Непрерывное предикатное предупреждение от GNU Prolog - PullRequest
20 голосов
/ 13 сентября 2011

Для жаворонка я начал изучать Пролог через 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/) недоволен, что 2-й предикат для мастера \ 1 не находится рядом с первым.Я могу переупорядочить программу, чтобы она заработала, но затем я получаю код, который моему начинающему глазу Пролога менее понятен, чем приведенный ниже.

Я что-то упускаю из виду?

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

Ответы [ 2 ]

23 голосов
/ 13 сентября 2011

Большинство Прологов хотят, чтобы пункты для каждого конкретного предиката были перечислены вместе, если только вы не совершите магию. Я удивлен, Стригниц и Бос игнорируют это. Измените программу на

% all clauses for wizard/1
wizard(ron).
wizard(X) :- hasBroom(X),hasWand(X).

hasWand(harry).
quidditchPlayer(harry).
hasBroom(X) :- quidditchPlayer(X).

Обратите внимание, что я сохранил пункты для wizard/1 в том же порядке, что и в исходной программе. Для простых баз знаний, таких как эта, порядок не имеет большого значения, но при реализации недетерминированных алгоритмов порядок предложений может определять порядок, в котором генерируются решения.

6 голосов
/ 13 сентября 2011

Существует директива ISO Prolog discontiguous, которую можно использовать для ослабления этого требования для определенного предиката:

http://www.gprolog.org/manual/gprolog.html#htoc53

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