prolog - Prolog 事实中的存在量化

标签 prolog logic existential-operator

我正在 Prolog (swi-prolog) 中做我的第一步,但无法解决以下问题:如何将存在量化的规则包含在我的事实中;具体来说,我如何包含句子“每个人都是某人的 friend ”\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) ← ∃ 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 的事实。 , bc作为人,像这样:
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/

相关文章:

请序言DCG插图

prolog - 用 prolog 解决 Numberlink 难题

Haskell If 的多个条件

mysql - SQL 从 2 个表更新 1 个表

python - 获取 pyswip 包的版本号

Prolog中序遍历

prolog - Prolog 中的这个错误是什么意思?

coffeescript - CoffeeScript 的存在运算符是如何工作的?

javascript - JavaScript 中的存在运算符?