【问题标题】:How to identify the inequality involved in an arithmetic expression specified by a prolog query?如何识别序言查询指定的算术表达式中涉及的不等式?
【发布时间】:2012-02-13 12:04:08
【问题描述】:

我正在编写序言并面临这种情况 - 在我的查询中,我传递了这样的内容:

?- query( 2*X + 3*Y >= 3*Z )

现在,我想做的是让 prolog 程序捕获不等式表达式,这样我就可以在变量中得到上述不等式,如下所示:

变量'Lhs'将有2*X + 3*Y 变量'Rhs'将有3*Z 现在我希望所涉及的不等式也被分配到某个地方(在一个名为 Opr?? 的变量中),所以说 Lhs Opr Rhs 之类的意思就像说“2*X + 3*Y >= 3*Z”..

这是我正在处理的场景的一般形式。我希望以某种方式识别所涉及的“不平等”,以便稍后在我的代码中使用它。

我正在开发带有 IC 库的 Eclipse-CLP。

【问题讨论】:

    标签: prolog logic constraint-programming


    【解决方案1】:

    您可以在任何 prolog 系统中使用 univ/2 运算符:

    parse_ops(Expr, Lhs, Rhs, Op):-
      Expr =.. [Op, Lhs, Rhs].
    
    ?- parse_ops(2*X + 3*Y >= 3*Z, Lhs, Rhs, Op).
    Lhs = 2*X+3*Y,
    Rhs = 3*Z,
    Op = (>=).
    

    【讨论】:

      【解决方案2】:

      你可以使用 univ 来分解你的不等式:

      Eq =.. [Op,Lhs,Rhs],
      

      这在两个方向都有效。

      【讨论】:

        【解决方案3】:

        这应该可以简单的做到:

        parse_query(LHS >= RHS, LHS, RHS).
        
        ?- parse_query(2*X + 3*Y >= 3*Z, LHS, RHS).
        LHS=2*X + 3*Y 
        RHS=3*Z
        

        您需要关注的是解析器在读取查询时使用的操作顺序。看看the op/3 operator for eclipse-clpthe op/3 operator doc for swi-prolog。请注意,不等式的优先级高于运算符。这意味着当解析查询 (2*X +3*Y >=3*Z) 时,>= 运算符成为函子。尝试使用显示谓词来明确这一点。

        ?- display(2*X + 3*Y >= 3*Z).
        >=(+(*(2,X), *(3,Y)), *(3,Z))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-07-23
          • 1970-01-01
          • 2022-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-25
          相关资源
          最近更新 更多