Theorem: List.Chain'.cons_of_le
File: Mathlib/Data/List/Chain.lean

tactic: simp only [List.chain'_singleton]
state_before: case nil
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b : α
inst✝ : LinearOrder α
a : α
as : List α
ha : Chain' (fun x x_1 => x > x_1) (a :: as)
hm : Chain' (fun x x_1 => x > x_1) []
hmas : [] ≤ as
⊢ Chain' (fun x x_1 => x > x_1) [a]
state_after: no goals

tactic: apply hm.cons
state_before: case cons
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a : α
as : List α
ha : Chain' (fun x x_1 => x > x_1) (a :: as)
b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
hmas : b :: bs ≤ as
⊢ Chain' (fun x x_1 => x > x_1) (a :: b :: bs)
state_after: case cons
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a : α
as : List α
ha : Chain' (fun x x_1 => x > x_1) (a :: as)
b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
hmas : b :: bs ≤ as
⊢ a > b

tactic: simp only [le_iff_lt_or_eq, or_false] at hmas
state_before: case cons.nil
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
ha : Chain' (fun x x_1 => x > x_1) [a]
hmas : b :: bs ≤ []
⊢ a > b
state_after: case cons.nil
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
ha : Chain' (fun x x_1 => x > x_1) [a]
hmas : b :: bs < []
⊢ a > b

tactic: rw [List.chain'_cons] at ha
state_before: case cons.cons
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : Chain' (fun x x_1 => x > x_1) (a :: a' :: as)
hmas : b :: bs ≤ a' :: as
⊢ a > b
state_after: case cons.cons
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : b :: bs ≤ a' :: as
⊢ a > b

tactic: refine gt_of_gt_of_ge ha.1 ?_
state_before: case cons.cons
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : b :: bs ≤ a' :: as
⊢ a > b
state_after: case cons.cons
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : b :: bs ≤ a' :: as
⊢ a' ≥ b

tactic: rw [le_iff_lt_or_eq] at hmas
state_before: case cons.cons
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : b :: bs ≤ a' :: as
⊢ a' ≥ b
state_after: case cons.cons
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : b :: bs < a' :: as ∨ b :: bs = a' :: as
⊢ a' ≥ b

tactic: cases' hmas with hmas hmas
state_before: case cons.cons
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : b :: bs < a' :: as ∨ b :: bs = a' :: as
⊢ a' ≥ b
state_after: case cons.cons.inl
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : b :: bs < a' :: as
⊢ a' ≥ b

case cons.cons.inr
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : b :: bs = a' :: as
⊢ a' ≥ b

tactic: by_contra! hh
state_before: case cons.cons.inl
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : b :: bs < a' :: as
⊢ a' ≥ b
state_after: case cons.cons.inl
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : b :: bs < a' :: as
hh : a' < b
⊢ False

tactic: rw [← not_le] at hmas
state_before: case cons.cons.inl
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : b :: bs < a' :: as
hh : a' < b
⊢ False
state_after: case cons.cons.inl
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : ¬a' :: as ≤ b :: bs
hh : a' < b
⊢ False

tactic: apply hmas
state_before: case cons.cons.inl
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : ¬a' :: as ≤ b :: bs
hh : a' < b
⊢ False
state_after: case cons.cons.inl
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : ¬a' :: as ≤ b :: bs
hh : a' < b
⊢ a' :: as ≤ b :: bs

tactic: apply le_of_lt
state_before: case cons.cons.inl
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : ¬a' :: as ≤ b :: bs
hh : a' < b
⊢ a' :: as ≤ b :: bs
state_after: case cons.cons.inl.a
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : ¬a' :: as ≤ b :: bs
hh : a' < b
⊢ a' :: as < b :: bs

tactic: exact (List.lt_iff_lex_lt _ _).mp (List.lt.head _ _ hh)
state_before: case cons.cons.inl.a
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : ¬a' :: as ≤ b :: bs
hh : a' < b
⊢ a' :: as < b :: bs
state_after: no goals

tactic: simp only [List.cons.injEq] at hmas
state_before: case cons.cons.inr
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : b :: bs = a' :: as
⊢ a' ≥ b
state_after: case cons.cons.inr
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : b = a' ∧ bs = as
⊢ a' ≥ b

tactic: rw [ge_iff_le, le_iff_lt_or_eq]
state_before: case cons.cons.inr
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : b = a' ∧ bs = as
⊢ a' ≥ b
state_after: case cons.cons.inr
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : b = a' ∧ bs = as
⊢ b < a' ∨ b = a'

tactic: exact Or.inr hmas.1
state_before: case cons.cons.inr
α : Type u
β : Type v
R r : α → α → Prop
l l₁ l₂ : List α
a✝ b✝ : α
inst✝ : LinearOrder α
a b : α
bs : List α
hm : Chain' (fun x x_1 => x > x_1) (b :: bs)
a' : α
as : List α
ha : a > a' ∧ Chain' (fun x x_1 => x > x_1) (a' :: as)
hmas : b = a' ∧ bs = as
⊢ b < a' ∨ b = a'
state_after: no goals