把东西放在HoldPattern里面

时间:2010-10-03 21:26:38

标签: wolfram-mathematica

我正在生成一个像这样的替换规则列表

ops = {LessEqual, GreaterEqual};
ineqRules = Table[HoldPattern[Inequality[a_, op1, c_, _, e_]] -> a == c, {op1, ops}]

上面不起作用,因为HoldPattern从Table中隐藏了“op1”,我该如何解决?

这是之前question

的后续行动

3 个答案:

答案 0 :(得分:2)

怎么样

ops = {LessEqual, GreaterEqual};    
ineqRules = (HoldPattern[Inequality[a_, #, c_, _, e_]] :> a == c) & /@ ops

编辑:要解决belisarius答案中提到的问题,请尝试:

ineqRules=Flatten[{HoldPattern[Inequality[a_,#,c_,___]]:>a==c,HoldPattern[#[a_,c_]&&___]:>a==c}&/@ops]

这显然取决于你有一个简单的结构,即没有其他&&'s。

答案 1 :(得分:2)

这是使用

的工作
ops = {LessEqual, GreaterEqual};
ineqRules =
  Table[
    With[{op1=op1},
      HoldPattern[Inequality[a_, op1, c_ ,_ ,e_]] -> a == c
    ],
    {op1, ops}
  ]

答案 2 :(得分:1)

我确信应该有更好的方法,但这似乎有效:

ops = {LessEqual, GreaterEqual};
ineqRules[op_] := HoldPattern[Inequality[a_, op, c_, _, e_]] -> a == c;
ineq = Table[ineqRules[op], {op, ops}];
Inequality[1, LessEqual, x, Less, 2] /. ineq

Out: 1 == x

HTH

修改

小心这一点:

Inequality[e1, GreaterEqual, e2, Equal, e3] /. ineq
Out> e1 == e2

但是

Inequality[1, GreaterEqual, e2, Equal, 2] /. ineq
Out> False

我想如果需要的话,我需要一些Hold []野兽......让我们知道