Подтвердить что ты не робот

Недопустимое предупреждение предиката от 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
4b9b3361

Ответ 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