Prolog事实中的存在量化



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

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

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

现在这个公式如下如果存在一个Y,那么friend_of(X,Y)为真Xfriend(X)为真。这似乎非常接近您想要的。

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

friend_of(a,b) :- true.

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

编辑:关于你评论中的情况,我会指出谓词构成关系。关系不一定对称,这就是我将关系命名为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

最新更新