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