【问题标题】:Order of unknowns in Prolog constraint logic programming (clpr)Prolog 约束逻辑编程 (clpr) 中的未知数顺序
【发布时间】:2018-08-26 16:16:20
【问题描述】:

我有:

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

谢谢!

【问题讨论】:

    标签: prolog clpr


    【解决方案1】:

    可能是使用过的 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,有各种各样的潜在方程和不等式求解器。

    【讨论】:

    • 跳到 X = Y**2 对人类来说很容易,但即使 X = Y*Y 已知 X 也应该得出结论 Y 也必须是可发现的。如何,是另一个问题。但它甚至可以在数字上完成......
    【解决方案2】:

    使用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
    

    【讨论】:

      猜你喜欢
      • 2014-12-03
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多