我想知道如何表达公式
(我的理解是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
的所有实例化都是正确的。
答案 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,但在这些情况下并不适用: