Prolog事实中的存在量化
Existential quantification in Prolog facts
我正在做 Prolog (swi-prolog) 的第一步,但无法解决以下问题:如何将存在量化规则包含到我的事实中;具体来说,如何将句子 "Everybody is a friend of somebody" \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)
。关系也不一定是自反的。朋友关系是否自反是值得商榷的。然而,这当然是一个可能的阅读。考虑到这一点以及您评论中给出的示例,让我们假设您有一些事实将 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
表达自反性的规则基本上表明,每个人至少与 him/herself 是朋友。从这条规则你的要求Everybody is a friend of someone直接跟上。如果你查询这个关系,你会得到想要的结果:
?- 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 (swi-prolog) 的第一步,但无法解决以下问题:如何将存在量化规则包含到我的事实中;具体来说,如何将句子 "Everybody is a friend of somebody" \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)
。关系也不一定是自反的。朋友关系是否自反是值得商榷的。然而,这当然是一个可能的阅读。考虑到这一点以及您评论中给出的示例,让我们假设您有一些事实将 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
表达自反性的规则基本上表明,每个人至少与 him/herself 是朋友。从这条规则你的要求Everybody is a friend of someone直接跟上。如果你查询这个关系,你会得到想要的结果:
?- 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