Prolog 事实中的存在量化

Posted

技术标签:

【中文标题】Prolog 事实中的存在量化【英文标题】:Existential quantification in Prolog facts 【发布时间】:2017-10-04 08:47:07 【问题描述】:

我正在 Prolog (swi-prolog) 中迈出第一步,但无法解决以下问题:如何将存在量化的规则包含到我的事实中;具体来说,我如何才能将“每个人都是某人的朋友”\forall x \exists y friend(x,y)这句话作为事实包含在内?到目前为止,我发现的每个问题都只是关于查询而不是事实。谢谢!

【问题讨论】:

似乎相关:faculty.nps.edu/ncrowe/book/chap14.html 【参考方案1】:

在您给出的示例中,您实际上是在量化变量而不是规则。考虑到这一点,请考虑以下示例:

friend_of(a,b).

friend(X) :-
   friend_of(X,Y).

规则中的变量是普遍量化的,所以你可以把规则写成这样的逻辑公式:

XY(friend(X)friend_of(X,Y))

由于变量Y没有出现在规则的头部,它的全称量词可以作为存在量词移到规则体中:

X(friend(X)←∃Yfriend_of(X,Y))

现在这个公式读作:ForallXfriend(X)如果存在一个Y为真这样@987654334 @是真的。这似乎与您想要的非常接近。

另一方面,如果您考虑事实,则它们用于说明情况确实如此。上面例子中的friend_of/2 只是简单的写法

friend_of(a,b) :- true.

但是,这里没有变量,所以没有什么可以量化的。

编辑:关于您的 cmets 中的情况,我会注意到谓词构成关系。关系不一定是对称的,这就是我将关系命名为friend_of/2 的原因。也就是说,friend_of(a,b) 不一定意味着friend_of(b,a)。关系也不一定是自反的。关系朋友是否具有反身性是有争议的。但是,这肯定是一种可能的阅读方式。考虑到这一点以及您评论中给出的示例,我们假设您有一些事实将 abc 描述为人,如下所示:

person(a).
person(b).
person(c).

那么你可以像这样描述一个自反关系friends/2

friends(a,b) :- false.   % example from your comment
friends(a,c) :- false.   % example from your comment
friends(X,X) :-          % the relation is reflexive
   person(X).            % among people

表达自反性的规则基本上是说,每个人都至少是他/她自己的朋友。根据这条规则,您的要求每个人都是某人的朋友。如果你查询这个关系,你会得到想要的结果:

   ?- friends(a,X).
X = a

虽然没有说明两个不同人之间的实际友谊,但最一般的查询也会产生每个人的结果:

   ?- friends(X,Y).
X = Y = a ? ;
X = Y = b ? ;
X = Y = c

请注意,事实person/1 必须将答案限制为真实的人。如果你用一些非人查询friends/2

   ?- friends(cos(0),X).
no

如果你试图在没有这样一个目标的情况下定义自反性:

friend(X,X).

你的定义太笼统了:

   ?- friends(a,X).           % desired result
X = a
   ?- friends(cos(0),X).      % undesired result
X = cos(0)

而且最一般的查询不会产生任何真实的人:

   ?- friends(X,Y).
X = Y

【讨论】:

你说得对,我把术语弄混了一点。我想这个练习的目的是根据一些事实来推断友谊。例如。如果我知道只有 a,b 和 c 以及 ~friend(a,b) 和 ~friend(a,c) 由于上述规则,我可以推断出friend(a,a)。我还不太明白这将如何与您提出的解决方案一起使用。 @huxley:“~friend(a,b)”是什么意思?你的意思是你已经给出了一个事实friend(a,b)?或者您已明确声明 ab 不是朋友,例如:friend(a,b) :- false.? 第二种情况就是我的意思。因此,鉴于 a 和 b 以及 a 和 c 不是朋友,我怎么能推断出 a 和 a 必须是朋友 (friend(a,a)) 给定“每个人都是某人的朋友”和你的解决方案? 我想我现在明白了。谢谢!

以上是关于Prolog 事实中的存在量化的主要内容,如果未能解决你的问题,请参考以下文章

删除 Prolog 中的单引号/引号

Prolog:模拟析取事实

在prolog中将两个列表映射在一起

prolog中的哈希表

Prolog 中如何表示谓词逻辑?

Prolog图表表示缺少事实