首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别由prolog查询指定的算术表达式所涉及的不等式?

如何识别由prolog查询指定的算术表达式所涉及的不等式?
EN

Stack Overflow用户
提问于 2012-02-13 20:04:09
回答 3查看 208关注 0票数 0

我在prolog上工作,面对这样的场景-在我的查询中,我传递了类似这样的东西:

代码语言:javascript
复制
?- 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。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-13 21:17:43

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

代码语言:javascript
复制
Eq =.. [Op,Lhs,Rhs],

这在两个方向上都有效。

票数 2
EN

Stack Overflow用户

发布于 2012-02-13 21:18:12

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

代码语言:javascript
复制
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 = (>=).
票数 3
EN

Stack Overflow用户

发布于 2012-02-13 22:07:52

这应该能够简单地做到:

代码语言:javascript
复制
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谓词来阐明这一点。

代码语言:javascript
复制
?- display(2*X + 3*Y >= 3*Z).
>=(+(*(2,X), *(3,Y)), *(3,Z))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9260202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档