为了好玩,我已经开始通过http://www.learnprolognow.org/学习Prolog。我的借口是我才刚刚开始。
我不确定下面的(简单?)练习应该写成按预期工作。http://cs.union.edu/~striegnk/learn-prolog-now/html/node13.html#sec.l1.exercises
我可以看到Gnu Prolog1.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
发布于 2011-09-13 19:14:32
大多数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
的子句保持为与原始程序中相同的顺序。对于像这样的简单知识库,顺序并不重要,但在实现非确定性算法时,子句顺序可能会决定生成解决方案的顺序。
发布于 2011-09-13 22:28:48
您可以使用ISO Prolog discontiguous
指令来放宽对特定谓词的这一要求:
https://stackoverflow.com/questions/7400904
复制相似问题