为什么我需要 运行 clpfd:label/1 才能终止查询?

Why do I need to run clpfd:label/1 for my query to terminate?

这是序言部分:

?- use_module(library(clpfd)).
true.

?- Large #>= Small, Small #> 0, length([1, 2], Large).
Large = 2,
Small in 1..2.

?- Large #>= Small, Small #> 0, length([1, 2], Large), length(List, Small).
Large = 2,
Small = 1,
List = [_5770] ;
Large = Small, Small = 2,
List = [_5770, _5776] ;
^CAction (h for help) ? abort
% Execution Aborted
?- Large #>= Small, Small #> 0, length([1, 2], Large), label([Small]), length(List, Small).
Large = 2,
Small = 1,
List = [_4464] ;
Large = Small, Small = 2,
List = [_4478, _4484].

?-

第一个查询工作正常。一旦枚举了所有解决方案,第二个查询将永远循环。第三个查询有效,但我不知道为什么。

这就是 clpfd 的工作方式吗,我总是需要在尝试使用约束变量之前调用标签?

在某种意义上,发生这种情况是因为您正在使用 "too little" clpfd:在当前的 Prolog 系统中,length/2 不考虑未决约束!

我把它作为一个挑战来实现 length/2 的变体。但理想情况下,它也应该与 CLP(B)、CLP(Q) 等一起使用!一般一般让求解器与这样的谓词合作的方法还不清楚