Prolog中的算术运算

时间:2014-05-17 18:11:07

标签: prolog clpfd

如果我有

A in 0..4, A * A #=A.

有可能吗

A in 0..1.

我会说不,因为0 * 0 = 0,而1 * 1 = 1,所以这两个不能是A?

提前谢谢。

1 个答案:

答案 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是一个完美的答案!

顺便说一句,你在SICStus,SWI,B和GNU中得到(基本上)相同的答案。