Documentation

Starlib.Data.Fin.Tuple.Lemmas

Lemmas for new operations on Fin-indexed (heterogeneous) vectors #

@[implicit_reducible]
instance Fin.instUniqueForallOfNatNat_starlib {α : Sort u} :
Unique (Fin 0α)
@[implicit_reducible]
instance Fin.instUniqueForall_starlib {α : Fin 0Sort u} :
Unique ((i : Fin 0) → α i)
@[simp]
theorem Fin.dcons_zero {n : } {motive : Fin (n + 1)Sort u} (a : motive 0) (v : (i : Fin n) → motive i.succ) :
(a ::ᵈ v) 0 = a
@[simp]
theorem Fin.vcons_zero {n : } {α : Sort u} (a : α) (v : Fin nα) :
(a ::ᵛ v) 0 = a
@[simp]
theorem Fin.dcons_succ {n : } {motive : Fin (n + 1)Sort u} (a : motive 0) (v : (i : Fin n) → motive i.succ) (i : Fin n) :
(a ::ᵈ v) i.succ = v i
@[simp]
theorem Fin.vcons_succ {n : } {α : Sort u} (a : α) (v : Fin nα) (i : Fin n) :
(a ::ᵛ v) i.succ = v i
@[csimp]

dcons is equal to cons. Marked as csimp to allow for switching to the cons implementation during execution.

theorem Fin.vcons_eq_cons {n : } {α : Sort u} (a : α) (v : Fin nα) :
a ::ᵛ v = cons a v
@[simp]
theorem Fin.dcons_one {n : } {motive : Fin (n + 2)Sort u} (a : motive 0) (v : (i : Fin (n + 1)) → motive i.succ) :
(a ::ᵈ v) 1 = v 0
@[simp]
theorem Fin.vcons_one {n : } {α : Sort u} (a : α) (v : Fin (n + 1)α) :
(a ::ᵛ v) 1 = v 0
@[simp]
theorem Fin.vcons_empty {α : Sort u} (a : α) :
@[simp]
theorem Fin.vcons_of_one {α : Sort u} (a : α) {i : Fin 1} :
!v[a] i = match i with | 0 => a
@[simp]
theorem Fin.tail_vcons {n : } {α : Sort u} (a : α) (v : Fin nα) :
tail (a ::ᵛ v) = v
@[simp]
theorem Fin.vcons_self_tail {n : } {α : Sort u} (v : Fin (n + 1)α) :
v 0 ::ᵛ tail v = v
theorem Fin.vcons_right_injective {n : } {α : Sort u} (a : α) :
theorem Fin.vcons_left_injective {n : } {α : Sort u} (v : Fin nα) :
Function.Injective fun (a : α) => a ::ᵛ v
theorem Fin.vcons_inj {n : } {α : Sort u} (a b : α) (v w : Fin nα) :
a ::ᵛ v = b ::ᵛ w a = b v = w
@[simp]
theorem Fin.vcons_fin_zero {α : Sort u} (a : α) (v : Fin 0α) :
a ::ᵛ v = fun (i : Fin (0 + 1)) => match i with | 0 => a
theorem Fin.vcons_eq_const {n : } {α : Sort u} (a : α) :
(a ::ᵛ fun (x : Fin n) => a) = fun (x : Fin (n + 1)) => a
theorem Fin.range_vcons {n : } {α : Type u_1} (a : α) (v : Fin nα) :
@[simp]
theorem Fin.dconcat_zero {motive : Fin 1Sort u} (a : motive (last 0)) :
@[simp]
theorem Fin.vconcat_zero {α : Sort u} (a : α) :
@[simp]
theorem Fin.dconcat_last {n : } {motive : Fin (n + 1)Sort u} (v : (i : Fin n) → motive i.castSucc) (a : motive (last n)) :
(v :+ᵈ a) (last n) = a
@[simp]
theorem Fin.vconcat_last {n : } {α : Sort u} (v : Fin nα) (a : α) :
(v :+ᵛ a) (last n) = a
@[simp]
theorem Fin.dconcat_castSucc {n : } {motive : Fin (n + 1)Sort u} (v : (i : Fin n) → motive i.castSucc) (a : motive (last n)) (i : Fin n) :
(v :+ᵈ a) i.castSucc = v i
@[simp]
theorem Fin.vconcat_castSucc {n : } {α : Sort u} (v : Fin nα) (a : α) (i : Fin n) :
(v :+ᵛ a) i.castSucc = v i
@[csimp]

dconcat is equal to snoc. Marked as csimp to allow for switching to the snoc implementation during execution.

theorem Fin.vconcat_eq_snoc {n : } {α : Sort u} (v : Fin nα) (a : α) :
v :+ᵛ a = snoc v a
theorem Fin.dconcat_dcons_eq_dcons_dconcat {n : } {motive : Fin (n + 2)Sort u} (a : motive 0) (v : (i : Fin n) → motive i.castSucc.succ) (b : motive (last (n + 1))) :
(fun (i : Fin (n + 1)) => (a ::ᵈ v) i) :+ᵈ b = a ::ᵈ fun (i : Fin (n + 1)) => (v :+ᵈ b) i
theorem Fin.vconcat_vcons_eq_vcons_vconcat {n : } {α : Sort u} (a : α) (v : Fin nα) (b : α) :
a ::ᵛ v :+ᵛ b = a ::ᵛ (v :+ᵛ b)
theorem Fin.init_dconcat {n : } {motive : Fin (n + 1)Sort u} (v : (i : Fin n) → motive i.castSucc) (a : motive (last n)) :
(fun (i : Fin n) => (v :+ᵈ a) i.castSucc) = v
theorem Fin.init_vconcat {n : } {α : Sort u} (v : Fin nα) (a : α) :
(fun (i : Fin n) => (v :+ᵛ a) i.castSucc) = v
theorem Fin.dconcat_init_self {n : } {motive : Fin (n + 1)Sort u} (v : (i : Fin (n + 1)) → motive i) :
(fun (i : Fin n) => v i.castSucc) :+ᵈ v (last n) = v
theorem Fin.vconcat_init_self {n : } {α : Sort u} (v : Fin (n + 1)α) :
(fun (i : Fin n) => v i.castSucc) :+ᵛ v (last n) = v
theorem Fin.range_vconcat {n : } {α : Type u_1} (v : Fin nα) (a : α) :
theorem Fin.dconcat_injective2 {n : } {motive : Fin (n + 1)Sort u} :
theorem Fin.dconcat_inj {n : } {motive : Fin (n + 1)Sort u} (v w : (i : Fin n) → motive i.castSucc) (a b : motive (last n)) :
v :+ᵈ a = w :+ᵈ b v = w a = b
theorem Fin.vconcat_inj {n : } {α : Sort u} (v w : Fin nα) (a b : α) :
v :+ᵛ a = w :+ᵛ b v = w a = b
theorem Fin.dconcat_right_injective {n : } {motive : Fin (n + 1)Sort u} (v : (i : Fin n) → motive i.castSucc) :
theorem Fin.vconcat_right_injective {n : } {α : Sort u} (v : Fin nα) :
theorem Fin.dconcat_left_injective {n : } {motive : Fin (n + 1)Sort u} (a : motive (last n)) :
Function.Injective fun (v : (i : Fin n) → motive i.castSucc) => v :+ᵈ a
theorem Fin.vconcat_left_injective {α : Sort u} {n : } (a : α) :
Function.Injective fun (v : Fin nα) => v :+ᵛ a
@[simp]
theorem Fin.zero_dappend {n : } {motive : Fin (0 + n)Sort u} {u : (i : Fin 0) → motive (castAdd n i)} (v : (i : Fin n) → motive (natAdd 0 i)) :
u ++ᵈ v = fun (i : Fin (0 + n)) => cast (v (Fin.cast i))
@[simp]
theorem Fin.zero_vappend {n : } {α : Sort u} {u : Fin 0α} (v : Fin nα) :
u ++ᵛ v = v Fin.cast
@[simp]
theorem Fin.dappend_zero {m : } {motive : Fin (m + 0)Sort u} (u : (i : Fin m) → motive (castAdd 0 i)) :
@[simp]
theorem Fin.vappend_zero {m : } {α : Sort u} (u : Fin mα) {v : Fin 0α} :
u ++ᵛ v = u
theorem Fin.dappend_succ {m n : } {motive : Fin (m + (n + 1))Sort u} (u : (i : Fin m) → motive (castAdd (n + 1) i)) (v : (i : Fin (n + 1)) → motive (natAdd m i)) :
u ++ᵈ v = (fun (i : Fin (m + n)) => (u ++ᵈ fun (i : Fin n) => v i.castSucc) i) :+ᵈ v (last n)
theorem Fin.vappend_succ {m n : } {α : Sort u} (u : Fin mα) (v : Fin (n + 1)α) :
@[csimp]

dappend is equal to addCases. Marked as csimp to allow for switching to the addCases implementation during execution.

@[csimp]

vappend is equal to append. Marked as csimp to allow for switching to the append implementation during execution.

@[simp]
theorem Fin.dempty_dappend {n : } {motive : Fin (0 + n)Sort u} (v : (i : Fin n) → motive (natAdd 0 i)) :
!h[] ++ᵈ v = fun (i : Fin (0 + n)) => cast (v (Fin.cast i))
@[simp]
theorem Fin.vempty_vappend {n : } {α : Sort u} (v : Fin nα) :
@[simp]
theorem Fin.dappend_dempty {m : } {motive : Fin (m + 0)Sort u} (v : (i : Fin m) → motive (castAdd 0 i)) :
@[simp]
theorem Fin.vappend_vempty {m : } {α : Sort u} (v : Fin mα) :
theorem Fin.dappend_assoc {m n p : } {motive : Fin (m + n + p)Sort u} (_u : (i : Fin m) → motive (castAdd p (castAdd n i))) (_v : (i : Fin n) → motive (castAdd p (natAdd m i))) (_w : (i : Fin p) → motive (natAdd (m + n) i)) :
theorem Fin.vappend_assoc {m n : } {α : Sort u} {p : } (u : Fin mα) (v : Fin nα) (w : Fin pα) :
u ++ᵛ v ++ᵛ w = (u ++ᵛ (v ++ᵛ w)) Fin.cast
@[simp]
theorem Fin.dappend_left {m n : } {motive : Fin (m + n)Sort u} (u : (i : Fin m) → motive (castAdd n i)) (v : (i : Fin n) → motive (natAdd m i)) (i : Fin m) :
(u ++ᵈ v) (castAdd n i) = u i
@[simp]
theorem Fin.vappend_left {m n : } {α : Sort u} (u : Fin mα) (v : Fin nα) (i : Fin m) :
(u ++ᵛ v) (castAdd n i) = u i
@[simp]
theorem Fin.dappend_right {m n : } {motive : Fin (m + n)Sort u} (u : (i : Fin m) → motive (castAdd n i)) (v : (i : Fin n) → motive (natAdd m i)) (i : Fin n) :
(u ++ᵈ v) (natAdd m i) = v i
@[simp]
theorem Fin.vappend_right {m n : } {α : Sort u} (u : Fin mα) (v : Fin nα) (i : Fin n) :
(u ++ᵛ v) (natAdd m i) = v i
theorem Fin.dappend_left_of_lt {m n : } {motive : Fin (m + n)Sort u} (u : (i : Fin m) → motive (castAdd n i)) (v : (i : Fin n) → motive (natAdd m i)) (i : Fin (m + n)) (h : i < m) :
(u ++ᵈ v) i = cast (u i, h)
theorem Fin.vappend_left_of_lt {m n : } {α : Sort u} (u : Fin mα) (v : Fin nα) (i : Fin (m + n)) (h : i < m) :
(u ++ᵛ v) i = u i, h
theorem Fin.dappend_right_of_not_lt {m n : } {motive : Fin (m + n)Sort u} (u : (i : Fin m) → motive (castAdd n i)) (v : (i : Fin n) → motive (natAdd m i)) (i : Fin (m + n)) (h : ¬i < m) :
(u ++ᵈ v) i = dcast (v i - m, )
theorem Fin.vappend_right_of_not_lt {m n : } {α : Sort u} (u : Fin mα) (v : Fin nα) (i : Fin (m + n)) (h : ¬i < m) :
(u ++ᵛ v) i = v i - m,
@[simp]
theorem Fin.vappend_vcons {m n : } {α : Sort u} (a : α) (u : Fin mα) (v : Fin nα) :
a ::ᵛ u ++ᵛ v = (a ::ᵛ (u ++ᵛ v)) Fin.cast
theorem Fin.vappend_vconcat {m n : } {α : Sort u} (u : Fin mα) (v : Fin nα) (a : α) :
u ++ᵛ (v :+ᵛ a) = u ++ᵛ v :+ᵛ a
theorem Fin.vappend_left_eq_cons {n : } {α : Sort u} (a : Fin 1α) (v : Fin nα) :
a ++ᵛ v = (a 0 ::ᵛ v) Fin.cast
theorem Fin.vappend_right_eq_snoc {m : } {α : Sort u} (u : Fin mα) (a : Fin 1α) :
u ++ᵛ a = u :+ᵛ a 0
theorem Fin.vappend_zero_of_succ_left {m n : } {α : Sort u} {u : Fin (m + 1)α} {v : Fin nα} :
(u ++ᵛ v) 0 = u 0
@[simp]
theorem Fin.vappend_last_of_succ_right {m n : } {α : Sort u} {u : Fin mα} {v : Fin (n + 1)α} :
(u ++ᵛ v) (last (m + n)) = v (last n)
theorem Fin.range_vappend {m n : } {α : Type u_1} (u : Fin mα) (v : Fin nα) :
theorem Fin.vappend_ext {m n : } {α : Sort u} (u₁ u₂ : Fin mα) (v₁ v₂ : Fin nα) :
u₁ ++ᵛ v₁ = u₂ ++ᵛ v₂ u₁ = u₂ v₁ = v₂
theorem Fin.ext_vcons {n : } {α : Sort u} (a b : α) (v w : Fin nα) :
a ::ᵛ v = b ::ᵛ w a = b v = w
theorem Fin.vcons_eq_vcons_iff {n : } {α : Sort u} (a b : α) (v w : Fin nα) :
a ::ᵛ v = b ::ᵛ w a = b v = w
theorem Fin.vext_iff {n : } {α : Sort u} {v w : Fin nα} :
v = w ∀ (i : Fin n), v i = w i
theorem Fin.vcons_vappend_comm {m n : } {α : Sort u} (a : α) (u : Fin mα) (v : Fin nα) :
a ::ᵛ (u ++ᵛ v) = (a ::ᵛ u ++ᵛ v) Fin.cast
theorem Fin.vappend_singleton {m : } {α : Sort u} (u : Fin mα) (a : α) :
u ++ᵛ !v[a] = u :+ᵛ a
theorem Fin.singleton_append {n : } {α : Sort u} (a : α) (v : Fin nα) :
!v[a] ++ᵛ v = (a ::ᵛ v) Fin.cast
theorem Fin.empty_unique {α : Sort u} (v : Fin 0α) :

Lemmas for functorial vectors (binary first, then unary) #

@[simp]
theorem Fin.fcons₂_zero {A : Sort u} {B : Sort v} {F₂ : ABSort w} {n : } {α₁ : A} {α₂ : B} {β₁ : Fin nA} {β₂ : Fin nB} (a : F₂ α₁ α₂) (b : (i : Fin n) → F₂ (β₁ i) (β₂ i)) :
fcons₂ a b 0 = cast a
@[simp]
theorem Fin.fcons₂_succ {A : Sort u} {B : Sort v} {F₂ : ABSort w} {n : } {α₁ : A} {α₂ : B} {β₁ : Fin nA} {β₂ : Fin nB} (a : F₂ α₁ α₂) (b : (i : Fin n) → F₂ (β₁ i) (β₂ i)) (i : Fin n) :
fcons₂ a b i.succ = cast (b i)
@[simp]
theorem Fin.fcons₂_one {A : Sort u} {B : Sort v} {F₂ : ABSort w} {n : } {α₁ : A} {α₂ : B} {β₁ : Fin (n + 1)A} {β₂ : Fin (n + 1)B} (a : F₂ α₁ α₂) (b : (i : Fin (n + 1)) → F₂ (β₁ i) (β₂ i)) :
fcons₂ a b 1 = b 0
theorem Fin.fcons₂_right_injective {A : Sort u} {B : Sort v} {F₂ : ABSort w} {n : } {α₁ : A} {α₂ : B} {β₁ : Fin nA} {β₂ : Fin nB} (a : F₂ α₁ α₂) :
theorem Fin.fcons₂_left_injective {A : Sort u} {B : Sort v} {F₂ : ABSort w} {n : } {α₁ : A} {α₂ : B} {β₁ : Fin nA} {β₂ : Fin nB} (b : (i : Fin n) → F₂ (β₁ i) (β₂ i)) :
Function.Injective fun (a : F₂ α₁ α₂) => fcons₂ a b
theorem Fin.fcons₂_injective2 {A : Sort u} {B : Sort v} {F₂ : ABSort w} {n : } {α₁ : A} {α₂ : B} {β₁ : Fin nA} {β₂ : Fin nB} :
theorem Fin.fcons₂_inj {A : Sort u} {B : Sort v} {F₂ : ABSort w} {n : } {α₁ : A} {α₂ : B} {β₁ : Fin nA} {β₂ : Fin nB} (a₁ a₂ : F₂ α₁ α₂) (b₁ b₂ : (i : Fin n) → F₂ (β₁ i) (β₂ i)) :
fcons₂ a₁ b₁ = fcons₂ a₂ b₂ a₁ = a₂ b₁ = b₂
@[simp]
theorem Fin.fconcat₂_castSucc {A : Sort u} {B : Sort v} {F₂ : ABSort w} {n : } {α₁ : Fin nA} {α₂ : Fin nB} {β₁ : A} {β₂ : B} (v : (i : Fin n) → F₂ (α₁ i) (α₂ i)) (a : F₂ β₁ β₂) (i : Fin n) :
fconcat₂ v a i.castSucc = cast (v i)
@[simp]
theorem Fin.fconcat₂_last {A : Sort u} {B : Sort v} {F₂ : ABSort w} {n : } {α₁ : Fin nA} {α₂ : Fin nB} {β₁ : A} {β₂ : B} (v : (i : Fin n) → F₂ (α₁ i) (α₂ i)) (a : F₂ β₁ β₂) :
fconcat₂ v a (last n) = cast a
theorem Fin.fconcat₂_injective2 {A : Sort u} {B : Sort v} {F₂ : ABSort w} {n : } {α₁ : Fin nA} {α₂ : Fin nB} {β₁ : A} {β₂ : B} :
theorem Fin.fconcat₂_inj {A : Sort u} {B : Sort v} {F₂ : ABSort w} {n : } {α₁ : Fin nA} {α₂ : Fin nB} {β₁ : A} {β₂ : B} (v₁ v₂ : (i : Fin n) → F₂ (α₁ i) (α₂ i)) (a₁ a₂ : F₂ β₁ β₂) :
fconcat₂ v₁ a₁ = fconcat₂ v₂ a₂ v₁ = v₂ a₁ = a₂
theorem Fin.fconcat₂_right_injective {A : Sort u} {B : Sort v} {F₂ : ABSort w} {n : } {α₁ : Fin nA} {α₂ : Fin nB} {β₁ : A} {β₂ : B} (v : (i : Fin n) → F₂ (α₁ i) (α₂ i)) :
theorem Fin.fconcat₂_left_injective {A : Sort u} {B : Sort v} {F₂ : ABSort w} {n : } {α₁ : Fin nA} {α₂ : Fin nB} {β₁ : A} {β₂ : B} (a : F₂ β₁ β₂) :
Function.Injective fun (v : (i : Fin n) → F₂ (α₁ i) (α₂ i)) => fconcat₂ v a
@[simp]
theorem Fin.fappend₂_zero {A : Sort u} {B : Sort v} {F₂ : ABSort w} {m : } {α₁ : Fin mA} {α₂ : Fin mB} {β₁ : Fin 0A} {β₂ : Fin 0B} (u : (i : Fin m) → F₂ (α₁ i) (α₂ i)) :
@[simp]
theorem Fin.fappend₂_succ {A : Sort u} {B : Sort v} {F₂ : ABSort w} {m n : } {α₁ : Fin mA} {α₂ : Fin mB} {β₁ : Fin (n + 1)A} {β₂ : Fin (n + 1)B} (u : (i : Fin m) → F₂ (α₁ i) (α₂ i)) (v : (i : Fin (n + 1)) → F₂ (β₁ i) (β₂ i)) :
fappend₂ u v = fconcat₂ (fappend₂ u fun (i : Fin n) => v i.castSucc) (v (last n))
@[simp]
theorem Fin.fappend₂_left {A : Sort u} {B : Sort v} {F₂ : ABSort w} {m n : } {α₁ : Fin mA} {α₂ : Fin mB} {β₁ : Fin nA} {β₂ : Fin nB} (u : (i : Fin m) → F₂ (α₁ i) (α₂ i)) (v : (i : Fin n) → F₂ (β₁ i) (β₂ i)) (i : Fin m) :
fappend₂ u v (castAdd n i) = cast (u i)
@[simp]
theorem Fin.fappend₂_right {A : Sort u} {B : Sort v} {F₂ : ABSort w} {m n : } {α₁ : Fin mA} {α₂ : Fin mB} {β₁ : Fin nA} {β₂ : Fin nB} (u : (i : Fin m) → F₂ (α₁ i) (α₂ i)) (v : (i : Fin n) → F₂ (β₁ i) (β₂ i)) (i : Fin n) :
fappend₂ u v (natAdd m i) = cast (v i)
theorem Fin.fappend₂_ext {A : Sort u} {B : Sort v} {F₂ : ABSort w} {m n : } {α₁ : Fin mA} {α₂ : Fin mB} {β₁ : Fin nA} {β₂ : Fin nB} (u₁ u₂ : (i : Fin m) → F₂ (α₁ i) (α₂ i)) (v₁ v₂ : (i : Fin n) → F₂ (β₁ i) (β₂ i)) :
fappend₂ u₁ v₁ = fappend₂ u₂ v₂ u₁ = u₂ v₁ = v₂
@[simp]
theorem Fin.fcons_zero {A : Sort u} {F : ASort v} {n : } {α : A} {β : Fin nA} (a : F α) (b : (i : Fin n) → F (β i)) :
fcons a b 0 = cast a
@[simp]
theorem Fin.fcons_succ {A : Sort u} {F : ASort v} {n : } {α : A} {β : Fin nA} (a : F α) (v : (i : Fin n) → F (β i)) (i : Fin n) :
fcons a v i.succ = cast (v i)
@[simp]
theorem Fin.fcons_one {A : Sort u} {F : ASort v} {n : } {α : A} {β : Fin (n + 1)A} (a : F α) (v : (i : Fin (n + 1)) → F (β i)) :
fcons a v 1 = v 0
theorem Fin.fcons_right_injective {A : Sort u} {F : ASort v} {n : } {α : A} {β : Fin nA} (a : F α) :
theorem Fin.fcons_left_injective {A : Sort u} {F : ASort v} {n : } {α : A} {β : Fin nA} (b : (i : Fin n) → F (β i)) :
Function.Injective fun (a : F α) => fcons a b
theorem Fin.fcons_injective2 {A : Sort u} {F : ASort v} {n : } {α : A} {β : Fin nA} :
theorem Fin.fcons_inj {A : Sort u} {F : ASort v} {n : } {α : A} {β : Fin nA} (a₁ a₂ : F α) (b₁ b₂ : (i : Fin n) → F (β i)) :
fcons a₁ b₁ = fcons a₂ b₂ a₁ = a₂ b₁ = b₂
@[simp]
theorem Fin.fconcat_zero {A : Sort u} {F : ASort v} {α : Fin 0A} {β : A} (a : F β) :
!h[] :+ʰ a = fun (i : Fin (0 + 1)) => match i with | 0 => a
@[simp]
theorem Fin.fconcat_castSucc {A : Sort u} {F : ASort v} {n : } {α : Fin nA} {β : A} (v : (i : Fin n) → F (α i)) (b : F β) (i : Fin n) :
fconcat v b i.castSucc = cast (v i)
@[simp]
theorem Fin.fconcat_last {A : Sort u} {F : ASort v} {n : } {α : Fin nA} {β : A} (v : (i : Fin n) → F (α i)) (b : F β) :
fconcat v b (last n) = cast b
theorem Fin.fconcat_injective2 {A : Sort u} {F : ASort v} {n : } {α : Fin nA} {β : A} :
theorem Fin.fconcat_inj {A : Sort u} {F : ASort v} {n : } {α : Fin nA} {β : A} (v₁ v₂ : (i : Fin n) → F (α i)) (a₁ a₂ : F β) :
fconcat v₁ a₁ = fconcat v₂ a₂ v₁ = v₂ a₁ = a₂
theorem Fin.fconcat_right_injective {A : Sort u} {F : ASort v} {n : } {α : Fin nA} {β : A} (v : (i : Fin n) → F (α i)) :
theorem Fin.fconcat_left_injective {A : Sort u} {F : ASort v} {n : } {α : Fin nA} {β : A} (a : F β) :
Function.Injective fun (v : (i : Fin n) → F (α i)) => fconcat v a

Functorial append (unary F) lemmas

@[simp]
theorem Fin.fappend_zero {A : Sort u} {F : ASort v} {m : } {β : Fin mA} {α : Fin 0A} (u : (i : Fin m) → F (β i)) :
@[simp]
theorem Fin.fappend_succ {A : Sort u} {F : ASort v} {m n : } {α : Fin mA} {β : Fin (n + 1)A} (u : (i : Fin m) → F (α i)) (v : (i : Fin (n + 1)) → F (β i)) :
fappend u v = fconcat (fappend u fun (i : Fin n) => v i.castSucc) (v (last n))
@[simp]
theorem Fin.fappend_left {A : Sort u} {F : ASort v} {m n : } {α : Fin mA} {β : Fin nA} (u : (i : Fin m) → F (α i)) (v : (i : Fin n) → F (β i)) (i : Fin m) :
fappend u v (castAdd n i) = cast (u i)
@[simp]
theorem Fin.fappend_right {A : Sort u} {F : ASort v} {m n : } {α : Fin mA} {β : Fin nA} (u : (i : Fin m) → F (α i)) (v : (i : Fin n) → F (β i)) (i : Fin n) :
fappend u v (natAdd m i) = cast (v i)
theorem Fin.fappend_ext {A : Sort u} {F : ASort v} {m n : } {α : Fin mA} {β : Fin nA} (u₁ u₂ : (i : Fin m) → F (α i)) (v₁ v₂ : (i : Fin n) → F (β i)) :
fappend u₁ v₁ = fappend u₂ v₂ u₁ = u₂ v₁ = v₂

Lemmas for heterogeneous vectors #

@[simp]
theorem Fin.hcons_zero {n : } {α : Sort u} {β : Fin nSort u} (a : α) (b : (i : Fin n) → β i) :
(a ::ʰ b) 0 = cast a
@[simp]
theorem Fin.hcons_succ {n : } {α : Sort u} {β : Fin nSort u} (a : α) (v : (i : Fin n) → β i) (i : Fin n) :
(a ::ʰ v) i.succ = cast (v i)
@[simp]
theorem Fin.hcons_one {n : } {α : Sort u} {β : Fin (n + 1)Sort u} (a : α) (v : (i : Fin (n + 1)) → β i) :
(a ::ʰ v) 1 = cast (v 0)
theorem Fin.hcons_eq_cons {n : } {α : Sort u} {β : Fin nSort u} (a : α) (v : (i : Fin n) → β i) :
a ::ʰ v = cons ((a ::ʰ v) 0) fun (i : Fin n) => (a ::ʰ v) i.succ
@[simp]
theorem Fin.hconcat_zero {α : Fin 0Sort u} {β : Sort u} (a : β) :
!h[] :+ʰ a = fun (i : Fin (0 + 1)) => match i with | 0 => a
@[simp]
theorem Fin.hconcat_castSucc {n : } {α : Fin nSort u} {β : Sort u} (v : (i : Fin n) → α i) (b : β) (i : Fin n) :
(v :+ʰ b) i.castSucc = cast (v i)
@[simp]
theorem Fin.hconcat_last {n : } {α : Fin nSort u} {β : Sort u} (v : (i : Fin n) → α i) (b : β) :
(v :+ʰ b) (last n) = cast b
theorem Fin.hconcat_eq_snoc {n : } {α : Fin nSort u} {β : Sort u} (v : (i : Fin n) → α i) (b : β) :
v :+ʰ b = snoc (fun (i : Fin n) => cast (v i)) (cast b)
theorem Fin.hcons_right_injective {n : } {α : Sort u} {β : Fin nSort u} (a : α) :
theorem Fin.hcons_left_injective {n : } {α : Sort u} {β : Fin nSort u} (b : (i : Fin n) → β i) :
Function.Injective fun (a : α) => a ::ʰ b
theorem Fin.hcons_injective2 {n : } {α : Sort u} {β : Fin nSort u} :
theorem Fin.hcons_inj {n : } {α : Sort u} {β : Fin nSort u} (a₁ a₂ : α) (b₁ b₂ : (i : Fin n) → β i) :
a₁ ::ʰ b₁ = a₂ ::ʰ b₂ a₁ = a₂ b₁ = b₂
@[simp]
theorem Fin.hcons_fin_zero {α : Sort u} {β : Fin 0Sort u} (a : α) (v : (i : Fin 0) → β i) :
a ::ʰ v = fun (i : Fin (0 + 1)) => match i with | 0 => a
theorem Fin.hconcat_hcons {n : } {α : Sort u} {β : Fin nSort u} {γ : Sort u} (_a : α) (_v : (i : Fin n) → β i) (_c : γ) :
theorem Fin.dinit_hconcat {n : } {α : Fin nSort u} {β : Sort u} (_v : (i : Fin n) → α i) (_b : β) :
theorem Fin.hconcat_init_self {n : } {α : Fin n.succSort u} (_v : (i : Fin (n + 1)) → α i) :
theorem Fin.hconcat_inj {n : } {α : Fin nSort u} {β : Sort u} (v₁ v₂ : (i : Fin n) → α i) (a₁ a₂ : β) :
v₁ :+ʰ a₁ = v₂ :+ʰ a₂ v₁ = v₂ a₁ = a₂
theorem Fin.hconcat_right_injective {n : } {α : Fin nSort u} {β : Sort u} (v : (i : Fin n) → α i) :
theorem Fin.hconcat_left_injective {n : } {α : Fin nSort u} {β : Sort u} (a : β) :
Function.Injective fun (v : (i : Fin n) → α i) => v :+ʰ a
@[simp]
theorem Fin.happend_zero {m : } {β : Fin mSort u} {α : Fin 0Sort u} (u : (i : Fin m) → β i) :
u ++ʰ !h[] = u
@[simp]
theorem Fin.happend_empty {m : } {α : Fin mSort u} {β : Fin 0Sort u} (v : (i : Fin m) → α i) :
v ++ʰ !h[] = v
@[simp]
theorem Fin.happend_succ {m n : } {α : Fin mSort u} {β : Fin (n + 1)Sort u} (u : (i : Fin m) → α i) (v : (i : Fin (n + 1)) → β i) :
u ++ʰ v = (u ++ʰ fun (i : Fin n) => v i.castSucc) :+ʰ v (last n)
@[simp]
theorem Fin.dempty_happend {n : } {α : Fin 0Sort u} {β : Fin nSort u} (v : (i : Fin n) → β i) :
!h[] ++ʰ v = fun (i : Fin (0 + n)) => cast (v (Fin.cast i))
@[simp]
theorem Fin.happend_left {m n : } {α : Fin mSort u} {β : Fin nSort u} (u : (i : Fin m) → α i) (v : (i : Fin n) → β i) (i : Fin m) :
(u ++ʰ v) (castAdd n i) = cast (u i)
@[simp]
theorem Fin.happend_right {m n : } {α : Fin mSort u} {β : Fin nSort u} (u : (i : Fin m) → α i) (v : (i : Fin n) → β i) (i : Fin n) :
(u ++ʰ v) (natAdd m i) = cast (v i)
theorem Fin.happend_eq_addCases {m n : } {α : Fin mSort u} {β : Fin nSort u} (u : (i : Fin m) → α i) (v : (i : Fin n) → β i) :
u ++ʰ v = addCases (fun (i : Fin m) => cast (u i)) fun (i : Fin n) => cast (v i)
theorem Fin.happend_assoc {m n : } {α : Fin mSort u} {β : Fin nSort u} {p : } {γ : Fin pSort u} (u : (i : Fin m) → α i) (v : (i : Fin n) → β i) (w : (i : Fin p) → γ i) :
u ++ʰ v ++ʰ w = fun (i : Fin (m + n + p)) => cast ((u ++ʰ (v ++ʰ w)) (Fin.cast i))
theorem Fin.happend_hcons {m n : } {α : Sort u} {β : Fin mSort u} {γ : Fin nSort u} (_a : α) (_u : (i : Fin m) → β i) (_v : (i : Fin n) → γ i) :
theorem Fin.happend_hconcat {m n : } {α : Fin mSort u} {β : Fin nSort u} {γ : Sort u} (_u : (i : Fin m) → α i) (_v : (i : Fin n) → β i) (_c : γ) :
theorem Fin.happend_left_eq_hcons {n : } {α : Fin 1Sort u} {β : Fin nSort u} (_a : (i : Fin 1) → α i) (_v : (i : Fin n) → β i) :
theorem Fin.happend_right_eq_hconcat {m : } {α : Fin mSort u} {β : Fin 1Sort u} (u : (i : Fin m) → α i) (a : (i : Fin 1) → β i) :
u ++ʰ a = u :+ʰ a 0
theorem Fin.happend_ext {m n : } {α : Fin mSort u} {β : Fin nSort u} (u₁ u₂ : (i : Fin m) → α i) (v₁ v₂ : (i : Fin n) → β i) :
u₁ ++ʰ v₁ = u₂ ++ʰ v₂ u₁ = u₂ v₁ = v₂
theorem Fin.ext_hcons {n : } {α : Sort u} {β : Fin nSort u} (a₁ a₂ : α) (v₁ v₂ : (i : Fin n) → β i) :
a₁ ::ʰ v₁ = a₂ ::ʰ v₂ a₁ = a₂ v₁ = v₂
theorem Fin.hcons_eq_hcons_iff {n : } {α : Sort u} {β : Fin nSort u} (a₁ a₂ : α) (v₁ v₂ : (i : Fin n) → β i) :
a₁ ::ʰ v₁ = a₂ ::ʰ v₂ a₁ = a₂ v₁ = v₂
theorem Fin.dext_iff {n : } {α : Fin nSort u} {v w : (i : Fin n) → α i} :
v = w ∀ (i : Fin n), v i = w i
theorem Fin.hcons_happend_comm {m n : } {α : Sort u} {β : Fin mSort u} {γ : Fin nSort u} (_a : α) (_u : (i : Fin m) → β i) (_v : (i : Fin n) → γ i) :
theorem Fin.happend_singleton {m : } {α : Fin mSort u} {β : Sort u} (_u : (i : Fin m) → α i) (_a : β) :
theorem Fin.singleton_happend {n : } {α : Sort u} {β : Fin nSort u} (_a : α) (_v : (i : Fin n) → β i) :
@[implicit_reducible]
instance Fin.instUniqueForall_starlib_1 {α : Fin 0Sort u} :
Unique ((i : Fin 0) → α i)
@[simp]
theorem Fin.rightpad_apply_lt {m : } {α : Sort u} (n : ) (a : α) (v : Fin mα) (i : Fin n) (h : i < m) :
rightpad n a v i = v i, h
@[simp]
theorem Fin.rightpad_apply_ge {m : } {α : Sort u} (n : ) (a : α) (v : Fin mα) (i : Fin n) (h : m i) :
rightpad n a v i = a
@[simp]
theorem Fin.leftpad_apply_lt {m : } {α : Sort u} (n : ) (a : α) (v : Fin mα) (i : Fin n) (h : i < n - m) :
leftpad n a v i = a
@[simp]
theorem Fin.leftpad_apply_ge {m : } {α : Sort u} (n : ) (a : α) (v : Fin mα) (i : Fin n) (h : n - m i) :
leftpad n a v i = v i - (n - m),
theorem Fin.rightpad_eq_self {n : } {α : Sort u} (v : Fin nα) (a : α) :
rightpad n a v = v
theorem Fin.leftpad_eq_self {n : } {α : Sort u} (v : Fin nα) (a : α) :
leftpad n a v = v