8

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

4

1 回答 1

9

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

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))

现在这个公式读作:如果存在一个这样的,那么Forall是 真的。这似乎与您想要的非常接近。X friend(X) Y friend_of(X,Y)

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

friend_of(a,b) :- true.

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

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

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
于 2017-05-05T20:23:51.697 回答