Imports
/-
Copyright (c) 2025 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
module
public import Physlib.Relativity.Tensors.ComponentIdx.Single
public import Physlib.Relativity.Tensors.Contraction.SuccSuccAbove
public import Mathlib.Topology.Algebra.Module.ModuleTopology
public import Mathlib.Analysis.RCLike.Basic
public import Mathlib.Tactic.Cases
public import Mathlib.GroupTheory.Perm.FinReindexing of tensor components
In this file we give results related to the reindexing of tensors.
If a tensor has indices specified by a list of colors c : Fin n → C, then reindexing the
tensor corresponds to a bijection σ : Fin m → Fin n such that c ∘ σ = c1 for some other
list of colors c1 : Fin m → C. A reindexing might take a tensor ψⁱⱼ to a tensor ψʲᵢ
by reordering the indices, or it might take a tensor ψⁱⱼᵏ to a tensor ψⁱᵏ.
We are interested in the interaction of reindexing with the following operations on tensors:
Fin.append corresponds to the product of tensors.
Fin.succAbove corresponds to the evaluation of a tensor at a given index.
Fin.succSuccAbove corresponds to the contraction of a tensor at two given indices.
@[expose] public sectionIndex maps
The finite index maps out of which the reindexings below are built: Fin.append for products and
Fin.succAbove for a deleted slot. The lemmas on Fin.succSuccAbove, for a deleted pair, are in
Physlib.Relativity.Tensors.Contraction.SuccSuccAbove.
Splitting Fin (m + n) into its two blocks and reassembling them is the identity.
lemma append_castAdd_natAdd_eq_id {m n : ℕ} :
Fin.append (Fin.castAdd n) (Fin.natAdd m) = (id : Fin (m + n) → Fin (m + n)) := m:ℕn:ℕ⊢ append (castAdd n) (natAdd m) = id
All goals completed! 🐙
Moving slot i to the end is the cycle [i, last]: the block map that lists the
i.succAbove survivors in order and then i is Fin.cycleIcc i (Fin.last n).
All goals completed! 🐙
Given two lists of indices c : Fin n → C and c1 : Fin m → C a map
σ : Fin m → Fin n satisfies the condition IsReindexing c c1 σ if it is:
A bijection
Forms a commutative triangle with c and c1.
def IsReindexing {n m : ℕ} (c : Fin n → C) (c1 : Fin m → C)
(σ : Fin m → Fin n) : Prop :=
Function.Bijective σ ∧ ∀ i, c (σ i) = c1 iProperties of the underlying function
lemma injective {n m : ℕ} {c : Fin n → C} {c1 : Fin m → C}
{σ : Fin m → Fin n} (h : IsReindexing c c1 σ) : Function.Injective σ := h.1.1lemma surjective {n m : ℕ} {c : Fin n → C} {c1 : Fin m → C}
{σ : Fin m → Fin n} (h : IsReindexing c c1 σ) : Function.Surjective σ := h.1.2lemma auto {n m : ℕ} {c : Fin n → C} {c1 : Fin m → C}
{σ : Fin m → Fin n} (h : IsReindexing c c1 σ := by {simp [IsReindexing]; try decide}) :
IsReindexing c c1 σ := h@[simp]
lemma on_id {n : ℕ} {c c1 : Fin n → C} :
IsReindexing c c1 (id : Fin n → Fin n) ↔ ∀ i, c i = c1 i := by C:Typen:ℕc:Fin n → Cc1:Fin n → C⊢ IsReindexing c c1 id ↔ ∀ (i : Fin n), c i = c1 i
simp [IsReindexing] All goals completed! 🐙lemma on_id_symm {n : ℕ} {c c1 : Fin n → C} (h : IsReindexing c1 c id) :
IsReindexing c c1 (id : Fin n → Fin n) := by C:Typen:ℕc:Fin n → Cc1:Fin n → Ch:IsReindexing c1 c id⊢ IsReindexing c c1 id
simp at h ⊢ C:Typen:ℕc:Fin n → Cc1:Fin n → Ch:∀ (i : Fin n), c1 i = c i⊢ ∀ (i : Fin n), c i = c1 i
exact fun i => (h i).symm All goals completed! 🐙
For a map σ satisfying IsReindexing c c1 σ, the inverse of that map.
def inv {n m : ℕ} {c : Fin n → C} {c1 : Fin m → C}
(σ : Fin m → Fin n) (h : IsReindexing c c1 σ) : Fin n → Fin m :=
Fintype.bijInv h.1
For a map σ : Fin m → Fin n satisfying IsReindexing c c1 σ,
that map lifted to an equivalence between
Fin n and Fin m.
def toEquiv {n m : ℕ} {c : Fin n → C} {c1 : Fin m → C}
{σ : Fin m → Fin n} (h : IsReindexing c c1 σ) :
Fin n ≃ Fin m where
toFun := inv σ h
invFun := σ
left_inv := Fintype.rightInverse_bijInv h.1
right_inv := Fintype.leftInverse_bijInv h.1lemma apply_inv_apply {n m : ℕ} {c : Fin n → C} {c1 : Fin m → C}
(σ : Fin m → Fin n) (h : IsReindexing c c1 σ) (x : Fin m) :
h.inv σ (σ x) = x := by C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σx:Fin m⊢ inv σ h (σ x) = x
change h.toEquiv (h.toEquiv.symm x) = x C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σx:Fin m⊢ h.toEquiv (h.toEquiv.symm x) = x
simp All goals completed! 🐙lemma inv_apply_apply {n m : ℕ} {c : Fin n → C} {c1 : Fin m → C}
(σ : Fin m → Fin n) (h : IsReindexing c c1 σ) (x : Fin n) :
σ (h.inv σ x) = x := by C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σx:Fin n⊢ σ (inv σ h x) = x
change h.toEquiv.symm (h.toEquiv x) = x C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σx:Fin n⊢ h.toEquiv.symm (h.toEquiv x) = x
simp All goals completed! 🐙
lemma preserve_color {n m : ℕ} {c : Fin n → C} {c1 : Fin m → C}
{σ : Fin m → Fin n} (h : IsReindexing c c1 σ) :
∀ (x : Fin m), c1 x = (c ∘ σ) x := by C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σ⊢ ∀ (x : Fin m), c1 x = (c ∘ σ) x
intro x C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σx:Fin m⊢ c1 x = (c ∘ σ) x
obtain ⟨y, rfl⟩ := h.toEquiv.surjective x C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σy:Fin n⊢ c1 (h.toEquiv y) = (c ∘ σ) (h.toEquiv y)
simp only [Function.comp_apply] C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σy:Fin n⊢ c1 (h.toEquiv y) = c (σ (h.toEquiv y))
rw [h.2 C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σy:Fin n⊢ c1 (h.toEquiv y) = c1 (h.toEquiv y) All goals completed! 🐙] All goals completed! 🐙
set_option warning.simp.varHead false in
@[simp]
lemma inv_perserve_color {n m : ℕ} {c : Fin n → C} {c1 : Fin m → C}
{σ : Fin m → Fin n} (h : IsReindexing c c1 σ) (x : Fin n) :
c1 (h.inv σ x) = c x := by C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σx:Fin n⊢ c1 (inv σ h x) = c x
obtain ⟨x, rfl⟩ := h.toEquiv.symm.surjective x C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σx:Fin m⊢ c1 (inv σ h (h.toEquiv.symm x)) = c (h.toEquiv.symm x)
change c1 (h.toEquiv _) = _ C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σx:Fin m⊢ c1 (h.toEquiv (h.toEquiv.symm x)) = c (h.toEquiv.symm x)
simp only [Equiv.apply_symm_apply] C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σx:Fin m⊢ c1 x = c (h.toEquiv.symm x)
rw [h.preserve_color C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σx:Fin m⊢ (c ∘ σ) x = c (h.toEquiv.symm x) C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σx:Fin m⊢ (c ∘ σ) x = c (h.toEquiv.symm x)] C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σx:Fin m⊢ (c ∘ σ) x = c (h.toEquiv.symm x)
rfl All goals completed! 🐙
set_option warning.simp.varHead false in
@[simp]
lemma toEquiv_symm_perserve_color {n m : ℕ} {c : Fin n → C} {c1 : Fin m → C}
{σ : Fin m → Fin n} (h : IsReindexing c c1 σ) (x : Fin m) :
c (h.toEquiv.symm x) = c1 x := by C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σx:Fin m⊢ c (h.toEquiv.symm x) = c1 x
obtain ⟨x, rfl⟩ := h.toEquiv.surjective x C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σx:Fin n⊢ c (h.toEquiv.symm (h.toEquiv x)) = c1 (h.toEquiv x)
rw [h.preserve_color C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σx:Fin n⊢ c (h.toEquiv.symm (h.toEquiv x)) = (c ∘ σ) (h.toEquiv x) C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σx:Fin n⊢ c (h.toEquiv.symm (h.toEquiv x)) = (c ∘ σ) (h.toEquiv x)] C:Typen:ℕm:ℕc:Fin n → Cc1:Fin m → Cσ:Fin m → Fin nh:IsReindexing c c1 σx:Fin n⊢ c (h.toEquiv.symm (h.toEquiv x)) = (c ∘ σ) (h.toEquiv x)
rfl All goals completed! 🐙Constructors
lemma swap {n : ℕ} {c : Fin n → C} (i j : Fin n) :
IsReindexing c (c ∘ Equiv.swap i j) (Equiv.swap i j) := by C:Typen:ℕc:Fin n → Ci:Fin nj:Fin n⊢ IsReindexing c (c ∘ ⇑(Equiv.swap i j)) ⇑(Equiv.swap i j)
simp [IsReindexing] All goals completed! 🐙
The inverse of a map satisfying IsReindexing c c1 σ is a reindexing of c1 by c.
lemma symm {n m : ℕ} {c : Fin n → C} {c1 : Fin m → C}
{σ : Fin m → Fin n} (h : IsReindexing c c1 σ) : IsReindexing c1 c (h.inv σ) :=
⟨h.toEquiv.bijective, h.inv_perserve_color⟩lemma symm_of_id {n : ℕ} {c c1 : Fin n → C} (h : IsReindexing c c1 id) :
IsReindexing c1 c id := by C:Typen:ℕc:Fin n → Cc1:Fin n → Ch:IsReindexing c c1 id⊢ IsReindexing c1 c id
simp at h ⊢ C:Typen:ℕc:Fin n → Cc1:Fin n → Ch:∀ (i : Fin n), c i = c1 i⊢ ∀ (i : Fin n), c1 i = c i
exact fun i => (h i).symm All goals completed! 🐙
The composition of two maps satisfying IsReindexing also satisfies the IsReindexing.
lemma comp {n n1 n2 : ℕ} {c : Fin n → C} {c1 : Fin n1 → C}
{c2 : Fin n2 → C} {σ : Fin n1 → Fin n} {σ2 : Fin n2 → Fin n1}
(h : IsReindexing c c1 σ) (h2 : IsReindexing c1 c2 σ2) : IsReindexing c c2 (σ ∘ σ2) :=
⟨h.1.comp h2.1, fun x => (h.2 (σ2 x)).trans (h2.2 x)⟩
lemma append_congr_left {n n' n2 : ℕ} {c : Fin n → C} {c' : Fin n' → C}
{σ : Fin n' → Fin n} (c2 : Fin n2 → C) (h : IsReindexing c c' σ) :
IsReindexing (Fin.append c c2) (Fin.append c' c2)
(Fin.append (Fin.castAdd n2 ∘ σ) (Fin.natAdd n)) := by C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σ⊢ IsReindexing (append c c2) (append c' c2) (append (castAdd n2 ∘ σ) (natAdd n))
refine ⟨?_, fun i => ?_⟩ refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σ⊢ Function.Bijective (append (castAdd n2 ∘ σ) (natAdd n))refine_2 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n' + n2)⊢ append c c2 (append (castAdd n2 ∘ σ) (natAdd n) i) = append c' c2 i
· refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σ⊢ Function.Bijective (append (castAdd n2 ∘ σ) (natAdd n)) have heq : (Fin.append (Fin.castAdd n2 ∘ σ) (Fin.natAdd n) : Fin (n' + n2) → Fin (n + n2)) =
⇑(finSumFinEquiv.symm.trans
(((Equiv.ofBijective σ h.1).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv)) := by C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σ⊢ IsReindexing (append c c2) (append c' c2) (append (castAdd n2 ∘ σ) (natAdd n)) refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n2 ∘ σ) (natAdd n) =
⇑(finSumFinEquiv.symm.trans (((Equiv.ofBijective σ ⋯).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv))⊢ Function.Bijective (append (castAdd n2 ∘ σ) (natAdd n))
ext i C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n' + n2)⊢ ↑(append (castAdd n2 ∘ σ) (natAdd n) i) =
↑((finSumFinEquiv.symm.trans (((Equiv.ofBijective σ ⋯).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv)) i) refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n2 ∘ σ) (natAdd n) =
⇑(finSumFinEquiv.symm.trans (((Equiv.ofBijective σ ⋯).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv))⊢ Function.Bijective (append (castAdd n2 ∘ σ) (natAdd n))
refine Fin.addCases (fun a => ?_) (fun a => ?_) i refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n' + n2)a:Fin n'⊢ ↑(append (castAdd n2 ∘ σ) (natAdd n) (castAdd n2 a)) =
↑((finSumFinEquiv.symm.trans (((Equiv.ofBijective σ ⋯).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv))
(castAdd n2 a))refine_2 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n' + n2)a:Fin n2⊢ ↑(append (castAdd n2 ∘ σ) (natAdd n) (natAdd n' a)) =
↑((finSumFinEquiv.symm.trans (((Equiv.ofBijective σ ⋯).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv))
(natAdd n' a))refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n2 ∘ σ) (natAdd n) =
⇑(finSumFinEquiv.symm.trans (((Equiv.ofBijective σ ⋯).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv))⊢ Function.Bijective (append (castAdd n2 ∘ σ) (natAdd n)) <;> refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n' + n2)a:Fin n'⊢ ↑(append (castAdd n2 ∘ σ) (natAdd n) (castAdd n2 a)) =
↑((finSumFinEquiv.symm.trans (((Equiv.ofBijective σ ⋯).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv))
(castAdd n2 a))refine_2 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n' + n2)a:Fin n2⊢ ↑(append (castAdd n2 ∘ σ) (natAdd n) (natAdd n' a)) =
↑((finSumFinEquiv.symm.trans (((Equiv.ofBijective σ ⋯).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv))
(natAdd n' a))refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n2 ∘ σ) (natAdd n) =
⇑(finSumFinEquiv.symm.trans (((Equiv.ofBijective σ ⋯).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv))⊢ Function.Bijective (append (castAdd n2 ∘ σ) (natAdd n))
simp [Fin.append_left, Fin.append_right]refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n2 ∘ σ) (natAdd n) =
⇑(finSumFinEquiv.symm.trans (((Equiv.ofBijective σ ⋯).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv))⊢ Function.Bijective (append (castAdd n2 ∘ σ) (natAdd n))refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n2 ∘ σ) (natAdd n) =
⇑(finSumFinEquiv.symm.trans (((Equiv.ofBijective σ ⋯).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv))⊢ Function.Bijective (append (castAdd n2 ∘ σ) (natAdd n))
rw [heq refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n2 ∘ σ) (natAdd n) =
⇑(finSumFinEquiv.symm.trans (((Equiv.ofBijective σ ⋯).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv))⊢ Function.Bijective
⇑(finSumFinEquiv.symm.trans (((Equiv.ofBijective σ ⋯).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv)) refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n2 ∘ σ) (natAdd n) =
⇑(finSumFinEquiv.symm.trans (((Equiv.ofBijective σ ⋯).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv))⊢ Function.Bijective
⇑(finSumFinEquiv.symm.trans (((Equiv.ofBijective σ ⋯).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv))]refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n2 ∘ σ) (natAdd n) =
⇑(finSumFinEquiv.symm.trans (((Equiv.ofBijective σ ⋯).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv))⊢ Function.Bijective
⇑(finSumFinEquiv.symm.trans (((Equiv.ofBijective σ ⋯).sumCongr (Equiv.refl (Fin n2))).trans finSumFinEquiv))
exact Equiv.bijective _ All goals completed! 🐙
· refine_2 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n' + n2)⊢ append c c2 (append (castAdd n2 ∘ σ) (natAdd n) i) = append c' c2 i refine Fin.addCases (fun a => ?_) (fun a => ?_) i refine_2.refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n' + n2)a:Fin n'⊢ append c c2 (append (castAdd n2 ∘ σ) (natAdd n) (castAdd n2 a)) = append c' c2 (castAdd n2 a)refine_2.refine_2 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n' + n2)a:Fin n2⊢ append c c2 (append (castAdd n2 ∘ σ) (natAdd n) (natAdd n' a)) = append c' c2 (natAdd n' a) <;> refine_2.refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n' + n2)a:Fin n'⊢ append c c2 (append (castAdd n2 ∘ σ) (natAdd n) (castAdd n2 a)) = append c' c2 (castAdd n2 a)refine_2.refine_2 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n' + n2)a:Fin n2⊢ append c c2 (append (castAdd n2 ∘ σ) (natAdd n) (natAdd n' a)) = append c' c2 (natAdd n' a)
simp [Fin.append_left, Fin.append_right, h.2] All goals completed! 🐙
lemma append_congr_right {n n' n2 : ℕ} {c : Fin n → C} {c' : Fin n' → C}
{σ : Fin n' → Fin n} (c2 : Fin n2 → C) (h : IsReindexing c c' σ) :
IsReindexing (Fin.append c2 c) (Fin.append c2 c')
(Fin.append (Fin.castAdd n) (Fin.natAdd n2 ∘ σ)) := by C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σ⊢ IsReindexing (append c2 c) (append c2 c') (append (castAdd n) (natAdd n2 ∘ σ))
refine ⟨?_, fun i => ?_⟩ refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σ⊢ Function.Bijective (append (castAdd n) (natAdd n2 ∘ σ))refine_2 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n2 + n')⊢ append c2 c (append (castAdd n) (natAdd n2 ∘ σ) i) = append c2 c' i
· refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σ⊢ Function.Bijective (append (castAdd n) (natAdd n2 ∘ σ)) have heq : (Fin.append (Fin.castAdd n) (Fin.natAdd n2 ∘ σ) : Fin (n2 + n') → Fin (n2 + n)) =
⇑(finSumFinEquiv.symm.trans
(((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ h.1)).trans finSumFinEquiv)) := by C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σ⊢ IsReindexing (append c2 c) (append c2 c') (append (castAdd n) (natAdd n2 ∘ σ)) refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n) (natAdd n2 ∘ σ) =
⇑(finSumFinEquiv.symm.trans (((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ ⋯)).trans finSumFinEquiv))⊢ Function.Bijective (append (castAdd n) (natAdd n2 ∘ σ))
ext i C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n2 + n')⊢ ↑(append (castAdd n) (natAdd n2 ∘ σ) i) =
↑((finSumFinEquiv.symm.trans (((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ ⋯)).trans finSumFinEquiv)) i) refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n) (natAdd n2 ∘ σ) =
⇑(finSumFinEquiv.symm.trans (((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ ⋯)).trans finSumFinEquiv))⊢ Function.Bijective (append (castAdd n) (natAdd n2 ∘ σ))
refine Fin.addCases (fun a => ?_) (fun a => ?_) i refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n2 + n')a:Fin n2⊢ ↑(append (castAdd n) (natAdd n2 ∘ σ) (castAdd n' a)) =
↑((finSumFinEquiv.symm.trans (((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ ⋯)).trans finSumFinEquiv))
(castAdd n' a))refine_2 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n2 + n')a:Fin n'⊢ ↑(append (castAdd n) (natAdd n2 ∘ σ) (natAdd n2 a)) =
↑((finSumFinEquiv.symm.trans (((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ ⋯)).trans finSumFinEquiv))
(natAdd n2 a))refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n) (natAdd n2 ∘ σ) =
⇑(finSumFinEquiv.symm.trans (((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ ⋯)).trans finSumFinEquiv))⊢ Function.Bijective (append (castAdd n) (natAdd n2 ∘ σ)) <;> refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n2 + n')a:Fin n2⊢ ↑(append (castAdd n) (natAdd n2 ∘ σ) (castAdd n' a)) =
↑((finSumFinEquiv.symm.trans (((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ ⋯)).trans finSumFinEquiv))
(castAdd n' a))refine_2 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n2 + n')a:Fin n'⊢ ↑(append (castAdd n) (natAdd n2 ∘ σ) (natAdd n2 a)) =
↑((finSumFinEquiv.symm.trans (((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ ⋯)).trans finSumFinEquiv))
(natAdd n2 a))refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n) (natAdd n2 ∘ σ) =
⇑(finSumFinEquiv.symm.trans (((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ ⋯)).trans finSumFinEquiv))⊢ Function.Bijective (append (castAdd n) (natAdd n2 ∘ σ))
simp [Fin.append_left, Fin.append_right]refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n) (natAdd n2 ∘ σ) =
⇑(finSumFinEquiv.symm.trans (((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ ⋯)).trans finSumFinEquiv))⊢ Function.Bijective (append (castAdd n) (natAdd n2 ∘ σ))refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n) (natAdd n2 ∘ σ) =
⇑(finSumFinEquiv.symm.trans (((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ ⋯)).trans finSumFinEquiv))⊢ Function.Bijective (append (castAdd n) (natAdd n2 ∘ σ))
rw [heq refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n) (natAdd n2 ∘ σ) =
⇑(finSumFinEquiv.symm.trans (((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ ⋯)).trans finSumFinEquiv))⊢ Function.Bijective
⇑(finSumFinEquiv.symm.trans (((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ ⋯)).trans finSumFinEquiv)) refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n) (natAdd n2 ∘ σ) =
⇑(finSumFinEquiv.symm.trans (((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ ⋯)).trans finSumFinEquiv))⊢ Function.Bijective
⇑(finSumFinEquiv.symm.trans (((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ ⋯)).trans finSumFinEquiv))]refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σheq:append (castAdd n) (natAdd n2 ∘ σ) =
⇑(finSumFinEquiv.symm.trans (((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ ⋯)).trans finSumFinEquiv))⊢ Function.Bijective
⇑(finSumFinEquiv.symm.trans (((Equiv.refl (Fin n2)).sumCongr (Equiv.ofBijective σ ⋯)).trans finSumFinEquiv))
exact Equiv.bijective _ All goals completed! 🐙
· refine_2 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n2 + n')⊢ append c2 c (append (castAdd n) (natAdd n2 ∘ σ) i) = append c2 c' i refine Fin.addCases (fun a => ?_) (fun a => ?_) i refine_2.refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n2 + n')a:Fin n2⊢ append c2 c (append (castAdd n) (natAdd n2 ∘ σ) (castAdd n' a)) = append c2 c' (castAdd n' a)refine_2.refine_2 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n2 + n')a:Fin n'⊢ append c2 c (append (castAdd n) (natAdd n2 ∘ σ) (natAdd n2 a)) = append c2 c' (natAdd n2 a) <;> refine_2.refine_1 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n2 + n')a:Fin n2⊢ append c2 c (append (castAdd n) (natAdd n2 ∘ σ) (castAdd n' a)) = append c2 c' (castAdd n' a)refine_2.refine_2 C:Typen:ℕn':ℕn2:ℕc:Fin n → Cc':Fin n' → Cσ:Fin n' → Fin nc2:Fin n2 → Ch:IsReindexing c c' σi:Fin (n2 + n')a:Fin n'⊢ append c2 c (append (castAdd n) (natAdd n2 ∘ σ) (natAdd n2 a)) = append c2 c' (natAdd n2 a)
simp [Fin.append_left, Fin.append_right, h.2] All goals completed! 🐙
lemma append_zero_right {n} {c : Fin n → C}
{c1 : Fin 0 → C} : IsReindexing c (Fin.append c c1) id := by C:Typen:ℕc:Fin n → Cc1:Fin 0 → C⊢ IsReindexing c (append c c1) id
simp only [Nat.add_zero, IsReindexing.on_id] C:Typen:ℕc:Fin n → Cc1:Fin 0 → C⊢ ∀ (i : Fin n), c i = append c c1 i
have P : ∀ (i : Fin (n + 0)), c i = Fin.append c c1 i := by C:Typen:ℕc:Fin n → Cc1:Fin 0 → C⊢ IsReindexing c (append c c1) id C:Typen:ℕc:Fin n → Cc1:Fin 0 → CP:∀ (i : Fin (n + 0)), c i = append c c1 i⊢ ∀ (i : Fin n), c i = append c c1 i
rw [Fin.forall_fin_add C:Typen:ℕc:Fin n → Cc1:Fin 0 → C⊢ (∀ (i : Fin n), c (castAdd 0 i) = append c c1 (castAdd 0 i)) ∧ ∀ (j : Fin 0), c (natAdd n j) = append c c1 (natAdd n j) C:Typen:ℕc:Fin n → Cc1:Fin 0 → C⊢ (∀ (i : Fin n), c (castAdd 0 i) = append c c1 (castAdd 0 i)) ∧ ∀ (j : Fin 0), c (natAdd n j) = append c c1 (natAdd n j) C:Typen:ℕc:Fin n → Cc1:Fin 0 → CP:∀ (i : Fin (n + 0)), c i = append c c1 i⊢ ∀ (i : Fin n), c i = append c c1 i] C:Typen:ℕc:Fin n → Cc1:Fin 0 → C⊢ (∀ (i : Fin n), c (castAdd 0 i) = append c c1 (castAdd 0 i)) ∧ ∀ (j : Fin 0), c (natAdd n j) = append c c1 (natAdd n j) C:Typen:ℕc:Fin n → Cc1:Fin 0 → CP:∀ (i : Fin (n + 0)), c i = append c c1 i⊢ ∀ (i : Fin n), c i = append c c1 i
simp only [Fin.append_left, Fin.append_right, IsEmpty.forall_iff, and_true] C:Typen:ℕc:Fin n → Cc1:Fin 0 → C⊢ ∀ (i : Fin n), c (castAdd 0 i) = c i C:Typen:ℕc:Fin n → Cc1:Fin 0 → CP:∀ (i : Fin (n + 0)), c i = append c c1 i⊢ ∀ (i : Fin n), c i = append c c1 i
simp only [Fin.castAdd_zero, Fin.cast_eq_self, implies_true] C:Typen:ℕc:Fin n → Cc1:Fin 0 → CP:∀ (i : Fin (n + 0)), c i = append c c1 i⊢ ∀ (i : Fin n), c i = append c c1 i C:Typen:ℕc:Fin n → Cc1:Fin 0 → CP:∀ (i : Fin (n + 0)), c i = append c c1 i⊢ ∀ (i : Fin n), c i = append c c1 i
exact P All goals completed! 🐙
lemma append_swap {n n2 : ℕ} {c : Fin n → C} {c2 : Fin n2 → C} :
IsReindexing (Fin.append c c2) (Fin.append c2 c)
(Fin.append (Fin.natAdd n) (Fin.castAdd n2)) := by C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → C⊢ IsReindexing (append c c2) (append c2 c) (append (natAdd n) (castAdd n2))
refine ⟨?_, fun i => ?_⟩ refine_1 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → C⊢ Function.Bijective (append (natAdd n) (castAdd n2))refine_2 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Ci:Fin (n2 + n)⊢ append c c2 (append (natAdd n) (castAdd n2) i) = append c2 c i
· refine_1 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → C⊢ Function.Bijective (append (natAdd n) (castAdd n2)) have heq : (Fin.append (Fin.natAdd n) (Fin.castAdd n2) : Fin (n2 + n) → Fin (n + n2)) =
⇑(finSumFinEquiv.symm.trans
((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv)) := by C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → C⊢ IsReindexing (append c c2) (append c2 c) (append (natAdd n) (castAdd n2)) refine_1 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Cheq:append (natAdd n) (castAdd n2) = ⇑(finSumFinEquiv.symm.trans ((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv))⊢ Function.Bijective (append (natAdd n) (castAdd n2))
ext i C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Ci:Fin (n2 + n)⊢ ↑(append (natAdd n) (castAdd n2) i) =
↑((finSumFinEquiv.symm.trans ((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv)) i) refine_1 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Cheq:append (natAdd n) (castAdd n2) = ⇑(finSumFinEquiv.symm.trans ((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv))⊢ Function.Bijective (append (natAdd n) (castAdd n2))
refine Fin.addCases (fun a => ?_) (fun a => ?_) i refine_1 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Ci:Fin (n2 + n)a:Fin n2⊢ ↑(append (natAdd n) (castAdd n2) (castAdd n a)) =
↑((finSumFinEquiv.symm.trans ((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv)) (castAdd n a))refine_2 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Ci:Fin (n2 + n)a:Fin n⊢ ↑(append (natAdd n) (castAdd n2) (natAdd n2 a)) =
↑((finSumFinEquiv.symm.trans ((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv)) (natAdd n2 a))refine_1 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Cheq:append (natAdd n) (castAdd n2) = ⇑(finSumFinEquiv.symm.trans ((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv))⊢ Function.Bijective (append (natAdd n) (castAdd n2)) <;> refine_1 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Ci:Fin (n2 + n)a:Fin n2⊢ ↑(append (natAdd n) (castAdd n2) (castAdd n a)) =
↑((finSumFinEquiv.symm.trans ((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv)) (castAdd n a))refine_2 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Ci:Fin (n2 + n)a:Fin n⊢ ↑(append (natAdd n) (castAdd n2) (natAdd n2 a)) =
↑((finSumFinEquiv.symm.trans ((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv)) (natAdd n2 a))refine_1 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Cheq:append (natAdd n) (castAdd n2) = ⇑(finSumFinEquiv.symm.trans ((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv))⊢ Function.Bijective (append (natAdd n) (castAdd n2))
simp [Fin.append_left, Fin.append_right]refine_1 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Cheq:append (natAdd n) (castAdd n2) = ⇑(finSumFinEquiv.symm.trans ((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv))⊢ Function.Bijective (append (natAdd n) (castAdd n2))refine_1 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Cheq:append (natAdd n) (castAdd n2) = ⇑(finSumFinEquiv.symm.trans ((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv))⊢ Function.Bijective (append (natAdd n) (castAdd n2))
rw [heq refine_1 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Cheq:append (natAdd n) (castAdd n2) = ⇑(finSumFinEquiv.symm.trans ((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv))⊢ Function.Bijective ⇑(finSumFinEquiv.symm.trans ((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv)) refine_1 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Cheq:append (natAdd n) (castAdd n2) = ⇑(finSumFinEquiv.symm.trans ((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv))⊢ Function.Bijective ⇑(finSumFinEquiv.symm.trans ((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv))]refine_1 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Cheq:append (natAdd n) (castAdd n2) = ⇑(finSumFinEquiv.symm.trans ((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv))⊢ Function.Bijective ⇑(finSumFinEquiv.symm.trans ((Equiv.sumComm (Fin n2) (Fin n)).trans finSumFinEquiv))
exact Equiv.bijective _ All goals completed! 🐙
· refine_2 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Ci:Fin (n2 + n)⊢ append c c2 (append (natAdd n) (castAdd n2) i) = append c2 c i refine Fin.addCases (fun a => ?_) (fun a => ?_) i refine_2.refine_1 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Ci:Fin (n2 + n)a:Fin n2⊢ append c c2 (append (natAdd n) (castAdd n2) (castAdd n a)) = append c2 c (castAdd n a)refine_2.refine_2 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Ci:Fin (n2 + n)a:Fin n⊢ append c c2 (append (natAdd n) (castAdd n2) (natAdd n2 a)) = append c2 c (natAdd n2 a) <;> refine_2.refine_1 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Ci:Fin (n2 + n)a:Fin n2⊢ append c c2 (append (natAdd n) (castAdd n2) (castAdd n a)) = append c2 c (castAdd n a)refine_2.refine_2 C:Typen:ℕn2:ℕc:Fin n → Cc2:Fin n2 → Ci:Fin (n2 + n)a:Fin n⊢ append c c2 (append (natAdd n) (castAdd n2) (natAdd n2 a)) = append c2 c (natAdd n2 a)
simp [Fin.append_left, Fin.append_right] All goals completed! 🐙lemma append_assoc_right {n1 n2 n3 : ℕ} {c : Fin n1 → C} {c2 : Fin n2 → C} {c3 : Fin n3 → C} :
IsReindexing (Fin.append c (Fin.append c2 c3)) (Fin.append (Fin.append c c2) c3)
(Fin.cast (by k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bn1:ℕn2:ℕn3:ℕc:Fin n1 → Cc2:Fin n2 → Cc3:Fin n3 → C⊢ n1 + n2 + n3 = n1 + (n2 + n3) grind All goals completed! 🐙)) :=
⟨(finCongr (by C:Typen1:ℕn2:ℕn3:ℕc:Fin n1 → Cc2:Fin n2 → Cc3:Fin n3 → C⊢ n1 + n2 + n3 = n1 + (n2 + n3) grind All goals completed! 🐙)).bijective, fun i => (congrFun (Fin.append_assoc c c2 c3) i).symm⟩lemma append_assoc_left {n1 n2 n3 : ℕ} {c : Fin n1 → C} {c2 : Fin n2 → C} {c3 : Fin n3 → C} :
IsReindexing (Fin.append (Fin.append c c2) c3) (Fin.append c (Fin.append c2 c3))
(Fin.cast (by k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bn1:ℕn2:ℕn3:ℕc:Fin n1 → Cc2:Fin n2 → Cc3:Fin n3 → C⊢ n1 + (n2 + n3) = n1 + n2 + n3 grind All goals completed! 🐙)) :=
⟨(finCongr (by C:Typen1:ℕn2:ℕn3:ℕc:Fin n1 → Cc2:Fin n2 → Cc3:Fin n3 → C⊢ n1 + (n2 + n3) = n1 + n2 + n3 grind All goals completed! 🐙)).bijective, fun i => congrFun (Fin.append_assoc c c2 c3) _⟩
lemma append_succAbove_natAdd {n n1 : ℕ} {c : Fin n → C} {c1 : Fin (n1 + 1) → C}
(i : Fin (n1 + 1)) :
IsReindexing (Fin.append c c1 ∘ (Fin.natAdd n i).succAbove)
(Fin.append c (c1 ∘ i.succAbove)) id := by C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)⊢ IsReindexing (append c c1 ∘ (natAdd n i).succAbove) (append c (c1 ∘ i.succAbove)) id
refine ⟨Function.bijective_id, fun x => ?_⟩ C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)⊢ (append c c1 ∘ (natAdd n i).succAbove) (id x) = append c (c1 ∘ i.succAbove) x
simp only [Function.comp_apply, id_eq] C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)⊢ append c c1 ((natAdd n i).succAbove x) = append c (c1 ∘ i.succAbove) x
refine Fin.addCases (fun a => ?_) (fun a => ?_) x refine_1 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n⊢ append c c1 ((natAdd n i).succAbove (castAdd n1 a)) = append c (c1 ∘ i.succAbove) (castAdd n1 a)refine_2 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1⊢ append c c1 ((natAdd n i).succAbove (natAdd n a)) = append c (c1 ∘ i.succAbove) (natAdd n a)
· refine_1 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n⊢ append c c1 ((natAdd n i).succAbove (castAdd n1 a)) = append c (c1 ∘ i.succAbove) (castAdd n1 a) have hidx : (Fin.natAdd n i).succAbove (Fin.castAdd n1 a) = Fin.castAdd (n1 + 1) a := by C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)⊢ IsReindexing (append c c1 ∘ (natAdd n i).succAbove) (append c (c1 ∘ i.succAbove)) id refine_1 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin nhidx:(natAdd n i).succAbove (castAdd n1 a) = castAdd (n1 + 1) a⊢ append c c1 ((natAdd n i).succAbove (castAdd n1 a)) = append c (c1 ∘ i.succAbove) (castAdd n1 a)
rw [Fin.succAbove_of_castSucc_lt C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n⊢ (castAdd n1 a).castSucc = castAdd (n1 + 1) ah C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n⊢ (castAdd n1 a).castSucc < natAdd n i C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n⊢ (castAdd n1 a).castSucc = castAdd (n1 + 1) ah C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n⊢ (castAdd n1 a).castSucc < natAdd n i refine_1 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin nhidx:(natAdd n i).succAbove (castAdd n1 a) = castAdd (n1 + 1) a⊢ append c c1 ((natAdd n i).succAbove (castAdd n1 a)) = append c (c1 ∘ i.succAbove) (castAdd n1 a)] C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n⊢ (castAdd n1 a).castSucc = castAdd (n1 + 1) ah C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n⊢ (castAdd n1 a).castSucc < natAdd n irefine_1 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin nhidx:(natAdd n i).succAbove (castAdd n1 a) = castAdd (n1 + 1) a⊢ append c c1 ((natAdd n i).succAbove (castAdd n1 a)) = append c (c1 ∘ i.succAbove) (castAdd n1 a)
· C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n⊢ (castAdd n1 a).castSucc = castAdd (n1 + 1) arefine_1 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin nhidx:(natAdd n i).succAbove (castAdd n1 a) = castAdd (n1 + 1) a⊢ append c c1 ((natAdd n i).succAbove (castAdd n1 a)) = append c (c1 ∘ i.succAbove) (castAdd n1 a) ext C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n⊢ ↑(castAdd n1 a).castSucc = ↑(castAdd (n1 + 1) a)refine_1 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin nhidx:(natAdd n i).succAbove (castAdd n1 a) = castAdd (n1 + 1) a⊢ append c c1 ((natAdd n i).succAbove (castAdd n1 a)) = append c (c1 ∘ i.succAbove) (castAdd n1 a)
simp All goals completed! 🐙refine_1 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin nhidx:(natAdd n i).succAbove (castAdd n1 a) = castAdd (n1 + 1) a⊢ append c c1 ((natAdd n i).succAbove (castAdd n1 a)) = append c (c1 ∘ i.succAbove) (castAdd n1 a)
· h C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n⊢ (castAdd n1 a).castSucc < natAdd n irefine_1 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin nhidx:(natAdd n i).succAbove (castAdd n1 a) = castAdd (n1 + 1) a⊢ append c c1 ((natAdd n i).succAbove (castAdd n1 a)) = append c (c1 ∘ i.succAbove) (castAdd n1 a) simp only [Fin.lt_def, Fin.val_castSucc, Fin.val_castAdd, Fin.val_natAdd] h C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n⊢ ↑a < n + ↑irefine_1 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin nhidx:(natAdd n i).succAbove (castAdd n1 a) = castAdd (n1 + 1) a⊢ append c c1 ((natAdd n i).succAbove (castAdd n1 a)) = append c (c1 ∘ i.succAbove) (castAdd n1 a)
omegarefine_1 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin nhidx:(natAdd n i).succAbove (castAdd n1 a) = castAdd (n1 + 1) a⊢ append c c1 ((natAdd n i).succAbove (castAdd n1 a)) = append c (c1 ∘ i.succAbove) (castAdd n1 a)refine_1 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin nhidx:(natAdd n i).succAbove (castAdd n1 a) = castAdd (n1 + 1) a⊢ append c c1 ((natAdd n i).succAbove (castAdd n1 a)) = append c (c1 ∘ i.succAbove) (castAdd n1 a)
simp [hidx, Fin.append_left] All goals completed! 🐙
· refine_2 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1⊢ append c c1 ((natAdd n i).succAbove (natAdd n a)) = append c (c1 ∘ i.succAbove) (natAdd n a) have hidx : (Fin.natAdd n i).succAbove (Fin.natAdd n a) = Fin.natAdd n (i.succAbove a) := by C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)⊢ IsReindexing (append c c1 ∘ (natAdd n i).succAbove) (append c (c1 ∘ i.succAbove)) id refine_2 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hidx:(natAdd n i).succAbove (natAdd n a) = natAdd n (i.succAbove a)⊢ append c c1 ((natAdd n i).succAbove (natAdd n a)) = append c (c1 ∘ i.succAbove) (natAdd n a)
have hcond : ((Fin.natAdd n a).castSucc < Fin.natAdd n i) ↔ (a.castSucc < i) := by C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)⊢ IsReindexing (append c c1 ∘ (natAdd n i).succAbove) (append c (c1 ∘ i.succAbove)) id C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hcond:(natAdd n a).castSucc < natAdd n i ↔ a.castSucc < i⊢ (natAdd n i).succAbove (natAdd n a) = natAdd n (i.succAbove a)refine_2 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hidx:(natAdd n i).succAbove (natAdd n a) = natAdd n (i.succAbove a)⊢ append c c1 ((natAdd n i).succAbove (natAdd n a)) = append c (c1 ∘ i.succAbove) (natAdd n a)
simp only [Fin.lt_def, Fin.val_castSucc, Fin.val_natAdd] C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1⊢ n + ↑a < n + ↑i ↔ ↑a < ↑i C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hcond:(natAdd n a).castSucc < natAdd n i ↔ a.castSucc < i⊢ (natAdd n i).succAbove (natAdd n a) = natAdd n (i.succAbove a)refine_2 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hidx:(natAdd n i).succAbove (natAdd n a) = natAdd n (i.succAbove a)⊢ append c c1 ((natAdd n i).succAbove (natAdd n a)) = append c (c1 ∘ i.succAbove) (natAdd n a)
omega C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hcond:(natAdd n a).castSucc < natAdd n i ↔ a.castSucc < i⊢ (natAdd n i).succAbove (natAdd n a) = natAdd n (i.succAbove a)refine_2 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hidx:(natAdd n i).succAbove (natAdd n a) = natAdd n (i.succAbove a)⊢ append c c1 ((natAdd n i).succAbove (natAdd n a)) = append c (c1 ∘ i.succAbove) (natAdd n a) C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hcond:(natAdd n a).castSucc < natAdd n i ↔ a.castSucc < i⊢ (natAdd n i).succAbove (natAdd n a) = natAdd n (i.succAbove a)refine_2 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hidx:(natAdd n i).succAbove (natAdd n a) = natAdd n (i.succAbove a)⊢ append c c1 ((natAdd n i).succAbove (natAdd n a)) = append c (c1 ∘ i.succAbove) (natAdd n a)
simp only [Fin.succAbove, hcond] C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hcond:(natAdd n a).castSucc < natAdd n i ↔ a.castSucc < i⊢ (if a.castSucc < i then (natAdd n a).castSucc else (natAdd n a).succ) =
natAdd n (if a.castSucc < i then a.castSucc else a.succ)refine_2 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hidx:(natAdd n i).succAbove (natAdd n a) = natAdd n (i.succAbove a)⊢ append c c1 ((natAdd n i).succAbove (natAdd n a)) = append c (c1 ∘ i.succAbove) (natAdd n a)
split_ifs pos C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hcond:(natAdd n a).castSucc < natAdd n i ↔ a.castSucc < ih✝:a.castSucc < i⊢ (natAdd n a).castSucc = natAdd n a.castSuccneg C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hcond:(natAdd n a).castSucc < natAdd n i ↔ a.castSucc < ih✝:¬a.castSucc < i⊢ (natAdd n a).succ = natAdd n a.succrefine_2 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hidx:(natAdd n i).succAbove (natAdd n a) = natAdd n (i.succAbove a)⊢ append c c1 ((natAdd n i).succAbove (natAdd n a)) = append c (c1 ∘ i.succAbove) (natAdd n a) <;> pos C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hcond:(natAdd n a).castSucc < natAdd n i ↔ a.castSucc < ih✝:a.castSucc < i⊢ (natAdd n a).castSucc = natAdd n a.castSuccneg C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hcond:(natAdd n a).castSucc < natAdd n i ↔ a.castSucc < ih✝:¬a.castSucc < i⊢ (natAdd n a).succ = natAdd n a.succrefine_2 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hidx:(natAdd n i).succAbove (natAdd n a) = natAdd n (i.succAbove a)⊢ append c c1 ((natAdd n i).succAbove (natAdd n a)) = append c (c1 ∘ i.succAbove) (natAdd n a) ext neg C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hcond:(natAdd n a).castSucc < natAdd n i ↔ a.castSucc < ih✝:¬a.castSucc < i⊢ ↑(natAdd n a).succ = ↑(natAdd n a.succ)refine_2 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hidx:(natAdd n i).succAbove (natAdd n a) = natAdd n (i.succAbove a)⊢ append c c1 ((natAdd n i).succAbove (natAdd n a)) = append c (c1 ∘ i.succAbove) (natAdd n a) <;> pos C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hcond:(natAdd n a).castSucc < natAdd n i ↔ a.castSucc < ih✝:a.castSucc < i⊢ ↑(natAdd n a).castSucc = ↑(natAdd n a.castSucc)neg C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hcond:(natAdd n a).castSucc < natAdd n i ↔ a.castSucc < ih✝:¬a.castSucc < i⊢ ↑(natAdd n a).succ = ↑(natAdd n a.succ)refine_2 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hidx:(natAdd n i).succAbove (natAdd n a) = natAdd n (i.succAbove a)⊢ append c c1 ((natAdd n i).succAbove (natAdd n a)) = append c (c1 ∘ i.succAbove) (natAdd n a) simp [Nat.add_assoc]refine_2 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hidx:(natAdd n i).succAbove (natAdd n a) = natAdd n (i.succAbove a)⊢ append c c1 ((natAdd n i).succAbove (natAdd n a)) = append c (c1 ∘ i.succAbove) (natAdd n a)refine_2 C:Typen:ℕn1:ℕc:Fin n → Cc1:Fin (n1 + 1) → Ci:Fin (n1 + 1)x:Fin (n + n1)a:Fin n1hidx:(natAdd n i).succAbove (natAdd n a) = natAdd n (i.succAbove a)⊢ append c c1 ((natAdd n i).succAbove (natAdd n a)) = append c (c1 ∘ i.succAbove) (natAdd n a)
simp [hidx, Fin.append_right] All goals completed! 🐙
lemma append_succAbove_castAdd {n n1 : ℕ} {c : Fin (n + 1) → C} {c1 : Fin (n1 + 1) → C}
(i : Fin (n + 1)) :
IsReindexing (Fin.append c c1 ∘ (Fin.castAdd (n1 + 1) i).succAbove)
(Fin.append (c ∘ i.succAbove) c1) (Fin.cast (by k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bn:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)⊢ n + (n1 + 1) = (n + 1).add n1 grind All goals completed! 🐙)) := by C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)⊢ IsReindexing (append c c1 ∘ (castAdd (n1 + 1) i).succAbove) (append (c ∘ i.succAbove) c1) (Fin.cast ⋯)
refine ⟨(finCongr (by C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)⊢ n + (n1 + 1) = (n + 1).add n1 grind All goals completed! 🐙)).bijective, fun y => ?_⟩
simp only [Function.comp_apply] C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ y)) = append (c ∘ i.succAbove) c1 y
refine Fin.addCases (fun a => ?_) (fun a => ?_) y refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin n⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a))) =
append (c ∘ i.succAbove) c1 (castAdd (n1 + 1) a)refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a))) = append (c ∘ i.succAbove) c1 (natAdd n a)
· refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin n⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a))) =
append (c ∘ i.succAbove) c1 (castAdd (n1 + 1) a) have hidx : (Fin.castAdd (n1 + 1) i).succAbove (Fin.cast (by C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin n⊢ n + (n1 + 1) = (n + 1).add n1 refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a))) =
append (c ∘ i.succAbove) c1 (castAdd (n1 + 1) a) grind All goals completed! 🐙 refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a))) =
append (c ∘ i.succAbove) c1 (castAdd (n1 + 1) a)) (Fin.castAdd (n1 + 1) a))
= Fin.castAdd (n1 + 1) (i.succAbove a) := by C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)⊢ IsReindexing (append c c1 ∘ (castAdd (n1 + 1) i).succAbove) (append (c ∘ i.succAbove) c1) (Fin.cast ⋯)refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a))) =
append (c ∘ i.succAbove) c1 (castAdd (n1 + 1) a)
have hcond : ((Fin.cast (by C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin n⊢ n + (n1 + 1) = (n + 1).add n1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhcond:(Fin.cast ⋯ (castAdd (n1 + 1) a)).castSucc < castAdd (n1 + 1) i ↔ a.castSucc < i⊢ (castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a))) =
append (c ∘ i.succAbove) c1 (castAdd (n1 + 1) a) grind All goals completed! 🐙 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhcond:(Fin.cast ⋯ (castAdd (n1 + 1) a)).castSucc < castAdd (n1 + 1) i ↔ a.castSucc < i⊢ (castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a))) =
append (c ∘ i.succAbove) c1 (castAdd (n1 + 1) a)) (Fin.castAdd (n1 + 1) a)).castSucc <
Fin.castAdd (n1 + 1) i) ↔ (a.castSucc < i) := by C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)⊢ IsReindexing (append c c1 ∘ (castAdd (n1 + 1) i).succAbove) (append (c ∘ i.succAbove) c1) (Fin.cast ⋯) C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhcond:(Fin.cast ⋯ (castAdd (n1 + 1) a)).castSucc < castAdd (n1 + 1) i ↔ a.castSucc < i⊢ (castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a))) =
append (c ∘ i.succAbove) c1 (castAdd (n1 + 1) a)
simp only [Fin.lt_def, Fin.val_castSucc, Fin.val_cast, Fin.val_castAdd] C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhcond:(Fin.cast ⋯ (castAdd (n1 + 1) a)).castSucc < castAdd (n1 + 1) i ↔ a.castSucc < i⊢ (castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a))) =
append (c ∘ i.succAbove) c1 (castAdd (n1 + 1) a) C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhcond:(Fin.cast ⋯ (castAdd (n1 + 1) a)).castSucc < castAdd (n1 + 1) i ↔ a.castSucc < i⊢ (castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a))) =
append (c ∘ i.succAbove) c1 (castAdd (n1 + 1) a)
simp only [Fin.succAbove, hcond] C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhcond:(Fin.cast ⋯ (castAdd (n1 + 1) a)).castSucc < castAdd (n1 + 1) i ↔ a.castSucc < i⊢ (if a.castSucc < i then (Fin.cast ⋯ (castAdd (n1 + 1) a)).castSucc else (Fin.cast ⋯ (castAdd (n1 + 1) a)).succ) =
castAdd (n1 + 1) (if a.castSucc < i then a.castSucc else a.succ)refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a))) =
append (c ∘ i.succAbove) c1 (castAdd (n1 + 1) a)
split_ifs pos C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhcond:(Fin.cast ⋯ (castAdd (n1 + 1) a)).castSucc < castAdd (n1 + 1) i ↔ a.castSucc < ih✝:a.castSucc < i⊢ (Fin.cast ⋯ (castAdd (n1 + 1) a)).castSucc = castAdd (n1 + 1) a.castSuccneg C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhcond:(Fin.cast ⋯ (castAdd (n1 + 1) a)).castSucc < castAdd (n1 + 1) i ↔ a.castSucc < ih✝:¬a.castSucc < i⊢ (Fin.cast ⋯ (castAdd (n1 + 1) a)).succ = castAdd (n1 + 1) a.succrefine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a))) =
append (c ∘ i.succAbove) c1 (castAdd (n1 + 1) a) <;> pos C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhcond:(Fin.cast ⋯ (castAdd (n1 + 1) a)).castSucc < castAdd (n1 + 1) i ↔ a.castSucc < ih✝:a.castSucc < i⊢ (Fin.cast ⋯ (castAdd (n1 + 1) a)).castSucc = castAdd (n1 + 1) a.castSuccneg C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhcond:(Fin.cast ⋯ (castAdd (n1 + 1) a)).castSucc < castAdd (n1 + 1) i ↔ a.castSucc < ih✝:¬a.castSucc < i⊢ (Fin.cast ⋯ (castAdd (n1 + 1) a)).succ = castAdd (n1 + 1) a.succrefine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a))) =
append (c ∘ i.succAbove) c1 (castAdd (n1 + 1) a) ext neg C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhcond:(Fin.cast ⋯ (castAdd (n1 + 1) a)).castSucc < castAdd (n1 + 1) i ↔ a.castSucc < ih✝:¬a.castSucc < i⊢ ↑(Fin.cast ⋯ (castAdd (n1 + 1) a)).succ = ↑(castAdd (n1 + 1) a.succ)refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a))) =
append (c ∘ i.succAbove) c1 (castAdd (n1 + 1) a) <;> pos C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhcond:(Fin.cast ⋯ (castAdd (n1 + 1) a)).castSucc < castAdd (n1 + 1) i ↔ a.castSucc < ih✝:a.castSucc < i⊢ ↑(Fin.cast ⋯ (castAdd (n1 + 1) a)).castSucc = ↑(castAdd (n1 + 1) a.castSucc)neg C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhcond:(Fin.cast ⋯ (castAdd (n1 + 1) a)).castSucc < castAdd (n1 + 1) i ↔ a.castSucc < ih✝:¬a.castSucc < i⊢ ↑(Fin.cast ⋯ (castAdd (n1 + 1) a)).succ = ↑(castAdd (n1 + 1) a.succ)refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a))) =
append (c ∘ i.succAbove) c1 (castAdd (n1 + 1) a) simprefine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a))) =
append (c ∘ i.succAbove) c1 (castAdd (n1 + 1) a)refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin nhidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a)) = castAdd (n1 + 1) (i.succAbove a)⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (castAdd (n1 + 1) a))) =
append (c ∘ i.succAbove) c1 (castAdd (n1 + 1) a)
simp [hidx, Fin.append_left] All goals completed! 🐙
· refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a))) = append (c ∘ i.succAbove) c1 (natAdd n a) have hidx : (Fin.castAdd (n1 + 1) i).succAbove (Fin.cast (by C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)⊢ n + (n1 + 1) = (n + 1).add n1 refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)hidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a)) = natAdd (n + 1) a⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a))) = append (c ∘ i.succAbove) c1 (natAdd n a) grind All goals completed! 🐙refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)hidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a)) = natAdd (n + 1) a⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a))) = append (c ∘ i.succAbove) c1 (natAdd n a)) (Fin.natAdd n a))
= Fin.natAdd (n + 1) a := by C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)⊢ IsReindexing (append c c1 ∘ (castAdd (n1 + 1) i).succAbove) (append (c ∘ i.succAbove) c1) (Fin.cast ⋯)refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)hidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a)) = natAdd (n + 1) a⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a))) = append (c ∘ i.succAbove) c1 (natAdd n a)
rw [Fin.succAbove_of_le_castSucc C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)⊢ (Fin.cast ⋯ (natAdd n a)).succ = natAdd (n + 1) ah C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)⊢ castAdd (n1 + 1) i ≤ (Fin.cast ⋯ (natAdd n a)).castSucc C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)⊢ (Fin.cast ⋯ (natAdd n a)).succ = natAdd (n + 1) ah C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)⊢ castAdd (n1 + 1) i ≤ (Fin.cast ⋯ (natAdd n a)).castSuccrefine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)hidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a)) = natAdd (n + 1) a⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a))) = append (c ∘ i.succAbove) c1 (natAdd n a)] C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)⊢ (Fin.cast ⋯ (natAdd n a)).succ = natAdd (n + 1) ah C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)⊢ castAdd (n1 + 1) i ≤ (Fin.cast ⋯ (natAdd n a)).castSuccrefine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)hidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a)) = natAdd (n + 1) a⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a))) = append (c ∘ i.succAbove) c1 (natAdd n a)
· C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)⊢ (Fin.cast ⋯ (natAdd n a)).succ = natAdd (n + 1) arefine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)hidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a)) = natAdd (n + 1) a⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a))) = append (c ∘ i.succAbove) c1 (natAdd n a) ext C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)⊢ ↑(Fin.cast ⋯ (natAdd n a)).succ = ↑(natAdd (n + 1) a)refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)hidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a)) = natAdd (n + 1) a⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a))) = append (c ∘ i.succAbove) c1 (natAdd n a)
simp [Nat.add_right_comm] All goals completed! 🐙refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)hidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a)) = natAdd (n + 1) a⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a))) = append (c ∘ i.succAbove) c1 (natAdd n a)
· h C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)⊢ castAdd (n1 + 1) i ≤ (Fin.cast ⋯ (natAdd n a)).castSuccrefine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)hidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a)) = natAdd (n + 1) a⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a))) = append (c ∘ i.succAbove) c1 (natAdd n a) simp only [Fin.le_def, Fin.val_castSucc, Fin.val_cast, Fin.val_natAdd, Fin.val_castAdd] h C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)⊢ ↑i ≤ n + ↑arefine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)hidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a)) = natAdd (n + 1) a⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a))) = append (c ∘ i.succAbove) c1 (natAdd n a)
omegarefine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)hidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a)) = natAdd (n + 1) a⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a))) = append (c ∘ i.succAbove) c1 (natAdd n a)refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Ci:Fin (n + 1)y:Fin (n + (n1 + 1))a:Fin (n1 + 1)hidx:(castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a)) = natAdd (n + 1) a⊢ append c c1 ((castAdd (n1 + 1) i).succAbove (Fin.cast ⋯ (natAdd n a))) = append (c ∘ i.succAbove) c1 (natAdd n a)
simp [hidx, Fin.append_right] All goals completed! 🐙
Removing two entries from the right component of Fin.append c1 c commutes with the
append: removing the i-th and j-th entries of c and then appending c1 matches
removing the corresponding entries of Fin.append c1 c, via the identity permutation.
This is used for the commutation of taking a product of tensors
with contraction of indices.
lemma append_succSuccAbove_natAdd {n n1 : ℕ} {c : Fin (n + 1 + 1) → C}
{c1 : Fin n1 → C} (i j : Fin (n + 1 + 1)) :
IsReindexing (Fin.append c1 c ∘ (Fin.natAdd n1 i).succSuccAbove (Fin.natAdd n1 j))
(Fin.append c1 (c ∘ i.succSuccAbove j)) id := by C:Typen:ℕn1:ℕc:Fin (n + 1 + 1) → Cc1:Fin n1 → Ci:Fin (n + 1 + 1)j:Fin (n + 1 + 1)⊢ IsReindexing (append c1 c ∘ (natAdd n1 i).succSuccAbove (natAdd n1 j)) (append c1 (c ∘ i.succSuccAbove j)) id
apply And.intro (Function.bijective_id) C:Typen:ℕn1:ℕc:Fin (n + 1 + 1) → Cc1:Fin n1 → Ci:Fin (n + 1 + 1)j:Fin (n + 1 + 1)⊢ ∀ (i_1 : Fin (n1 + n)),
(append c1 c ∘ (natAdd n1 i).succSuccAbove (natAdd n1 j)) (id i_1) = append c1 (c ∘ i.succSuccAbove j) i_1
simp [forall_fin_add, succSuccAbove_comm_natAdd i j, succSuccAbove_natAdd_apply_castAdd i j] All goals completed! 🐙
Given a reindexing of c by c1 via σ for which the index i is sent to 0,
removing the i-th entry of c1 and the first entry of c yields a reindexing of
c ∘ Fin.succ by c1 ∘ i.succAbove via the map sending j to the predecessor of
σ (i.succAbove j).
lemma succAbove_of_eq_zero {n n1 : ℕ} {c : Fin (n + 1) → C} {c1 : Fin (n1 + 1) → C}
{σ : Fin (n1 + 1) → Fin (n + 1)} (i : Fin (n1 + 1))
(h : IsReindexing c c1 σ) (hi : σ i = 0) :
IsReindexing (c ∘ Fin.succ) (c1 ∘ i.succAbove)
(fun j => (σ (i.succAbove j)).pred (by k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bn:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0j:Fin n1⊢ σ (i.succAbove j) ≠ 0 simp [← hi, h.injective.eq_iff] All goals completed! 🐙)) := by C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0⊢ IsReindexing (c ∘ succ) (c1 ∘ i.succAbove) fun j => (σ (i.succAbove j)).pred ⋯
refine ⟨⟨?_, ?_⟩, ?_⟩ refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0⊢ Function.Injective fun j => (σ (i.succAbove j)).pred ⋯refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0⊢ Function.Surjective fun j => (σ (i.succAbove j)).pred ⋯refine_3 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0⊢ ∀ (i_1 : Fin n1), (c ∘ succ) ((fun j => (σ (i.succAbove j)).pred ⋯) i_1) = (c1 ∘ i.succAbove) i_1
· refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0⊢ Function.Injective fun j => (σ (i.succAbove j)).pred ⋯ intro x1 x2 h1 refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0x1:Fin n1x2:Fin n1h1:(fun j => (σ (i.succAbove j)).pred ⋯) x1 = (fun j => (σ (i.succAbove j)).pred ⋯) x2⊢ x1 = x2
simpa [h.injective.eq_iff] using h1 All goals completed! 🐙
· refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0⊢ Function.Surjective fun j => (σ (i.succAbove j)).pred ⋯ intro k refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0k:Fin n⊢ ∃ a, (fun j => (σ (i.succAbove j)).pred ⋯) a = k
suffices ha : ∃ a, σ (i.succAbove a) = k.succ by C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0k:Fin nha:∃ a, σ (i.succAbove a) = k.succ⊢ ∃ a, (fun j => (σ (i.succAbove j)).pred ⋯) a = k refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0k:Fin n⊢ ∃ a, σ (i.succAbove a) = k.succ
obtain ⟨a, ha⟩ := ha C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0k:Fin na:Fin n1ha:σ (i.succAbove a) = k.succ⊢ ∃ a, (fun j => (σ (i.succAbove j)).pred ⋯) a = k refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0k:Fin n⊢ ∃ a, σ (i.succAbove a) = k.succ
use a h C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0k:Fin na:Fin n1ha:σ (i.succAbove a) = k.succ⊢ (fun j => (σ (i.succAbove j)).pred ⋯) a = krefine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0k:Fin n⊢ ∃ a, σ (i.succAbove a) = k.succ
simp [ha]refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0k:Fin n⊢ ∃ a, σ (i.succAbove a) = k.succrefine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0k:Fin n⊢ ∃ a, σ (i.succAbove a) = k.succ
obtain ⟨j, hj⟩ := h.surjective k.succ refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0k:Fin nj:Fin (n1 + 1)hj:σ j = k.succ⊢ ∃ a, σ (i.succAbove a) = k.succ
simp only [← hj, h.injective.eq_iff, Fin.exists_succAbove_eq_iff, ne_eq] refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0k:Fin nj:Fin (n1 + 1)hj:σ j = k.succ⊢ ¬j = i
grind All goals completed! 🐙
· refine_3 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0⊢ ∀ (i_1 : Fin n1), (c ∘ succ) ((fun j => (σ (i.succAbove j)).pred ⋯) i_1) = (c1 ∘ i.succAbove) i_1 intro x refine_3 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0x:Fin n1⊢ (c ∘ succ) ((fun j => (σ (i.succAbove j)).pred ⋯) x) = (c1 ∘ i.succAbove) x
simp [h.preserve_color] All goals completed! 🐙
Given a reindexing of c by c1 via σ for which the index i is not sent to 0,
removing the i-th entry of c1 and the (σ i)-th entry of c yields a reindexing of
c ∘ (σ i).succAbove by c1 ∘ i.succAbove via the map
(σ i).pred.predAbove ∘ σ ∘ i.succAbove.
lemma succAbove_of_neq_zero {n n1 : ℕ} {c : Fin (n + 1) → C} {c1 : Fin (n1 + 1) → C}
{σ : Fin (n1 + 1) → Fin (n + 1)} (i : Fin (n1 + 1))
(h : IsReindexing c c1 σ) (hi : σ i ≠ 0) :
IsReindexing (c ∘ (σ i).succAbove) (c1 ∘ i.succAbove)
((Fin.pred (σ i) hi).predAbove ∘ σ ∘ i.succAbove) := by C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0⊢ IsReindexing (c ∘ (σ i).succAbove) (c1 ∘ i.succAbove) (((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove)
have hpr : σ i = ((σ i).pred hi).succ := (Fin.succ_pred _ _).symm C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succ⊢ IsReindexing (c ∘ (σ i).succAbove) (c1 ∘ i.succAbove) (((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove)
have hne : ∀ x, σ (i.succAbove x) ≠ σ i := fun x heq =>
Fin.succAbove_ne i x (h.injective heq) C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ i⊢ IsReindexing (c ∘ (σ i).succAbove) (c1 ∘ i.succAbove) (((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove)
refine ⟨⟨?_, ?_⟩, ?_⟩ refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ i⊢ Function.Injective (((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove)refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ i⊢ Function.Surjective (((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove)refine_3 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ i⊢ ∀ (i_1 : Fin n1), (c ∘ (σ i).succAbove) ((((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove) i_1) = (c1 ∘ i.succAbove) i_1
· refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ i⊢ Function.Injective (((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove) intro x1 x2 h2 refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ix1:Fin n1x2:Fin n1h2:(((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove) x1 = (((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove) x2⊢ x1 = x2
simp only [Function.comp_apply] at h2 refine_1 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ix1:Fin n1x2:Fin n1h2:((σ i).pred hi).predAbove (σ (i.succAbove x1)) = ((σ i).pred hi).predAbove (σ (i.succAbove x2))⊢ x1 = x2
apply i.succAbove_right_injective (h.injective ?_) C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ix1:Fin n1x2:Fin n1h2:((σ i).pred hi).predAbove (σ (i.succAbove x1)) = ((σ i).pred hi).predAbove (σ (i.succAbove x2))⊢ σ (i.succAbove x1) = σ (i.succAbove x2)
suffices h' :
((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove x1))) =
((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove x2))) by C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ix1:Fin n1x2:Fin n1h2:((σ i).pred hi).predAbove (σ (i.succAbove x1)) = ((σ i).pred hi).predAbove (σ (i.succAbove x2))h':((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove x1))) =
((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove x2)))⊢ σ (i.succAbove x1) = σ (i.succAbove x2) C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ix1:Fin n1x2:Fin n1h2:((σ i).pred hi).predAbove (σ (i.succAbove x1)) = ((σ i).pred hi).predAbove (σ (i.succAbove x2))⊢ ((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove x1))) =
((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove x2)))
rwa [Fin.succ_succAbove_predAbove (hpr ▸ hne x1), C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ix1:Fin n1x2:Fin n1h2:((σ i).pred hi).predAbove (σ (i.succAbove x1)) = ((σ i).pred hi).predAbove (σ (i.succAbove x2))h':σ (i.succAbove x1) = ((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove x2)))⊢ σ (i.succAbove x1) = σ (i.succAbove x2) C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ix1:Fin n1x2:Fin n1h2:((σ i).pred hi).predAbove (σ (i.succAbove x1)) = ((σ i).pred hi).predAbove (σ (i.succAbove x2))⊢ ((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove x1))) =
((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove x2)))
Fin.succ_succAbove_predAbove (hpr ▸ hne x2) C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ix1:Fin n1x2:Fin n1h2:((σ i).pred hi).predAbove (σ (i.succAbove x1)) = ((σ i).pred hi).predAbove (σ (i.succAbove x2))h':σ (i.succAbove x1) = σ (i.succAbove x2)⊢ σ (i.succAbove x1) = σ (i.succAbove x2) C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ix1:Fin n1x2:Fin n1h2:((σ i).pred hi).predAbove (σ (i.succAbove x1)) = ((σ i).pred hi).predAbove (σ (i.succAbove x2))⊢ ((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove x1))) =
((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove x2)))] C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ix1:Fin n1x2:Fin n1h2:((σ i).pred hi).predAbove (σ (i.succAbove x1)) = ((σ i).pred hi).predAbove (σ (i.succAbove x2))h':σ (i.succAbove x1) = σ (i.succAbove x2)⊢ σ (i.succAbove x1) = σ (i.succAbove x2) C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ix1:Fin n1x2:Fin n1h2:((σ i).pred hi).predAbove (σ (i.succAbove x1)) = ((σ i).pred hi).predAbove (σ (i.succAbove x2))⊢ ((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove x1))) =
((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove x2))) at h' C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ix1:Fin n1x2:Fin n1h2:((σ i).pred hi).predAbove (σ (i.succAbove x1)) = ((σ i).pred hi).predAbove (σ (i.succAbove x2))⊢ ((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove x1))) =
((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove x2)))
simpa using h2 All goals completed! 🐙
· refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ i⊢ Function.Surjective (((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove) intro k refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin n⊢ ∃ a, (((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove) a = k
simp only [Function.comp_apply] refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin n⊢ ∃ a, ((σ i).pred hi).predAbove (σ (i.succAbove a)) = k
suffices h' : ∃ a, σ (i.succAbove a) = (σ i).succAbove k by C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin nh':∃ a, σ (i.succAbove a) = (σ i).succAbove k⊢ ∃ a, ((σ i).pred hi).predAbove (σ (i.succAbove a)) = k refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin n⊢ ∃ a, σ (i.succAbove a) = (σ i).succAbove k
conv => C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin nh':∃ a, σ (i.succAbove a) = (σ i).succAbove k| ∃ a, ((σ i).pred hi).predAbove (σ (i.succAbove a)) = krefine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin n⊢ ∃ a, σ (i.succAbove a) = (σ i).succAbove k enter [1, a] C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin nh':∃ a, σ (i.succAbove a) = (σ i).succAbove ka:Fin n1| ((σ i).pred hi).predAbove (σ (i.succAbove a)) = krefine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin n⊢ ∃ a, σ (i.succAbove a) = (σ i).succAbove k; rw [← ((σ i).pred hi).succ.succAbove_right_injective.eq_iff] C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin nh':∃ a, σ (i.succAbove a) = (σ i).succAbove ka:Fin n1| ((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove a))) = ((σ i).pred hi).succ.succAbove krefine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin n⊢ ∃ a, σ (i.succAbove a) = (σ i).succAbove k
obtain ⟨a, h'⟩ := h' C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin na:Fin n1h':σ (i.succAbove a) = (σ i).succAbove k⊢ ∃ a, ((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove a))) = ((σ i).pred hi).succ.succAbove krefine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin n⊢ ∃ a, σ (i.succAbove a) = (σ i).succAbove k
exact ⟨a, by C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin na:Fin n1h':σ (i.succAbove a) = (σ i).succAbove k⊢ ((σ i).pred hi).succ.succAbove (((σ i).pred hi).predAbove (σ (i.succAbove a))) = ((σ i).pred hi).succ.succAbove krefine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin n⊢ ∃ a, σ (i.succAbove a) = (σ i).succAbove k rw [Fin.succ_succAbove_predAbove (hpr ▸ hne a), C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin na:Fin n1h':σ (i.succAbove a) = (σ i).succAbove k⊢ σ (i.succAbove a) = ((σ i).pred hi).succ.succAbove k C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin na:Fin n1h':σ (i.succAbove a) = (σ i).succAbove k⊢ σ (i.succAbove a) = (σ i).succAbove krefine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin n⊢ ∃ a, σ (i.succAbove a) = (σ i).succAbove k ← hpr C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin na:Fin n1h':σ (i.succAbove a) = (σ i).succAbove k⊢ σ (i.succAbove a) = (σ i).succAbove k C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin na:Fin n1h':σ (i.succAbove a) = (σ i).succAbove k⊢ σ (i.succAbove a) = (σ i).succAbove krefine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin n⊢ ∃ a, σ (i.succAbove a) = (σ i).succAbove k] C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin na:Fin n1h':σ (i.succAbove a) = (σ i).succAbove k⊢ σ (i.succAbove a) = (σ i).succAbove krefine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin n⊢ ∃ a, σ (i.succAbove a) = (σ i).succAbove k; exact h' All goals completed! 🐙refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin n⊢ ∃ a, σ (i.succAbove a) = (σ i).succAbove k⟩refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin n⊢ ∃ a, σ (i.succAbove a) = (σ i).succAbove k
obtain ⟨j, hj⟩ := h.surjective ((σ i).succAbove k) refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin nj:Fin (n1 + 1)hj:σ j = (σ i).succAbove k⊢ ∃ a, σ (i.succAbove a) = (σ i).succAbove k
simp only [← hj, h.injective.eq_iff, Fin.exists_succAbove_eq_iff, ne_eq] refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ik:Fin nj:Fin (n1 + 1)hj:σ j = (σ i).succAbove k⊢ ¬j = i
rintro rfl refine_2 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)h:IsReindexing c c1 σk:Fin nj:Fin (n1 + 1)hi:σ j ≠ 0hpr:σ j = ((σ j).pred hi).succhne:∀ (x : Fin n1), σ (j.succAbove x) ≠ σ jhj:σ j = (σ j).succAbove k⊢ False
simp at hj All goals completed! 🐙
· refine_3 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ i⊢ ∀ (i_1 : Fin n1), (c ∘ (σ i).succAbove) ((((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove) i_1) = (c1 ∘ i.succAbove) i_1 intro x refine_3 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ix:Fin n1⊢ (c ∘ (σ i).succAbove) ((((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove) x) = (c1 ∘ i.succAbove) x
simp only [h.preserve_color, Function.comp_apply] refine_3 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ix:Fin n1⊢ c ((σ i).succAbove (((σ i).pred hi).predAbove (σ (i.succAbove x)))) = c (σ (i.succAbove x))
congr 1 refine_3 C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ix:Fin n1⊢ (σ i).succAbove (((σ i).pred hi).predAbove (σ (i.succAbove x))) = σ (i.succAbove x)
conv_lhs => enter[1] C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ix:Fin n1| σ i; rw [hpr] C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i ≠ 0hpr:σ i = ((σ i).pred hi).succhne:∀ (x : Fin n1), σ (i.succAbove x) ≠ σ ix:Fin n1| ((σ i).pred hi).succ
exact Fin.succ_succAbove_predAbove (hpr ▸ hne x) All goals completed! 🐙
Given a reindexing of c by c1 via σ, removing the i-th entry of c1 and the
(σ i)-th entry of c yields a reindexing of c ∘ (σ i).succAbove by c1 ∘ i.succAbove.
This unifies succAbove_of_eq_zero and succAbove_of_neq_zero via a case split on
whether σ i = 0. This is used for the commutation of permutation
of indices with evaluation of indices.
lemma succAbove {n n1 : ℕ} {c : Fin (n + 1) → C} {c1 : Fin (n1 + 1) → C}
{σ : Fin (n1 + 1) → Fin (n + 1)} (i : Fin (n1 + 1))
(h : IsReindexing c c1 σ) :
IsReindexing (c ∘ (σ i).succAbove) (c1 ∘ i.succAbove)
(if hi : σ i = 0 then fun j => (σ (i.succAbove j)).pred (by k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bn:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0j:Fin n1⊢ σ (i.succAbove j) ≠ 0 simp [← hi, h.injective.eq_iff] All goals completed! 🐙)
else (Fin.pred (σ i) hi).predAbove ∘ σ ∘ i.succAbove) := by C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σ⊢ IsReindexing (c ∘ (σ i).succAbove) (c1 ∘ i.succAbove)
(if hi : σ i = 0 then fun j => (σ (i.succAbove j)).pred ⋯ else ((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove)
by_cases hi : σ i = 0 pos C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0⊢ IsReindexing (c ∘ (σ i).succAbove) (c1 ∘ i.succAbove)
(if hi : σ i = 0 then fun j => (σ (i.succAbove j)).pred ⋯ else ((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove)neg C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:¬σ i = 0⊢ IsReindexing (c ∘ (σ i).succAbove) (c1 ∘ i.succAbove)
(if hi : σ i = 0 then fun j => (σ (i.succAbove j)).pred ⋯ else ((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove)
· pos C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:σ i = 0⊢ IsReindexing (c ∘ (σ i).succAbove) (c1 ∘ i.succAbove)
(if hi : σ i = 0 then fun j => (σ (i.succAbove j)).pred ⋯ else ((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove) simpa [hi] using IsReindexing.succAbove_of_eq_zero i h hi All goals completed! 🐙
· neg C:Typen:ℕn1:ℕc:Fin (n + 1) → Cc1:Fin (n1 + 1) → Cσ:Fin (n1 + 1) → Fin (n + 1)i:Fin (n1 + 1)h:IsReindexing c c1 σhi:¬σ i = 0⊢ IsReindexing (c ∘ (σ i).succAbove) (c1 ∘ i.succAbove)
(if hi : σ i = 0 then fun j => (σ (i.succAbove j)).pred ⋯ else ((σ i).pred hi).predAbove ∘ σ ∘ i.succAbove) simpa [hi] using IsReindexing.succAbove_of_neq_zero i h hi All goals completed! 🐙
The conclusion of succAbove from an explicit survivor relabelling: if σ' fills the square
(σ i).succAbove ∘ σ' = σ ∘ i.succAbove, carrying the complement of i to the complement of
σ i, then it is a reindexing of the two shortened colour lists. The square forces σ' to be
injective, hence bijective, so no bijectivity hypothesis is needed; this is why the statement is
restricted to equal lengths.
Where succAbove builds the relabelling from σ as a dite composite, the map here is the
caller's, which is what lets it stand in the statement of a lemma the caller instantiates.
lemma succAbove_of_succAbove_eq {n : ℕ} {c c1 : Fin (n + 1) → C}
{σ : Fin (n + 1) → Fin (n + 1)} {σ' : Fin n → Fin n} (i : Fin (n + 1))
(h : IsReindexing c c1 σ) (hσ' : (σ i).succAbove ∘ σ' = σ ∘ i.succAbove) :
IsReindexing (c ∘ (σ i).succAbove) (c1 ∘ i.succAbove) σ' := by C:Typen:ℕc:Fin (n + 1) → Cc1:Fin (n + 1) → Cσ:Fin (n + 1) → Fin (n + 1)σ':Fin n → Fin ni:Fin (n + 1)h:IsReindexing c c1 σhσ':(σ i).succAbove ∘ σ' = σ ∘ i.succAbove⊢ IsReindexing (c ∘ (σ i).succAbove) (c1 ∘ i.succAbove) σ'
have key : ∀ a, (σ i).succAbove (σ' a) = σ (i.succAbove a) := congrFun hσ' C:Typen:ℕc:Fin (n + 1) → Cc1:Fin (n + 1) → Cσ:Fin (n + 1) → Fin (n + 1)σ':Fin n → Fin ni:Fin (n + 1)h:IsReindexing c c1 σhσ':(σ i).succAbove ∘ σ' = σ ∘ i.succAbovekey:∀ (a : Fin n), (σ i).succAbove (σ' a) = σ (i.succAbove a)⊢ IsReindexing (c ∘ (σ i).succAbove) (c1 ∘ i.succAbove) σ'
refine ⟨Finite.injective_iff_bijective.mp (fun a b hab => ?_), fun a => ?_⟩ refine_1 C:Typen:ℕc:Fin (n + 1) → Cc1:Fin (n + 1) → Cσ:Fin (n + 1) → Fin (n + 1)σ':Fin n → Fin ni:Fin (n + 1)h:IsReindexing c c1 σhσ':(σ i).succAbove ∘ σ' = σ ∘ i.succAbovekey:∀ (a : Fin n), (σ i).succAbove (σ' a) = σ (i.succAbove a)a:Fin nb:Fin nhab:σ' a = σ' b⊢ a = brefine_2 C:Typen:ℕc:Fin (n + 1) → Cc1:Fin (n + 1) → Cσ:Fin (n + 1) → Fin (n + 1)σ':Fin n → Fin ni:Fin (n + 1)h:IsReindexing c c1 σhσ':(σ i).succAbove ∘ σ' = σ ∘ i.succAbovekey:∀ (a : Fin n), (σ i).succAbove (σ' a) = σ (i.succAbove a)a:Fin n⊢ (c ∘ (σ i).succAbove) (σ' a) = (c1 ∘ i.succAbove) a
· refine_1 C:Typen:ℕc:Fin (n + 1) → Cc1:Fin (n + 1) → Cσ:Fin (n + 1) → Fin (n + 1)σ':Fin n → Fin ni:Fin (n + 1)h:IsReindexing c c1 σhσ':(σ i).succAbove ∘ σ' = σ ∘ i.succAbovekey:∀ (a : Fin n), (σ i).succAbove (σ' a) = σ (i.succAbove a)a:Fin nb:Fin nhab:σ' a = σ' b⊢ a = b exact Fin.succAbove_right_injective (h.injective (by C:Typen:ℕc:Fin (n + 1) → Cc1:Fin (n + 1) → Cσ:Fin (n + 1) → Fin (n + 1)σ':Fin n → Fin ni:Fin (n + 1)h:IsReindexing c c1 σhσ':(σ i).succAbove ∘ σ' = σ ∘ i.succAbovekey:∀ (a : Fin n), (σ i).succAbove (σ' a) = σ (i.succAbove a)a:Fin nb:Fin nhab:σ' a = σ' b⊢ σ (Fin.succAbove ?m.100 a) = σ (Fin.succAbove ?m.100 b) rw [← key a, C:Typen:ℕc:Fin (n + 1) → Cc1:Fin (n + 1) → Cσ:Fin (n + 1) → Fin (n + 1)σ':Fin n → Fin ni:Fin (n + 1)h:IsReindexing c c1 σhσ':(σ i).succAbove ∘ σ' = σ ∘ i.succAbovekey:∀ (a : Fin n), (σ i).succAbove (σ' a) = σ (i.succAbove a)a:Fin nb:Fin nhab:σ' a = σ' b⊢ (σ i).succAbove (σ' a) = σ (i.succAbove b) All goals completed! 🐙 ← key b, C:Typen:ℕc:Fin (n + 1) → Cc1:Fin (n + 1) → Cσ:Fin (n + 1) → Fin (n + 1)σ':Fin n → Fin ni:Fin (n + 1)h:IsReindexing c c1 σhσ':(σ i).succAbove ∘ σ' = σ ∘ i.succAbovekey:∀ (a : Fin n), (σ i).succAbove (σ' a) = σ (i.succAbove a)a:Fin nb:Fin nhab:σ' a = σ' b⊢ (σ i).succAbove (σ' a) = (σ i).succAbove (σ' b) All goals completed! 🐙 hab C:Typen:ℕc:Fin (n + 1) → Cc1:Fin (n + 1) → Cσ:Fin (n + 1) → Fin (n + 1)σ':Fin n → Fin ni:Fin (n + 1)h:IsReindexing c c1 σhσ':(σ i).succAbove ∘ σ' = σ ∘ i.succAbovekey:∀ (a : Fin n), (σ i).succAbove (σ' a) = σ (i.succAbove a)a:Fin nb:Fin nhab:σ' a = σ' b⊢ (σ i).succAbove (σ' b) = (σ i).succAbove (σ' b) All goals completed! 🐙] All goals completed! 🐙))
· refine_2 C:Typen:ℕc:Fin (n + 1) → Cc1:Fin (n + 1) → Cσ:Fin (n + 1) → Fin (n + 1)σ':Fin n → Fin ni:Fin (n + 1)h:IsReindexing c c1 σhσ':(σ i).succAbove ∘ σ' = σ ∘ i.succAbovekey:∀ (a : Fin n), (σ i).succAbove (σ' a) = σ (i.succAbove a)a:Fin n⊢ (c ∘ (σ i).succAbove) (σ' a) = (c1 ∘ i.succAbove) a simpa only [Function.comp_apply, key a] using h.2 (i.succAbove a) All goals completed! 🐙
Given a reindexing of c by c1 via σ and two distinct indices i ≠ j, removing the
i-th and j-th entries of c1 and the (σ i)-th and (σ j)-th entries of c yields a
reindexing of c ∘ (σ i).succSuccAbove (σ j) by c1 ∘ i.succSuccAbove j.
This is used for the commutation of permutation of indices with
contraction of indices.
lemma succSuccAbove {n n1 : ℕ} {c : Fin (n + 1 + 1) → C}
{c1 : Fin (n1 + 1 + 1) → C}
(i j : Fin (n1 + 1 + 1)) (hij : i ≠ j)
{σ : Fin (n1 + 1 + 1) → Fin (n + 1 + 1)} (hσ : IsReindexing c c1 σ) :
IsReindexing (c ∘ (σ i).succSuccAbove (σ j))
(c1 ∘ i.succSuccAbove j) (i.funPredPredAbove j hij σ hσ.1) := by C:Typen:ℕn1:ℕc:Fin (n + 1 + 1) → Cc1:Fin (n1 + 1 + 1) → Ci:Fin (n1 + 1 + 1)j:Fin (n1 + 1 + 1)hij:i ≠ jσ:Fin (n1 + 1 + 1) → Fin (n + 1 + 1)hσ:IsReindexing c c1 σ⊢ IsReindexing (c ∘ (σ i).succSuccAbove (σ j)) (c1 ∘ i.succSuccAbove j) (i.funPredPredAbove j hij σ ⋯)
apply And.intro left C:Typen:ℕn1:ℕc:Fin (n + 1 + 1) → Cc1:Fin (n1 + 1 + 1) → Ci:Fin (n1 + 1 + 1)j:Fin (n1 + 1 + 1)hij:i ≠ jσ:Fin (n1 + 1 + 1) → Fin (n + 1 + 1)hσ:IsReindexing c c1 σ⊢ Function.Bijective (i.funPredPredAbove j hij σ ⋯)right C:Typen:ℕn1:ℕc:Fin (n + 1 + 1) → Cc1:Fin (n1 + 1 + 1) → Ci:Fin (n1 + 1 + 1)j:Fin (n1 + 1 + 1)hij:i ≠ jσ:Fin (n1 + 1 + 1) → Fin (n + 1 + 1)hσ:IsReindexing c c1 σ⊢ ∀ (i_1 : Fin n1), (c ∘ (σ i).succSuccAbove (σ j)) (i.funPredPredAbove j hij σ ⋯ i_1) = (c1 ∘ i.succSuccAbove j) i_1
· left C:Typen:ℕn1:ℕc:Fin (n + 1 + 1) → Cc1:Fin (n1 + 1 + 1) → Ci:Fin (n1 + 1 + 1)j:Fin (n1 + 1 + 1)hij:i ≠ jσ:Fin (n1 + 1 + 1) → Fin (n + 1 + 1)hσ:IsReindexing c c1 σ⊢ Function.Bijective (i.funPredPredAbove j hij σ ⋯) exact Fin.funPredPredAbove_bijective i j hij σ hσ.left All goals completed! 🐙
· right C:Typen:ℕn1:ℕc:Fin (n + 1 + 1) → Cc1:Fin (n1 + 1 + 1) → Ci:Fin (n1 + 1 + 1)j:Fin (n1 + 1 + 1)hij:i ≠ jσ:Fin (n1 + 1 + 1) → Fin (n + 1 + 1)hσ:IsReindexing c c1 σ⊢ ∀ (i_1 : Fin n1), (c ∘ (σ i).succSuccAbove (σ j)) (i.funPredPredAbove j hij σ ⋯ i_1) = (c1 ∘ i.succSuccAbove j) i_1 intro m right C:Typen:ℕn1:ℕc:Fin (n + 1 + 1) → Cc1:Fin (n1 + 1 + 1) → Ci:Fin (n1 + 1 + 1)j:Fin (n1 + 1 + 1)hij:i ≠ jσ:Fin (n1 + 1 + 1) → Fin (n + 1 + 1)hσ:IsReindexing c c1 σm:Fin n1⊢ (c ∘ (σ i).succSuccAbove (σ j)) (i.funPredPredAbove j hij σ ⋯ m) = (c1 ∘ i.succSuccAbove j) m
simp [Fin.funPredPredAbove, hσ.2] All goals completed! 🐙
Removing two pairs of entries from c in either order gives the same colour list:
removing the i1-th and j1-th entries and then the (shifted) i2-th and j2-th entries
matches removing the i2-th and j2-th entries first and then the (shifted) i1-th and
j1-th entries, via the identity permutation.
This is used for the commutation of two contractions.
lemma succSuccAbove_comm {n : ℕ} {c : Fin (n + 1 + 1 + 1 + 1) → C}
(i1 j1 : Fin (n + 1 + 1 + 1 + 1)) (i2 j2 : Fin (n + 1 + 1))
(hij1 : i1 ≠ j1) (hij2 : i2 ≠ j2) :
let i2' := (i1.succSuccAbove j1 i2);
let j2' := (i1.succSuccAbove j1 j2);
have hi2j2' : i2' ≠ j2' := by k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bn:ℕc:Fin (n + 1 + 1 + 1 + 1) → Ci1:Fin (n + 1 + 1 + 1 + 1)j1:Fin (n + 1 + 1 + 1 + 1)i2:Fin (n + 1 + 1)j2:Fin (n + 1 + 1)hij1:i1 ≠ j1hij2:i2 ≠ j2i2':Fin (n + 2 + 1 + 1) := i1.succSuccAbove j1 i2j2':Fin (n + 2 + 1 + 1) := i1.succSuccAbove j1 j2⊢ i2' ≠ j2' simp [i2', j2', hij2] All goals completed! 🐙;
let i1' := (predPredAbove i2' j2' hi2j2' i1 (by k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bn:ℕc:Fin (n + 1 + 1 + 1 + 1) → Ci1:Fin (n + 1 + 1 + 1 + 1)j1:Fin (n + 1 + 1 + 1 + 1)i2:Fin (n + 1 + 1)j2:Fin (n + 1 + 1)hij1:i1 ≠ j1hij2:i2 ≠ j2i2':Fin (n + 2 + 1 + 1) := i1.succSuccAbove j1 i2j2':Fin (n + 2 + 1 + 1) := i1.succSuccAbove j1 j2hi2j2':i2' ≠ j2'⊢ i1 ≠ i2' ∧ i1 ≠ j2' simp [i2', j2'] All goals completed! 🐙));
let j1' := (predPredAbove i2' j2' hi2j2' j1 (by k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bn:ℕc:Fin (n + 1 + 1 + 1 + 1) → Ci1:Fin (n + 1 + 1 + 1 + 1)j1:Fin (n + 1 + 1 + 1 + 1)i2:Fin (n + 1 + 1)j2:Fin (n + 1 + 1)hij1:i1 ≠ j1hij2:i2 ≠ j2i2':Fin (n + 2 + 1 + 1) := i1.succSuccAbove j1 i2j2':Fin (n + 2 + 1 + 1) := i1.succSuccAbove j1 j2hi2j2':i2' ≠ j2'i1':Fin (n + 2) := i2'.predPredAbove j2' hi2j2' i1 ⋯⊢ j1 ≠ i2' ∧ j1 ≠ j2' simp [i2', j2'] All goals completed! 🐙));
IsReindexing ((c ∘ i2'.succSuccAbove j2') ∘ i1'.succSuccAbove j1')
((c ∘ i1.succSuccAbove j1) ∘ i2.succSuccAbove j2) id := by C:Typen:ℕc:Fin (n + 1 + 1 + 1 + 1) → Ci1:Fin (n + 1 + 1 + 1 + 1)j1:Fin (n + 1 + 1 + 1 + 1)i2:Fin (n + 1 + 1)j2:Fin (n + 1 + 1)hij1:i1 ≠ j1hij2:i2 ≠ j2⊢ let i2' := i1.succSuccAbove j1 i2;
let j2' := i1.succSuccAbove j1 j2;
have hi2j2' := ⋯;
let i1' := i2'.predPredAbove j2' hi2j2' i1 ⋯;
let j1' := i2'.predPredAbove j2' hi2j2' j1 ⋯;
IsReindexing ((c ∘ i2'.succSuccAbove j2') ∘ i1'.succSuccAbove j1') ((c ∘ i1.succSuccAbove j1) ∘ i2.succSuccAbove j2) id
apply And.intro (Function.bijective_id) C:Typen:ℕc:Fin (n + 1 + 1 + 1 + 1) → Ci1:Fin (n + 1 + 1 + 1 + 1)j1:Fin (n + 1 + 1 + 1 + 1)i2:Fin (n + 1 + 1)j2:Fin (n + 1 + 1)hij1:i1 ≠ j1hij2:i2 ≠ j2⊢ ∀ (i : Fin n),
((c ∘ (i1.succSuccAbove j1 i2).succSuccAbove (i1.succSuccAbove j1 j2)) ∘
((i1.succSuccAbove j1 i2).predPredAbove (i1.succSuccAbove j1 j2) ⋯ i1 ⋯).succSuccAbove
((i1.succSuccAbove j1 i2).predPredAbove (i1.succSuccAbove j1 j2) ⋯ j1 ⋯))
(id i) =
((c ∘ i1.succSuccAbove j1) ∘ i2.succSuccAbove j2) i
simp only [id_eq, Function.comp_apply] C:Typen:ℕc:Fin (n + 1 + 1 + 1 + 1) → Ci1:Fin (n + 1 + 1 + 1 + 1)j1:Fin (n + 1 + 1 + 1 + 1)i2:Fin (n + 1 + 1)j2:Fin (n + 1 + 1)hij1:i1 ≠ j1hij2:i2 ≠ j2⊢ ∀ (i : Fin n),
c
((i1.succSuccAbove j1 i2).succSuccAbove (i1.succSuccAbove j1 j2)
(((i1.succSuccAbove j1 i2).predPredAbove (i1.succSuccAbove j1 j2) ⋯ i1 ⋯).succSuccAbove
((i1.succSuccAbove j1 i2).predPredAbove (i1.succSuccAbove j1 j2) ⋯ j1 ⋯) i)) =
c (i1.succSuccAbove j1 (i2.succSuccAbove j2 i))
intro i C:Typen:ℕc:Fin (n + 1 + 1 + 1 + 1) → Ci1:Fin (n + 1 + 1 + 1 + 1)j1:Fin (n + 1 + 1 + 1 + 1)i2:Fin (n + 1 + 1)j2:Fin (n + 1 + 1)hij1:i1 ≠ j1hij2:i2 ≠ j2i:Fin n⊢ c
((i1.succSuccAbove j1 i2).succSuccAbove (i1.succSuccAbove j1 j2)
(((i1.succSuccAbove j1 i2).predPredAbove (i1.succSuccAbove j1 j2) ⋯ i1 ⋯).succSuccAbove
((i1.succSuccAbove j1 i2).predPredAbove (i1.succSuccAbove j1 j2) ⋯ j1 ⋯) i)) =
c (i1.succSuccAbove j1 (i2.succSuccAbove j2 i))
rw [succSuccAbove_comm_apply C:Typen:ℕc:Fin (n + 1 + 1 + 1 + 1) → Ci1:Fin (n + 1 + 1 + 1 + 1)j1:Fin (n + 1 + 1 + 1 + 1)i2:Fin (n + 1 + 1)j2:Fin (n + 1 + 1)hij1:i1 ≠ j1hij2:i2 ≠ j2i:Fin n⊢ c (i1.succSuccAbove j1 (i2.succSuccAbove j2 i)) = c (i1.succSuccAbove j1 (i2.succSuccAbove j2 i))hij1 C:Typen:ℕc:Fin (n + 1 + 1 + 1 + 1) → Ci1:Fin (n + 1 + 1 + 1 + 1)j1:Fin (n + 1 + 1 + 1 + 1)i2:Fin (n + 1 + 1)j2:Fin (n + 1 + 1)hij1:i1 ≠ j1hij2:i2 ≠ j2i:Fin n⊢ i1 ≠ j1hij2 C:Typen:ℕc:Fin (n + 1 + 1 + 1 + 1) → Ci1:Fin (n + 1 + 1 + 1 + 1)j1:Fin (n + 1 + 1 + 1 + 1)i2:Fin (n + 1 + 1)j2:Fin (n + 1 + 1)hij1:i1 ≠ j1hij2:i2 ≠ j2i:Fin n⊢ i2 ≠ j2 hij1 C:Typen:ℕc:Fin (n + 1 + 1 + 1 + 1) → Ci1:Fin (n + 1 + 1 + 1 + 1)j1:Fin (n + 1 + 1 + 1 + 1)i2:Fin (n + 1 + 1)j2:Fin (n + 1 + 1)hij1:i1 ≠ j1hij2:i2 ≠ j2i:Fin n⊢ i1 ≠ j1hij2 C:Typen:ℕc:Fin (n + 1 + 1 + 1 + 1) → Ci1:Fin (n + 1 + 1 + 1 + 1)j1:Fin (n + 1 + 1 + 1 + 1)i2:Fin (n + 1 + 1)j2:Fin (n + 1 + 1)hij1:i1 ≠ j1hij2:i2 ≠ j2i:Fin n⊢ i2 ≠ j2] hij1 C:Typen:ℕc:Fin (n + 1 + 1 + 1 + 1) → Ci1:Fin (n + 1 + 1 + 1 + 1)j1:Fin (n + 1 + 1 + 1 + 1)i2:Fin (n + 1 + 1)j2:Fin (n + 1 + 1)hij1:i1 ≠ j1hij2:i2 ≠ j2i:Fin n⊢ i1 ≠ j1hij2 C:Typen:ℕc:Fin (n + 1 + 1 + 1 + 1) → Ci1:Fin (n + 1 + 1 + 1 + 1)j1:Fin (n + 1 + 1 + 1 + 1)i2:Fin (n + 1 + 1)j2:Fin (n + 1 + 1)hij1:i1 ≠ j1hij2:i2 ≠ j2i:Fin n⊢ i2 ≠ j2
· hij1 C:Typen:ℕc:Fin (n + 1 + 1 + 1 + 1) → Ci1:Fin (n + 1 + 1 + 1 + 1)j1:Fin (n + 1 + 1 + 1 + 1)i2:Fin (n + 1 + 1)j2:Fin (n + 1 + 1)hij1:i1 ≠ j1hij2:i2 ≠ j2i:Fin n⊢ i1 ≠ j1 simp [hij1] All goals completed! 🐙
· hij2 C:Typen:ℕc:Fin (n + 1 + 1 + 1 + 1) → Ci1:Fin (n + 1 + 1 + 1 + 1)j1:Fin (n + 1 + 1 + 1 + 1)i2:Fin (n + 1 + 1)j2:Fin (n + 1 + 1)hij1:i1 ≠ j1hij2:i2 ≠ j2i:Fin n⊢ i2 ≠ j2 simp [hij2] All goals completed! 🐙lemma succSuccAbove_succAbove_comm {n : ℕ} {c : Fin (n + 1 + 1 + 1) → C}
(k : Fin (n + 1)) (i j : Fin (n + 1 + 1 + 1)) :
-- The corresponding position of k in the full list.
let k' := Fin.succSuccAbove i j k
let k'' := Fin.predAbove 0 k'
-- The position of i after removing k'
let i' := k''.predAbove i
-- The position of j after removing k'
let j' := k''.predAbove j
IsReindexing ((c ∘ k'.succAbove) ∘ i'.succSuccAbove j')
((c ∘ i.succSuccAbove j) ∘ k.succAbove) id := by C:Typen:ℕc:Fin (n + 1 + 1 + 1) → Ck:Fin (n + 1)i:Fin (n + 1 + 1 + 1)j:Fin (n + 1 + 1 + 1)⊢ let k' := i.succSuccAbove j k;
let k'' := predAbove 0 k';
let i' := k''.predAbove i;
let j' := k''.predAbove j;
IsReindexing ((c ∘ k'.succAbove) ∘ i'.succSuccAbove j') ((c ∘ i.succSuccAbove j) ∘ k.succAbove) id
refine ⟨Function.bijective_id, fun m => ?_⟩ C:Typen:ℕc:Fin (n + 1 + 1 + 1) → Ck:Fin (n + 1)i:Fin (n + 1 + 1 + 1)j:Fin (n + 1 + 1 + 1)m:Fin n⊢ ((c ∘ (i.succSuccAbove j k).succAbove) ∘
((predAbove 0 (i.succSuccAbove j k)).predAbove i).succSuccAbove ((predAbove 0 (i.succSuccAbove j k)).predAbove j))
(id m) =
((c ∘ i.succSuccAbove j) ∘ k.succAbove) m
simp only [id_eq, Function.comp_apply] C:Typen:ℕc:Fin (n + 1 + 1 + 1) → Ck:Fin (n + 1)i:Fin (n + 1 + 1 + 1)j:Fin (n + 1 + 1 + 1)m:Fin n⊢ c
((i.succSuccAbove j k).succAbove
(((predAbove 0 (i.succSuccAbove j k)).predAbove i).succSuccAbove ((predAbove 0 (i.succSuccAbove j k)).predAbove j)
m)) =
c (i.succSuccAbove j (k.succAbove m))
congr 1 C:Typen:ℕc:Fin (n + 1 + 1 + 1) → Ck:Fin (n + 1)i:Fin (n + 1 + 1 + 1)j:Fin (n + 1 + 1 + 1)m:Fin n⊢ (i.succSuccAbove j k).succAbove
(((predAbove 0 (i.succSuccAbove j k)).predAbove i).succSuccAbove ((predAbove 0 (i.succSuccAbove j k)).predAbove j)
m) =
i.succSuccAbove j (k.succAbove m)
apply Fin.val_injective C:Typen:ℕc:Fin (n + 1 + 1 + 1) → Ck:Fin (n + 1)i:Fin (n + 1 + 1 + 1)j:Fin (n + 1 + 1 + 1)m:Fin n⊢ ↑((i.succSuccAbove j k).succAbove
(((predAbove 0 (i.succSuccAbove j k)).predAbove i).succSuccAbove ((predAbove 0 (i.succSuccAbove j k)).predAbove j)
m)) =
↑(i.succSuccAbove j (k.succAbove m))
simp only [Fin.succSuccAbove, Fin.succAbove, lt_def, val_castSucc,
val_succ, apply_ite Fin.val, apply_dite Fin.val, Fin.predAbove, Fin.castPred] C:Typen:ℕc:Fin (n + 1 + 1 + 1) → Ck:Fin (n + 1)i:Fin (n + 1 + 1 + 1)j:Fin (n + 1 + 1 + 1)m:Fin n⊢ (if
(if
(↑m <
if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑i then
↑(i.pred ⋯)
else ↑(i.castLT ⋯)) ∧
↑m <
if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑j then
↑(j.pred ⋯)
else ↑(j.castLT ⋯) then
↑m
else
if
(↑m + 1 <
if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑i then
↑(i.pred ⋯)
else ↑(i.castLT ⋯)) ∧
(if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑j then
↑(j.pred ⋯)
else ↑(j.castLT ⋯)) ≤
↑m then
↑m + 1
else
if
(if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑i then
↑(i.pred ⋯)
else ↑(i.castLT ⋯)) ≤
↑m ∧
↑m + 1 <
if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑j then
↑(j.pred ⋯)
else ↑(j.castLT ⋯) then
↑m + 1
else ↑m + 2) <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1 else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
if
(↑m <
if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑i then
↑(i.pred ⋯)
else ↑(i.castLT ⋯)) ∧
↑m <
if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑j then
↑(j.pred ⋯)
else ↑(j.castLT ⋯) then
↑m
else
if
(↑m + 1 <
if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑i then
↑(i.pred ⋯)
else ↑(i.castLT ⋯)) ∧
(if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑j then
↑(j.pred ⋯)
else ↑(j.castLT ⋯)) ≤
↑m then
↑m + 1
else
if
(if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑i then
↑(i.pred ⋯)
else ↑(i.castLT ⋯)) ≤
↑m ∧
↑m + 1 <
if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑j then
↑(j.pred ⋯)
else ↑(j.castLT ⋯) then
↑m + 1
else ↑m + 2
else
(if
(↑m <
if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑i then
↑(i.pred ⋯)
else ↑(i.castLT ⋯)) ∧
↑m <
if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑j then
↑(j.pred ⋯)
else ↑(j.castLT ⋯) then
↑m
else
if
(↑m + 1 <
if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑i then
↑(i.pred ⋯)
else ↑(i.castLT ⋯)) ∧
(if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑j then
↑(j.pred ⋯)
else ↑(j.castLT ⋯)) ≤
↑m then
↑m + 1
else
if
(if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑i then
↑(i.pred ⋯)
else ↑(i.castLT ⋯)) ≤
↑m ∧
↑m + 1 <
if h :
(if h :
↑0 <
if ↑k < ↑i ∧ ↑k < ↑j then ↑k
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ↑k + 1
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ↑k + 1 else ↑k + 2 then
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).pred
⋯)
else
↑((if ↑k < ↑i ∧ ↑k < ↑j then ⟨↑k, ⋯⟩
else
if ↑k + 1 < ↑i ∧ ↑j ≤ ↑k then ⟨↑k + 1, ⋯⟩
else if ↑i ≤ ↑k ∧ ↑k + 1 < ↑j then ⟨↑k + 1, ⋯⟩ else ⟨↑k + 2, ⋯⟩).castLT
⋯)) <
↑j then
↑(j.pred ⋯)
else ↑(j.castLT ⋯) then
↑m + 1
else ↑m + 2) +
1) =
if (if ↑m < ↑k then ↑m else ↑m + 1) < ↑i ∧ (if ↑m < ↑k then ↑m else ↑m + 1) < ↑j then if ↑m < ↑k then ↑m else ↑m + 1
else
if (if ↑m < ↑k then ↑m else ↑m + 1) + 1 < ↑i ∧ ↑j ≤ if ↑m < ↑k then ↑m else ↑m + 1 then
(if ↑m < ↑k then ↑m else ↑m + 1) + 1
else
if (↑i ≤ if ↑m < ↑k then ↑m else ↑m + 1) ∧ (if ↑m < ↑k then ↑m else ↑m + 1) + 1 < ↑j then
(if ↑m < ↑k then ↑m else ↑m + 1) + 1
else (if ↑m < ↑k then ↑m else ↑m + 1) + 2
grind (splits := 60) All goals completed! 🐙
Removing two single entries from c in either order gives the same colour list:
removing the k1-th entry and then the (shifted) k2-th entry matches removing the
k2-th entry first and then the (shifted) k1-th entry, via the identity permutation.
This is used for the commutation of two evaluations of indices.
lemma succAbove_succAbove_comm {n : ℕ} {c : Fin (n + 1 + 1) → C}
(k1 : Fin (n + 1 + 1)) (k2 : Fin (n + 1)) :
let k2' := k1.succAbove k2;
let k1' := k2.predAbove k1;
IsReindexing ((c ∘ k2'.succAbove) ∘ k1'.succAbove)
((c ∘ k1.succAbove) ∘ k2.succAbove) id := by C:Typen:ℕc:Fin (n + 1 + 1) → Ck1:Fin (n + 1 + 1)k2:Fin (n + 1)⊢ let k2' := k1.succAbove k2;
let k1' := k2.predAbove k1;
IsReindexing ((c ∘ k2'.succAbove) ∘ k1'.succAbove) ((c ∘ k1.succAbove) ∘ k2.succAbove) id
intro k2' k1' C:Typen:ℕc:Fin (n + 1 + 1) → Ck1:Fin (n + 1 + 1)k2:Fin (n + 1)k2':Fin (n + 1 + 1) := k1.succAbove k2k1':Fin (n + 1) := k2.predAbove k1⊢ IsReindexing ((c ∘ k2'.succAbove) ∘ k1'.succAbove) ((c ∘ k1.succAbove) ∘ k2.succAbove) id
refine ⟨Function.bijective_id, fun m => ?_⟩ C:Typen:ℕc:Fin (n + 1 + 1) → Ck1:Fin (n + 1 + 1)k2:Fin (n + 1)k2':Fin (n + 1 + 1) := k1.succAbove k2k1':Fin (n + 1) := k2.predAbove k1m:Fin n⊢ ((c ∘ k2'.succAbove) ∘ k1'.succAbove) (id m) = ((c ∘ k1.succAbove) ∘ k2.succAbove) m
simp only [id_eq, Function.comp_apply] C:Typen:ℕc:Fin (n + 1 + 1) → Ck1:Fin (n + 1 + 1)k2:Fin (n + 1)k2':Fin (n + 1 + 1) := k1.succAbove k2k1':Fin (n + 1) := k2.predAbove k1m:Fin n⊢ c (k2'.succAbove (k1'.succAbove m)) = c (k1.succAbove (k2.succAbove m))
congr 1 C:Typen:ℕc:Fin (n + 1 + 1) → Ck1:Fin (n + 1 + 1)k2:Fin (n + 1)k2':Fin (n + 1 + 1) := k1.succAbove k2k1':Fin (n + 1) := k2.predAbove k1m:Fin n⊢ k2'.succAbove (k1'.succAbove m) = k1.succAbove (k2.succAbove m)
exact Fin.succAbove_succAbove_succAbove_predAbove k1 k2 m All goals completed! 🐙
Splitting a list of colours c : Fin (n + 1) → C into its first n entries and its
last entry recovers c: the identity permutation matches
Fin.append (c ∘ (Fin.last n).succAbove) ![c (Fin.last n)] with c.
lemma append_succ_last {n : ℕ} (c : Fin (n + 1) → C) :
IsReindexing (Fin.append (c ∘ (Fin.last n).succAbove) ![c (Fin.last n)]) c id := by C:Typen:ℕc:Fin (n + 1) → C⊢ IsReindexing (append (c ∘ (last n).succAbove) ![c (last n)]) c id
rw [Fin.succAbove_last, C:Typen:ℕc:Fin (n + 1) → C⊢ IsReindexing (append (c ∘ castSucc) ![c (last n)]) c id C:Typen:ℕc:Fin (n + 1) → C⊢ ∀ (i : Fin (n + Nat.succ 0)), append (c ∘ castSucc) ![c (last n)] i = c i on_id C:Typen:ℕc:Fin (n + 1) → C⊢ ∀ (i : Fin (n + Nat.succ 0)), append (c ∘ castSucc) ![c (last n)] i = c i C:Typen:ℕc:Fin (n + 1) → C⊢ ∀ (i : Fin (n + Nat.succ 0)), append (c ∘ castSucc) ![c (last n)] i = c i] C:Typen:ℕc:Fin (n + 1) → C⊢ ∀ (i : Fin (n + Nat.succ 0)), append (c ∘ castSucc) ![c (last n)] i = c i
refine Fin.addCases (fun i => ?_) (fun i => ?_) refine_1 C:Typen:ℕc:Fin (n + 1) → Ci:Fin n⊢ append (c ∘ castSucc) ![c (last n)] (castAdd (Nat.succ 0) i) = c (castAdd (Nat.succ 0) i)refine_2 C:Typen:ℕc:Fin (n + 1) → Ci:Fin (Nat.succ 0)⊢ append (c ∘ castSucc) ![c (last n)] (natAdd n i) = c (natAdd n i)
· refine_1 C:Typen:ℕc:Fin (n + 1) → Ci:Fin n⊢ append (c ∘ castSucc) ![c (last n)] (castAdd (Nat.succ 0) i) = c (castAdd (Nat.succ 0) i) simp only [Fin.append_left, Function.comp_apply] refine_1 C:Typen:ℕc:Fin (n + 1) → Ci:Fin n⊢ c i.castSucc = c (castAdd (Nat.succ 0) i); rfl All goals completed! 🐙
· refine_2 C:Typen:ℕc:Fin (n + 1) → Ci:Fin (Nat.succ 0)⊢ append (c ∘ castSucc) ![c (last n)] (natAdd n i) = c (natAdd n i) fin_cases i refine_2.«0» C:Typen:ℕc:Fin (n + 1) → C⊢ append (c ∘ castSucc) ![c (last n)] (natAdd n ((fun i => i) ⟨0, ⋯⟩)) = c (natAdd n ((fun i => i) ⟨0, ⋯⟩)); simp only [Fin.append_right, Matrix.cons_val_fin_one] refine_2.«0» C:Typen:ℕc:Fin (n + 1) → C⊢ c (last n) = c (natAdd n ⟨0, ⋯⟩); rfl All goals completed! 🐙
Splitting a list of colours c : Fin (n + 1) → C at an arbitrary slot i, rather than at the
last one as in append_succ_last: the block map that lists the i.succAbove survivors and then
i itself matches c with the survivors of i followed by the surviving entry c1 1 of a
rank-two list c1 whose second entry is slot i's colour.
lemma move_last {n : ℕ} {c : Fin (n + 1) → C} {c1 : Fin 2 → C} (i : Fin (n + 1))
(hc : c i = c1 1) :
IsReindexing c
(Fin.append (c ∘ i.succAbove) (c1 ∘ (0 : Fin 2).succAbove))
(Fin.append i.succAbove (fun _ : Fin 1 => i)) :=
⟨by C:Typen:ℕc:Fin (n + 1) → Cc1:Fin 2 → Ci:Fin (n + 1)hc:c i = c1 1⊢ Function.Bijective (append i.succAbove fun x => i)
rw [Fin.append_succAbove_const_eq_cycleIcc i C:Typen:ℕc:Fin (n + 1) → Cc1:Fin 2 → Ci:Fin (n + 1)hc:c i = c1 1⊢ Function.Bijective ⇑(i.cycleIcc (last n)) C:Typen:ℕc:Fin (n + 1) → Cc1:Fin 2 → Ci:Fin (n + 1)hc:c i = c1 1⊢ Function.Bijective ⇑(i.cycleIcc (last n))] C:Typen:ℕc:Fin (n + 1) → Cc1:Fin 2 → Ci:Fin (n + 1)hc:c i = c1 1⊢ Function.Bijective ⇑(i.cycleIcc (last n))
exact (Fin.cycleIcc i (Fin.last n)).bijective All goals completed! 🐙,
fun x => by C:Typen:ℕc:Fin (n + 1) → Cc1:Fin 2 → Ci:Fin (n + 1)hc:c i = c1 1x:Fin (n + 1)⊢ c (append i.succAbove (fun x => i) x) = append (c ∘ i.succAbove) (c1 ∘ Fin.succAbove 0) x
refine Fin.addCases (fun a => ?_) (fun a => ?_) x refine_1 C:Typen:ℕc:Fin (n + 1) → Cc1:Fin 2 → Ci:Fin (n + 1)hc:c i = c1 1x:Fin (n + 1)a:Fin n⊢ c (append i.succAbove (fun x => i) (castAdd 1 a)) = append (c ∘ i.succAbove) (c1 ∘ Fin.succAbove 0) (castAdd 1 a)refine_2 C:Typen:ℕc:Fin (n + 1) → Cc1:Fin 2 → Ci:Fin (n + 1)hc:c i = c1 1x:Fin (n + 1)a:Fin 1⊢ c (append i.succAbove (fun x => i) (natAdd n a)) = append (c ∘ i.succAbove) (c1 ∘ Fin.succAbove 0) (natAdd n a)
· refine_1 C:Typen:ℕc:Fin (n + 1) → Cc1:Fin 2 → Ci:Fin (n + 1)hc:c i = c1 1x:Fin (n + 1)a:Fin n⊢ c (append i.succAbove (fun x => i) (castAdd 1 a)) = append (c ∘ i.succAbove) (c1 ∘ Fin.succAbove 0) (castAdd 1 a) simp [Fin.append_left] All goals completed! 🐙
· refine_2 C:Typen:ℕc:Fin (n + 1) → Cc1:Fin 2 → Ci:Fin (n + 1)hc:c i = c1 1x:Fin (n + 1)a:Fin 1⊢ c (append i.succAbove (fun x => i) (natAdd n a)) = append (c ∘ i.succAbove) (c1 ∘ Fin.succAbove 0) (natAdd n a) fin_cases a refine_2.«0» C:Typen:ℕc:Fin (n + 1) → Cc1:Fin 2 → Ci:Fin (n + 1)hc:c i = c1 1x:Fin (n + 1)⊢ c (append i.succAbove (fun x => i) (natAdd n ((fun i => i) ⟨0, ⋯⟩))) =
append (c ∘ i.succAbove) (c1 ∘ Fin.succAbove 0) (natAdd n ((fun i => i) ⟨0, ⋯⟩))
simp [Fin.append_right, hc] All goals completed! 🐙⟩
Updating slot i of c to d and then back to e = c i returns c, no other slot moving:
the colour cast a round trip of two contractions at slot i generates.
lemma update_update_of_eq {n : ℕ} {c : Fin n → C} {d e : C} (i : Fin n) (he : c i = e) :
IsReindexing c (Function.update (Function.update c i d) i e) (id : Fin n → Fin n) :=
on_id.mpr (fun j => by C:Typen:ℕc:Fin n → Cd:Ce:Ci:Fin nhe:c i = ej:Fin n⊢ c j = Function.update (Function.update c i d) i e j by_cases h : j = i pos C:Typen:ℕc:Fin n → Cd:Ce:Ci:Fin nhe:c i = ej:Fin nh:j = i⊢ c j = Function.update (Function.update c i d) i e jneg C:Typen:ℕc:Fin n → Cd:Ce:Ci:Fin nhe:c i = ej:Fin nh:¬j = i⊢ c j = Function.update (Function.update c i d) i e j <;> pos C:Typen:ℕc:Fin n → Cd:Ce:Ci:Fin nhe:c i = ej:Fin nh:j = i⊢ c j = Function.update (Function.update c i d) i e jneg C:Typen:ℕc:Fin n → Cd:Ce:Ci:Fin nhe:c i = ej:Fin nh:¬j = i⊢ c j = Function.update (Function.update c i d) i e j simp [h, Function.update_of_ne, he] All goals completed! 🐙)
Splitting a list of colours c : Fin (n + 1) → C into its first entry and its remaining
n entries recovers c: the canonical reindexing Fin (1 + n) ≃ Fin (n + 1) matches
Fin.append ![c 0] (c ∘ Fin.succAbove 0) with c.
lemma append_of_first {n : ℕ} (c : Fin (n + 1) → C) :
IsReindexing (Fin.append ![c 0] (c ∘ Fin.succAbove 0)) c (Fin.cast (by k:Typeinst✝⁵:CommRing kC:TypeG:Typeinst✝⁴:Group GV:C → Typeinst✝³:(c : C) → AddCommGroup (V c)inst✝²:(c : C) → Module k (V c)basisIdx:C → Typeinst✝¹:(c : C) → Fintype (basisIdx c)inst✝:(c : C) → DecidableEq (basisIdx c)rep:(c : C) → Representation k G (V c)b:(c : C) → Basis (basisIdx c) k (V c)S:TensorSpecies k C G V basisIdx rep bn:ℕc:Fin (n + 1) → C⊢ n + 1 = Nat.succ 0 + n grind All goals completed! 🐙)) := by C:Typen:ℕc:Fin (n + 1) → C⊢ IsReindexing (append ![c 0] (c ∘ Fin.succAbove 0)) c (Fin.cast ⋯)
refine ⟨(finCongr (by C:Typen:ℕc:Fin (n + 1) → C⊢ n + 1 = Nat.succ 0 + n grind All goals completed! 🐙)).bijective, fun i => ?_⟩
rcases Fin.eq_zero_or_eq_succ i with rfl | ⟨i, rfl⟩ inl C:Typen:ℕc:Fin (n + 1) → C⊢ append ![c 0] (c ∘ Fin.succAbove 0) (Fin.cast ⋯ 0) = c 0inr C:Typen:ℕc:Fin (n + 1) → Ci:Fin n⊢ append ![c 0] (c ∘ Fin.succAbove 0) (Fin.cast ⋯ i.succ) = c i.succ
· inl C:Typen:ℕc:Fin (n + 1) → C⊢ append ![c 0] (c ∘ Fin.succAbove 0) (Fin.cast ⋯ 0) = c 0 rfl All goals completed! 🐙
· inr C:Typen:ℕc:Fin (n + 1) → Ci:Fin n⊢ append ![c 0] (c ∘ Fin.succAbove 0) (Fin.cast ⋯ i.succ) = c i.succ simpa using congrArg (Fin.append ![c 0] (c ∘ Fin.succ)) (a₁ := Fin.cast _ i.succ)
(a₂ := Fin.natAdd 1 i) (by C:Typen:ℕc:Fin (n + 1) → Ci:Fin n⊢ Fin.cast ⋯ i.succ = natAdd 1 i ext C:Typen:ℕc:Fin (n + 1) → Ci:Fin n⊢ ↑(Fin.cast ⋯ i.succ) = ↑(natAdd 1 i); grind All goals completed! 🐙)
Casting the domain along an equality n1 = n of lengths is a reindexing of c by
c ∘ Fin.cast h.
lemma fin_cast_isReindexing (n n1 : ℕ) {c : Fin n → C} (h : n1 = n) :
IsReindexing c (c ∘ Fin.cast h) (Fin.cast h) := by C:Typen:ℕn1:ℕc:Fin n → Ch:n1 = n⊢ IsReindexing c (c ∘ Fin.cast h) (Fin.cast h)
apply And.intro left C:Typen:ℕn1:ℕc:Fin n → Ch:n1 = n⊢ Function.Bijective (Fin.cast h)right C:Typen:ℕn1:ℕc:Fin n → Ch:n1 = n⊢ ∀ (i : Fin n1), c (Fin.cast h i) = (c ∘ Fin.cast h) i
· left C:Typen:ℕn1:ℕc:Fin n → Ch:n1 = n⊢ Function.Bijective (Fin.cast h) exact Equiv.bijective (finCongr h) All goals completed! 🐙
· right C:Typen:ℕn1:ℕc:Fin n → Ch:n1 = n⊢ ∀ (i : Fin n1), c (Fin.cast h i) = (c ∘ Fin.cast h) i intro i right C:Typen:ℕn1:ℕc:Fin n → Ch:n1 = ni:Fin n1⊢ c (Fin.cast h i) = (c ∘ Fin.cast h) i
rfl All goals completed! 🐙