【问题标题】:evaluating possible situations using prolog使用 prolog 评估可能的情况
【发布时间】:2012-10-06 11:34:22
【问题描述】:

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

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 中实现这一点,看看会出现多少种可能的情况。我在这里浏览了几个序言线程,我也在使用这本书 "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作为谓词,网上的一些帖子似乎提到了它。

【问题讨论】:

    标签: prolog


    【解决方案1】:

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

    特别是基于closed world assumption 的Prolog 语义,我们可能会倾向于省略像bob does not like don 这样的不相关命题,因为这只是说明没有肯定子句“bob likes don”。这种缺失确实在 Prolog 证明搜索中被“吸收”,并由 not 的“程序”定义形式化(Prolog 中唯一可用的,但操作符不太让人想起“人类”解释,即 \+ 表示 @987654326 @):

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

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

    所有这些介绍性的说我将引入一个 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).

    【讨论】:

    • chac,谢谢您的回复。这说得通。我还没有在“Learn prolog now”中学习下划线变量的使用。所以我在这里的任务是看看这四个人之间出现了多少可能的情况。当我运行您的代码进行查询时,如likes(cain,X) 它返回true. 那么这是否意味着该隐喜欢每个人?
    猜你喜欢
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    相关资源
    最近更新 更多