Overbar comme compteur dans une boucle

Nov 01 2020

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:

  1. Pourquoi cela arrive-t-il?
  2. 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

5 CarlWoll Nov 01 2020 at 15:38

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

5 mikado Nov 01 2020 at 13:13

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.