我还在思考如何将Datalog程序的递归转换成SQL,比如
P(x,y) <- Q(x,y).
Q(x,y) <- P(x,z), A(y).
其中A/1
是 EDB 谓词。P
因此,和之间存在相互依赖关系Q
。对于更长的查询,如何解决这个问题?
此外,有没有系统完全实现翻译?如果有,我可以知道我可以参考什么系统或哪篇论文吗?
我还在思考如何将Datalog程序的递归转换成SQL,比如
P(x,y) <- Q(x,y).
Q(x,y) <- P(x,z), A(y).
其中A/1
是 EDB 谓词。P
因此,和之间存在相互依赖关系Q
。对于更长的查询,如何解决这个问题?
此外,有没有系统完全实现翻译?如果有,我可以知道我可以参考什么系统或哪篇论文吗?
如果您采用“列出”先前结论和对这些结论进行前向链推理的方法来推断新结论,则不需要递归“深度”。
请记住,Datalog 需要对规则和变量进行一些限制,以确保有限终止并因此得出有限多个结论。例如,变量必须具有有限范围的可能值。
假设您的示例是指常量而不是变量:
P(x,y) <- Q(x,y).
Q(x,y) <- P(x,z), A(y).
一个问题是您希望A/1
实现为扩展存储过程或外部代码。为此,我建议列出调用A
所有可能参数(无限多)的所有结果。毕竟,这些都是您系统的结论(可证明的陈述)。
一旦完成,前向链接推理就会迭代而不是递归地进行。在每一步考虑每条规则,如果它产生一个新的结论,则将其与先前获得的(列出的)结论的前提(右侧)一起应用。如果在当前步骤中没有规则产生新的结论,则停止。证明程序已完成。
在您的示例中,证明在所有事实都被引用后停止A
,因为没有结论足以应用任一规则来获得新结论。
一种可能的方法是在 SQL 中使用递归 CTE,它提供传递闭包的能力。关系代数 + 传递闭包 = Datalog。
Logica做了这样的事情。它将一种类似数据日志的语言翻译成用于 Google BigQuery、PostgreSQL 和 SQLite 的 SQL。