Prolog 约束逻辑编程 (clpr) 中的未知顺序



我有:

:-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

相关内容

最新更新