0

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

?- 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。

4

3 回答 3

3

您可以使用univ/2运算符在任何 prolog 系统中执行此操作:

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 = (>=).
于 2012-02-13T13:18:12.047 回答
2

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

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

这在两个方向上都有效。

于 2012-02-13T13:17:43.443 回答
0

这应该能够简单地做到:

parse_query(LHS >= RHS, LHS, RHS).

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

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

?- display(2*X + 3*Y >= 3*Z).
>=(+(*(2,X), *(3,Y)), *(3,Z))
于 2012-02-13T14:07:51.590 回答