0

这是我在 prolog 中的算术不等式表达式:

2*X + 3*Y > 4*Z

我像这样使用统一术语操纵器:

Expr =.. [Op, Lhs, Rhs]

现在我Lhs = 2*X + 3*Y, Rhs as 4*Z and Op as > 一切都很好,直到现在。

我想要的是使用 Eclipse Prolog 中的 IC 库为这个表达式构建一个延迟的目标。例如,我希望像这样分配一个新创建的变量:

Eq = (Lhs #Op Rhs)  %meaning, Eq = (2*X + 3*Y #> 4*Z)

现在,由于所需的不等式(在本例中为 >)存储在 Op 中,尽管我使用Eq = (Lhs #Op Rhs),但 eclipse 正在返回错误。

当我的运算符要取自变量 Op 时,我如何创建这个延迟约束?谢谢你。

4

1 回答 1

1

您可以使用事实来定义关系:

cstr(=,#=).

或使用concat_atom/2

concat_atom([#,Op],CstrOp),

例如:

?- Eq = (X = 1),
   Eq =.. [Op, L, R],
   concat_atom([#, Op], CstrOp),
   Cstr =.. [CstrOp, L, R],
   call(Cstr).
Eq = 1 = 1
X = 1
Op = =
L = 1
R = 1
CstrOp = #=
Cstr = 1 #= 1
Yes (0.00s cpu)

请注意,这只适用于基本的等式/不等式运算符。您不能#只添加到任何运算符并期望它作为约束工作!

于 2012-02-13T15:19:31.247 回答