使用prolog评估可能的情况

使用prolog评估可能的情况,prolog,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中实现它,看看会出现多少可能的

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

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线程,我也在使用书“”。下面是我提出代码的最佳尝试

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)).
当我在UbuntuLinux(在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.

所以你能帮我做这个。。。。。。我在这里使用了
而不是
作为谓词,网络上的一些线程似乎提到了它。

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

特别是,Prolog语义是基于这样的,我们可能会试图忽略像
bob不喜欢don
这样的无关命题,因为这只是说明了肯定从句“bob喜欢don”的缺失。这种缺失确实在Prolog证明搜索中被“吸收”,并通过
not
的“程序性”定义形式化(Prolog中唯一可用,但运算符不太像“人类”解释,即
\+
表示
not
):

有关的详细说明,请参阅

所有这些介绍性的内容都是为了说,我将引入一个不喜欢的/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从逻辑编程的实用方法的角度出发,它对这些知识进行
运行
查询,这对于某些编程任务来说非常有意义

编辑根据评论建议,我认为应该为
每个人都喜欢某人的人编写一个更好的代码,而不是
喜欢(,u)。

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

最后一个事实证明了这一点,但它不允许推断出
不喜欢(cain,aron)。

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

特别是,Prolog语义是基于这样的,我们可能会试图忽略像
bob不喜欢don
这样的无关命题,因为这只是说明了肯定从句“bob喜欢don”的缺失。这种缺失确实在Prolog证明搜索中被“吸收”,并通过
not
的“程序性”定义形式化(Prolog中唯一可用,但运算符不太像“人类”解释,即
\+
表示
not
):

有关的详细说明,请参阅

所有这些介绍性的内容都是为了说,我将引入一个不喜欢的/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从逻辑编程的实用方法的角度出发,它对这些知识进行
运行
查询,这对于某些编程任务来说非常有意义

编辑根据评论建议,我认为应该为
每个人都喜欢某人的人编写一个更好的代码,而不是
喜欢(,u)。

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

最后一个事实证明了这一点,但它不允许推断出
不喜欢(cain,aron)。

chac,感谢您的回复。这是有道理的。我还没有学会在“现在学习prolog”中使用下划线变量。所以我的任务是看看这4个人之间可能出现多少情况。当我运行你的查询代码时,比如
likes(cain,X)
它返回
true。
那么这是否意味着cain喜欢所有人?chac,谢谢你的回复。这是有道理的。我还没有学会在“现在学习prolog”中使用下划线变量。所以我的任务是看看这4个人之间可能出现多少情况。当我运行你的查询代码时,比如
likes(cain,X)
它返回
true。
那么这是否意味着cain喜欢所有人?