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}

谢谢!

4

2 回答 2

2

可能是使用过的 CLP(R) 的一个弱点,即二次案例不能很好地工作。在 Y = Z 之后,很明显 X = Y**2,然后在 X = 9 且 Y > 0 的情况下,你应该很容易得到 Y = 3。你使用哪个 CLP(R)?

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

所以我想这不是 Prolog 本身的问题,而是图书馆的问题。严格来说,CLP(X) 只表示一个域 X。对于实数域 R,有各种各样的潜在方程和不等式求解器。

于 2018-08-26T23:51:35.717 回答
1

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

:-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
于 2018-08-29T19:19:13.727 回答