Константы Пролога

Есть ли способ определить константы в прологе?

Я хотел бы написать что-то вроде

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.