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