Theorem: Batteries.TransCmp.compareOfLessAndEq
File: .lake/packages/batteries/Batteries/Classes/Order.lean

tactic: refine { this with le_trans := fun {x y z} yx zy => ?_ }
state_before: α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
this : OrientedCmp fun x x_1 => compareOfLessAndEq x x_1
⊢ TransCmp fun x x_1 => compareOfLessAndEq x x_1
state_after: α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
this : OrientedCmp fun x x_1 => compareOfLessAndEq x x_1
x y z : α
yx : compareOfLessAndEq x y ≠ Ordering.gt
zy : compareOfLessAndEq y z ≠ Ordering.gt
⊢ compareOfLessAndEq x z ≠ Ordering.gt

tactic: rw [Ne, this.cmp_eq_gt, compareOfLessAndEq_eq_lt] at yx zy ⊢
state_before: α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
this : OrientedCmp fun x x_1 => compareOfLessAndEq x x_1
x y z : α
yx : compareOfLessAndEq x y ≠ Ordering.gt
zy : compareOfLessAndEq y z ≠ Ordering.gt
⊢ compareOfLessAndEq x z ≠ Ordering.gt
state_after: α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
this : OrientedCmp fun x x_1 => compareOfLessAndEq x x_1
x y z : α
yx : ¬y < x
zy : ¬z < y
⊢ ¬z < x

tactic: intro zx
state_before: α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
this : OrientedCmp fun x x_1 => compareOfLessAndEq x x_1
x y z : α
yx : ¬y < x
zy : ¬z < y
⊢ ¬z < x
state_after: α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
this : OrientedCmp fun x x_1 => compareOfLessAndEq x x_1
x y z : α
yx : ¬y < x
zy : ¬z < y
zx : z < x
⊢ False

tactic: if xy : x < y then exact zy (lt_trans zx xy)
else exact zy (lt_antisymm yx xy ▸ zx)
state_before: α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
this : OrientedCmp fun x x_1 => compareOfLessAndEq x x_1
x y z : α
yx : ¬y < x
zy : ¬z < y
zx : z < x
⊢ False
state_after: no goals

tactic: refine { symm := fun x y => ?_ }
state_before: α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
⊢ OrientedCmp fun x x_1 => compareOfLessAndEq x x_1
state_after: α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
⊢ (compareOfLessAndEq x y).swap = compareOfLessAndEq y x

tactic: simp [compareOfLessAndEq]
state_before: α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
⊢ (compareOfLessAndEq x y).swap = compareOfLessAndEq y x
state_after: α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
⊢ (if x < y then Ordering.lt else if x = y then Ordering.eq else Ordering.gt).swap =
    if y < x then Ordering.lt else if y = x then Ordering.eq else Ordering.gt

tactic: split <;> [rename_i xy; split <;> [subst y; rename_i xy ne]]
state_before: α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
⊢ (if x < y then Ordering.lt else if x = y then Ordering.eq else Ordering.gt).swap =
    if y < x then Ordering.lt else if y = x then Ordering.eq else Ordering.gt
state_after: case isTrue
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
xy : x < y
⊢ Ordering.lt.swap = if y < x then Ordering.lt else if y = x then Ordering.eq else Ordering.gt

case isFalse.isTrue
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x : α
h✝ : ¬x < x
⊢ Ordering.eq.swap = if x < x then Ordering.lt else if x = x then Ordering.eq else Ordering.gt

case isFalse.isFalse
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
xy : ¬x < y
ne : ¬x = y
⊢ Ordering.gt.swap = if y < x then Ordering.lt else if y = x then Ordering.eq else Ordering.gt

tactic: rw [if_neg, if_neg]
state_before: case isTrue
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
xy : x < y
⊢ Ordering.lt.swap = if y < x then Ordering.lt else if y = x then Ordering.eq else Ordering.gt
state_after: case isTrue
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
xy : x < y
⊢ Ordering.lt.swap = Ordering.gt

case isTrue.hnc
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
xy : x < y
⊢ ¬y = x

case isTrue.hnc
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
xy : x < y
⊢ ¬y < x

tactic: rfl
state_before: case isTrue
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
xy : x < y
⊢ Ordering.lt.swap = Ordering.gt

case isTrue.hnc
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
xy : x < y
⊢ ¬y = x

case isTrue.hnc
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
xy : x < y
⊢ ¬y < x
state_after: case isTrue.hnc
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
xy : x < y
⊢ ¬y = x

case isTrue.hnc
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
xy : x < y
⊢ ¬y < x

tactic: rintro rfl
state_before: case isTrue.hnc
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
xy : x < y
⊢ ¬y = x
state_after: case isTrue.hnc
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
y : α
xy : y < y
⊢ False

tactic: exact lt_irrefl _ xy
state_before: case isTrue.hnc
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
y : α
xy : y < y
⊢ False
state_after: no goals

tactic: exact fun yx => lt_irrefl _ (lt_trans xy yx)
state_before: case isTrue.hnc
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
xy : x < y
⊢ ¬y < x
state_after: no goals

tactic: rw [if_neg ‹_›, if_pos rfl]
state_before: case isFalse.isTrue
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x : α
h✝ : ¬x < x
⊢ Ordering.eq.swap = if x < x then Ordering.lt else if x = x then Ordering.eq else Ordering.gt
state_after: case isFalse.isTrue
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x : α
h✝ : ¬x < x
⊢ Ordering.eq.swap = Ordering.eq

tactic: rfl
state_before: case isFalse.isTrue
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x : α
h✝ : ¬x < x
⊢ Ordering.eq.swap = Ordering.eq
state_after: no goals

tactic: split <;> [rfl; rename_i yx]
state_before: case isFalse.isFalse
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
xy : ¬x < y
ne : ¬x = y
⊢ Ordering.gt.swap = if y < x then Ordering.lt else if y = x then Ordering.eq else Ordering.gt
state_after: case isFalse.isFalse.isFalse
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
xy : ¬x < y
ne : ¬x = y
yx : ¬y < x
⊢ Ordering.gt.swap = if y = x then Ordering.eq else Ordering.gt

tactic: cases ne (lt_antisymm xy yx)
state_before: case isFalse.isFalse.isFalse
α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
x y : α
xy : ¬x < y
ne : ¬x = y
yx : ¬y < x
⊢ Ordering.gt.swap = if y = x then Ordering.eq else Ordering.gt
state_after: no goals

tactic: exact zy (lt_trans zx xy)
state_before: α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
this : OrientedCmp fun x x_1 => compareOfLessAndEq x x_1
x y z : α
yx : ¬y < x
zy : ¬z < y
zx : z < x
xy : x < y
⊢ False
state_after: no goals

tactic: exact zy (lt_antisymm yx xy ▸ zx)
state_before: α : Type u_1
inst✝² : LT α
inst✝¹ : DecidableRel LT.lt
inst✝ : DecidableEq α
lt_irrefl : ∀ (x : α), ¬x < x
lt_trans : ∀ {x y z : α}, x < y → y < z → x < z
lt_antisymm : ∀ {x y : α}, ¬x < y → ¬y < x → x = y
this : OrientedCmp fun x x_1 => compareOfLessAndEq x x_1
x y z : α
yx : ¬y < x
zy : ¬z < y
zx : z < x
xy : ¬x < y
⊢ False
state_after: no goals