这是一段简短的代码片段,这是我经常遇到的情况的一个例子,它不能像你期望的那样工作:
?- L in 1..3, length(Ls, L). L = 1, Ls = [_G2634] ; L = 2, Ls = [_G2634, _G2637] ; L = 3, Ls = [_G2634, _G2637, _G2640] ; <infinite loop>
我们很容易看出length/2
与约束条件不相符。当人们期望length/2
在尝试实例化列表之前检查其第二个参数是否在正确的域中时,它似乎反过来并且在尝试实例化列表之后检查其第二个参数是否遵守约束。
这个问题通常如何解决?我们可以提出什么样的说法clength/2
,以便上面的示例正确终止?