Недопустимое предупреждение предиката от GNU Prolog
Для жаворонок я начал изучать Prolog через http://www.learnprolognow.org/. Мое оправдание в том, что я только что начал.
Я не уверен, как должно выполняться следующее (простое) упражнение для работы, как ожидалось.
http://cs.union.edu/~striegnk/learn-prolog-now/html/node13.html#sec.l1.exercises
Я вижу, что Gnu Prolog 1.4 (http://www.gprolog.org/) недовольна тем, что второй предикат для мастера \1 не находится рядом с первым. Я могу повторно заказать программу, чтобы она работала, но затем я получаю код, который для моего новичка Prolog выглядит менее понятным, чем тот, который представлен ниже.
Я пропустил что-то очевидное?
wiz.pl
wizard(ron).
hasWand(harry).
quidditchPlayer(harry).
wizard(X) :- hasBroom(X),hasWand(X).
hasBroom(X) :- quidditchPlayer(X).
обратитесь к wiz.pl
| ?- [wiz].
compiling D:/wiz.pl for byte code...
D:/wiz.pl:5: warning: discontiguous predicate wizard/1 - clause ignored
D:/wiz.pl compiled, 5 lines read - 632 bytes written, 24 ms
Ответы
Ответ 1
Большинство прологов требуют, чтобы предложения для любого конкретного предиката были перечислены вместе, если только вы не делаете какую-либо магию. Я удивлен, что Стригниц и Бос игнорируют это. Измените программу на
% all clauses for wizard/1
wizard(ron).
wizard(X) :- hasBroom(X),hasWand(X).
hasWand(harry).
quidditchPlayer(harry).
hasBroom(X) :- quidditchPlayer(X).
Обратите внимание, что я сохранил предложения для wizard/1
в том же порядке, что и в исходной программе. Для простых баз знаний, таких как этот, порядок не имеет большого значения, но при реализации недетерминированных алгоритмов порядок предложения может определять порядок генерирования решений.
Ответ 2
Существует директива ISO Prolog discontiguous
, которую вы можете использовать для ослабления этого требования для определенного предиката:
http://www.gprolog.org/manual/gprolog.html#htoc53