Theorem: List.perm_comp_forall₂
File: Mathlib/Data/List/Perm.lean

tactic: induction hlu generalizing v with
| nil => cases huv; exact ⟨[], Forall₂.nil, Perm.nil⟩
| cons u _hlu ih =>
  cases' huv with _ b _ v hab huv'
  rcases ih huv' with ⟨l₂, h₁₂, h₂₃⟩
  exact ⟨b :: l₂, Forall₂.cons hab h₁₂, h₂₃.cons _⟩
| swap a₁ a₂ h₂₃ =>
  cases' huv with _ b₁ _ l₂ h₁ hr₂₃
  cases' hr₂₃ with _ b₂ _ l₂ h₂ h₁₂
  exact ⟨b₂ :: b₁ :: l₂, Forall₂.cons h₂ (Forall₂.cons h₁ h₁₂), Perm.swap _ _ _⟩
| trans _ _ ih₁ ih₂ =>
  rcases ih₂ huv with ⟨lb₂, hab₂, h₂₃⟩
  rcases ih₁ hab₂ with ⟨lb₁, hab₁, h₁₂⟩
  exact ⟨lb₁, hab₁, Perm.trans h₁₂ h₂₃⟩
state_before: α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u : List α
v : List β
hlu : l ~ u
huv : Forall₂ r u v
⊢ (Forall₂ r ∘r Perm) l v
state_after: no goals

tactic: cases huv
state_before: case nil
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u : List α
v : List β
huv : Forall₂ r [] v
⊢ (Forall₂ r ∘r Perm) [] v
state_after: case nil.nil
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u : List α
⊢ (Forall₂ r ∘r Perm) [] []

tactic: exact ⟨[], Forall₂.nil, Perm.nil⟩
state_before: case nil.nil
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u : List α
⊢ (Forall₂ r ∘r Perm) [] []
state_after: no goals

tactic: cases' huv with _ b _ v hab huv'
state_before: case cons
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u✝ : List α
u : α
l₁✝ l₂✝ : List α
_hlu : l₁✝ ~ l₂✝
ih : ∀ {v : List β}, Forall₂ r l₂✝ v → (Forall₂ r ∘r Perm) l₁✝ v
v : List β
huv : Forall₂ r (u :: l₂✝) v
⊢ (Forall₂ r ∘r Perm) (u :: l₁✝) v
state_after: case cons.cons
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u✝ : List α
u : α
l₁✝ l₂✝ : List α
_hlu : l₁✝ ~ l₂✝
ih : ∀ {v : List β}, Forall₂ r l₂✝ v → (Forall₂ r ∘r Perm) l₁✝ v
b : β
v : List β
hab : r u b
huv' : Forall₂ r l₂✝ v
⊢ (Forall₂ r ∘r Perm) (u :: l₁✝) (b :: v)

tactic: rcases ih huv' with ⟨l₂, h₁₂, h₂₃⟩
state_before: case cons.cons
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u✝ : List α
u : α
l₁✝ l₂✝ : List α
_hlu : l₁✝ ~ l₂✝
ih : ∀ {v : List β}, Forall₂ r l₂✝ v → (Forall₂ r ∘r Perm) l₁✝ v
b : β
v : List β
hab : r u b
huv' : Forall₂ r l₂✝ v
⊢ (Forall₂ r ∘r Perm) (u :: l₁✝) (b :: v)
state_after: case cons.cons.intro.intro
α : Type u_1
β : Type u_2
l✝ l₁ l₂✝¹ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u✝ : List α
u : α
l₁✝ l₂✝ : List α
_hlu : l₁✝ ~ l₂✝
ih : ∀ {v : List β}, Forall₂ r l₂✝ v → (Forall₂ r ∘r Perm) l₁✝ v
b : β
v : List β
hab : r u b
huv' : Forall₂ r l₂✝ v
l₂ : List β
h₁₂ : Forall₂ r l₁✝ l₂
h₂₃ : l₂ ~ v
⊢ (Forall₂ r ∘r Perm) (u :: l₁✝) (b :: v)

tactic: exact ⟨b :: l₂, Forall₂.cons hab h₁₂, h₂₃.cons _⟩
state_before: case cons.cons.intro.intro
α : Type u_1
β : Type u_2
l✝ l₁ l₂✝¹ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u✝ : List α
u : α
l₁✝ l₂✝ : List α
_hlu : l₁✝ ~ l₂✝
ih : ∀ {v : List β}, Forall₂ r l₂✝ v → (Forall₂ r ∘r Perm) l₁✝ v
b : β
v : List β
hab : r u b
huv' : Forall₂ r l₂✝ v
l₂ : List β
h₁₂ : Forall₂ r l₁✝ l₂
h₂₃ : l₂ ~ v
⊢ (Forall₂ r ∘r Perm) (u :: l₁✝) (b :: v)
state_after: no goals

tactic: cases' huv with _ b₁ _ l₂ h₁ hr₂₃
state_before: case swap
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u : List α
a₁ a₂ : α
h₂₃ : List α
v : List β
huv : Forall₂ r (a₁ :: a₂ :: h₂₃) v
⊢ (Forall₂ r ∘r Perm) (a₂ :: a₁ :: h₂₃) v
state_after: case swap.cons
α : Type u_1
β : Type u_2
l✝ l₁ l₂✝ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u : List α
a₁ a₂ : α
h₂₃ : List α
b₁ : β
l₂ : List β
h₁ : r a₁ b₁
hr₂₃ : Forall₂ r (a₂ :: h₂₃) l₂
⊢ (Forall₂ r ∘r Perm) (a₂ :: a₁ :: h₂₃) (b₁ :: l₂)

tactic: cases' hr₂₃ with _ b₂ _ l₂ h₂ h₁₂
state_before: case swap.cons
α : Type u_1
β : Type u_2
l✝ l₁ l₂✝ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u : List α
a₁ a₂ : α
h₂₃ : List α
b₁ : β
l₂ : List β
h₁ : r a₁ b₁
hr₂₃ : Forall₂ r (a₂ :: h₂₃) l₂
⊢ (Forall₂ r ∘r Perm) (a₂ :: a₁ :: h₂₃) (b₁ :: l₂)
state_after: case swap.cons.cons
α : Type u_1
β : Type u_2
l✝ l₁ l₂✝ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u : List α
a₁ a₂ : α
h₂₃ : List α
b₁ : β
h₁ : r a₁ b₁
b₂ : β
l₂ : List β
h₂ : r a₂ b₂
h₁₂ : Forall₂ r h₂₃ l₂
⊢ (Forall₂ r ∘r Perm) (a₂ :: a₁ :: h₂₃) (b₁ :: b₂ :: l₂)

tactic: exact ⟨b₂ :: b₁ :: l₂, Forall₂.cons h₂ (Forall₂.cons h₁ h₁₂), Perm.swap _ _ _⟩
state_before: case swap.cons.cons
α : Type u_1
β : Type u_2
l✝ l₁ l₂✝ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u : List α
a₁ a₂ : α
h₂₃ : List α
b₁ : β
h₁ : r a₁ b₁
b₂ : β
l₂ : List β
h₂ : r a₂ b₂
h₁₂ : Forall₂ r h₂₃ l₂
⊢ (Forall₂ r ∘r Perm) (a₂ :: a₁ :: h₂₃) (b₁ :: b₂ :: l₂)
state_after: no goals

tactic: rcases ih₂ huv with ⟨lb₂, hab₂, h₂₃⟩
state_before: case trans
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
ih₁ : ∀ {v : List β}, Forall₂ r l₂✝ v → (Forall₂ r ∘r Perm) l₁✝ v
ih₂ : ∀ {v : List β}, Forall₂ r l₃✝ v → (Forall₂ r ∘r Perm) l₂✝ v
v : List β
huv : Forall₂ r l₃✝ v
⊢ (Forall₂ r ∘r Perm) l₁✝ v
state_after: case trans.intro.intro
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
ih₁ : ∀ {v : List β}, Forall₂ r l₂✝ v → (Forall₂ r ∘r Perm) l₁✝ v
ih₂ : ∀ {v : List β}, Forall₂ r l₃✝ v → (Forall₂ r ∘r Perm) l₂✝ v
v : List β
huv : Forall₂ r l₃✝ v
lb₂ : List β
hab₂ : Forall₂ r l₂✝ lb₂
h₂₃ : lb₂ ~ v
⊢ (Forall₂ r ∘r Perm) l₁✝ v

tactic: rcases ih₁ hab₂ with ⟨lb₁, hab₁, h₁₂⟩
state_before: case trans.intro.intro
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
ih₁ : ∀ {v : List β}, Forall₂ r l₂✝ v → (Forall₂ r ∘r Perm) l₁✝ v
ih₂ : ∀ {v : List β}, Forall₂ r l₃✝ v → (Forall₂ r ∘r Perm) l₂✝ v
v : List β
huv : Forall₂ r l₃✝ v
lb₂ : List β
hab₂ : Forall₂ r l₂✝ lb₂
h₂₃ : lb₂ ~ v
⊢ (Forall₂ r ∘r Perm) l₁✝ v
state_after: case trans.intro.intro.intro.intro
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
ih₁ : ∀ {v : List β}, Forall₂ r l₂✝ v → (Forall₂ r ∘r Perm) l₁✝ v
ih₂ : ∀ {v : List β}, Forall₂ r l₃✝ v → (Forall₂ r ∘r Perm) l₂✝ v
v : List β
huv : Forall₂ r l₃✝ v
lb₂ : List β
hab₂ : Forall₂ r l₂✝ lb₂
h₂₃ : lb₂ ~ v
lb₁ : List β
hab₁ : Forall₂ r l₁✝ lb₁
h₁₂ : lb₁ ~ lb₂
⊢ (Forall₂ r ∘r Perm) l₁✝ v

tactic: exact ⟨lb₁, hab₁, Perm.trans h₁₂ h₂₃⟩
state_before: case trans.intro.intro.intro.intro
α : Type u_1
β : Type u_2
l✝ l₁ l₂ : List α
a : α
γ : Type u_3
δ : Type u_4
r : α → β → Prop
p : γ → δ → Prop
l u l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
ih₁ : ∀ {v : List β}, Forall₂ r l₂✝ v → (Forall₂ r ∘r Perm) l₁✝ v
ih₂ : ∀ {v : List β}, Forall₂ r l₃✝ v → (Forall₂ r ∘r Perm) l₂✝ v
v : List β
huv : Forall₂ r l₃✝ v
lb₂ : List β
hab₂ : Forall₂ r l₂✝ lb₂
h₂₃ : lb₂ ~ v
lb₁ : List β
hab₁ : Forall₂ r l₁✝ lb₁
h₁₂ : lb₁ ~ lb₂
⊢ (Forall₂ r ∘r Perm) l₁✝ v
state_after: no goals