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

Order of unknowns in Prolog constraint logic programming (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,有各种各样的势方程和不等式求解器。

使用 this 模块更好地限制有限域:

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