2010-10-03 6 views
3

Je suis générer une liste de règles de remplacement comme celui-ciMettre les choses à l'intérieur HoldPattern

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

ci-dessus ne fonctionne pas parce que « OP1 » est caché dans le tableau par HoldPattern, comment puis-je résoudre ce problème?

C'est un suivi précédent question

Répondre

2

Que diriez-vous

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

Edit: Pour résoudre le problème noté dans la réponse de belisarius, essayez:

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

Cela dépend évidemment que vous ayez une structure simple pour commencer, c'est-à-dire aucun autre & &.

+0

Parfois, je déteste lire le code intelligent dans Mathematica :) +1 –

1

Je suis sûr qu'il devrait y avoir une meilleure façon, mais cela semble fonctionner:

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

Modifier

Soyez prudent avec ceci:

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

Mais

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

Je suppose que certains Maintenez la touche [] bête est nécessaire pour sortir que si nécessaire ... faites-nous savoir

+0

En effet, l'inégalité [1, GreaterEqual, x, Moins, 2] évalue à Et [GreaterEqual [1, x], moins [x, 2 ]], le même problème se produit dans ma réponse ... – Simon

+0

@Simon oui, voir mon edit –

+0

Merci, ça marche. C'est en fait une partie d'essayer de faire http://stackoverflow.com/questions/3815496/plotting-linear-inequalities-in-mathematica mais il s'avère que le simple remplacement de = = == ne me donne pas de sommets de la région –

2

C'est un travail pour Avec:

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