我正在Prolog(swi-prolog)中迈出第一步,无法解决以下问题:我如何将存在量化的规则包含在我的事实中;具体来说,我如何将"每个人都是某人的朋友"这句话forall x exists y friend(x,y)
为事实?到目前为止,我发现的每个问题都只是关于查询而不是事实。谢谢!
在你给出的例子中,你实际上是在量化变量而不是规则。考虑到这一点,请考虑以下示例:
friend_of(a,b).
friend(X) :-
friend_of(X,Y).
规则中的变量是通用量化的,因此您可以将规则编写为逻辑公式,如下所示:
∀X
∀Y
(friend(X)
←friend_of(X,Y))
由于变量Y
不会出现在规则的头部,因此其通用量词可以作为存在量词移动到规则的主体中:
∀X
(friend(X)
← ∃Y
friend_of(X,Y))
现在这个公式如下:如果存在一个Y
,那么friend_of(X,Y)
为真,则X
friend(X)
为真。这似乎非常接近您想要的。
另一方面,如果您考虑事实,它们用于说明情况确实如此。上面例子中friend_of/2
的事实只是简短的写作方式
friend_of(a,b) :- true.
但是,这里没有变量,因此没有什么可以量化的。
编辑:关于你评论中的情况,我会指出谓词构成关系。关系不一定对称,这就是我将关系命名为friend_of/2
的原因。也就是说,friend_of(a,b)
并不一定意味着friend_of(b,a)
.关系也不一定是反射性的。关系朋友是否是反射性的是值得商榷的。但是,这当然是一种可能的解读。考虑到这一点以及您评论中给出的示例,让我们假设您有一些事实来描述a
、b
和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