datalog - Datalog 中是否可以查询不存在?

标签 datalog

假设我为一个函数定义了一些值:

+(value[1] == "cats")
+(value[2] == "mice")

是否可以像下面这样定义一个函数?

(undefined[X] == False) <= (value[X] == Y)
(undefined[X] == True)  <= (value[X] does not exist)

我猜它不能,原因有二:

(1) 查询保证在 Datalog 中终止,您可以查询 undefined[X] == True

(2) 根据维基百科,Datalog 与 Prolog 的不同之处之一是 Datalog“要求出现在子句正文中否定文字中的每个变量也出现在子句正文中的某些正文字中” .

但我不确定,因为涉及的术语(“终止”、“字面意思”、“否定”)有很多用途。 (例如:negative literal 是指 f[X] == not Y 还是not (f[X] == Y) >? termination 是否意味着它可以评估单个表达式,如 undefined[3] == True,或者它是否意味着它会找到 的所有 X undefined[X] == True?)

最佳答案

这里是“安全”的另一个定义。

A safety condition says that every variable in the body of a rule must occur in at least one positive (i.e., not negated) atom.

来源:Datalog and Recursive Query Processing

原子(或目标)是谓词符号(函数)以及作为参数的术语列表。 (请注意,此处“术语”和“原子”的使用方式与 Prolog 中的不同。)

安全问题是决定是否可以保证给定数据记录程序的结果是有限的,即使某些源关系是无限的。

例如,以下规则是不安全的,因为 Y 变量出现在负原子中(即 not predicate2(Z,Y)).

rule(X,Y) :- predicate1(X,Z), not predicate2(Z,Y) .

为了满足安全条件,Y 变量也应该出现在正谓词中。

关于datalog - Datalog 中是否可以查询不存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49459760/

相关文章:

聚合值最大值的数据查询

macros - Racket 宏不起作用

datomic - 如何在数据日志查询中对结果进行排序

datomic - DataLog 等同于 SQL 吗?

datalog - 数据记录中未定义的谓词错误

sparql - RDFox:本地IRI ':born_in'中的前缀名称尚未绑定(bind)

clojure - not 子句在 Datomic 中如何工作?

clojure - 数据查询性能改进

Z3 muZ + 未解释的函数?