首页 文章

Datalog中是否存在不存在的问题?

提问于
浏览
1

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

+(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 回答

  • 0

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

    安全条件是规则体中的每个变量必须出现在至少一个正(即未被否定)的原子中 .

    资料来源:Datalog and Recursive Query Processing

    原子(或目标)是谓词符号(函数)以及作为参数的术语列表 . (注意,术语“术语”和“原子”在这里的使用方式与它们在Prolog中的使用方式不同 . )

    安全问题是确定即使某些源关系是无限的,也可以保证给定Datalog程序的结果是有限的 .

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

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

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

相关问题