假设我为函数定义了一些值:
+(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“要求在条款正文中出现在负文字中的每个变量也出现在条款正文中的某些正面文字中” .
但我不确定,因为所涉及的术语("terminate","literal","negative")有很多用途 . (例如: negative literal
是指 f[X] == not Y
还是 not (f[X] == Y)
? termination
是否意味着它可以评估像 undefined[3] == True
这样的单个表达式,或者它是否意味着它会找到 undefined[X] == True
的所有X?)
1 回答
这里是“安全”的另一个定义 .
资料来源:Datalog and Recursive Query Processing
原子(或目标)是谓词符号(函数)以及作为参数的术语列表 . (注意,术语“术语”和“原子”在这里的使用方式与它们在Prolog中的使用方式不同 . )
安全问题是确定即使某些源关系是无限的,也可以保证给定Datalog程序的结果是有限的 .
例如,以下规则不安全,因为
Y
变量在负原子中出现 only (即not predicate2(Z,Y)
) .为了满足安全条件,
Y
变量也应出现在正谓词中 .