如何表达∀X∃Yr(X,Y),∃X∀Yr(X,Y)?

时间:2017-02-25 14:44:55

标签: prolog quantifiers

我想知道如何表达公式

  • ∀X∃Yr(X,Y);和
  • ∃X∀Yr(X,Y)
Prolog中的

(我的理解是Prolog应该能够表达这些公式,我在Prolog教科书中找不到类似的东西。)

更新

我从j4n bur53的回答中得知,在Prolog中,我的问题的答案在某种程度上取决于r的性质,或者更具体地说,取决于r的集合的性质。参数属于。

因此,为了具体,下面我描述了我现在感兴趣的两个案例(并且相当规范)。 (碰巧,对于这两种情况,∀X∃Yr(X,Y)为真,∃X∀Yr(X,Y)为假。)

案例1 r由以下两个事实明确给出(仅此而已):

r(1, 2).
r(2, 1).

案例2 r≤(正)自然数 N = {1,2,3, ...}。因此r(1, Y)适用于Y的所有允许实例化,但没有X的实例化,r(X, Y)Y的所有实例化都是正确的。

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用与域相关的量词,假设X和Y来自域a(。)和b(。)。然后你会表达如下:

 ∀X (a(X) -> ∃Y (b(Y) & r(X, Y)))         (1) 
 ∃X (a(X) & ∀Y (b(Y) -> r(X, Y)))         (2)

现在连词(&)/ 2直接是Prologs连词(,)/ 2。并且对于暗示( - >)/ 2,观察以下逻辑等价A - > B ==〜(A& ~B)。

因此,如果我们允许否定为失败(+)/ 1为否定(〜)/ 1,我们可以定义一个元谓词,它在许多Prolog系统中预定义(例如SWI-Prolog),如下所示:

forall(F, G) :- \+ (F, \+ G).

因此,如果我们接受这里的所有转换,那么最后两个查询将构成以下Prolog查询。

?- forall(a(X), (b(Y),r(X,Y))).
?- a(X), forall(b(Y), r(X,Y)).

这种方法通常适用于Datalog,但在这些情况下并不适用:

  • 如果(。)或b(。)是无限的。
  • 如果r(。,。)有其他参数,即否定失败会丢弃绑定。
  • 如果需要经典推理,即失败的否定在这里太弱了
  • 如果涉及约束,我们可能需要foreach / 2而不是forall / 2.
  • 还有什么?