来自GNU Prolog的不连续的谓词警告

Ada*_*han 20 prolog

对于云雀,我已经开始通过http://www.learnprolognow.org/学习Prolog .我的理由是我开始.

我不确定应该如何编写以下(简单?)练习按预期工作. http://cs.union.edu/~striegnk/learn-prolog-now/html/node13.html#sec.l1.exercises

我可以看到,牛羚的Prolog 1.4(http://www.gprolog.org/)不开心,对于向导\ 1第2谓词不是旁边的第一个.我可以重新排序程序,使其工作,但后来我结束了代码到我的新手Prolog的眼睛比下面介绍的少了一个可以理解的.

我错过了一些明显的东西吗

wiz.pl

wizard(ron).
hasWand(harry).
quidditchPlayer(harry).

wizard(X) :- hasBroom(X),hasWand(X).
hasBroom(X) :- quidditchPlayer(X).
Run Code Online (Sandbox Code Playgroud)

咨询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
Run Code Online (Sandbox Code Playgroud)

Fre*_*Foo 23

大多数Prolog都希望将任何特定谓词的子句列在一起,除非你做了一些魔术.我很惊讶Striegnitz和Bos忽略了这一点.将程序更改为

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

hasWand(harry).
quidditchPlayer(harry).
hasBroom(X) :- quidditchPlayer(X).
Run Code Online (Sandbox Code Playgroud)

请注意,我保留了wizard/1与原始程序中相同顺序的条款.对于简单的知识库,如这一个,顺序无所谓了,但实现非确定性算法时,句序可确定在其中生成解决方案的顺序.


Nic*_*ain 6

有一个ISO Prolog discontiguous指令可用于放宽特定谓词的此要求:

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

  • 不知何故,我错过了编辑窗口 - 只需将其添加到您的知识库的顶部:“:-不连续(向导/ 1)”。 (3认同)