0

私はプロローグに取り組んでいて、このシナリオに直面しました-私のクエリでは、次のようなものを渡します:

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

さて、私がやりたいのは、プロローグプログラムに不等式をキャプチャさせて、以下のような変数で上記の不等式を持つことができるようにすることです。

変数' Lhs'は2*X + 3*Y 変数' Rhs'になります3*Z 今、私は関係する不等式をどこかに(Opr ??と呼ばれる変数で)割り当てたいので、LhsOprRhsのようなことを言うことはまさに" 2*X + 3*Y >= 3*Z"を言うことを意味します。

これは、私が取り組んでいるシナリオの一般的な形式です。どういうわけか、関係する「不等式」を特定して、後でコードで使用できるようにしたいと思います。

私はICライブラリを使用してEclipse-CLPに取り組んでいます。

4

3 に答える 3

3

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 = (>=).
于 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述語を使用してみてください。

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