Theorem: List.pairwise_iff_forall_sublist
File: .lake/packages/batteries/Batteries/Data/List/Pairwise.lean

tactic: simp
state_before: case nil
α✝ : Type u_1
R : α✝ → α✝ → Prop
⊢ Pairwise R [] ↔ ∀ {a b : α✝}, [a, b] <+ [] → R a b
state_after: no goals

tactic: rw [List.pairwise_cons]
state_before: case cons
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
⊢ Pairwise R (hd :: tl) ↔ ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
state_after: case cons
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
⊢ (∀ (a' : α✝), a' ∈ tl → R hd a') ∧ Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b

tactic: constructor <;> intro h
state_before: case cons
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
⊢ (∀ (a' : α✝), a' ∈ tl → R hd a') ∧ Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
state_after: case cons.mp
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : (∀ (a' : α✝), a' ∈ tl → R hd a') ∧ Pairwise R tl
⊢ ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b

case cons.mpr
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
⊢ (∀ (a' : α✝), a' ∈ tl → R hd a') ∧ Pairwise R tl

tactic: intro
| a, b, .cons _ hab => exact IH.mp h.2 hab
| _, b, .cons₂ _ hab => refine h.1 _ (hab.subset ?_); simp
state_before: case cons.mp
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : (∀ (a' : α✝), a' ∈ tl → R hd a') ∧ Pairwise R tl
⊢ ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
state_after: no goals

tactic: exact IH.mp h.2 hab
state_before: α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : (∀ (a' : α✝), a' ∈ tl → R hd a') ∧ Pairwise R tl
x✝² x✝¹ : α✝
x✝ : [x✝², x✝¹] <+ hd :: tl
a b : α✝
hab : [a, b] <+ tl
⊢ R a b
state_after: no goals

tactic: refine h.1 _ (hab.subset ?_)
state_before: α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : (∀ (a' : α✝), a' ∈ tl → R hd a') ∧ Pairwise R tl
x✝² x✝¹ : α✝
x✝ : [x✝², x✝¹] <+ hd :: tl
b : α✝
hab : [b] <+ tl
⊢ R hd b
state_after: α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : (∀ (a' : α✝), a' ∈ tl → R hd a') ∧ Pairwise R tl
x✝² x✝¹ : α✝
x✝ : [x✝², x✝¹] <+ hd :: tl
b : α✝
hab : [b] <+ tl
⊢ b ∈ [b]

tactic: simp
state_before: α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : (∀ (a' : α✝), a' ∈ tl → R hd a') ∧ Pairwise R tl
x✝² x✝¹ : α✝
x✝ : [x✝², x✝¹] <+ hd :: tl
b : α✝
hab : [b] <+ tl
⊢ b ∈ [b]
state_after: no goals

tactic: constructor
state_before: case cons.mpr
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
⊢ (∀ (a' : α✝), a' ∈ tl → R hd a') ∧ Pairwise R tl
state_after: case cons.mpr.left
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
⊢ ∀ (a' : α✝), a' ∈ tl → R hd a'

case cons.mpr.right
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
⊢ Pairwise R tl

tactic: intro x hx
state_before: case cons.mpr.left
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
⊢ ∀ (a' : α✝), a' ∈ tl → R hd a'
state_after: case cons.mpr.left
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
x : α✝
hx : x ∈ tl
⊢ R hd x

tactic: apply h
state_before: case cons.mpr.left
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
x : α✝
hx : x ∈ tl
⊢ R hd x
state_after: case cons.mpr.left.a
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
x : α✝
hx : x ∈ tl
⊢ [hd, x] <+ hd :: tl

tactic: rw [List.cons_sublist_cons, List.singleton_sublist]
state_before: case cons.mpr.left.a
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
x : α✝
hx : x ∈ tl
⊢ [hd, x] <+ hd :: tl
state_after: case cons.mpr.left.a
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
x : α✝
hx : x ∈ tl
⊢ x ∈ tl

tactic: exact hx
state_before: case cons.mpr.left.a
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
x : α✝
hx : x ∈ tl
⊢ x ∈ tl
state_after: no goals

tactic: apply IH.mpr
state_before: case cons.mpr.right
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
⊢ Pairwise R tl
state_after: case cons.mpr.right
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
⊢ ∀ {a b : α✝}, [a, b] <+ tl → R a b

tactic: intro a b hab
state_before: case cons.mpr.right
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
⊢ ∀ {a b : α✝}, [a, b] <+ tl → R a b
state_after: case cons.mpr.right
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
a b : α✝
hab : [a, b] <+ tl
⊢ R a b

tactic: apply h
state_before: case cons.mpr.right
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
a b : α✝
hab : [a, b] <+ tl
⊢ R a b
state_after: case cons.mpr.right.a
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
a b : α✝
hab : [a, b] <+ tl
⊢ [a, b] <+ hd :: tl

tactic: exact hab.cons _
state_before: case cons.mpr.right.a
α✝ : Type u_1
R : α✝ → α✝ → Prop
hd : α✝
tl : List α✝
IH : Pairwise R tl ↔ ∀ {a b : α✝}, [a, b] <+ tl → R a b
h : ∀ {a b : α✝}, [a, b] <+ hd :: tl → R a b
a b : α✝
hab : [a, b] <+ tl
⊢ [a, b] <+ hd :: tl
state_after: no goals