Hi,
When preparing sample code for my prior question, I noticed that substitute()
was affected by the definition of an additional expression that was not passed in as input. In particular, when the code below
ex := (\Gamma^{a b})_{\alpha \beta} (\Psi_{b a})_{\gamma \eta};
substitute(ex, $_{a} -> _{b}, ^{a} -> ^{b}, _{b} -> _{a}, ^{b} -> ^{a}$);
is placed in a file test.cnb and run by entering cadabra2 test.cnb
in the terminal, the output is
\indexbracket(Γ^{a b})_{α β} \indexbracket(Ψ_{b a})_{γ η}
\indexbracket(Γ^{b a})_{α β} \indexbracket(Ψ_{a b})_{γ η}
as expected. However, when the code in test.cnb is
ex := (\Gamma^{a b})_{\alpha \beta} (\Psi_{b a})_{\gamma \eta};
ex2 := (\Gamma^{a})_{\alpha \beta} (\Psi_{b})_{\gamma \eta};
substitute(ex, $_{a} -> _{b}, ^{a} -> ^{b}, _{b} -> _{a}, ^{b} -> ^{a}$);
the output is
\indexbracket(Γ^{a b})_{α β} \indexbracket(Ψ_{b a})_{γ η}
\indexbracket(Γ^{a})_{α β} \indexbracket(Ψ_{b})_{γ η}
\indexbracket(Γ^{a})_{α β} \indexbracket(Ψ_{b})_{γ η}
That is, substitute()
seems to be returning ex2
. This bug does not appear when entering the code line-by-line into the cadabra2 CLI.
The full code of test.cnb giving the latter result is shown below.
{a,b,c,d,e}::Indices(vector)
{a,b,c,d,e}::Integer(0..10)
{\alpha,\beta,\gamma,\eta}::Indices(spinor)
\Gamma_{#}::GammaMatrix(metric=\delta)
\delta{#}::KroneckerDelta
ex := (\Gamma^{a b})_{\alpha \beta} (\Psi_{b a})_{\gamma \eta};
ex2 := (\Gamma^{a})_{\alpha \beta} (\Psi_{b})_{\gamma \eta};
substitute(ex, $_{a} -> _{b}, ^{a} -> ^{b}, _{b} -> _{a}, ^{b} -> ^{a}$);
-Simon