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

tactic: induction hlu generalizing v
state_before: α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l u : List α
v : List β
hlu : l ~ u
huv : Forall₂ r u v
⊢ (Forall₂ r ∘r Perm) l v

tactic: case nil => cases huv; exact ⟨[], Forall₂.nil, Perm.nil⟩
state_before: case nil
α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l u : List α
v : List β
huv : Forall₂ r [] v
⊢ (Forall₂ r ∘r Perm) [] v

case cons
α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l u : List α
x✝ : α
l₁✝ l₂✝ : List α
a✝ : l₁✝ ~ l₂✝
a_ih✝ : ∀ {v : List β}, Forall₂ r l₂✝ v → (Forall₂ r ∘r Perm) l₁✝ v
v : List β
huv : Forall₂ r (x✝ :: l₂✝) v
⊢ (Forall₂ r ∘r Perm) (x✝ :: l₁✝) v

case swap
α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l u : List α
x✝ y✝ : α
l✝ : List α
v : List β
huv : Forall₂ r (x✝ :: y✝ :: l✝) v
⊢ (Forall₂ r ∘r Perm) (y✝ :: x✝ :: l✝) v

case trans
α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l u l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
a_ih✝¹ : ∀ {v : List β}, Forall₂ r l₂✝ v → (Forall₂ r ∘r Perm) l₁✝ v
a_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

tactic: case cons a l 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 _⟩
state_before: case cons
α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l u : List α
x✝ : α
l₁✝ l₂✝ : List α
a✝ : l₁✝ ~ l₂✝
a_ih✝ : ∀ {v : List β}, Forall₂ r l₂✝ v → (Forall₂ r ∘r Perm) l₁✝ v
v : List β
huv : Forall₂ r (x✝ :: l₂✝) v
⊢ (Forall₂ r ∘r Perm) (x✝ :: l₁✝) v

case swap
α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l u : List α
x✝ y✝ : α
l✝ : List α
v : List β
huv : Forall₂ r (x✝ :: y✝ :: l✝) v
⊢ (Forall₂ r ∘r Perm) (y✝ :: x✝ :: l✝) v

case trans
α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l u l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
a_ih✝¹ : ∀ {v : List β}, Forall₂ r l₂✝ v → (Forall₂ r ∘r Perm) l₁✝ v
a_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

tactic: case 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 _ _ _⟩
state_before: case swap
α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l u : List α
x✝ y✝ : α
l✝ : List α
v : List β
huv : Forall₂ r (x✝ :: y✝ :: l✝) v
⊢ (Forall₂ r ∘r Perm) (y✝ :: x✝ :: l✝) v

case trans
α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l u l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
a_ih✝¹ : ∀ {v : List β}, Forall₂ r l₂✝ v → (Forall₂ r ∘r Perm) l₁✝ v
a_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

tactic: case
  trans la₁ la₂ la₃ _ _ 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: case trans
α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l u l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
a_ih✝¹ : ∀ {v : List β}, Forall₂ r l₂✝ v → (Forall₂ r ∘r Perm) l₁✝ v
a_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

tactic: cases huv
state_before: α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l u : List α
v : List β
huv : Forall₂ r [] v
⊢ (Forall₂ r ∘r Perm) [] v

tactic: exact ⟨[], Forall₂.nil, Perm.nil⟩
state_before: case nil
α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l u : List α
⊢ (Forall₂ r ∘r Perm) [] []

tactic: cases' huv with _ b _ v hab huv'
state_before: α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l✝ u✝ : List α
a : α
l u : List α
_hlu : l ~ u
ih : ∀ {v : List β}, Forall₂ r u v → (Forall₂ r ∘r Perm) l v
v : List β
huv : Forall₂ r (a :: u) v
⊢ (Forall₂ r ∘r Perm) (a :: l) v

tactic: rcases ih huv' with ⟨l₂, h₁₂, h₂₃⟩
state_before: case cons
α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l✝ u✝ : List α
a : α
l u : List α
_hlu : l ~ u
ih : ∀ {v : List β}, Forall₂ r u v → (Forall₂ r ∘r Perm) l v
b : β
v : List β
hab : r a b
huv' : Forall₂ r u v
⊢ (Forall₂ r ∘r Perm) (a :: l) (b :: v)

tactic: exact ⟨b :: l₂, Forall₂.cons hab h₁₂, h₂₃.cons _⟩
state_before: case cons.intro.intro
α : Type uu
β : Type vv
l₁ l₂✝ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l✝ u✝ : List α
a : α
l u : List α
_hlu : l ~ u
ih : ∀ {v : List β}, Forall₂ r u v → (Forall₂ r ∘r Perm) l v
b : β
v : List β
hab : r a b
huv' : Forall₂ r u v
l₂ : List β
h₁₂ : Forall₂ r l l₂
h₂₃ : l₂ ~ v
⊢ (Forall₂ r ∘r Perm) (a :: l) (b :: v)

tactic: cases' huv with _ b₁ _ l₂ h₁ hr₂₃
state_before: α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
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

tactic: cases' hr₂₃ with _ b₂ _ l₂ h₂ h₁₂
state_before: case cons
α : Type uu
β : Type vv
l₁ l₂✝ : List α
γ : Type ?u.37530
δ : Type ?u.37533
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: exact ⟨b₂ :: b₁ :: l₂, Forall₂.cons h₂ (Forall₂.cons h₁ h₁₂), Perm.swap _ _ _⟩
state_before: case cons.cons
α : Type uu
β : Type vv
l₁ l₂✝ : List α
γ : Type ?u.37530
δ : Type ?u.37533
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: rcases ih₂ huv with ⟨lb₂, hab₂, h₂₃⟩
state_before: α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l u la₁ la₂ la₃ : List α
a✝¹ : la₁ ~ la₂
a✝ : la₂ ~ la₃
ih₁ : ∀ {v : List β}, Forall₂ r la₂ v → (Forall₂ r ∘r Perm) la₁ v
ih₂ : ∀ {v : List β}, Forall₂ r la₃ v → (Forall₂ r ∘r Perm) la₂ v
v : List β
huv : Forall₂ r la₃ v
⊢ (Forall₂ r ∘r Perm) la₁ v

tactic: rcases ih₁ hab₂ with ⟨lb₁, hab₁, h₁₂⟩
state_before: case intro.intro
α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l u la₁ la₂ la₃ : List α
a✝¹ : la₁ ~ la₂
a✝ : la₂ ~ la₃
ih₁ : ∀ {v : List β}, Forall₂ r la₂ v → (Forall₂ r ∘r Perm) la₁ v
ih₂ : ∀ {v : List β}, Forall₂ r la₃ v → (Forall₂ r ∘r Perm) la₂ v
v : List β
huv : Forall₂ r la₃ v
lb₂ : List β
hab₂ : Forall₂ r la₂ lb₂
h₂₃ : lb₂ ~ v
⊢ (Forall₂ r ∘r Perm) la₁ v

tactic: exact ⟨lb₁, hab₁, Perm.trans h₁₂ h₂₃⟩
state_before: case intro.intro.intro.intro
α : Type uu
β : Type vv
l₁ l₂ : List α
γ : Type ?u.37530
δ : Type ?u.37533
r : α → β → Prop
p : γ → δ → Prop
l u la₁ la₂ la₃ : List α
a✝¹ : la₁ ~ la₂
a✝ : la₂ ~ la₃
ih₁ : ∀ {v : List β}, Forall₂ r la₂ v → (Forall₂ r ∘r Perm) la₁ v
ih₂ : ∀ {v : List β}, Forall₂ r la₃ v → (Forall₂ r ∘r Perm) la₂ v
v : List β
huv : Forall₂ r la₃ v
lb₂ : List β
hab₂ : Forall₂ r la₂ lb₂
h₂₃ : lb₂ ~ v
lb₁ : List β
hab₁ : Forall₂ r la₁ lb₁
h₁₂ : lb₁ ~ lb₂
⊢ (Forall₂ r ∘r Perm) la₁ v