我有:
:-use_module(library(clpr)).
comp(X, Y, Z):-
{X = Y * Z, Y = Z, Y > 0, Z > 0}.
其中与查询:
?-comp(X,3,Z).
收益 率:
X = 9.0,
Z = 3.0
不出所料。但为什么不呢
comp(9,Y,Z).
还给我 Y 和 Z 的值?相反,我得到的是:
{Z>0.0,Y=Z,9-Y*Z=0.0},
{9-Y*Z=0.0},
{9-Y*Z=0.0}
谢谢!
可能是使用的 CLP(R( 的一个弱点,即二次情况不能很好地工作。在 Y = Z 之后,很明显 X = Y**2,然后 X = 9 且 Y> 0,您应该很容易得到 Y = 3。您使用哪种 CLP(R(?
CLP(R( 不仅需要支持线性等式和不等式。例如,使用Gröbner基算法,CLP(R(可以做更多的事情,甚至是代数。一些计算机代数系统可以很容易地做到这一点。
所以我想这不是Prolog本身的问题,而是库的问题。严格来说,CLP(X(只表示域X。对于实数的域R,有各种各样的潜在方程和不等式求解器。
使用此模块对有限域进行约束更好:
:-use_module(library(clpfd)).
comp(X, Y, Z):-
X #= Y * Z, Y #= Z, Y #> 0, Z #> 0.
跟
comp(9,Y,Z).
我得到:
Y = Z, Z = 3