Theorem: List.Sorted.merge
File: Mathlib/Data/List/Sort.lean

tactic: simp
state_before: α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
x✝¹ x✝ : Sorted r []
⊢ Sorted r (List.merge (fun x x_1 => decide (r x x_1)) [] [])
state_after: no goals

tactic: simpa using h₂
state_before: α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
b : α
l' : List α
x✝ : Sorted r []
h₂ : Sorted r (b :: l')
⊢ Sorted r (List.merge (fun x x_1 => decide (r x x_1)) [] (b :: l'))
state_after: no goals

tactic: simpa using h₁
state_before: α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
h₁ : Sorted r (a :: l)
x✝ : Sorted r []
⊢ Sorted r (List.merge (fun x x_1 => decide (r x x_1)) (a :: l) [])
state_after: no goals

tactic: by_cases h : a ≼ b
state_before: α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
⊢ Sorted r (List.merge (fun x x_1 => decide (r x x_1)) (a :: l) (b :: l'))
state_after: case pos
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : r a b
⊢ Sorted r (List.merge (fun x x_1 => decide (r x x_1)) (a :: l) (b :: l'))

case neg
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
⊢ Sorted r (List.merge (fun x x_1 => decide (r x x_1)) (a :: l) (b :: l'))

tactic: intro b' bm
state_before: case pos
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : r a b
⊢ ∀ b' ∈ List.merge (fun x x_1 => decide (r x x_1)) l (b :: l'), r a b'
state_after: case pos
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) l (b :: l')
⊢ r a b'

tactic: rcases show b' = b ∨ b' ∈ l ∨ b' ∈ l' by
    simpa [or_left_comm] using (perm_merge _ _ _).subset bm with
  (be | bl | bl')
state_before: case pos
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) l (b :: l')
⊢ r a b'
state_after: case pos.inl
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) l (b :: l')
be : b' = b
⊢ r a b'

case pos.inr.inl
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) l (b :: l')
bl : b' ∈ l
⊢ r a b'

case pos.inr.inr
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) l (b :: l')
bl' : b' ∈ l'
⊢ r a b'

tactic: simpa [h, h₁.of_cons.merge h₂]
state_before: α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : r a b
this : ∀ b' ∈ List.merge (fun x x_1 => decide (r x x_1)) l (b :: l'), r a b'
⊢ Sorted r (List.merge (fun x x_1 => decide (r x x_1)) (a :: l) (b :: l'))
state_after: no goals

tactic: simpa [or_left_comm] using (perm_merge _ _ _).subset bm
state_before: α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) l (b :: l')
⊢ b' = b ∨ b' ∈ l ∨ b' ∈ l'
state_after: no goals

tactic: subst b'
state_before: case pos.inl
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) l (b :: l')
be : b' = b
⊢ r a b'
state_after: case pos.inl
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : r a b
bm : b ∈ List.merge (fun x x_1 => decide (r x x_1)) l (b :: l')
⊢ r a b

tactic: assumption
state_before: case pos.inl
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : r a b
bm : b ∈ List.merge (fun x x_1 => decide (r x x_1)) l (b :: l')
⊢ r a b
state_after: no goals

tactic: exact rel_of_sorted_cons h₁ _ bl
state_before: case pos.inr.inl
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) l (b :: l')
bl : b' ∈ l
⊢ r a b'
state_after: no goals

tactic: exact _root_.trans h (rel_of_sorted_cons h₂ _ bl')
state_before: case pos.inr.inr
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) l (b :: l')
bl' : b' ∈ l'
⊢ r a b'
state_after: no goals

tactic: intro b' bm
state_before: case neg
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
⊢ ∀ b' ∈ List.merge (fun x x_1 => decide (r x x_1)) (a :: l) l', r b b'
state_after: case neg
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) (a :: l) l'
⊢ r b b'

tactic: have ba : b ≼ a := (total_of r _ _).resolve_left h
state_before: case neg
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) (a :: l) l'
⊢ r b b'
state_after: case neg
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) (a :: l) l'
ba : r b a
⊢ r b b'

tactic: have : b' = a ∨ b' ∈ l ∨ b' ∈ l' := by simpa using (perm_merge _ _ _).subset bm
state_before: case neg
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) (a :: l) l'
ba : r b a
⊢ r b b'
state_after: case neg
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) (a :: l) l'
ba : r b a
this : b' = a ∨ b' ∈ l ∨ b' ∈ l'
⊢ r b b'

tactic: rcases this with (be | bl | bl')
state_before: case neg
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) (a :: l) l'
ba : r b a
this : b' = a ∨ b' ∈ l ∨ b' ∈ l'
⊢ r b b'
state_after: case neg.inl
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) (a :: l) l'
ba : r b a
be : b' = a
⊢ r b b'

case neg.inr.inl
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) (a :: l) l'
ba : r b a
bl : b' ∈ l
⊢ r b b'

case neg.inr.inr
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) (a :: l) l'
ba : r b a
bl' : b' ∈ l'
⊢ r b b'

tactic: simpa [h, h₁.merge h₂.of_cons]
state_before: α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
this : ∀ b' ∈ List.merge (fun x x_1 => decide (r x x_1)) (a :: l) l', r b b'
⊢ Sorted r (List.merge (fun x x_1 => decide (r x x_1)) (a :: l) (b :: l'))
state_after: no goals

tactic: simpa using (perm_merge _ _ _).subset bm
state_before: α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) (a :: l) l'
ba : r b a
⊢ b' = a ∨ b' ∈ l ∨ b' ∈ l'
state_after: no goals

tactic: subst b'
state_before: case neg.inl
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) (a :: l) l'
ba : r b a
be : b' = a
⊢ r b b'
state_after: case neg.inl
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
ba : r b a
bm : a ∈ List.merge (fun x x_1 => decide (r x x_1)) (a :: l) l'
⊢ r b a

tactic: assumption
state_before: case neg.inl
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
ba : r b a
bm : a ∈ List.merge (fun x x_1 => decide (r x x_1)) (a :: l) l'
⊢ r b a
state_after: no goals

tactic: exact _root_.trans ba (rel_of_sorted_cons h₁ _ bl)
state_before: case neg.inr.inl
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) (a :: l) l'
ba : r b a
bl : b' ∈ l
⊢ r b b'
state_after: no goals

tactic: exact rel_of_sorted_cons h₂ _ bl'
state_before: case neg.inr.inr
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : IsTotal α r
inst✝ : IsTrans α r
a : α
l : List α
b : α
l' : List α
h₁ : Sorted r (a :: l)
h₂ : Sorted r (b :: l')
h : ¬r a b
b' : α
bm : b' ∈ List.merge (fun x x_1 => decide (r x x_1)) (a :: l) l'
ba : r b a
bl' : b' ∈ l'
⊢ r b b'
state_after: no goals