所以我试图理解Datalog是如何工作的,它和Prolog之间的区别之一是它在否定和递归上存在分层限制。 引用维基百科:
如果谓词P是从谓词Q中得出的(即P是 规则的头部,Q在身体的正面发生 规则),那么P的分层数必须大于或 等于Q
的分层数如果谓词P是从否定的谓词Q导出的(即P是 规则的负责人,Q在同一规则的主体中发生负面影响), 那么P的分层数必须大于 Q的分层数,
因此,顺便说一句,以下两个谓词不会导致分层错误,因为它们可以简单地分配相同的分层数。因此,尽管有循环定义,这些谓词都很好。
但是如果我们有一个含有一些否定的定义(其中〜是否定的话)会发生什么呢?
这里的分层是不可能的。 A(x,y)必须具有大于B(x,y)的分层数,并且B(x,y)必须具有大于A(x,y)的分层数。我的第一个想法是,这不是正常的,因为这是一个循环定义,但只要谓词不被否定,分层就可以完成循环。但为什么?真值是简单的二元值。以这种方式处理具有不同符号的公式似乎是极其随意的。在第二种不是第一种情况的情况下,这种分层试图防止的是什么?
答案 0 :(得分:8)
我认为问题在于:
A(x): - \ + B(x)
B(x): - \ + A(x)
......它的语义含糊不清。该程序有两个最小模型,即{A(x)}
和{B(x)}
,因此在定点语义下没有明确定义(没有修复)点)或模型理论语义(没有唯一的最小模型)。
为了解决这个问题,Datalog的分层语义对Datalog程序的语法施加了限制,这样,如果程序存在分层,那么它将会在固定点和模型理论语义中也有一个独特的最小模型(反之亦然,我相信)。
您可以在文章“Serge Abiteboul,Richard Hull和Victor Vianu的数据库基础”中找到更多有关Datalog的分层语义的详细信息,这些文章恰好是免费提供的{{3 },以及online中的相关详细信息。这篇优秀的文字还解释了我上面使用的大多数其他术语,如模型,定点等,如果你被卡住了。