Overbar comme compteur dans une boucle
Je souhaite créer une table avec quatre compteurs différents que je souhaite appeler $a, \bar{a}, b, \bar{b}$. Pour cela, mon code évident est
$$\text{Table}\left[p\left[a,\bar{a},b,\bar{b}\right],\{a,0,1\},\left\{\bar{a},0,1\right\},\{b,0,1\},\left\{\bar{b},0,1\right\}\right] // \text{Grid}$$
qui retourne
{{p[0,0,0,0],p[0,1,0,1]},{p[0,1,1,0],p[0,1,1,1]}} {{p[0,0,0,0],p[0,1,0,1]},{p[0,1,1,0],p[0,1,1,1]}}
{{p[1,0,0,0],p[1,0,0,1]},{p[1,0,1,0],p[1,1,1,1]}} {{p[1,1,0,0],p[1,1,0,1]},{p[1,0,1,0],p[1,1,1,1]}}
Cependant, un rapide coup d'œil montre que ce n'est pas le résultat attendu - les éléments de la première ligne sont répétés. Si j'écris
Table[p[a, c, b, d] , {a, 0, 1}, {c, 0, 1}, {b, 0, 1}, {d, 0, 1}] // Grid
au lieu de cela, j'obtiens la sortie souhaitée. Ma question est donc double:
- Pourquoi cela arrive-t-il?
- Comment y remédier? Autrement dit, puis-je utiliser des variables telles que$\bar{a}$ ou $a'$ ou $a_1$ pour des boucles modifiant quelque chose ou je suis obligé d'utiliser d'autres noms qui n'impliquent pas ces symboles?
Réponses
Vous pouvez donner OverBarl' HoldFirstattribut afin qu'il ne dépende pas de la valeur de a:
SetAttributes[OverBar,HoldFirst]
Ensuite:
t1 = Table[
p[a, OverBar[a], b, OverBar[b]],
{a, 0, 1}, {OverBar[a], 0, 1}, {b, 0, 1}, {OverBar[b], 0, 1}
];
t2 = Table[p[a, c, b, d], {a, 0, 1}, {c, 0, 1}, {b, 0, 1}, {d, 0, 1}];
t1 === t2
Vrai
Le problème est que Mathematica traite OverBarcomme une fonction, donc OverBar[a]c'est une fonction de votre symbole a, pas un symbole indépendant.
J'éviterais d'utiliser de tels symboles, mais si l'apparence est importante pour vous, examinez la Symbolizefonctionnalité du Notationpackage.