Я пытаюсь создать собственное перечисление с помощью ряда фактов.
greater(X,Y) :- less (Y,X).
less(a,b).
less(b,c).
less(c,d).
Это прекрасно работает, однако есть значительные повторения.
Я пытаюсь сократить это. Есть ли способ использовать массив для простой линейной серии фактов с помощью преобразования?
transform([a,b,c,d])
resulting in the same less definitions.
Я уже создал определение "less", которое использует массив и функцию nextto / member для тестирования, однако я не могу добавить исключения или эквивалентные случаи, как я мог бы с отдельными объявлениями. Отсюда мой интерес к сокращению простого определения случая, а затем желание дополнить его дополнительными определениями.
Это напоминает мне, где defmacro в lisp полезен.
Спасибо.
Edit:
Мне удалось создать одну серию, используя assert. Он все успешно определяет, но возвращает ошибку. У меня сложилось впечатление, что это неправильный метод.
set_less([]).
set_less([X,Y|L]):- assert( myless(X,Y) ) , set_less([Y|L]).
:- set_less([a,b,c,d]).
Output:
Goal (directive) failed: user:set_less([a, b, c, d])
?- listing.
:- dynamic myless/2.
myless(a, b).
myless(b, c).
myless(c, d).
Второе редактирование:
mylist([a,b,c,d]).
set_less([]).
set_less([_]). ----- Key!
set_less([X,Y|L]):- assert( myless(X,Y) ) , set_less([Y|L]).
:- set_less([a,b,c,d]).
Это работает! Это хороший способ определения пользовательских перечислений? Я вижу, это работает сейчас, спасибо!