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

Prolog约束逻辑编程(clpr)中的未知数顺序,prolog,clpr,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 也给我Y和Z的值?我得到的是: comp(9,Y,Z). 谢谢 可能是所用CLP(R)的一个缺点,即二次型情况不太好用。在Y=Z之后,很明显X=Y**2,然后当X=9且Y>0时,很容易

我有:

与查询相关的内容包括:

:-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
也给我Y和Z的值?我得到的是:

comp(9,Y,Z).

谢谢

可能是所用CLP(R)的一个缺点,即二次型情况不太好用。在Y=Z之后,很明显X=Y**2,然后当X=9且Y>0时,很容易得到Y=3。您使用哪一台中电(R)

CLP(R)不仅需要支持线性等式和不等式。例如,使用Gröbner基算法,CLP(R)可以做得更多,甚至在代数上。一些计算机代数系统可以很容易地做到这一点


所以我想这不是Prolog本身的问题,而是库的问题。严格来说,CLP(X)仅表示域X。对于实数的域R,有各种各样的势方程和不等式解算器。

使用模块在有限域上进行约束更好:

我得到:

comp(9,Y,Z).

跳转到X=Y**2对人类来说很容易,但即使X=Y*Y具有已知的X,也应该得出结论,Y也必须是可发现的。如何,是另一个问题。但它甚至可以在数字上完成。。。
:-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