属性变量允许扩展统一。以下是有关界面的奥秘细节。让我们开始追逐吧!
在sicstus-prolog中
库(atts)提供使用属性变量的谓词。
除了关于verify_attributes(-Var, +Value, -Goals)
的一个细节之外,我想我明白SICStus Prolog User's Manual page for library(atts)所说的话:
[...] verify_attributes / 3在Var实际绑定到Value之前被调用。如果失败,则认为统一失败。 它可能不确定地成功,在这种情况下,统一可能回溯以给出另一个答案。期望在“目标”中返回将Var绑定到“值”后要调用的目标列表。最后,在调用目标之后,将调用在Var上被阻止的所有目标。
上面的句子(由我突出显示)使我感到困惑-也很多:)
我一直认为统一是一种可以执行以下操作的过程:
成功使用最通用的unifier(模数变量重命名)
或失败。
但是不确定能否成功?!
约束解决程序的实现者何时使用“功能”?
我想不出一个用例...请帮助!
实际上,我认为(我的)求解器代码中的不确定性是一个错误,而不是功能。对于任何不确定性,可以通过在Goals
中返回一些析取来轻松模拟。
答案 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.