Theorem: Fin.append_snoc
File: Mathlib/Data/Fin/Tuple/Basic.lean

tactic: funext i
state_before: m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i : Fin n
y : α✝ i.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
⊢ append as (snoc bs b) = snoc (append as bs) b
state_after: case h
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : Fin (n + (m + 1))
⊢ append as (snoc bs b) i = snoc (append as bs) b i

tactic: rcases i with ⟨i, isLt⟩
state_before: case h
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : Fin (n + (m + 1))
⊢ append as (snoc bs b) i = snoc (append as bs) b i
state_after: case h.mk
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : ℕ
isLt : i < n + (m + 1)
⊢ append as (snoc bs b) ⟨i, isLt⟩ = snoc (append as bs) b ⟨i, isLt⟩

tactic: simp only [append, addCases, castLT, cast_mk, subNat_mk, natAdd_mk, cast, ge_iff_le, snoc.eq_1,
  cast_eq, eq_rec_constant, Nat.add_eq, Nat.add_zero, castLT_mk]
state_before: case h.mk
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : ℕ
isLt : i < n + (m + 1)
⊢ append as (snoc bs b) ⟨i, isLt⟩ = snoc (append as bs) b ⟨i, isLt⟩
state_after: case h.mk
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : ℕ
isLt : i < n + (m + 1)
⊢ (if h : i < n then as ⟨i, ⋯⟩ else if h_1 : i - n < m then bs ⟨i - n, ⋯⟩ else b) =
    if h : i < n + m then if h_1 : i < n then as ⟨i, ⋯⟩ else bs ⟨i - n, ⋯⟩ else b

tactic: split_ifs with lt_n lt_add sub_lt nlt_add lt_add <;> (try rfl)
state_before: case h.mk
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : ℕ
isLt : i < n + (m + 1)
⊢ (if h : i < n then as ⟨i, ⋯⟩ else if h_1 : i - n < m then bs ⟨i - n, ⋯⟩ else b) =
    if h : i < n + m then if h_1 : i < n then as ⟨i, ⋯⟩ else bs ⟨i - n, ⋯⟩ else b
state_after: case neg
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : ℕ
isLt : i < n + (m + 1)
lt_n : i < n
lt_add : ¬i < n + m
⊢ as ⟨i, ⋯⟩ = b

case neg
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : ℕ
isLt : i < n + (m + 1)
lt_n : ¬i < n
sub_lt : i - n < m
nlt_add : ¬i < n + m
⊢ bs ⟨i - n, ⋯⟩ = b

case pos
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : ℕ
isLt : i < n + (m + 1)
lt_n : ¬i < n
sub_lt : ¬i - n < m
lt_add : i < n + m
⊢ b = bs ⟨i - n, ⋯⟩

tactic: try rfl
state_before: case neg
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : ℕ
isLt : i < n + (m + 1)
lt_n : ¬i < n
sub_lt : ¬i - n < m
lt_add : ¬i < n + m
⊢ b = b
state_after: no goals

tactic: rfl
state_before: case neg
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : ℕ
isLt : i < n + (m + 1)
lt_n : ¬i < n
sub_lt : ¬i - n < m
lt_add : ¬i < n + m
⊢ b = b
state_after: no goals

tactic: have := Nat.lt_add_right m lt_n
state_before: case neg
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : ℕ
isLt : i < n + (m + 1)
lt_n : i < n
lt_add : ¬i < n + m
⊢ as ⟨i, ⋯⟩ = b
state_after: case neg
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : ℕ
isLt : i < n + (m + 1)
lt_n : i < n
lt_add : ¬i < n + m
this : i < n + m
⊢ as ⟨i, ⋯⟩ = b

tactic: contradiction
state_before: case neg
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : ℕ
isLt : i < n + (m + 1)
lt_n : i < n
lt_add : ¬i < n + m
this : i < n + m
⊢ as ⟨i, ⋯⟩ = b
state_after: no goals

tactic: obtain rfl := Nat.eq_of_le_of_lt_succ (Nat.not_lt.mp nlt_add) isLt
state_before: case neg
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : ℕ
isLt : i < n + (m + 1)
lt_n : ¬i < n
sub_lt : i - n < m
nlt_add : ¬i < n + m
⊢ bs ⟨i - n, ⋯⟩ = b
state_after: case neg
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i : Fin n
y : α✝ i.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
isLt : n + m < n + (m + 1)
lt_n : ¬n + m < n
sub_lt : n + m - n < m
nlt_add : ¬n + m < n + m
⊢ bs ⟨n + m - n, ⋯⟩ = b

tactic: simp [Nat.add_comm n m] at sub_lt
state_before: case neg
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i : Fin n
y : α✝ i.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
isLt : n + m < n + (m + 1)
lt_n : ¬n + m < n
sub_lt : n + m - n < m
nlt_add : ¬n + m < n + m
⊢ bs ⟨n + m - n, ⋯⟩ = b
state_after: no goals

tactic: have := Nat.sub_lt_left_of_lt_add (Nat.not_lt.mp lt_n) lt_add
state_before: case pos
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : ℕ
isLt : i < n + (m + 1)
lt_n : ¬i < n
sub_lt : ¬i - n < m
lt_add : i < n + m
⊢ b = bs ⟨i - n, ⋯⟩
state_after: case pos
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : ℕ
isLt : i < n + (m + 1)
lt_n : ¬i < n
sub_lt : ¬i - n < m
lt_add : i < n + m
this : i - n < m
⊢ b = bs ⟨i - n, ⋯⟩

tactic: contradiction
state_before: case pos
m n : ℕ
α✝ : Fin (n + 1) → Type u
x : α✝ (last n)
q : (i : Fin (n + 1)) → α✝ i
p : (i : Fin n) → α✝ i.castSucc
i✝ : Fin n
y : α✝ i✝.castSucc
z : α✝ (last n)
α : Type u_1
as : Fin n → α
bs : Fin m → α
b : α
i : ℕ
isLt : i < n + (m + 1)
lt_n : ¬i < n
sub_lt : ¬i - n < m
lt_add : i < n + m
this : i - n < m
⊢ b = bs ⟨i - n, ⋯⟩
state_after: no goals