Theorem: List.Perm.pairwise_iff
File: .lake/packages/batteries/Batteries/Data/List/Perm.lean

tactic: induction d generalizing l₂ with
| nil => rw [← p.nil_eq]; constructor
| cons h _ IH =>
  have : _ ∈ l₂ := p.subset (mem_cons_self _ _)
  obtain ⟨s₂, t₂, rfl⟩ := append_of_mem this
  have p' := (p.trans perm_middle).cons_inv
  refine (pairwise_middle S).2 (pairwise_cons.2 ⟨fun b m => ?_, IH p'⟩)
  exact h _ (p'.symm.subset m)
state_before: α : Type u_1
R : α → α → Prop
S : ∀ {x y : α}, R x y → R y x
l₁✝ l₂✝ l₁ l₂ : List α
p : l₁ ~ l₂
d : Pairwise R l₁
⊢ Pairwise R l₂
state_after: no goals

tactic: rw [← p.nil_eq]
state_before: case nil
α : Type u_1
R : α → α → Prop
S : ∀ {x y : α}, R x y → R y x
l₁✝ l₂✝ l₁ l₂ : List α
p : [] ~ l₂
⊢ Pairwise R l₂
state_after: case nil
α : Type u_1
R : α → α → Prop
S : ∀ {x y : α}, R x y → R y x
l₁✝ l₂✝ l₁ l₂ : List α
p : [] ~ l₂
⊢ Pairwise R []

tactic: constructor
state_before: case nil
α : Type u_1
R : α → α → Prop
S : ∀ {x y : α}, R x y → R y x
l₁✝ l₂✝ l₁ l₂ : List α
p : [] ~ l₂
⊢ Pairwise R []
state_after: no goals

tactic: have : _ ∈ l₂ := p.subset (mem_cons_self _ _)
state_before: case cons
α : Type u_1
R : α → α → Prop
S : ∀ {x y : α}, R x y → R y x
l₁✝ l₂✝ l₁ : List α
a✝¹ : α
l✝ : List α
h : ∀ (a' : α), a' ∈ l✝ → R a✝¹ a'
a✝ : Pairwise R l✝
IH : ∀ {l₂ : List α}, l✝ ~ l₂ → Pairwise R l₂
l₂ : List α
p : a✝¹ :: l✝ ~ l₂
⊢ Pairwise R l₂
state_after: case cons
α : Type u_1
R : α → α → Prop
S : ∀ {x y : α}, R x y → R y x
l₁✝ l₂✝ l₁ : List α
a✝¹ : α
l✝ : List α
h : ∀ (a' : α), a' ∈ l✝ → R a✝¹ a'
a✝ : Pairwise R l✝
IH : ∀ {l₂ : List α}, l✝ ~ l₂ → Pairwise R l₂
l₂ : List α
p : a✝¹ :: l✝ ~ l₂
this : a✝¹ ∈ l₂
⊢ Pairwise R l₂

tactic: obtain ⟨s₂, t₂, rfl⟩ := append_of_mem this
state_before: case cons
α : Type u_1
R : α → α → Prop
S : ∀ {x y : α}, R x y → R y x
l₁✝ l₂✝ l₁ : List α
a✝¹ : α
l✝ : List α
h : ∀ (a' : α), a' ∈ l✝ → R a✝¹ a'
a✝ : Pairwise R l✝
IH : ∀ {l₂ : List α}, l✝ ~ l₂ → Pairwise R l₂
l₂ : List α
p : a✝¹ :: l✝ ~ l₂
this : a✝¹ ∈ l₂
⊢ Pairwise R l₂
state_after: case cons.intro.intro
α : Type u_1
R : α → α → Prop
S : ∀ {x y : α}, R x y → R y x
l₁✝ l₂✝ l₁ : List α
a✝¹ : α
l✝ : List α
h : ∀ (a' : α), a' ∈ l✝ → R a✝¹ a'
a✝ : Pairwise R l✝
IH : ∀ {l₂ : List α}, l✝ ~ l₂ → Pairwise R l₂
s₂ t₂ : List α
p : a✝¹ :: l✝ ~ s₂ ++ a✝¹ :: t₂
this : a✝¹ ∈ s₂ ++ a✝¹ :: t₂
⊢ Pairwise R (s₂ ++ a✝¹ :: t₂)

tactic: have p' := (p.trans perm_middle).cons_inv
state_before: case cons.intro.intro
α : Type u_1
R : α → α → Prop
S : ∀ {x y : α}, R x y → R y x
l₁✝ l₂✝ l₁ : List α
a✝¹ : α
l✝ : List α
h : ∀ (a' : α), a' ∈ l✝ → R a✝¹ a'
a✝ : Pairwise R l✝
IH : ∀ {l₂ : List α}, l✝ ~ l₂ → Pairwise R l₂
s₂ t₂ : List α
p : a✝¹ :: l✝ ~ s₂ ++ a✝¹ :: t₂
this : a✝¹ ∈ s₂ ++ a✝¹ :: t₂
⊢ Pairwise R (s₂ ++ a✝¹ :: t₂)
state_after: case cons.intro.intro
α : Type u_1
R : α → α → Prop
S : ∀ {x y : α}, R x y → R y x
l₁✝ l₂✝ l₁ : List α
a✝¹ : α
l✝ : List α
h : ∀ (a' : α), a' ∈ l✝ → R a✝¹ a'
a✝ : Pairwise R l✝
IH : ∀ {l₂ : List α}, l✝ ~ l₂ → Pairwise R l₂
s₂ t₂ : List α
p : a✝¹ :: l✝ ~ s₂ ++ a✝¹ :: t₂
this : a✝¹ ∈ s₂ ++ a✝¹ :: t₂
p' : l✝ ~ s₂ ++ t₂
⊢ Pairwise R (s₂ ++ a✝¹ :: t₂)

tactic: refine (pairwise_middle S).2 (pairwise_cons.2 ⟨fun b m => ?_, IH p'⟩)
state_before: case cons.intro.intro
α : Type u_1
R : α → α → Prop
S : ∀ {x y : α}, R x y → R y x
l₁✝ l₂✝ l₁ : List α
a✝¹ : α
l✝ : List α
h : ∀ (a' : α), a' ∈ l✝ → R a✝¹ a'
a✝ : Pairwise R l✝
IH : ∀ {l₂ : List α}, l✝ ~ l₂ → Pairwise R l₂
s₂ t₂ : List α
p : a✝¹ :: l✝ ~ s₂ ++ a✝¹ :: t₂
this : a✝¹ ∈ s₂ ++ a✝¹ :: t₂
p' : l✝ ~ s₂ ++ t₂
⊢ Pairwise R (s₂ ++ a✝¹ :: t₂)
state_after: case cons.intro.intro
α : Type u_1
R : α → α → Prop
S : ∀ {x y : α}, R x y → R y x
l₁✝ l₂✝ l₁ : List α
a✝¹ : α
l✝ : List α
h : ∀ (a' : α), a' ∈ l✝ → R a✝¹ a'
a✝ : Pairwise R l✝
IH : ∀ {l₂ : List α}, l✝ ~ l₂ → Pairwise R l₂
s₂ t₂ : List α
p : a✝¹ :: l✝ ~ s₂ ++ a✝¹ :: t₂
this : a✝¹ ∈ s₂ ++ a✝¹ :: t₂
p' : l✝ ~ s₂ ++ t₂
b : α
m : b ∈ s₂ ++ t₂
⊢ R a✝¹ b

tactic: exact h _ (p'.symm.subset m)
state_before: case cons.intro.intro
α : Type u_1
R : α → α → Prop
S : ∀ {x y : α}, R x y → R y x
l₁✝ l₂✝ l₁ : List α
a✝¹ : α
l✝ : List α
h : ∀ (a' : α), a' ∈ l✝ → R a✝¹ a'
a✝ : Pairwise R l✝
IH : ∀ {l₂ : List α}, l✝ ~ l₂ → Pairwise R l₂
s₂ t₂ : List α
p : a✝¹ :: l✝ ~ s₂ ++ a✝¹ :: t₂
this : a✝¹ ∈ s₂ ++ a✝¹ :: t₂
p' : l✝ ~ s₂ ++ t₂
b : α
m : b ∈ s₂ ++ t₂
⊢ R a✝¹ b
state_after: no goals