Theorem: List.Perm.rec_heq
File: Mathlib/Data/List/Perm.lean

tactic: induction hl
state_before: α : Type uu
β✝ : Type vv
l₁ l₂ : List α
β : List α → Sort u_1
f : (a : α) → (l : List α) → β l → β (a :: l)
b : β []
l l' : List α
hl : l ~ l'
f_congr : ∀ {a : α} {l l' : List α} {b : β l} {b' : β l'}, l ~ l' → HEq b b' → HEq (f a l b) (f a l' b')
f_swap : ∀ {a a' : α} {l : List α} {b : β l}, HEq (f a (a' :: l) (f a' l b)) (f a' (a :: l) (f a l b))
⊢ HEq (List.rec b f l) (List.rec b f l')

tactic: case nil => rfl
state_before: case nil
α : Type uu
β✝ : Type vv
l₁ l₂ : List α
β : List α → Sort u_1
f : (a : α) → (l : List α) → β l → β (a :: l)
b : β []
l l' : List α
f_congr : ∀ {a : α} {l l' : List α} {b : β l} {b' : β l'}, l ~ l' → HEq b b' → HEq (f a l b) (f a l' b')
f_swap : ∀ {a a' : α} {l : List α} {b : β l}, HEq (f a (a' :: l) (f a' l b)) (f a' (a :: l) (f a l b))
⊢ HEq (List.rec b f []) (List.rec b f [])

case cons
α : Type uu
β✝ : Type vv
l₁ l₂ : List α
β : List α → Sort u_1
f : (a : α) → (l : List α) → β l → β (a :: l)
b : β []
l l' : List α
f_congr : ∀ {a : α} {l l' : List α} {b : β l} {b' : β l'}, l ~ l' → HEq b b' → HEq (f a l b) (f a l' b')
f_swap : ∀ {a a' : α} {l : List α} {b : β l}, HEq (f a (a' :: l) (f a' l b)) (f a' (a :: l) (f a l b))
x✝ : α
l₁✝ l₂✝ : List α
a✝ : l₁✝ ~ l₂✝
a_ih✝ : HEq (List.rec b f l₁✝) (List.rec b f l₂✝)
⊢ HEq (List.rec b f (x✝ :: l₁✝)) (List.rec b f (x✝ :: l₂✝))

case swap
α : Type uu
β✝ : Type vv
l₁ l₂ : List α
β : List α → Sort u_1
f : (a : α) → (l : List α) → β l → β (a :: l)
b : β []
l l' : List α
f_congr : ∀ {a : α} {l l' : List α} {b : β l} {b' : β l'}, l ~ l' → HEq b b' → HEq (f a l b) (f a l' b')
f_swap : ∀ {a a' : α} {l : List α} {b : β l}, HEq (f a (a' :: l) (f a' l b)) (f a' (a :: l) (f a l b))
x✝ y✝ : α
l✝ : List α
⊢ HEq (List.rec b f (y✝ :: x✝ :: l✝)) (List.rec b f (x✝ :: y✝ :: l✝))

case trans
α : Type uu
β✝ : Type vv
l₁ l₂ : List α
β : List α → Sort u_1
f : (a : α) → (l : List α) → β l → β (a :: l)
b : β []
l l' : List α
f_congr : ∀ {a : α} {l l' : List α} {b : β l} {b' : β l'}, l ~ l' → HEq b b' → HEq (f a l b) (f a l' b')
f_swap : ∀ {a a' : α} {l : List α} {b : β l}, HEq (f a (a' :: l) (f a' l b)) (f a' (a :: l) (f a l b))
l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
a_ih✝¹ : HEq (List.rec b f l₁✝) (List.rec b f l₂✝)
a_ih✝ : HEq (List.rec b f l₂✝) (List.rec b f l₃✝)
⊢ HEq (List.rec b f l₁✝) (List.rec b f l₃✝)

tactic: case cons a l l' h ih => exact f_congr h ih
state_before: case cons
α : Type uu
β✝ : Type vv
l₁ l₂ : List α
β : List α → Sort u_1
f : (a : α) → (l : List α) → β l → β (a :: l)
b : β []
l l' : List α
f_congr : ∀ {a : α} {l l' : List α} {b : β l} {b' : β l'}, l ~ l' → HEq b b' → HEq (f a l b) (f a l' b')
f_swap : ∀ {a a' : α} {l : List α} {b : β l}, HEq (f a (a' :: l) (f a' l b)) (f a' (a :: l) (f a l b))
x✝ : α
l₁✝ l₂✝ : List α
a✝ : l₁✝ ~ l₂✝
a_ih✝ : HEq (List.rec b f l₁✝) (List.rec b f l₂✝)
⊢ HEq (List.rec b f (x✝ :: l₁✝)) (List.rec b f (x✝ :: l₂✝))

case swap
α : Type uu
β✝ : Type vv
l₁ l₂ : List α
β : List α → Sort u_1
f : (a : α) → (l : List α) → β l → β (a :: l)
b : β []
l l' : List α
f_congr : ∀ {a : α} {l l' : List α} {b : β l} {b' : β l'}, l ~ l' → HEq b b' → HEq (f a l b) (f a l' b')
f_swap : ∀ {a a' : α} {l : List α} {b : β l}, HEq (f a (a' :: l) (f a' l b)) (f a' (a :: l) (f a l b))
x✝ y✝ : α
l✝ : List α
⊢ HEq (List.rec b f (y✝ :: x✝ :: l✝)) (List.rec b f (x✝ :: y✝ :: l✝))

case trans
α : Type uu
β✝ : Type vv
l₁ l₂ : List α
β : List α → Sort u_1
f : (a : α) → (l : List α) → β l → β (a :: l)
b : β []
l l' : List α
f_congr : ∀ {a : α} {l l' : List α} {b : β l} {b' : β l'}, l ~ l' → HEq b b' → HEq (f a l b) (f a l' b')
f_swap : ∀ {a a' : α} {l : List α} {b : β l}, HEq (f a (a' :: l) (f a' l b)) (f a' (a :: l) (f a l b))
l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
a_ih✝¹ : HEq (List.rec b f l₁✝) (List.rec b f l₂✝)
a_ih✝ : HEq (List.rec b f l₂✝) (List.rec b f l₃✝)
⊢ HEq (List.rec b f l₁✝) (List.rec b f l₃✝)

tactic: case swap a a' l => exact f_swap
state_before: case swap
α : Type uu
β✝ : Type vv
l₁ l₂ : List α
β : List α → Sort u_1
f : (a : α) → (l : List α) → β l → β (a :: l)
b : β []
l l' : List α
f_congr : ∀ {a : α} {l l' : List α} {b : β l} {b' : β l'}, l ~ l' → HEq b b' → HEq (f a l b) (f a l' b')
f_swap : ∀ {a a' : α} {l : List α} {b : β l}, HEq (f a (a' :: l) (f a' l b)) (f a' (a :: l) (f a l b))
x✝ y✝ : α
l✝ : List α
⊢ HEq (List.rec b f (y✝ :: x✝ :: l✝)) (List.rec b f (x✝ :: y✝ :: l✝))

case trans
α : Type uu
β✝ : Type vv
l₁ l₂ : List α
β : List α → Sort u_1
f : (a : α) → (l : List α) → β l → β (a :: l)
b : β []
l l' : List α
f_congr : ∀ {a : α} {l l' : List α} {b : β l} {b' : β l'}, l ~ l' → HEq b b' → HEq (f a l b) (f a l' b')
f_swap : ∀ {a a' : α} {l : List α} {b : β l}, HEq (f a (a' :: l) (f a' l b)) (f a' (a :: l) (f a l b))
l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
a_ih✝¹ : HEq (List.rec b f l₁✝) (List.rec b f l₂✝)
a_ih✝ : HEq (List.rec b f l₂✝) (List.rec b f l₃✝)
⊢ HEq (List.rec b f l₁✝) (List.rec b f l₃✝)

tactic: case trans l₁ l₂ l₃ _h₁ _h₂ ih₁ ih₂ => exact HEq.trans ih₁ ih₂
state_before: case trans
α : Type uu
β✝ : Type vv
l₁ l₂ : List α
β : List α → Sort u_1
f : (a : α) → (l : List α) → β l → β (a :: l)
b : β []
l l' : List α
f_congr : ∀ {a : α} {l l' : List α} {b : β l} {b' : β l'}, l ~ l' → HEq b b' → HEq (f a l b) (f a l' b')
f_swap : ∀ {a a' : α} {l : List α} {b : β l}, HEq (f a (a' :: l) (f a' l b)) (f a' (a :: l) (f a l b))
l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
a_ih✝¹ : HEq (List.rec b f l₁✝) (List.rec b f l₂✝)
a_ih✝ : HEq (List.rec b f l₂✝) (List.rec b f l₃✝)
⊢ HEq (List.rec b f l₁✝) (List.rec b f l₃✝)

tactic: rfl
state_before: α : Type uu
β✝ : Type vv
l₁ l₂ : List α
β : List α → Sort u_1
f : (a : α) → (l : List α) → β l → β (a :: l)
b : β []
l l' : List α
f_congr : ∀ {a : α} {l l' : List α} {b : β l} {b' : β l'}, l ~ l' → HEq b b' → HEq (f a l b) (f a l' b')
f_swap : ∀ {a a' : α} {l : List α} {b : β l}, HEq (f a (a' :: l) (f a' l b)) (f a' (a :: l) (f a l b))
⊢ HEq (List.rec b f []) (List.rec b f [])

tactic: exact f_congr h ih
state_before: α : Type uu
β✝ : Type vv
l₁ l₂ : List α
β : List α → Sort u_1
f : (a : α) → (l : List α) → β l → β (a :: l)
b : β []
l✝ l'✝ : List α
f_congr : ∀ {a : α} {l l' : List α} {b : β l} {b' : β l'}, l ~ l' → HEq b b' → HEq (f a l b) (f a l' b')
f_swap : ∀ {a a' : α} {l : List α} {b : β l}, HEq (f a (a' :: l) (f a' l b)) (f a' (a :: l) (f a l b))
a : α
l l' : List α
h : l ~ l'
ih : HEq (List.rec b f l) (List.rec b f l')
⊢ HEq (List.rec b f (a :: l)) (List.rec b f (a :: l'))

tactic: exact f_swap
state_before: α : Type uu
β✝ : Type vv
l₁ l₂ : List α
β : List α → Sort u_1
f : (a : α) → (l : List α) → β l → β (a :: l)
b : β []
l✝ l' : List α
f_congr : ∀ {a : α} {l l' : List α} {b : β l} {b' : β l'}, l ~ l' → HEq b b' → HEq (f a l b) (f a l' b')
f_swap : ∀ {a a' : α} {l : List α} {b : β l}, HEq (f a (a' :: l) (f a' l b)) (f a' (a :: l) (f a l b))
a a' : α
l : List α
⊢ HEq (List.rec b f (a' :: a :: l)) (List.rec b f (a :: a' :: l))

tactic: exact HEq.trans ih₁ ih₂
state_before: α : Type uu
β✝ : Type vv
l₁✝ l₂✝ : List α
β : List α → Sort u_1
f : (a : α) → (l : List α) → β l → β (a :: l)
b : β []
l l' : List α
f_congr : ∀ {a : α} {l l' : List α} {b : β l} {b' : β l'}, l ~ l' → HEq b b' → HEq (f a l b) (f a l' b')
f_swap : ∀ {a a' : α} {l : List α} {b : β l}, HEq (f a (a' :: l) (f a' l b)) (f a' (a :: l) (f a l b))
l₁ l₂ l₃ : List α
_h₁ : l₁ ~ l₂
_h₂ : l₂ ~ l₃
ih₁ : HEq (List.rec b f l₁) (List.rec b f l₂)
ih₂ : HEq (List.rec b f l₂) (List.rec b f l₃)
⊢ HEq (List.rec b f l₁) (List.rec b f l₃)