gpt4 book ai didi

prolog - CLP 中变量的暂定绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 15:09:27 25 4
gpt4 key购买 nike

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

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.

它告诉我值 6 和 3 在这个程序中发出了失败。所以我想使用这些信息来修改我的测试序列,利用有限数量的替代值。最后我想达到如下目的:

solution_valueSeq_alternatives(Vs, Seq, []) :-
!,
fail.
solution_valueSeq_alternatives(Vs, Seq, Alt) :-
vars_assign_fail(Vs, Seq, []).
solution_valueSeq_alternatives(Vs, Seq, [A|Alt]) :-
vars_assign_fail(Vs, Seq, [F|Fs]),
sequence_fail_alternative_rearrange(Seq, [F|Fs], A, Reseq),
solution_valueSeq_alternatives(Vs, Reseq, Alt).

问题在于,在第三个子句中,vars_assign_fail 已经将 Seq 的值部分绑定(bind)到 Vs。但是,我想“撤消”此操作(=回溯)并仅保留有关失败的绑定(bind)的信息 (F|Fs)。此信息在谓词 sequence_fail_alternative_rearrange 中使用,以便使用替代值的输入创建新序列,并再次运行“测试”,直到找到有效的解决方案 - 或者当用完备选方案列表时整个迭代失败。

谁能给我建议如何在 Prolog 中最好地实现它?有没有可能再次解绑Vs中的变量或者只是暂时执行vars_assign_fail?您会推荐什么解决方案?

最佳答案

提示:not 谓词可以应用两次(双重否定),您只关心 Goal 是成功还是失败以及是否应丢弃任何绑定(bind)。检查Why double negation doesn't bind in Prolog .在 vars_assign_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).

关于prolog - CLP 中变量的暂定绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65456276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com