我在prolog上工作,面对这样的场景-在我的查询中,我传递了类似这样的东西:
?- query( 2*X + 3*Y >= 3*Z )现在,我想要做的是让prolog程序捕获不等式表达式,这样我就可以在变量中获得上面的不等式,如下所示:
变量'Lhs‘将具有变量'Rhs’将具有3*Z。现在我希望所涉及的不等式也被赋值到某个地方(在名为Opr??的变量中),这样说起来就像说Lhs Opr Rhs一样,意思就是说“2*X + 3*Y >= 3*Z”。
这是我正在处理的场景的一般形式。不知何故,我希望标识涉及到的“不平等”,以便稍后在代码中使用它。
我正在使用IC库开发Eclipse-CLP。
发布于 2012-02-13 21:17:43
你可以使用univ来分解你的不等式:
Eq =.. [Op,Lhs,Rhs],这在两个方向上都有效。
发布于 2012-02-13 21:18:12
您可以使用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-13 22:07:52
这应该能够简单地做到:
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-clp和the op/3 operator doc for swi-prolog。请注意,不等式的优先数高于运算符。这意味着当解析查询(2*X +3*Y >=3*Z)时,>=操作符成为函数器。尝试使用display谓词来阐明这一点。
?- display(2*X + 3*Y >= 3*Z).
>=(+(*(2,X), *(3,Y)), *(3,Z))https://stackoverflow.com/questions/9260202
复制相似问题