数据记录中的不安全表达式
Not-safe expression in datalog
为什么这个目标不安全?
MANAGER(Name) :- WORKER(Name, Age, _ ), ¬ SUBORDINATE (_, Name), Age <= 40
我们老师说是因为SUBORDINATE是负数,所以不能有未定义的(_)空格,但是这个表达式对我来说似乎是合乎逻辑的。
谁能帮帮我?
Datalog 中的安全要求旨在防止出现无限结果。如果你有一个变量出现在头部并且只在 body 中取反,那么它可以绑定到无限多个值,这显然是一个问题。
具体的安全要求很难准确表述,所以通常您会看到简化为 'every variable has to occur positively' 的要求。这比需要的要严格一些。
对该问题最有参考意义的答案是该规则在技术上是不安全的,但它不会产生无限结果。某些 Datalog 引擎会允许此规则和 return 有限结果。
这条规则是绝对安全的,它不会产生无限关系。这是您使用的 Datalog 引擎的实现缺陷。
通常,处理 _
的一种简单方法是将其转换为新变量。这使得引擎的实现变得容易,但可能是该子句抛出错误的原因。如果它是一个变量,就会有无限多个值SUBORDINATE
的第一个参数不能。
为什么这个目标不安全?
MANAGER(Name) :- WORKER(Name, Age, _ ), ¬ SUBORDINATE (_, Name), Age <= 40
我们老师说是因为SUBORDINATE是负数,所以不能有未定义的(_)空格,但是这个表达式对我来说似乎是合乎逻辑的。 谁能帮帮我?
Datalog 中的安全要求旨在防止出现无限结果。如果你有一个变量出现在头部并且只在 body 中取反,那么它可以绑定到无限多个值,这显然是一个问题。
具体的安全要求很难准确表述,所以通常您会看到简化为 'every variable has to occur positively' 的要求。这比需要的要严格一些。
对该问题最有参考意义的答案是该规则在技术上是不安全的,但它不会产生无限结果。某些 Datalog 引擎会允许此规则和 return 有限结果。
这条规则是绝对安全的,它不会产生无限关系。这是您使用的 Datalog 引擎的实现缺陷。
通常,处理 _
的一种简单方法是将其转换为新变量。这使得引擎的实现变得容易,但可能是该子句抛出错误的原因。如果它是一个变量,就会有无限多个值SUBORDINATE
的第一个参数不能。