Константы Пролога
Есть ли способ определить константы в прологе?
Я хотел бы написать что-то вроде
list1 :- [1, 2, 3].
list2 :- [4, 5, 6].
predicate(L) :- append(list1, list2, L).
Работа, которую я использую сейчас, это
list1([1, 2, 3]).
list2([4, 5, 6]).
predicate(L) :-
list1(L1),
list2(L2),
append(L1, L2, L).
но немного неуклюже связывать "бесполезную" переменную, такую как каждый раз, когда мне нужно получить доступ к константе.
Другая (даже более уродливая) работа вокруг, я полагаю, будет включать cpp в цепочку построения.
(В моем фактическом приложении список - это большой LUT, используемый во многих местах.)
Ответы
Ответ 1
Я не думаю, что вы можете сделать это в "чистом" Prolog (хотя некоторые реализации могут позволить вам сделать что-то близко, например, ECLiPSe имеет полки).
Причина такова:
1) Вы не можете писать такие вещи, как
list1 :- [4, 5, 6].
или
list1 = [4, 5, 6].
Потому что правая сторона и левая сторона - оба условия, которые не совпадают.
2) Вы не можете писать такие вещи, как
list1 :- [4, 5, 6].
или
list1 = [4, 5, 6].
потому что левая сторона теперь является переменной, но переменные допустимы только в головах/телах предикатов.
Что вы можете сделать, так это определить предикат с несколькими параметрами, например:
myList([1, 2, 3]).
myList([4, 5, 6]).
а затем получить все свои значения с помощью bagof (или аналогичных предикатов):
predicate(L) :-
bagof(ML, myList(ML), MLs),
concat(MLs, L).
MLs
- это список всех значений ML
, которые удовлетворяют myList(ML)
и, конечно, concat
объединяет список списков.
Ответ 2
Нет, вы не можете сделать это в Prolog, и определить его с помощью предиката - разумная вещь.
Или лучше, инкапсулируйте свою функцию поиска в предикат.
Тем не менее, если вы действительно хотите использовать предварительную обработку, есть term_expansion/2
, но он может сделать ваш код нечитаемым и беспорядочным, если вы не будете осторожны.
Вы также можете посмотреть расширения Prolog, которые включают в себя нотацию функций (языки функциональной логики, такие как Mercury). Но они еще более экзотичны, чем Prolog.