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

发布于 2025-01-05 08:53:59 字数 466 浏览 0 评论 0原文

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

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

现在,我想做的是让 prolog 程序捕获不等式表达式,以便我可以在变量中包含上述不等式,如下所示:

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

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

我正在使用 IC 库开发 Eclipse-CLP。

I am working on prolog and faced this scenario -
In my query, I pass something like this:

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

Now, what I would like to do is have the prolog program capture the inequality expression so that I can have the above inequality in variables like below:

variable 'Lhs' will have 2*X + 3*Y
variable 'Rhs' will have 3*Z
Now I want the inequality involved to be also assigned somewhere (in a variable called Opr??), so that saying something like Lhs Opr Rhs would mean exactly like saying "2*X + 3*Y >= 3*Z"..

This is a general form of the scenario that I am working on. I somehow want the "inequality" involved to be identified, so that I can use it later in my code.

I am working on Eclipse-CLP with IC library.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

蓝眼睛不忧郁 2025-01-12 08:53:59

您可以使用 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 = (>=).

You can do it with any prolog system, using the univ/2 operator:

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 = (>=).
猫九 2025-01-12 08:53:59

您可以使用 univ 来反汇编您的不等式:

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

这在两个方向上都有效。

You can use univ to disassemble your inequaliy:

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

This works in both directions.

凯凯我们等你回来 2025-01-12 08:53:59

这应该能够简单地执行以下操作:

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))

This should be able to simply do:

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

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

What you need to be concerned here with is order of operations the Parser uses when reading your query. Take a look at the op/3 operator for eclipse-clp and the op/3 operator doc for swi-prolog. Notice the precedence number for inequalities are higher than operators. This means that when the query (2*X +3*Y >=3*Z) is parsed, the >= operator becomes the functor. Try to use the display predicate to make this clear.

?- display(2*X + 3*Y >= 3*Z).
>=(+(*(2,X), *(3,Y)), *(3,Z))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文