Пролог Константы - PullRequest
       1

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

10 голосов
/ 28 июня 2010

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

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

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).

но связывать «бесполезную» переменную, подобную этой, каждый раз, когда мне нужно получить доступ к константе, немного неуклюже.цепочка сборки.

(В моем реальном приложении список представляет собой большой LUT, используемый во многих местах.)

Ответы [ 2 ]

11 голосов
/ 28 июня 2010

Я не думаю, что вы можете сделать это в «чистом» Прологе (хотя некоторые реализации могут позволить вам сделать что-то близкое, например, в ECLiPSe есть полки).

Причина:

1) Вы не можете писать вещи , такие как

list1 :- [4, 5, 6].

или

list1 = [4, 5, 6].

Поскольку правая и левая стороны являются терминами, которые неt match.

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 голосов
/ 04 июля 2010

Нет, вы не можете сделать это в Прологе, и разумно определить его с помощью предиката.

Или, лучше, инкапсулировать вашу функцию поиска в предикате.

Тем не менее, если вы действительно хотите использовать предварительную обработку, есть term_expansion/2, но это может сделать ваш код нечитаемым и грязным, если вы не будете осторожны.

Вы также можете посмотреть на расширения Prolog, которые включают функцию обозначения (языки функциональной логики, такие как Mercury ).Но они даже более экзотичны, чем Пролог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...