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

时间:2011-09-13 11:12:11

标签: prolog

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

我不确定如何按照预期编写以下(简单?)练习。 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

2 个答案:

答案 0 :(得分: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).

请注意,我保留wizard/1的条款与原始程序中的顺序相同。对于诸如此类的简单知识库,顺序无关紧要,但在实现非确定性算法时,子句顺序可以确定生成解的顺序。

答案 1 :(得分:6)

您可以使用ISO Prolog discontiguous指令来放宽对特定谓词的此要求:

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