对于云雀,我已经开始通过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
与原始程序中相同顺序的条款.对于简单的知识库,如这一个,顺序无所谓了,但实现非确定性算法时,句序可确定在其中生成解决方案的顺序.
有一个ISO Prolog discontiguous
指令可用于放宽特定谓词的此要求:
http://www.gprolog.org/manual/gprolog.html#htoc53