Prolog CLP中变量的暂定绑定

Prolog CLP中变量的暂定绑定,prolog,backtracking,Prolog,Backtracking,我试图通过使用SWI Prolog CLP(FD)解决一个调度问题。当我试图解决更大的问题时,我正在应用更先进的标记策略,在这里,更好地理解程序在什么时候失败和回溯是有益的。因此,我喜欢记录哪些变量绑定导致失败,并使用这些信息更好地适应我的标签启发。 为了说明,我生成了一个示例。我生成了一个谓词,它将变量列表绑定到一个值序列。我想知道序列的哪一部分使解决方案变得无效,并将这些变量记录在谓词的第三个参数中 vars_assign_fail(_, [], []). vars_assign_fail(

我试图通过使用SWI Prolog CLP(FD)解决一个调度问题。当我试图解决更大的问题时,我正在应用更先进的标记策略,在这里,更好地理解程序在什么时候失败和回溯是有益的。因此,我喜欢记录哪些变量绑定导致失败,并使用这些信息更好地适应我的标签启发。
为了说明,我生成了一个示例。我生成了一个谓词,它将变量列表绑定到一个值序列。我想知道序列的哪一部分使解决方案变得无效,并将这些变量记录在谓词的第三个参数中

vars_assign_fail(_, [], []).
vars_assign_fail([S|Vs], [S|Ss], Fs ) :-
    !,
    vars_assign_fail(Vs, Ss, Fs).
vars_assign_fail([_|Vs], [S|Ss], [S|Fs]) :-
    vars_assign_fail(Vs, Ss, Fs).
我现在可以测试这个谓词,只使用非常简单的约束

?- length(Vs, 6), As=[1, 2, 6, 9, 11, 3], Vs ins 1..5\/8..22, chain(Vs, #<), vars_assign_fail(Vs, As, Fs).
Vs = [1, 2, _51574, 9, 11, _51592],
As = [1, 2, 6, 9, 11, 3],
Fs = [6, 3],
_51574 in 3..5\/8,
_51592 in 12..22.
问题是,在第三个子句中,vars_assign_fail已经将Seq的值部分绑定到Vs.I,但是,它希望“撤消”这个(=回溯),并且只保留关于失败绑定(F | Fs)的信息。该信息位于谓词序列_fail _alternative _repearch中,以使用可选值的输入创建新序列,并再次运行“测试”,直到 找到有效的解决方案——或者,当运行完备选方案列表时,整个迭代失败


有谁能给我一些建议,告诉我如何在Prolog中最好地实现这一点?是否有可能再次解除Vs中变量的绑定,或仅暂时执行vars\u assign\u fail?您会推荐什么解决方案?

提示:not谓词可以应用两次(双重否定),您只关心目标是成功还是失败,以及是否应该放弃任何绑定。检查。 在vars\u assign\u fail/3的第二个子句中使用此选项,类似于:

vars_assign_fail(_, [], []).
vars_assign_fail([V|Vs], [S|Ss], Fs ) :-
    \+ \+ V=S, 
    !,
    vars_assign_fail(Vs, Ss, Fs).
vars_assign_fail([_|Vs], [S|Ss], [S|Fs]) :-
    vars_assign_fail(Vs, Ss, Fs).
vars_assign_fail(_, [], []).
vars_assign_fail([V|Vs], [S|Ss], Fs ) :-
    \+ \+ V=S, 
    !,
    vars_assign_fail(Vs, Ss, Fs).
vars_assign_fail([_|Vs], [S|Ss], [S|Fs]) :-
    vars_assign_fail(Vs, Ss, Fs).