Theorem: List.orderedInsert_erase
File: Mathlib/Data/List/Sort.lean

tactic: cases hx
state_before: case nil
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
x : α
hx : x ∈ []
hxs : Sorted r []
⊢ orderedInsert r x ([].erase x) = []
state_after: no goals

tactic: rw [sorted_cons] at hxs
state_before: case cons
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
y : α
ys : List α
ih : ∀ x ∈ ys, Sorted r ys → orderedInsert r x (ys.erase x) = ys
x : α
hx : x ∈ y :: ys
hxs : Sorted r (y :: ys)
⊢ orderedInsert r x ((y :: ys).erase x) = y :: ys
state_after: case cons
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
y : α
ys : List α
ih : ∀ x ∈ ys, Sorted r ys → orderedInsert r x (ys.erase x) = ys
x : α
hx : x ∈ y :: ys
hxs : (∀ b ∈ ys, r y b) ∧ Sorted r ys
⊢ orderedInsert r x ((y :: ys).erase x) = y :: ys

tactic: obtain rfl | hxy := Decidable.eq_or_ne x y
state_before: case cons
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
y : α
ys : List α
ih : ∀ x ∈ ys, Sorted r ys → orderedInsert r x (ys.erase x) = ys
x : α
hx : x ∈ y :: ys
hxs : (∀ b ∈ ys, r y b) ∧ Sorted r ys
⊢ orderedInsert r x ((y :: ys).erase x) = y :: ys
state_after: case cons.inl
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
ys : List α
ih : ∀ x ∈ ys, Sorted r ys → orderedInsert r x (ys.erase x) = ys
x : α
hx : x ∈ x :: ys
hxs : (∀ b ∈ ys, r x b) ∧ Sorted r ys
⊢ orderedInsert r x ((x :: ys).erase x) = x :: ys

case cons.inr
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
y : α
ys : List α
ih : ∀ x ∈ ys, Sorted r ys → orderedInsert r x (ys.erase x) = ys
x : α
hx : x ∈ y :: ys
hxs : (∀ b ∈ ys, r y b) ∧ Sorted r ys
hxy : x ≠ y
⊢ orderedInsert r x ((y :: ys).erase x) = y :: ys

tactic: rw [erase_cons_head]
state_before: case cons.inl
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
ys : List α
ih : ∀ x ∈ ys, Sorted r ys → orderedInsert r x (ys.erase x) = ys
x : α
hx : x ∈ x :: ys
hxs : (∀ b ∈ ys, r x b) ∧ Sorted r ys
⊢ orderedInsert r x ((x :: ys).erase x) = x :: ys
state_after: case cons.inl
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
ys : List α
ih : ∀ x ∈ ys, Sorted r ys → orderedInsert r x (ys.erase x) = ys
x : α
hx : x ∈ x :: ys
hxs : (∀ b ∈ ys, r x b) ∧ Sorted r ys
⊢ orderedInsert r x ys = x :: ys

tactic: cases ys with
| nil => rfl
| cons z zs =>
  rw [orderedInsert, if_pos (hxs.1 _ (.head zs))]
state_before: case cons.inl
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
ys : List α
ih : ∀ x ∈ ys, Sorted r ys → orderedInsert r x (ys.erase x) = ys
x : α
hx : x ∈ x :: ys
hxs : (∀ b ∈ ys, r x b) ∧ Sorted r ys
⊢ orderedInsert r x ys = x :: ys
state_after: no goals

tactic: rfl
state_before: case cons.inl.nil
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
x : α
ih : ∀ x ∈ [], Sorted r [] → orderedInsert r x ([].erase x) = []
hx : x ∈ [x]
hxs : (∀ b ∈ [], r x b) ∧ Sorted r []
⊢ orderedInsert r x [] = [x]
state_after: no goals

tactic: rw [orderedInsert, if_pos (hxs.1 _ (.head zs))]
state_before: case cons.inl.cons
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
x z : α
zs : List α
ih : ∀ x ∈ z :: zs, Sorted r (z :: zs) → orderedInsert r x ((z :: zs).erase x) = z :: zs
hx : x ∈ x :: z :: zs
hxs : (∀ b ∈ z :: zs, r x b) ∧ Sorted r (z :: zs)
⊢ orderedInsert r x (z :: zs) = x :: z :: zs
state_after: no goals

tactic: rw [mem_cons] at hx
state_before: case cons.inr
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
y : α
ys : List α
ih : ∀ x ∈ ys, Sorted r ys → orderedInsert r x (ys.erase x) = ys
x : α
hx : x ∈ y :: ys
hxs : (∀ b ∈ ys, r y b) ∧ Sorted r ys
hxy : x ≠ y
⊢ orderedInsert r x ((y :: ys).erase x) = y :: ys
state_after: case cons.inr
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
y : α
ys : List α
ih : ∀ x ∈ ys, Sorted r ys → orderedInsert r x (ys.erase x) = ys
x : α
hx : x = y ∨ x ∈ ys
hxs : (∀ b ∈ ys, r y b) ∧ Sorted r ys
hxy : x ≠ y
⊢ orderedInsert r x ((y :: ys).erase x) = y :: ys

tactic: replace hx := hx.resolve_left hxy
state_before: case cons.inr
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
y : α
ys : List α
ih : ∀ x ∈ ys, Sorted r ys → orderedInsert r x (ys.erase x) = ys
x : α
hx : x = y ∨ x ∈ ys
hxs : (∀ b ∈ ys, r y b) ∧ Sorted r ys
hxy : x ≠ y
⊢ orderedInsert r x ((y :: ys).erase x) = y :: ys
state_after: case cons.inr
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
y : α
ys : List α
ih : ∀ x ∈ ys, Sorted r ys → orderedInsert r x (ys.erase x) = ys
x : α
hxs : (∀ b ∈ ys, r y b) ∧ Sorted r ys
hxy : x ≠ y
hx : x ∈ ys
⊢ orderedInsert r x ((y :: ys).erase x) = y :: ys

tactic: rw [erase_cons_tail _ (not_beq_of_ne hxy.symm), orderedInsert, ih _ hx hxs.2, if_neg]
state_before: case cons.inr
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
y : α
ys : List α
ih : ∀ x ∈ ys, Sorted r ys → orderedInsert r x (ys.erase x) = ys
x : α
hxs : (∀ b ∈ ys, r y b) ∧ Sorted r ys
hxy : x ≠ y
hx : x ∈ ys
⊢ orderedInsert r x ((y :: ys).erase x) = y :: ys
state_after: case cons.inr.hnc
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
y : α
ys : List α
ih : ∀ x ∈ ys, Sorted r ys → orderedInsert r x (ys.erase x) = ys
x : α
hxs : (∀ b ∈ ys, r y b) ∧ Sorted r ys
hxy : x ≠ y
hx : x ∈ ys
⊢ ¬r x y

tactic: refine mt (fun hrxy => ?_) hxy
state_before: case cons.inr.hnc
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
y : α
ys : List α
ih : ∀ x ∈ ys, Sorted r ys → orderedInsert r x (ys.erase x) = ys
x : α
hxs : (∀ b ∈ ys, r y b) ∧ Sorted r ys
hxy : x ≠ y
hx : x ∈ ys
⊢ ¬r x y
state_after: case cons.inr.hnc
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
y : α
ys : List α
ih : ∀ x ∈ ys, Sorted r ys → orderedInsert r x (ys.erase x) = ys
x : α
hxs : (∀ b ∈ ys, r y b) ∧ Sorted r ys
hxy : x ≠ y
hx : x ∈ ys
hrxy : r x y
⊢ x = y

tactic: exact antisymm hrxy (hxs.1 _ hx)
state_before: case cons.inr.hnc
α : Type u
r : α → α → Prop
inst✝² : DecidableRel r
inst✝¹ : DecidableEq α
inst✝ : IsAntisymm α r
y : α
ys : List α
ih : ∀ x ∈ ys, Sorted r ys → orderedInsert r x (ys.erase x) = ys
x : α
hxs : (∀ b ∈ ys, r y b) ∧ Sorted r ys
hxy : x ≠ y
hx : x ∈ ys
hrxy : r x y
⊢ x = y
state_after: no goals