如果我有
A in 0..4, A * A #=A.
有可能吗
A in 0..1.
我会说不,因为0 * 0 = 0,而1 * 1 = 1,所以这两个不能是A?
提前谢谢。
答案 0 :(得分:3)
您在这里要问的是CLPFD系统的一致性。一般来说,系统尽量保持一致性,尽可能保持良好的一致性。与一致性与速度的不同权衡取舍。但大多数时候他们只提供安全的近似值。然而,在这种情况下,一切看起来都很完美(这里使用SICStus):
| ?- A in 0..4, A * A #=A.
clpfd:(A*A#=A),
A in 0..1 ? ;
no
所以,我们得到一个答案:是的,有解决方案,只要clpfd(:A*A#=A), A in 0..1
是真的。 先验我们不能说是否是这种情况,但我们可能会尝试一下:
| ?- A in 0..4, A * A #=A, A = 1.
A = 1 ? ;
no
| ?- A in 0..4, A * A #=A, A = 0.
A = 0 ? ;
no
所以:0和1都是一个解决方案,因此A in 0..1
是一个完美的答案!