SICStus Prolog中的Verify_attributes

时间:2019-06-25 17:41:30

标签: prolog sicstus-prolog clp

属性变量允许扩展统一。以下是有关界面的奥秘细节。让我们开始追逐吧!

中 库(atts)提供使用属性变量的谓词。 除了关于verify_attributes(-Var, +Value, -Goals)的一个细节之外,我想我明白SICStus Prolog User's Manual page for library(atts)所说的话:

  

[...] verify_attributes / 3在Var实际绑定到Value之前被调用。如果失败,则认为统一失败。   它可能不确定地成功,在这种情况下,统一可能回溯以给出另一个答案。期望在“目标”中返回将Var绑定到“值”后要调用的目标列表。最后,在调用目标之后,将调用在Var上被阻止的所有目标。

上面的句子(由我突出显示)使我感到困惑-也很多:)

我一直认为统一是一种可以执行以下操作的过程:

  • 成功使用最通用的unifier(模数变量重命名)

  • 或失败。

但是不确定能否成功?!

约束解决程序的实现者何时使用“功能”?

我想不出一个用例...请帮助!


编辑

实际上,我认为(我的)求解器代码中的不确定性是一个错误,而不是功能。对于任何不确定性,可以通过在Goals中返回一些析取来轻松模拟。

1 个答案:

答案 0 :(得分:2)

您在XSB中发现了相同的行为:

  

verify_attributes(-Var,+ Value)
  每当一个   属性变量Var(至少具有一个属性)将要   绑定到值(非变量项或另一个属性   变量)。当将Var绑定到Value时,一个特殊的中断   称为属性变量中断被触发,然后XSB的   中断处理程序(用Prolog编写)调用verify_attributes / 2。如果它   失败,则认为统一失败。可能会成功   不确定的,在这种情况下,统一可能会倒退   给出另一个答案。
  http://xsb.sourceforge.net/shadow_site/manual2/node4.html

与返回目标的第三个参数无关, 待稍后执行。第三个参数甚至在 XSB,此回调中没有这样的第三个参数。我猜谜语解决方案是这样的,verify_attributes / 2钩子可能会留下一个选择点,并且随后的统一是在这个选择点的延续中。

以便在回溯期间再次尝试选择点。和 这意味着随后的统一被撤消,然后 如果选择点提供了进一步的解决方案,请再次尝试。凭借对回叫方式的巧妙组织,我猜每个Prolog系统都可以实现这一点,因为Prolog系统应该支持选择点。

但是由于缺乏用例,也可能没有它。 Frozen / 2和when / 2都不需要它,因为它们与实例化变量一起使用。典型的CLP(X)也不需要它,因为不需要选择点。但是它可能存在于XSB中,因为缺少了第三个参数。如果您不允许在验证挂钩中使用不确定性,则需要提供替代方法。

总结各种选择以弥补不确定性:

  • verify_attributes / 3:
    SICStus的verify_attributes / 2变体中的第三个参数,其中 是verify_attributes / 3。那里的目标可能是不确定的。的 目标将看到实例化的变量。

  • attr_unify_hook / 2:
    这是SWI-Prolog挂钩。它将看到实例化的变量 也一样但是一个小的测试表明它允许非确定性:

    Welcome to SWI-Prolog (threaded, 64 bits, version 8.1.4)

    ?- [user].
    |: foo:attr_unify_hook(_,_) :- write('a'), nl.
    |: foo:attr_unify_hook(_,_) :- write('b'), nl.
    |: 
    % user://1 compiled 0.01 sec, 2 clauses
    true.

    ?- put_attr(X, foo, 1), X=2.
    a
    X = 2 ;
    b
    X = 2.
  • sys_assume_cont/1
    这是内置的Jekejeke Prolog。具有相同的效果 SICStus中的第三个参数,但是可以在 执行verify_attributes / 2。