数据记录中的不安全表达式

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的第一个参数不能。