首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >来自GNU Prolog的不连续谓词警告

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

Stack Overflow用户
提问于 2011-09-13 19:12:11
回答 2查看 12.5K关注 0票数 23

为了好玩,我已经开始通过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

代码语言:javascript
复制
wizard(ron).
hasWand(harry).
quidditchPlayer(harry).

wizard(X) :- hasBroom(X),hasWand(X).
hasBroom(X) :- quidditchPlayer(X).

咨询wiz.pl

代码语言:javascript
复制
| ?- [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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-13 19:14:32

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

代码语言:javascript
复制
% all clauses for wizard/1
wizard(ron).
wizard(X) :- hasBroom(X),hasWand(X).

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

请注意,我将wizard/1的子句保持为与原始程序中相同的顺序。对于像这样的简单知识库,顺序并不重要,但在实现非确定性算法时,子句顺序可能会决定生成解决方案的顺序。

票数 26
EN

Stack Overflow用户

发布于 2011-09-13 22:28:48

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

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7400904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档