Разрешение ограничений в Прологе

Я ищу ресурсы для изучения разрешения ограничений в Prolog. Например,

List=[X, Y, Z], List ins 1..4, X - Y #= Z.

person dev    schedule 19.04.2014    source источник
comment
Это неправильный синтаксис Пролога. List[X, Y, Z] является недопустимым, как было прокомментировано в вашей ранее опубликованной проблеме.   -  person lurker    schedule 19.04.2014
comment
Спасибо, сейчас исправил.   -  person dev    schedule 19.04.2014


Ответы (1)


Насколько я понимаю, вы хотите получить конкретные решения (а не домены). Для этого используйте label/1 или labeling/2, которые дадут все явные решения (путем поиска с возвратом). В SWI-Prolog эти предикаты задокументированы здесь: labeling/2 .

label(List) эквивалентно labeling([],List).

Для этого простого примера будет достаточно label(List):

?- List=[X, Y, Z], List ins 1..4, X - Y #= Z,label(List).

В общем, вам было бы полезно прочитать полную документацию по clpfd (здесь для SWI-Prolog).

person hakank    schedule 19.04.2014
comment
Я пытаюсь понять, как Пролог работает с доменами. Не могли бы вы порекомендовать какой-нибудь источник, чтобы узнать больше об этом? - person dev; 20.04.2014
comment
Если вам нужны общие описания того, как работают домены (а также распространители и т. д.), вероятно, лучше всего для описания некоторых подробностей подойдет полная книга по программированию с ограничениями (логика). Некоторые книги, которые мне нравятся по этому поводу: Rina Dechter: Constraint Processing (2003), Apt Principles of Constraint Programming (2003), Marriott & Stuckey Programming with Constraints (1998, немного старовата, но все еще вдохновляет). - person hakank; 20.04.2014