The metric tensor identifies a tensor with the one obtained by dualising the color of a single
index: contracting slot i of t against metricTensor (S.τ (c i)) returns a tensor of color
Function.update c i (S.τ (c i)), leaving every other slot alone. This is the raising and lowering
of a named index, T^{μν} ↦ T_{μ}{}^{ν}. toDualMapAtIndex i is that contraction, crossToSlot
against the metric, at every rank and every named slot.
A metric contracted against the metric at the dual color collapses to the unit tensor, in both
orders. So the contraction back against metricTensor (c i), fromDualMapAtIndex i, inverts it,
and the two assemble into the linear equivalence toDualAtIndex i: the two color assignments
carry the same information. Dualising the same index twice returns the original tensor, up to the
reindexing of the colors.
ii. Key results
TensorSpecies.Tensor.toDualMapAtIndex : dualise the color of the index i by contracting with
the metric tensor.
TensorSpecies.Tensor.fromDualMapAtIndex : the returning contraction, against the metric tensor
at c i.
TensorSpecies.Tensor.toDualMapAtIndex_toDualMapAtIndex : dualising the index i twice returns
the original tensor.
TensorSpecies.Tensor.toDualMapAtIndex_equivariant : dualising an index commutes with the
G-action.
TensorSpecies.Tensor.toDualAtIndex : raising and lowering the index i as a linear
equivalence.
iii. Table of contents
A. Dualising a named index
B. Contracting a metric against its dual
C. Dualising twice
D. The returning contraction
E. Equivariance
F. Raising and lowering as an equivalence
iv. References
@[expose]publicsection
A. Dualising a named index
B. Contracting a metric against its dual
The metric tensor at S.τ c contracted with the metric tensor at c is the unit tensor
at c.
Dualising the index i twice returns the original tensor, up to the reindexing of the
colors.
lemmatoDualMapAtIndex_toDualMapAtIndex{n:ℕ}{c:Finn→C}(i:Finn)(t:S.Tensorc):toDualMapAtIndex(S:=S)i(toDualMapAtIndex(S:=S)it)=permT(id:Finn→Finn)(IsReindexing.update_update_of_eqi(byk:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbn:ℕc:Finn→Ci:Finnt:S.Tensorc⊢ ci=S.τ(Function.updateci(S.τ(ci))i)simp[τ_τ_apply]All goals completed! 🐙))t:=byk:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbn:ℕc:Finn→Ci:Finnt:S.Tensorc⊢ (toDualMapAtIndexi)((toDualMapAtIndexi)t)=(permTid⋯)tcasesnwith|zero=>zerok:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbc:Fin0→Ci:Fin0t:S.Tensorc⊢ (toDualMapAtIndexi)((toDualMapAtIndexi)t)=(permTid⋯)texacti.elim0All goals completed! 🐙|succnA=>succk:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbnA:ℕc:Fin(nA+1)→Ci:Fin(nA+1)t:S.Tensorc⊢ (toDualMapAtIndexi)((toDualMapAtIndexi)t)=(permTid⋯)t-- Both metrics enter at literal colors, matched by `S.τ_τ_apply`, so neither is transported.havekey:=crossToSlot_raise_lower_round_trip(S:=S)i(he:=rfl)(ha:=rfl)(hb:=S.τ_τ_apply(ci))(M:=metricTensor(S:=S)(S.τ(ci)))(M':=metricTensor(S:=S)(ci))(hM:=crossToEnd_dual_metricTensor_metricTensor)(t:=t)succk:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbnA:ℕc:Fin(nA+1)→Ci:Fin(nA+1)t:S.Tensorckey:(crossToSloti0⋯(metricTensor(ci)))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)t⊢ (toDualMapAtIndexi)((toDualMapAtIndexi)t)=(permTid⋯)t-- The second dualisation reads its metric at the composite color the first one left behind.rw[toDualMapAtIndex,succk:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbnA:ℕc:Fin(nA+1)→Ci:Fin(nA+1)t:S.Tensorckey:(crossToSloti0⋯(metricTensor(ci)))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)t⊢ (crossToSloti0⋯(metricTensor(S.τ(Function.updateci(S.τ(ci))i))))((toDualMapAtIndexi)t)=(permTid⋯)tsucck:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbnA:ℕc:Fin(nA+1)→Ci:Fin(nA+1)t:S.Tensorckey:(crossToSloti0⋯(metricTensor(ci)))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)t⊢ (crossToSloti0⋯((permTid⋯)(metricTensor(ci))))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)ttoDualMapAtIndex,succk:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbnA:ℕc:Fin(nA+1)→Ci:Fin(nA+1)t:S.Tensorckey:(crossToSloti0⋯(metricTensor(ci)))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)t⊢ (crossToSloti0⋯(metricTensor(S.τ(Function.updateci(S.τ(ci))i))))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)tsucck:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbnA:ℕc:Fin(nA+1)→Ci:Fin(nA+1)t:S.Tensorckey:(crossToSloti0⋯(metricTensor(ci)))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)t⊢ (crossToSloti0⋯((permTid⋯)(metricTensor(ci))))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)tmetricTensor_congr(byk:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbnA:ℕc:Fin(nA+1)→Ci:Fin(nA+1)t:S.Tensorckey:(crossToSloti0⋯(metricTensor(ci)))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)t⊢ S.τ(Function.updateci(S.τ(ci))i)=cisucck:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbnA:ℕc:Fin(nA+1)→Ci:Fin(nA+1)t:S.Tensorckey:(crossToSloti0⋯(metricTensor(ci)))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)t⊢ (crossToSloti0⋯((permTid⋯)(metricTensor(ci))))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)tsimp[Function.update_self,τ_τ_apply]All goals completed! 🐙succk:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbnA:ℕc:Fin(nA+1)→Ci:Fin(nA+1)t:S.Tensorckey:(crossToSloti0⋯(metricTensor(ci)))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)t⊢ (crossToSloti0⋯((permTid⋯)(metricTensor(ci))))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)t:S.τ(Function.updateci(S.τ(ci))i)=ci)]succk:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbnA:ℕc:Fin(nA+1)→Ci:Fin(nA+1)t:S.Tensorckey:(crossToSloti0⋯(metricTensor(ci)))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)t⊢ (crossToSloti0⋯((permTid⋯)(metricTensor(ci))))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)terw[crossToSlot_permT_right_id,succk:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbnA:ℕc:Fin(nA+1)→Ci:Fin(nA+1)t:S.Tensorckey:(crossToSloti0⋯(metricTensor(ci)))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)t⊢ (permTid⋯)((crossToSloti0⋯(metricTensor(ci)))((crossToSloti0⋯(metricTensor(S.τ(ci))))t))=(permTid⋯)tkey,succk:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbnA:ℕc:Fin(nA+1)→Ci:Fin(nA+1)t:S.Tensorckey:(crossToSloti0⋯(metricTensor(ci)))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)t⊢ (permTid⋯)((permTid⋯)t)=(permTid⋯)tpermT_permTsucck:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbnA:ℕc:Fin(nA+1)→Ci:Fin(nA+1)t:S.Tensorckey:(crossToSloti0⋯(metricTensor(ci)))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)t⊢ (permT(id∘id)⋯)t=(permTid⋯)t]succk:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbnA:ℕc:Fin(nA+1)→Ci:Fin(nA+1)t:S.Tensorckey:(crossToSloti0⋯(metricTensor(ci)))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)t⊢ (permT(id∘id)⋯)t=(permTid⋯)texactpermT_congr(byk:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbnA:ℕc:Fin(nA+1)→Ci:Fin(nA+1)t:S.Tensorckey:(crossToSloti0⋯(metricTensor(ci)))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)t⊢ id∘id=idfunextjk:Typeinst✝⁵:RCLikekC:TypeG:Typeinst✝⁴:GroupGV:C→Typeinst✝³:(c:C)→AddCommGroup(Vc)inst✝²:(c:C)→Modulek(Vc)basisIdx:C→Typeinst✝¹:(c:C)→Fintype(basisIdxc)inst✝:(c:C)→DecidableEq(basisIdxc)rep:(c:C)→RepresentationkG(Vc)b:(c:C)→Module.Basis(basisIdxc)k(Vc)S:TensorSpecieskCGVbasisIdxrepbnA:ℕc:Fin(nA+1)→Ci:Fin(nA+1)t:S.Tensorckey:(crossToSloti0⋯(metricTensor(ci)))((crossToSloti0⋯(metricTensor(S.τ(ci))))t)=(permTid⋯)tj:Fin(nA+1)⊢ (id∘id)j=idj;simpAll goals completed! 🐙)rfl