使用prolog评估可能的情况

时间:2012-10-06 11:34:23

标签: prolog

我试图了解以下事实的可能情况。

don likes cain
bob does not like don
cain does not like aron
nobody likes someone who does not like him
aron likes everyone who likes bob
don likes everyone bob likes
everybody likes somebody

我刚刚开始学习prolog,我正试图在prolog中实现这一点,看看有多少可能出现的情况。我在这里扫描了几个prolog线程,我也在使用“Learn prolog now”这本书。所以这是我最好的尝试来提出代码。

likes(don, cain).
likes(aron,W):- likes(W,bob).
likes(don,M):- likes(bob,M).


(likes(aron,aron);likes(aron,bob));(likes(aron,cain);likes(aron,don)).

(likes(bob,aron);likes(bob,bob));(likes(bob,cain);likes(bob,don)).

(likes(cain,aron);likes(cain,bob));(likes(cain,cain);likes(cain,don)).

(likes(don,aron);likes(don,bob));(likes(don,cain);likes(don,don)).



not(likes(bob,don)).
not(likes(cain,aron)).

not(likes(Y,X)) :- not(likes(X,Y)).

当我在Ubuntu Linux(在winxp中的VirtualBox中)的swipl编译器中运行时,出现以下错误

?- [test].
ERROR: /home/test.pl:11:
    '$record_clause'/2: No permission to modify static_procedure `(;)/2'
ERROR: /home/test.pl:13:
    '$record_clause'/2: No permission to modify static_procedure `(;)/2'
ERROR: /home/test.pl:15:
    '$record_clause'/2: No permission to modify static_procedure `(;)/2'
ERROR: /home/test.pl:17:
    '$record_clause'/2: No permission to modify static_procedure `(;)/2'
% test compiled 0.00 sec, 1,616 bytes
true.

所以你可以帮我解决这个问题......我在这里使用not作为谓词,网上的一些线程似乎都提到了它。

1 个答案:

答案 0 :(得分:1)

在Prolog中,我们对事物的确有一个相当自然的表现,但是当面对负面信息(比如否定)时,我们必须使我们的直觉适应Prolog提供的受限计算模型。

特别是,Prolog语义基于closed world assumption,我们可能会被忽略为像bob does not like don那样无关紧要的命题,因为这只是说没有积极的条款'bob like don'。这种缺席确实在Prolog证明搜索中被“吸收”,并且由not的“程序性”定义形式化(Prolog中唯一可用,但运算符较少让人联想到'人类'解释,即{{1} }表示\+):

not

有关详细说明,请参阅this page

所有这些介绍都说我会引入一个not_like / 2来明确表示'负面'知识。从语法上讲,我们得到:

\+ X :- call(X), !, fail.
\+ X.

现在这些陈述有意义吗? Prolog从逻辑编程的实用方法的角度出发,对likes(don, cain). not_likes(bob, don). not_likes(cain, aron). not_likes(X, Y) :- \+ likes(Y, X). likes(aron, X) :- likes(X, bob). likes(don, X) :- likes(bob, X). likes(_, _). 进行run查询,这对某些编程任务非常有意义......

评论建议

修改,我认为代替knowledge而不是likes(_,_).的更好代码

everybody likes somebody

这是最后一个事实的合理性,但是单独它不允许推断likes(X, Y) :- \+ not_likes(X, Y).