Помещение вещей в HoldPattern - PullRequest
3 голосов
/ 04 октября 2010

Я создаю список правил замены, подобных этому

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

Выше не работает, потому что "op1" скрыт от таблицы HoldPattern, как мне это исправить?* Это продолжение предыдущего вопроса

Ответы [ 3 ]

2 голосов
/ 04 октября 2010

Как насчет

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

Редактировать: Чтобы исправить проблему, отмеченную в ответе Велисария, попробуйте:

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

Это, очевидно, зависит от того, что у вас есть простая структура, т.е.нет других && 's.

2 голосов
/ 21 ноября 2010

Это работа для С :

ops = {LessEqual, GreaterEqual};
ineqRules =
  Table[
    With[{op1=op1},
      HoldPattern[Inequality[a_, op1, c_ ,_ ,e_]] -> a == c
    ],
    {op1, ops}
  ]
1 голос
/ 04 октября 2010

Я уверен, что должен быть лучший способ, но это, кажется, работает:

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 [] ... дайте нам знать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...