我正在 Prolog (swi-prolog) 中做我的第一步,但无法解决以下问题:如何将存在量化的规则包含在我的事实中;具体来说,我如何包含句子“每个人都是某人的 friend ”\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))
现在这个公式读作: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)
.关系也不一定是自反的。关系 friend 是否是自反是值得商榷的。然而,这肯定是一个可能的阅读。考虑到这一点以及您评论中给出的示例,让我们假设您有一些描述 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
表达反身性的规则基本上表明,每个人都至少与他/她自己是 friend 。根据这条规则,您的要求每个人都是直接遵循的某人的 friend 。如果你查询这个关系,你会得到想要的结果: ?- 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
关于prolog - Prolog 事实中的存在量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43812239/