假设我为一个函数定义了一些值:
+(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/