Prolog Noob: библиотека программирования ограничений или проблема синтаксиса в SWI-Prolog - PullRequest
9 голосов
/ 08 апреля 2011

Я просто пытаюсь понять программирование ограничений в SWI-Prolog, глядя на этот урок: http://en.wikibooks.org/wiki/Prolog/Constraint_Logic_Programming

Однако я, кажется, падаю на первое препятствие.

?- use_module(library(clpfd)).
true.

?- X #> Y, X in 1..3, Y=2.
ERROR: Syntax error: Operator expected
ERROR: X 
ERROR: ** here **
ERROR: #> Y, X in 1..3, Y=2 . 
?- 

Что здесь не так? Я, кажется, включил библиотеку, но первая строка примера из учебника выдает синтаксическую ошибку.

Кажется, что все учебники, которые я могу найти, используют такие операторы, как # =, # <и т. Д. Но мой SWI-Prolog их опровергает. Являются ли они дополнительным синтаксисом, который поставляется с этой библиотекой ограничений? (И я не могу загрузить его?) </p>

Или я неправильно читаю учебные примеры?

Обновление: пытаясь понять вещи из ответа Хорша ниже. Я могу заставить это работать, если я использую библиотеку и запускаю линию в интерактивном терминале. Но если я попытаюсь импортировать библиотеку и использовать эти операторы в исходном файле, она снова выдаст ошибку. Что я не понимаю?

Обновление 2:

OK. Если в моем исходном файле я вызываю библиотеку, а затем пишу правило, которое содержит #>. Затем я пытаюсь справиться с этим из командной строки. Это вызовет ошибку, и синтаксис #> не распознается. Если импортировать библиотеку в командную строку перед тем, как попытаться обратиться к программе, она работает. Это может быть правильно?

Ответы [ 3 ]

12 голосов
/ 10 апреля 2011

Опираясь на ответ Хорша, вы должны импортировать библиотеку в свой исходный код, помня поставить ?- в начале строки следующим образом:

?- use_module(library(clpfd)).

?- сообщает SWI-Пролог для выполнения строки, как если бы она была введена непосредственно в интерпретатор, вместо того, чтобы пытаться объявить ее как предикат в вашей программе.

Не беспокойтесь о том, что SWI-Prolog импортирует библиотеку более одного раза,он знает, проверять, была ли изменена библиотека, и перезагружает ее, только если библиотека была изменена с момента последней загрузки.

8 голосов
/ 05 марта 2012

Для всех, кто найдет это в будущем, если вы хотите импортировать библиотеку в исходный файл SWI-Prolog, также будет работать следующее:

:- use_module(library(clpfd)).

Обратите внимание на :-, а не ?-.

0 голосов
/ 08 апреля 2011

Все в руководстве здесь и там .

?- [library(clpfd)].
%   library(error) compiled into error 0.00 sec, 10,128 bytes
%  library(apply) compiled into apply 0.00 sec, 16,840 bytes
%  library(assoc) compiled into assoc 0.00 sec, 13,132 bytes
%  library(lists) compiled into lists 0.00 sec, 14,332 bytes
%  library(pairs) compiled into pairs 0.00 sec, 5,372 bytes
% library(clpfd) compiled into clpfd 0.05 sec, 392,604 bytes
true.

?- X #> Y, X in 1..3, Y=2.
X = 3,
Y = 2.
...