扩展统一,SICStus 风格

rep*_*eat 6 prolog unification sicstus-prolog

我想了解 SICStus 风格的可扩展统一。在用户手册上的library(atts)规定:

Module:verify_attributes(-Var, +Value, -Goals)

...
verify_attributes/3可能会调用任意的 Prolog 目标,但Var不应受其约束。绑定Var将导致未定义的行为。
...
在单个统一绑定多个属性变量的情况下,首先撤消所有此类绑定,然后对每个相关变量执行以下操作:

  1. 对于每个相关模块M,都会M:verify_attributes/3被调用,收集返回的Goals.
  2. 重做变量绑定。
  3. 任何Goals被称为。
  4. 任何在变量上阻塞的目标,现在已经解除阻塞,都会被调用。

到目前为止,我想出了对上述内容的以下解释:

  • 不同的verify_attribute/3处理程序挂钩Var,看到相同的状态Var:所有看到它“pre_unify”。

  • verify_attribute/3不能绑定Var,但可以绑定其他属性变量。

  • 这些绑定也将被延迟,以便处理程序不仅看到 的相同状态Var,而且看到所有涉及的属性变量。

    上面的操作列表需要“5. 强制对属性变量进行任何延迟绑定”。

我是否朝着正确的方向前进 -就是“完成,然后撤消,然后重做”的全部内容吗?  请帮忙!

Mat*_*son 8

该机制最初由 Christian Holzbaur 设计并由您真正实施。关于。你的解释:

不同的verify_attribute/3处理程序挂钩Var,看到 Var 的相同状态:都看到它“pre_unify”。

对。

verify_attribute/3不能绑定Var,但可以绑定其他属性变量。

对。

这些绑定也将被延迟,以便处理程序不仅看到 的相同状态Var,而且看到所有涉及的属性变量。

错误的。如果它绑定了其他属性变量,则整个扩展统一机制将在这些变量上递归调用。

上面的操作列表需要“5. 强制对属性变量进行任何延迟绑定”。

错误的。

  • 很高兴看到你回答。 (3认同)