因此,我试图了解 Datalog 的工作原理,它与 Prolog 之间的区别之一是它在否定和递归上具有分层限制。引用维基百科:
如果谓词 P 是从谓词 Q 正派生的(即 P 是规则的头部,并且 Q 正出现在同一规则的主体中),则 P 的分层数必须大于或等于分层Q的数量
如果谓词 P 是从否定谓词 Q 派生的(即 P 是规则的头部,并且 Q 否定出现在同一规则的主体中),则 P 的分层数必须大于 Q 的分层数,
因此,这样下去,以下两个谓词不会导致分层错误,因为它们可以简单地分配相同的分层编号。所以这些谓词很好,尽管有循环定义。
- A(x) :- B(x)
- B(x) :- A(x)
但是,如果我们有一个包含一些否定的定义(其中〜是否定),则会发生什么对比
- A(x) :- ~ B(x)
- B(x) :- ~ A(x)
在这里分层是不可能的。A(x,y) 的分层数必须大于 B(x,y),B(x,y) 的分层数必须大于 A(x,y)。我的第一个想法是这不好,因为这是一个循环定义,但只要谓词不被否定,分层就可以循环。但为什么?真值只是二进制的。以这种方式对具有否定符号的公式进行不同的处理似乎是非常武断的。在第二种情况下,这种分层试图防止在第一种情况下是什么?