Overbar como contador em um loop

Nov 01 2020

Quero criar uma mesa com quatro contadores diferentes que quero chamar $a, \bar{a}, b, \bar{b}$. Para isso, meu código óbvio é

$$\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}$$

que retorna

{{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]}}

No entanto, uma rápida olhada mostra que este não é o resultado esperado - os elementos da primeira linha são repetidos. Se eu escrever

Table[p[a, c, b, d] , {a, 0, 1}, {c, 0, 1}, {b, 0, 1}, {d, 0, 1}] // Grid

em vez disso, obtenho a saída desejada. Portanto, minha pergunta é dupla:

  1. Por que isso acontece?
  2. Como pode ser consertado? Ou seja, posso usar variáveis ​​como$\bar{a}$ ou $a'$ ou $a_1$ para loops modificando algo ou sou forçado a usar outros nomes que não envolvam esses símbolos?

Respostas

5 CarlWoll Nov 01 2020 at 15:38

Você pode fornecer OverBaro HoldFirstatributo para que ele não dependa do valor de a:

SetAttributes[OverBar,HoldFirst]

Então:

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

Verdadeiro

5 mikado Nov 01 2020 at 13:13

O problema é que o Mathematica trata OverBarcomo uma função, então OverBar[a]é uma função do seu símbolo a, não um símbolo independente.

Eu evitaria usar esses símbolos, mas se a aparência for importante para você, investigue a Symbolizefuncionalidade do Notationpacote.