1

我正在尝试查看以下事实的可能情况。

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 的 swipl 编译器中运行它时(在 winxp 的 VirtualBox 中),我得到以下错误

?- [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这里用作谓词,网上的一些线程似乎提到了它。

4

1 回答 1

1

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

特别是,Prolog 语义基于封闭世界假设,我们可能会倾向于忽略不相关的命题 like bob does not like don,因为这只是说明没有肯定子句“bob likes don”。这种缺席确实在 Prolog 证明搜索中被“吸收”,并由not(Prolog 中唯一可用的,但操作符不太让人联想到“人类”解释,即\+意味着not)的“程序”定义形式化:

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

有关更多说明,请参阅此页面。

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

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(_, _).

现在这些说法有意义吗?Prolog 从逻辑编程的实用方法的角度出发,并run针对此类进行查询,这对于某些编程任务knowledge非常有意义......

评论建议的编辑,我认为应该是likes(_,_).更好的代码而不是everybody likes somebody

likes(X, Y) :- \+ not_likes(X, Y).

最后一个事实证明了这一点,但独立它不允许推断not_likes(cain, aron).

于 2012-10-06T12:36:51.753 回答