这里是序幕环节:
?- 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的工作方式吗,在尝试使用受约束的变量之前,我总是需要调用label吗?
答案 0 :(得分:2)
从某种意义上说,发生这种情况是因为您使用的clpfd太少了:在当前的Prolog系统中,length/2
并未考虑待处理的约束!
我认为实现length/2
的变体确实是一个挑战。理想情况下,它也应与CLP(B),CLP(Q)等一起使用!一般情况下,使求解器与此类谓词 合作的方式尚不清楚。