Imports
/-
Copyright (c) 2024 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 Mathlib.Algebra.Order.Group.Nat
public import Mathlib.Algebra.Order.Monoid.NatCast
public import Mathlib.Logic.Equiv.Fin.BasicFin lemmas
The purpose of this file is to define some results Fin currently in Mathlib.
At some point these should either be up-streamed to Mathlib or replaced with definitions already in Mathlib.
@[expose] public section
Given a i and x in Fin n.succ.succ returns an element of Fin n.succ
subtracting 1 if i.val ≤ x.val else casting x.
def predAboveI (i x : Fin n.succ.succ) : Fin n.succ :=
if h : x.val < i.val then
⟨x.val, n:ℕi:Fin n.succ.succx:Fin n.succ.succh:↑x < ↑i⊢ ↑x < n.succ All goals completed! 🐙⟩
else
⟨x.val - 1, n:ℕi:Fin n.succ.succx:Fin n.succ.succh:¬↑x < ↑i⊢ ↑x - 1 < n.succ All goals completed! 🐙⟩lemma predAboveI_self (i : Fin n.succ.succ) : predAboveI i i = ⟨i.val - 1, n:ℕi:Fin n.succ.succ⊢ ↑i - 1 < n.succ All goals completed! 🐙⟩ := n:ℕi:Fin n.succ.succ⊢ predAboveI i i = ⟨↑i - 1, ⋯⟩
All goals completed! 🐙@[simp]
lemma predAboveI_succAbove (i : Fin n.succ.succ) (x : Fin n.succ) :
predAboveI i (Fin.succAbove i x) = x := n:ℕi:Fin n.succ.succx:Fin n.succ⊢ predAboveI i (i.succAbove x) = x
n:ℕi:Fin n.succ.succx:Fin n.succ⊢ (if h : (if ↑x < ↑i then ↑x else ↑x + 1) < ↑i then if ↑x < ↑i then ↑x else ↑x + 1
else (if ↑x < ↑i then ↑x else ↑x + 1) - 1) =
↑x
n:ℕi:Fin n.succ.succx:Fin n.succh✝:↑x < ↑i⊢ ↑x = ↑xn:ℕi:Fin n.succ.succx:Fin n.succh✝¹:¬↑x < ↑ih✝:↑x + 1 < ↑i⊢ ↑x + 1 = ↑xn:ℕi:Fin n.succ.succx:Fin n.succh✝¹:¬↑x < ↑ih✝:¬↑x + 1 < ↑i⊢ ↑x + 1 - 1 = ↑x n:ℕi:Fin n.succ.succx:Fin n.succh✝:↑x < ↑i⊢ ↑x = ↑xn:ℕi:Fin n.succ.succx:Fin n.succh✝¹:¬↑x < ↑ih✝:↑x + 1 < ↑i⊢ ↑x + 1 = ↑xn:ℕi:Fin n.succ.succx:Fin n.succh✝¹:¬↑x < ↑ih✝:¬↑x + 1 < ↑i⊢ ↑x + 1 - 1 = ↑x All goals completed! 🐙lemma succsAbove_predAboveI {i x : Fin n.succ.succ} (h : i ≠ x) :
Fin.succAbove i (predAboveI i x) = x := n:ℕi:Fin n.succ.succx:Fin n.succ.succh:i ≠ x⊢ i.succAbove (predAboveI i x) = x
n:ℕi:Fin n.succ.succx:Fin n.succ.succh:↑i ≠ ↑x⊢ i.succAbove (predAboveI i x) = x
n:ℕi:Fin n.succ.succx:Fin n.succ.succh:↑i ≠ ↑x⊢ (if (if h : ↑x < ↑i then ↑x else ↑x - 1) < ↑i then if h : ↑x < ↑i then ↑x else ↑x - 1
else (if h : ↑x < ↑i then ↑x else ↑x - 1) + 1) =
↑x
n:ℕi:Fin n.succ.succx:Fin n.succ.succh:↑i ≠ ↑xh✝:↑x < ↑i⊢ ↑x = ↑xn:ℕi:Fin n.succ.succx:Fin n.succ.succh:↑i ≠ ↑xh✝¹:¬↑x < ↑ih✝:↑x - 1 < ↑i⊢ ↑x - 1 = ↑xn:ℕi:Fin n.succ.succx:Fin n.succ.succh:↑i ≠ ↑xh✝¹:¬↑x < ↑ih✝:¬↑x - 1 < ↑i⊢ ↑x - 1 + 1 = ↑x n:ℕi:Fin n.succ.succx:Fin n.succ.succh:↑i ≠ ↑xh✝:↑x < ↑i⊢ ↑x = ↑xn:ℕi:Fin n.succ.succx:Fin n.succ.succh:↑i ≠ ↑xh✝¹:¬↑x < ↑ih✝:↑x - 1 < ↑i⊢ ↑x - 1 = ↑xn:ℕi:Fin n.succ.succx:Fin n.succ.succh:↑i ≠ ↑xh✝¹:¬↑x < ↑ih✝:¬↑x - 1 < ↑i⊢ ↑x - 1 + 1 = ↑x All goals completed! 🐙All goals completed! 🐙
· mpr n:ℕi:Fin n.succ.succx:Fin n.succ.succh✝:i ≠ xy:Fin n.succh:i.succAbove y = x⊢ y = predAboveI i x simp [← h] All goals completed! 🐙lemma predAboveI_lt {i x : Fin n.succ.succ} (h : x.val < i.val) :
predAboveI i x = ⟨x.val, by n:ℕi:Fin n.succ.succx:Fin n.succ.succh:↑x < ↑i⊢ ↑x < n.succ omega All goals completed! 🐙⟩ := by n:ℕi:Fin n.succ.succx:Fin n.succ.succh:↑x < ↑i⊢ predAboveI i x = ⟨↑x, ⋯⟩
simp [predAboveI, h] All goals completed! 🐙lemma predAboveI_ge {i x : Fin n.succ.succ} (h : i.val < x.val) :
predAboveI i x = ⟨x.val - 1, by n:ℕi:Fin n.succ.succx:Fin n.succ.succh:↑i < ↑x⊢ ↑x - 1 < n.succ omega All goals completed! 🐙⟩ := by n:ℕi:Fin n.succ.succx:Fin n.succ.succh:↑i < ↑x⊢ predAboveI i x = ⟨↑x - 1, ⋯⟩
simp only [Nat.succ_eq_add_one, predAboveI, Fin.val_fin_lt, dite_eq_right_iff, Fin.mk.injEq] n:ℕi:Fin n.succ.succx:Fin n.succ.succh:↑i < ↑x⊢ x < i → ↑x = ↑x - 1
omega All goals completed! 🐙
lemma succAbove_succAbove_predAboveI (i : Fin n.succ.succ) (j : Fin n.succ) (x : Fin n) :
i.succAbove (j.succAbove x) =
(i.succAbove j).succAbove ((predAboveI (i.succAbove j) i).succAbove x) := by n:ℕi:Fin n.succ.succj:Fin n.succx:Fin n⊢ i.succAbove (j.succAbove x) = (i.succAbove j).succAbove ((predAboveI (i.succAbove j) i).succAbove x)
rw [← (predAboveI_eq_iff (Fin.succAbove_ne i j) (j.predAbove i)).mpr
(Fin.succAbove_succAbove_predAbove i j), n:ℕi:Fin n.succ.succj:Fin n.succx:Fin n⊢ i.succAbove (j.succAbove x) = (i.succAbove j).succAbove ((j.predAbove i).succAbove x) All goals completed! 🐙
Fin.succAbove_succAbove_succAbove_predAbove n:ℕi:Fin n.succ.succj:Fin n.succx:Fin n⊢ i.succAbove (j.succAbove x) = i.succAbove (j.succAbove x) All goals completed! 🐙] All goals completed! 🐙
The equivalence between Fin n.succ and Fin 1 ⊕ Fin n extracting the
ith component.
def finExtractOne {n : ℕ} (i : Fin (n + 1)) : Fin (n + 1) ≃ Fin 1 ⊕ Fin n :=
(finCongr (by n✝:ℕn:ℕi:Fin (n + 1)⊢ n.succ = ↑i + 1 + (n - ↑i) omega All goals completed! 🐙 : n.succ = i + 1 + (n - i))).trans <|
finSumFinEquiv.symm.trans <|
(Equiv.sumCongr (finSumFinEquiv.symm.trans (Equiv.sumComm (Fin i) (Fin 1)))
(Equiv.refl (Fin (n-i)))).trans <|
(Equiv.sumAssoc (Fin 1) (Fin i) (Fin (n - i))).trans <|
Equiv.sumCongr (Equiv.refl (Fin 1)) (finSumFinEquiv.trans (finCongr (by n✝:ℕn:ℕi:Fin (n + 1)⊢ ↑i + (n - ↑i) = n omega All goals completed! 🐙)))
@[simp]
lemma finExtractOne_apply_eq {n : ℕ} (i : Fin n.succ) :
finExtractOne i i = Sum.inl 0 := by n:ℕi:Fin n.succ⊢ (finExtractOne i) i = Sum.inl 0
rw [Equiv.apply_eq_iff_eq_symm_apply n:ℕi:Fin n.succ⊢ i = (finExtractOne i).symm (Sum.inl 0) n:ℕi:Fin n.succ⊢ i = (finExtractOne i).symm (Sum.inl 0)] n:ℕi:Fin n.succ⊢ i = (finExtractOne i).symm (Sum.inl 0)
rfl All goals completed! 🐙
lemma finExtractOne_symm_inr {n : ℕ} (i : Fin n.succ) :
(finExtractOne i).symm ∘ Sum.inr = i.succAbove := by n:ℕi:Fin n.succ⊢ ⇑(finExtractOne i).symm ∘ Sum.inr = i.succAbove
ext x n:ℕi:Fin n.succx:Fin n⊢ ↑((⇑(finExtractOne i).symm ∘ Sum.inr) x) = ↑(i.succAbove x)
simp only [Nat.succ_eq_add_one, finExtractOne, Function.comp_apply, Equiv.symm_trans_apply,
finCongr_symm, Equiv.symm_symm, Equiv.sumCongr_symm, Equiv.refl_symm, Equiv.sumCongr_apply,
Equiv.coe_refl, Sum.map_inr, finCongr_apply, Fin.val_cast] n:ℕi:Fin n.succx:Fin n⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast ⋯ x)))))) =
↑(i.succAbove x)
change (finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - i))).symm
(Sum.inr (finSumFinEquiv.symm (Fin.cast _ x)))))).val = _ n:ℕi:Fin n.succx:Fin n⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast ⋯ x)))))) =
↑(i.succAbove x)
by_cases hi : x.1 < i.1 pos n:ℕi:Fin n.succx:Fin nhi:↑x < ↑i⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast ⋯ x)))))) =
↑(i.succAbove x)neg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑i⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast ⋯ x)))))) =
↑(i.succAbove x)
· pos n:ℕi:Fin n.succx:Fin nhi:↑x < ↑i⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast ⋯ x)))))) =
↑(i.succAbove x) generalize_proofs hp pos n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast hp x)))))) =
↑(i.succAbove x)
have h1 : (finSumFinEquiv.symm (Fin.cast hp x)) =
Sum.inl ⟨x, hi⟩ := by n:ℕi:Fin n.succ⊢ ⇑(finExtractOne i).symm ∘ Sum.inr = i.succAbove pos n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inl ⟨↑x, hi⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast hp x)))))) =
↑(i.succAbove x)
rw [← finSumFinEquiv_symm_apply_castAdd n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)⊢ finSumFinEquiv.symm (Fin.cast hp x) = finSumFinEquiv.symm (Fin.castAdd (n - ↑i) ⟨↑x, hi⟩) n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)⊢ finSumFinEquiv.symm (Fin.cast hp x) = finSumFinEquiv.symm (Fin.castAdd (n - ↑i) ⟨↑x, hi⟩) pos n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inl ⟨↑x, hi⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast hp x)))))) =
↑(i.succAbove x)] n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)⊢ finSumFinEquiv.symm (Fin.cast hp x) = finSumFinEquiv.symm (Fin.castAdd (n - ↑i) ⟨↑x, hi⟩)pos n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inl ⟨↑x, hi⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast hp x)))))) =
↑(i.succAbove x)
rflpos n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inl ⟨↑x, hi⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast hp x)))))) =
↑(i.succAbove x)pos n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inl ⟨↑x, hi⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast hp x)))))) =
↑(i.succAbove x)
rw [h1 pos n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inl ⟨↑x, hi⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (Sum.inl ⟨↑x, hi⟩))))) =
↑(i.succAbove x) pos n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inl ⟨↑x, hi⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (Sum.inl ⟨↑x, hi⟩))))) =
↑(i.succAbove x)]pos n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inl ⟨↑x, hi⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (Sum.inl ⟨↑x, hi⟩))))) =
↑(i.succAbove x)
simp only [Nat.succ_eq_add_one, Equiv.sumAssoc_symm_apply_inr_inl, Sum.map_inl,
Equiv.symm_trans_apply, Equiv.symm_symm, Equiv.sumComm_symm, Equiv.sumComm_apply,
Sum.swap_inr, finSumFinEquiv_apply_left, Fin.castAdd_mk] pos n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inl ⟨↑x, hi⟩⊢ ↑x = ↑(i.succAbove x)
rw [Fin.succAbove pos n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inl ⟨↑x, hi⟩⊢ ↑x = ↑(if x.castSucc < i then x.castSucc else x.succ) pos n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inl ⟨↑x, hi⟩⊢ ↑x = ↑(if x.castSucc < i then x.castSucc else x.succ)]pos n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inl ⟨↑x, hi⟩⊢ ↑x = ↑(if x.castSucc < i then x.castSucc else x.succ)
split pos.isTrue n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inl ⟨↑x, hi⟩h✝:x.castSucc < i⊢ ↑x = ↑x.castSuccpos.isFalse n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inl ⟨↑x, hi⟩h✝:¬x.castSucc < i⊢ ↑x = ↑x.succ
· pos.isTrue n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inl ⟨↑x, hi⟩h✝:x.castSucc < i⊢ ↑x = ↑x.castSucc rfl All goals completed! 🐙
rename_i hn pos.isFalse n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inl ⟨↑x, hi⟩hn:¬x.castSucc < i⊢ ↑x = ↑x.succ
simp_all only [Nat.succ_eq_add_one, not_lt, Fin.le_def, Fin.val_castSucc, Fin.val_succ,
left_eq_add, one_ne_zero] pos.isFalse n:ℕi:Fin n.succx:Fin nhi:↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inl ⟨↑x, hi⟩hn:↑i ≤ ↑x⊢ False
omega All goals completed! 🐙
· neg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑i⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast ⋯ x)))))) =
↑(i.succAbove x) generalize_proofs hp neg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast hp x)))))) =
↑(i.succAbove x)
have h1 : (finSumFinEquiv.symm (Fin.cast hp x)) =
Sum.inr ⟨x - i, by n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)⊢ ↑x - ↑i < n - ↑i neg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast hp x)))))) =
↑(i.succAbove x) omega All goals completed! 🐙neg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast hp x)))))) =
↑(i.succAbove x)⟩ := by n:ℕi:Fin n.succ⊢ ⇑(finExtractOne i).symm ∘ Sum.inr = i.succAboveneg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast hp x)))))) =
↑(i.succAbove x)
rw [← finSumFinEquiv_symm_apply_natAdd n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)⊢ finSumFinEquiv.symm (Fin.cast hp x) = finSumFinEquiv.symm (Fin.natAdd ↑i ⟨↑x - ↑i, ⋯⟩) n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)⊢ finSumFinEquiv.symm (Fin.cast hp x) = finSumFinEquiv.symm (Fin.natAdd ↑i ⟨↑x - ↑i, ⋯⟩)neg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast hp x)))))) =
↑(i.succAbove x)] n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)⊢ finSumFinEquiv.symm (Fin.cast hp x) = finSumFinEquiv.symm (Fin.natAdd ↑i ⟨↑x - ↑i, ⋯⟩)neg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast hp x)))))) =
↑(i.succAbove x)
apply congrArg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)⊢ Fin.cast hp x = Fin.natAdd ↑i ⟨↑x - ↑i, ⋯⟩neg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast hp x)))))) =
↑(i.succAbove x)
ext n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)⊢ ↑(Fin.cast hp x) = ↑(Fin.natAdd ↑i ⟨↑x - ↑i, ⋯⟩)neg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast hp x)))))) =
↑(i.succAbove x)
simp only [Nat.succ_eq_add_one, Fin.val_cast, Fin.natAdd_mk] n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)⊢ ↑x = ↑i + (↑x - ↑i)neg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast hp x)))))) =
↑(i.succAbove x)
omeganeg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast hp x)))))) =
↑(i.succAbove x)neg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (finSumFinEquiv.symm (Fin.cast hp x)))))) =
↑(i.succAbove x)
rw [h1, neg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (Sum.inr ⟨↑x - ↑i, ⋯⟩))))) =
↑(i.succAbove x) neg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (Sum.inr ⟨↑x - ↑i, ⋯⟩))))) =
↑(if x.castSucc < i then x.castSucc else x.succ) Fin.succAbove neg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (Sum.inr ⟨↑x - ↑i, ⋯⟩))))) =
↑(if x.castSucc < i then x.castSucc else x.succ)neg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (Sum.inr ⟨↑x - ↑i, ⋯⟩))))) =
↑(if x.castSucc < i then x.castSucc else x.succ)]neg n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (Sum.inr ⟨↑x - ↑i, ⋯⟩))))) =
↑(if x.castSucc < i then x.castSucc else x.succ)
split neg.isTrue n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩h✝:x.castSucc < i⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (Sum.inr ⟨↑x - ↑i, ⋯⟩))))) =
↑x.castSuccneg.isFalse n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩h✝:¬x.castSucc < i⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (Sum.inr ⟨↑x - ↑i, ⋯⟩))))) =
↑x.succ
· neg.isTrue n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩h✝:x.castSucc < i⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (Sum.inr ⟨↑x - ↑i, ⋯⟩))))) =
↑x.castSucc rename_i hn neg.isTrue n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩hn:x.castSucc < i⊢ ↑(finSumFinEquiv
(Sum.map (⇑(finSumFinEquiv.symm.trans (Equiv.sumComm (Fin ↑i) (Fin 1))).symm) id
((Equiv.sumAssoc (Fin 1) (Fin ↑i) (Fin (n - ↑i))).symm (Sum.inr (Sum.inr ⟨↑x - ↑i, ⋯⟩))))) =
↑x.castSucc
simp_all [Fin.lt_def] All goals completed! 🐙
simp only [Nat.succ_eq_add_one, Equiv.sumAssoc_symm_apply_inr_inr, Sum.map_inr, id_eq,
finSumFinEquiv_apply_right, Fin.natAdd_mk, Fin.val_succ] neg.isFalse n:ℕi:Fin n.succx:Fin nhi:¬↑x < ↑ihp:n = ↑i + (n - ↑i)h1:finSumFinEquiv.symm (Fin.cast hp x) = Sum.inr ⟨↑x - ↑i, ⋯⟩h✝:¬x.castSucc < i⊢ ↑i + 1 + (↑x - ↑i) = ↑x + 1
omega All goals completed! 🐙
@[simp]
lemma finExtractOne_symm_inr_apply {n : ℕ} (i : Fin n.succ) (x : Fin n) :
(finExtractOne i).symm (Sum.inr x) = i.succAbove x := calc
_ = ((finExtractOne i).symm ∘ Sum.inr) x := rfl
_ = i.succAbove x := by n:ℕi:Fin n.succx:Fin n⊢ (⇑(finExtractOne i).symm ∘ Sum.inr) x = i.succAbove x rw [finExtractOne_symm_inr n:ℕi:Fin n.succx:Fin n⊢ i.succAbove x = i.succAbove x All goals completed! 🐙] All goals completed! 🐙@[simp]
lemma finExtractOne_symm_inl_apply {n : ℕ} (i : Fin n.succ) :
(finExtractOne i).symm (Sum.inl 0) = i := by n:ℕi:Fin n.succ⊢ (finExtractOne i).symm (Sum.inl 0) = i
rfl All goals completed! 🐙lemma finExtractOne_apply_neq {n : ℕ} (i j : Fin (n + 1 + 1)) (hij : i ≠ j) :
finExtractOne i j = Sum.inr (predAboveI i j) := by n:ℕi:Fin (n + 1 + 1)j:Fin (n + 1 + 1)hij:i ≠ j⊢ (finExtractOne i) j = Sum.inr (predAboveI i j)
symm n:ℕi:Fin (n + 1 + 1)j:Fin (n + 1 + 1)hij:i ≠ j⊢ Sum.inr (predAboveI i j) = (finExtractOne i) j
apply (Equiv.symm_apply_eq _).mp ?_ n:ℕi:Fin (n + 1 + 1)j:Fin (n + 1 + 1)hij:i ≠ j⊢ (finExtractOne i).symm (Sum.inr (predAboveI i j)) = j
simp only [Nat.succ_eq_add_one, finExtractOne_symm_inr_apply] n:ℕi:Fin (n + 1 + 1)j:Fin (n + 1 + 1)hij:i ≠ j⊢ i.succAbove (predAboveI i j) = j
exact succsAbove_predAboveI hij All goals completed! 🐙
Given an equivalence Fin n.succ.succ ≃ Fin n.succ.succ, and an i : Fin n.succ.succ,
the map Fin n.succ → Fin n.succ obtained by dropping i and it's image.
def finExtractOnPermHom {m : ℕ} (i : Fin n.succ.succ) (σ : Fin n.succ.succ ≃ Fin m.succ.succ) :
Fin n.succ → Fin m.succ := fun x => predAboveI (σ i) (σ ((finExtractOne i).symm (Sum.inr x)))
lemma finExtractOnPermHom_inv {m : ℕ} (i : Fin n.succ.succ)
(σ : Fin n.succ.succ ≃ Fin m.succ.succ) :
(finExtractOnPermHom (σ i) σ.symm) ∘ (finExtractOnPermHom i σ) = id := by n:ℕm:ℕi:Fin n.succ.succσ:Fin n.succ.succ ≃ Fin m.succ.succ⊢ finExtractOnPermHom (σ i) σ.symm ∘ finExtractOnPermHom i σ = id
funext x n:ℕm:ℕi:Fin n.succ.succσ:Fin n.succ.succ ≃ Fin m.succ.succx:Fin n.succ⊢ (finExtractOnPermHom (σ i) σ.symm ∘ finExtractOnPermHom i σ) x = id x
have hσ : σ i ≠ σ (i.succAbove x) := by n:ℕm:ℕi:Fin n.succ.succσ:Fin n.succ.succ ≃ Fin m.succ.succ⊢ finExtractOnPermHom (σ i) σ.symm ∘ finExtractOnPermHom i σ = id n:ℕm:ℕi:Fin n.succ.succσ:Fin n.succ.succ ≃ Fin m.succ.succx:Fin n.succhσ:σ i ≠ σ (i.succAbove x)⊢ (finExtractOnPermHom (σ i) σ.symm ∘ finExtractOnPermHom i σ) x = id x simp n:ℕm:ℕi:Fin n.succ.succσ:Fin n.succ.succ ≃ Fin m.succ.succx:Fin n.succhσ:σ i ≠ σ (i.succAbove x)⊢ (finExtractOnPermHom (σ i) σ.symm ∘ finExtractOnPermHom i σ) x = id x n:ℕm:ℕi:Fin n.succ.succσ:Fin n.succ.succ ≃ Fin m.succ.succx:Fin n.succhσ:σ i ≠ σ (i.succAbove x)⊢ (finExtractOnPermHom (σ i) σ.symm ∘ finExtractOnPermHom i σ) x = id x
simp only [Function.comp_apply, finExtractOnPermHom, finExtractOne_symm_inr_apply,
Equiv.symm_apply_apply, succsAbove_predAboveI hσ, predAboveI_succAbove, id_eq] All goals completed! 🐙
Given an equivalence Fin n.succ.succ ≃ Fin n.succ.succ, and an i : Fin n.succ.succ,
the equivalence Fin n.succ ≃ Fin n.succ obtained by dropping i and it's image.
def finExtractOnePerm {m : ℕ} (i : Fin n.succ.succ) (σ : Fin n.succ.succ ≃ Fin m.succ.succ) :
Fin n.succ ≃ Fin m.succ where
toFun x := finExtractOnPermHom i σ x
invFun x := finExtractOnPermHom (σ i) σ.symm x
left_inv x := by n:ℕm:ℕi:Fin n.succ.succσ:Fin n.succ.succ ≃ Fin m.succ.succx:Fin n.succ⊢ (fun x => finExtractOnPermHom (σ i) σ.symm x) ((fun x => finExtractOnPermHom i σ x) x) = x simpa using congrFun (finExtractOnPermHom_inv i σ) x All goals completed! 🐙
right_inv x := by n:ℕm:ℕi:Fin n.succ.succσ:Fin n.succ.succ ≃ Fin m.succ.succx:Fin m.succ⊢ (fun x => finExtractOnPermHom i σ x) ((fun x => finExtractOnPermHom (σ i) σ.symm x) x) = x simpa using congrFun (finExtractOnPermHom_inv (σ i) σ.symm) x All goals completed! 🐙
lemma finExtractOnePerm_equiv {n m : ℕ} (e : Fin n.succ.succ ≃ Fin m.succ.succ)
(i : Fin n.succ.succ) :
e ∘ i.succAbove = (e i).succAbove ∘ finExtractOnePerm i e := by n:ℕm:ℕe:Fin n.succ.succ ≃ Fin m.succ.succi:Fin n.succ.succ⊢ ⇑e ∘ i.succAbove = (e i).succAbove ∘ ⇑(finExtractOnePerm i e)
funext x n:ℕm:ℕe:Fin n.succ.succ ≃ Fin m.succ.succi:Fin n.succ.succx:Fin (n + 1)⊢ (⇑e ∘ i.succAbove) x = ((e i).succAbove ∘ ⇑(finExtractOnePerm i e)) x
have hσ : e i ≠ e (i.succAbove x) := by n:ℕm:ℕe:Fin n.succ.succ ≃ Fin m.succ.succi:Fin n.succ.succ⊢ ⇑e ∘ i.succAbove = (e i).succAbove ∘ ⇑(finExtractOnePerm i e) n:ℕm:ℕe:Fin n.succ.succ ≃ Fin m.succ.succi:Fin n.succ.succx:Fin (n + 1)hσ:e i ≠ e (i.succAbove x)⊢ (⇑e ∘ i.succAbove) x = ((e i).succAbove ∘ ⇑(finExtractOnePerm i e)) x simp n:ℕm:ℕe:Fin n.succ.succ ≃ Fin m.succ.succi:Fin n.succ.succx:Fin (n + 1)hσ:e i ≠ e (i.succAbove x)⊢ (⇑e ∘ i.succAbove) x = ((e i).succAbove ∘ ⇑(finExtractOnePerm i e)) x n:ℕm:ℕe:Fin n.succ.succ ≃ Fin m.succ.succi:Fin n.succ.succx:Fin (n + 1)hσ:e i ≠ e (i.succAbove x)⊢ (⇑e ∘ i.succAbove) x = ((e i).succAbove ∘ ⇑(finExtractOnePerm i e)) x
simp only [Function.comp_apply, finExtractOnePerm, finExtractOnPermHom, Equiv.coe_fn_mk,
finExtractOne_symm_inr_apply, succsAbove_predAboveI hσ] All goals completed! 🐙@[simp]
lemma finExtractOnePerm_apply (i : Fin n.succ.succ) (σ : Fin n.succ.succ ≃ Fin n.succ.succ)
(x : Fin n.succ) : finExtractOnePerm i σ x = predAboveI (σ i)
(σ ((finExtractOne i).symm (Sum.inr x))) := rfl@[simp]
lemma finExtractOnePerm_symm_apply (i : Fin n.succ.succ) (σ : Fin n.succ.succ ≃ Fin n.succ.succ)
(x : Fin n.succ) : (finExtractOnePerm i σ).symm x = predAboveI (σ.symm (σ i))
(σ.symm ((finExtractOne (σ i)).symm (Sum.inr x))) := rfl
The equivalence of types Fin n.succ.succ ≃ (Fin 1 ⊕ Fin 1) ⊕ Fin n extracting
the i and (i.succAbove j).
def finExtractTwo {n : ℕ} (i : Fin n.succ.succ) (j : Fin n.succ) :
Fin n.succ.succ ≃ (Fin 1 ⊕ Fin 1) ⊕ Fin n :=
(finExtractOne i).trans <|
(Equiv.sumCongr (Equiv.refl (Fin 1)) (finExtractOne j)).trans <|
(Equiv.sumAssoc (Fin 1) (Fin 1) (Fin n)).symm@[simp]
lemma finExtractTwo_apply_fst {n : ℕ} (i : Fin n.succ.succ) (j : Fin n.succ) :
finExtractTwo i j i = Sum.inl (Sum.inl 0) := by n:ℕi:Fin n.succ.succj:Fin n.succ⊢ (finExtractTwo i j) i = Sum.inl (Sum.inl 0)
simp [finExtractTwo] All goals completed! 🐙lemma finExtractTwo_symm_inr {n : ℕ} (i : Fin n.succ.succ) (j : Fin n.succ) :
(finExtractTwo i j).symm ∘ Sum.inr = i.succAbove ∘ j.succAbove := by n:ℕi:Fin n.succ.succj:Fin n.succ⊢ ⇑(finExtractTwo i j).symm ∘ Sum.inr = i.succAbove ∘ j.succAbove
ext1 x n:ℕi:Fin n.succ.succj:Fin n.succx:Fin n⊢ (⇑(finExtractTwo i j).symm ∘ Sum.inr) x = (i.succAbove ∘ j.succAbove) x
simp [finExtractTwo] All goals completed! 🐙@[simp]
lemma finExtractTwo_symm_inr_apply {n : ℕ} (i : Fin n.succ.succ) (j : Fin n.succ) (x : Fin n) :
(finExtractTwo i j).symm (Sum.inr x) = i.succAbove (j.succAbove x) := by n:ℕi:Fin n.succ.succj:Fin n.succx:Fin n⊢ (finExtractTwo i j).symm (Sum.inr x) = i.succAbove (j.succAbove x)
simp [finExtractTwo] All goals completed! 🐙@[simp]
lemma finExtractTwo_symm_inl_inr_apply {n : ℕ} (i : Fin n.succ.succ) (j : Fin n.succ) :
(finExtractTwo i j).symm (Sum.inl (Sum.inr 0)) = i.succAbove j := by n:ℕi:Fin n.succ.succj:Fin n.succ⊢ (finExtractTwo i j).symm (Sum.inl (Sum.inr 0)) = i.succAbove j
simp [finExtractTwo] All goals completed! 🐙@[simp]
lemma finExtractTwo_symm_inl_inl_apply {n : ℕ} (i : Fin n.succ.succ) (j : Fin n.succ) :
(finExtractTwo i j).symm (Sum.inl (Sum.inl 0)) = i := by n:ℕi:Fin n.succ.succj:Fin n.succ⊢ (finExtractTwo i j).symm (Sum.inl (Sum.inl 0)) = i rfl All goals completed! 🐙@[simp]
lemma finExtractTwo_apply_snd {n : ℕ} (i : Fin n.succ.succ) (j : Fin n.succ) :
finExtractTwo i j (i.succAbove j) = Sum.inl (Sum.inr 0) := by n:ℕi:Fin n.succ.succj:Fin n.succ⊢ (finExtractTwo i j) (i.succAbove j) = Sum.inl (Sum.inr 0)
simp [← Equiv.eq_symm_apply] All goals completed! 🐙
Takes two maps Fin n → Fin n and returns the equivalence they form.
def finMapToEquiv (f1 : Fin n → Fin m) (f2 : Fin m → Fin n)
(h : ∀ x, f1 (f2 x) = x := by decide)
(h' : ∀ x, f2 (f1 x) = x := by decide) : Fin n ≃ Fin m where
toFun := f1
invFun := f2
left_inv := h'
right_inv := h@[simp]
lemma finMapToEquiv_apply {f1 : Fin n → Fin m} {f2 : Fin m → Fin n}
{h : ∀ x, f1 (f2 x) = x} {h' : ∀ x, f2 (f1 x) = x} (x : Fin n) :
finMapToEquiv f1 f2 h h' x = f1 x := rfl@[simp]
lemma finMapToEquiv_symm_apply {f1 : Fin n → Fin m} {f2 : Fin m → Fin n}
{h : ∀ x, f1 (f2 x) = x} {h' : ∀ x, f2 (f1 x) = x} (x : Fin m) :
(finMapToEquiv f1 f2 h h').symm x = f2 x := rfllemma finMapToEquiv_symm_eq {f1 : Fin n → Fin m} {f2 : Fin m → Fin n}
{h : ∀ x, f1 (f2 x) = x} {h' : ∀ x, f2 (f1 x) = x} :
(finMapToEquiv f1 f2 h h').symm = finMapToEquiv f2 f1 h' h := rfl
Given an equivalence between Fin n and Fin m, the induced equivalence between
Fin n.succ and Fin m.succ derived by Fin.cons.
def equivCons {n m : ℕ} (e : Fin n ≃ Fin m) : Fin n.succ ≃ Fin m.succ where
toFun := Fin.cons 0 (Fin.succ ∘ e.toFun)
invFun := Fin.cons 0 (Fin.succ ∘ e.invFun)
left_inv i := by n✝:ℕn:ℕm:ℕe:Fin n ≃ Fin mi:Fin n.succ⊢ Fin.cons 0 (Fin.succ ∘ e.invFun) (Fin.cons 0 (Fin.succ ∘ e.toFun) i) = i induction i using Fin.cases zero n✝:ℕn:ℕm:ℕe:Fin n ≃ Fin m⊢ Fin.cons 0 (Fin.succ ∘ e.invFun) (Fin.cons 0 (Fin.succ ∘ e.toFun) 0) = 0succ n✝:ℕn:ℕm:ℕe:Fin n ≃ Fin mi✝:Fin n⊢ Fin.cons 0 (Fin.succ ∘ e.invFun) (Fin.cons 0 (Fin.succ ∘ e.toFun) i✝.succ) = i✝.succ <;> zero n✝:ℕn:ℕm:ℕe:Fin n ≃ Fin m⊢ Fin.cons 0 (Fin.succ ∘ e.invFun) (Fin.cons 0 (Fin.succ ∘ e.toFun) 0) = 0succ n✝:ℕn:ℕm:ℕe:Fin n ≃ Fin mi✝:Fin n⊢ Fin.cons 0 (Fin.succ ∘ e.invFun) (Fin.cons 0 (Fin.succ ∘ e.toFun) i✝.succ) = i✝.succ simp All goals completed! 🐙
right_inv i := by n✝:ℕn:ℕm:ℕe:Fin n ≃ Fin mi:Fin m.succ⊢ Fin.cons 0 (Fin.succ ∘ e.toFun) (Fin.cons 0 (Fin.succ ∘ e.invFun) i) = i induction i using Fin.cases zero n✝:ℕn:ℕm:ℕe:Fin n ≃ Fin m⊢ Fin.cons 0 (Fin.succ ∘ e.toFun) (Fin.cons 0 (Fin.succ ∘ e.invFun) 0) = 0succ n✝:ℕn:ℕm:ℕe:Fin n ≃ Fin mi✝:Fin m⊢ Fin.cons 0 (Fin.succ ∘ e.toFun) (Fin.cons 0 (Fin.succ ∘ e.invFun) i✝.succ) = i✝.succ <;> zero n✝:ℕn:ℕm:ℕe:Fin n ≃ Fin m⊢ Fin.cons 0 (Fin.succ ∘ e.toFun) (Fin.cons 0 (Fin.succ ∘ e.invFun) 0) = 0succ n✝:ℕn:ℕm:ℕe:Fin n ≃ Fin mi✝:Fin m⊢ Fin.cons 0 (Fin.succ ∘ e.toFun) (Fin.cons 0 (Fin.succ ∘ e.invFun) i✝.succ) = i✝.succ simp All goals completed! 🐙@[simp]
lemma equivCons_zero {n m : ℕ} (e : Fin n ≃ Fin m) :
equivCons e 0 = 0 := rfl@[simp]
lemma equivCons_trans {n m k : ℕ} (e : Fin n ≃ Fin m) (f : Fin m ≃ Fin k) :
Fin.equivCons (e.trans f) = (Fin.equivCons e).trans (Fin.equivCons f) := by n:ℕm:ℕk:ℕe:Fin n ≃ Fin mf:Fin m ≃ Fin k⊢ equivCons (e.trans f) = (equivCons e).trans (equivCons f)
ext x n:ℕm:ℕk:ℕe:Fin n ≃ Fin mf:Fin m ≃ Fin kx:Fin n.succ⊢ ↑((equivCons (e.trans f)) x) = ↑(((equivCons e).trans (equivCons f)) x)
induction x using Fin.cases zero n:ℕm:ℕk:ℕe:Fin n ≃ Fin mf:Fin m ≃ Fin k⊢ ↑((equivCons (e.trans f)) 0) = ↑(((equivCons e).trans (equivCons f)) 0)succ n:ℕm:ℕk:ℕe:Fin n ≃ Fin mf:Fin m ≃ Fin ki✝:Fin n⊢ ↑((equivCons (e.trans f)) i✝.succ) = ↑(((equivCons e).trans (equivCons f)) i✝.succ) <;> zero n:ℕm:ℕk:ℕe:Fin n ≃ Fin mf:Fin m ≃ Fin k⊢ ↑((equivCons (e.trans f)) 0) = ↑(((equivCons e).trans (equivCons f)) 0)succ n:ℕm:ℕk:ℕe:Fin n ≃ Fin mf:Fin m ≃ Fin ki✝:Fin n⊢ ↑((equivCons (e.trans f)) i✝.succ) = ↑(((equivCons e).trans (equivCons f)) i✝.succ) rfl All goals completed! 🐙@[simp]
lemma equivCons_castOrderIso {n m : ℕ} (h : n = m) :
(Fin.equivCons (Fin.castOrderIso h).toEquiv) = (Fin.castOrderIso (by n✝:ℕn:ℕm:ℕh:n = m⊢ n.succ = m.succ simp [h] All goals completed! 🐙)).toEquiv := by n:ℕm:ℕh:n = m⊢ equivCons (Fin.castOrderIso h).toEquiv = (Fin.castOrderIso ⋯).toEquiv
ext x n:ℕm:ℕh:n = mx:Fin n.succ⊢ ↑((equivCons (Fin.castOrderIso h).toEquiv) x) = ↑((Fin.castOrderIso ⋯).toEquiv x)
induction x using Fin.cases zero n:ℕm:ℕh:n = m⊢ ↑((equivCons (Fin.castOrderIso h).toEquiv) 0) = ↑((Fin.castOrderIso ⋯).toEquiv 0)succ n:ℕm:ℕh:n = mi✝:Fin n⊢ ↑((equivCons (Fin.castOrderIso h).toEquiv) i✝.succ) = ↑((Fin.castOrderIso ⋯).toEquiv i✝.succ) <;> zero n:ℕm:ℕh:n = m⊢ ↑((equivCons (Fin.castOrderIso h).toEquiv) 0) = ↑((Fin.castOrderIso ⋯).toEquiv 0)succ n:ℕm:ℕh:n = mi✝:Fin n⊢ ↑((equivCons (Fin.castOrderIso h).toEquiv) i✝.succ) = ↑((Fin.castOrderIso ⋯).toEquiv i✝.succ) rfl All goals completed! 🐙@[simp]
lemma equivCons_symm_succ {n m : ℕ} (e : Fin n ≃ Fin m) (i : ℕ) (hi : i + 1 < m.succ) :
(Fin.equivCons e).symm ⟨i + 1, hi⟩ = (e.symm ⟨i, Nat.succ_lt_succ_iff.mp hi⟩).succ := rfl@[simp]
lemma equivCons_succ {n m : ℕ} (e : Fin n ≃ Fin m) (i : ℕ) (hi : i + 1 < n.succ) :
(Fin.equivCons e) ⟨i + 1, hi⟩ = (e ⟨i, Nat.succ_lt_succ_iff.mp hi⟩).succ := rfl