Built with doc-gen4, running Lean4. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓to navigate, Ctrl+πŸ–±οΈto focus. On Mac, use Cmdinstead of Ctrl.
/-
Copyright (c) 2016 Jeremy Avigad. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jeremy Avigad
-/

import Mathlib.Init.Algebra.Order
import Mathlib.Init.Data.Int.Basic

/-! # The order relation on the integers -/

open Nat

namespace Int

#align int.nonneg 
Int.NonNeg: β„€ β†’ Prop
Int.NonNeg
#align int.le
Int.le: β„€ β†’ β„€ β†’ Prop
Int.le
#align int.lt
Int.lt: β„€ β†’ β„€ β†’ Prop
Int.lt
export private
decNonneg: (m : β„€) β†’ Decidable (NonNeg m)
decNonneg
from Init.Data.Int.Basic #align int.decidable_nonneg
Int.decNonneg: (m : β„€) β†’ Decidable (NonNeg m)
Int.decNonneg
#align int.decidable_le
Int.decLe: (a b : β„€) β†’ Decidable (a ≀ b)
Int.decLe
#align int.decidable_lt
Int.decLt: (a b : β„€) β†’ Decidable (a < b)
Int.decLt
theorem
le.elim: βˆ€ {a b : β„€}, a ≀ b β†’ βˆ€ {P : Prop}, (βˆ€ (n : β„•), a + ↑n = b β†’ P) β†’ P
le.elim
{a b :
β„€: Type
β„€
} (
h: a ≀ b
h
: a ≀ b) {
P: Prop
P
:
Prop: Type
Prop
} (
h': βˆ€ (n : β„•), a + ↑n = b β†’ P
h'
: βˆ€ n :
β„•: Type
β„•
, a + ↑n = b β†’
P: Prop
P
) :
P: Prop
P
:=
Exists.elim: βˆ€ {Ξ± : Sort ?u.111} {p : Ξ± β†’ Prop} {b : Prop}, (βˆƒ x, p x) β†’ (βˆ€ (a : Ξ±), p a β†’ b) β†’ b
Exists.elim
(
le.dest: βˆ€ {a b : β„€}, a ≀ b β†’ βˆƒ n, a + ↑n = b
le.dest
h: a ≀ b
h
)
h': βˆ€ (n : β„•), a + ↑n = b β†’ P
h'
#align int.le.elim
Int.le.elim: βˆ€ {a b : β„€}, a ≀ b β†’ βˆ€ {P : Prop}, (βˆ€ (n : β„•), a + ↑n = b β†’ P) β†’ P
Int.le.elim
alias
ofNat_le: βˆ€ {m n : β„•}, ↑m ≀ ↑n ↔ m ≀ n
ofNat_le
↔
le_of_ofNat_le_ofNat: βˆ€ {m n : β„•}, ↑m ≀ ↑n β†’ m ≀ n
le_of_ofNat_le_ofNat
ofNat_le_ofNat_of_le: βˆ€ {m n : β„•}, m ≀ n β†’ ↑m ≀ ↑n
ofNat_le_ofNat_of_le
#align int.coe_nat_le_coe_nat_of_le
Int.ofNat_le_ofNat_of_le: βˆ€ {m n : β„•}, m ≀ n β†’ ↑m ≀ ↑n
Int.ofNat_le_ofNat_of_le
#align int.le_of_coe_nat_le_coe_nat
Int.le_of_ofNat_le_ofNat: βˆ€ {m n : β„•}, ↑m ≀ ↑n β†’ m ≀ n
Int.le_of_ofNat_le_ofNat
#align int.coe_nat_le_coe_nat_iff
Int.ofNat_le: βˆ€ {m n : β„•}, ↑m ≀ ↑n ↔ m ≀ n
Int.ofNat_le
#align int.coe_zero_le
Int.ofNat_zero_le: βˆ€ (n : β„•), 0 ≀ ↑n
Int.ofNat_zero_le
#align int.eq_coe_of_zero_le
Int.eq_ofNat_of_zero_le: βˆ€ {a : β„€}, 0 ≀ a β†’ βˆƒ n, a = ↑n
Int.eq_ofNat_of_zero_le
theorem
lt.elim: βˆ€ {a b : β„€}, a < b β†’ βˆ€ {P : Prop}, (βˆ€ (n : β„•), a + ↑(succ n) = b β†’ P) β†’ P
lt.elim
{a b :
β„€: Type
β„€
} (
h: a < b
h
: a < b) {
P: Prop
P
:
Prop: Type
Prop
} (
h': βˆ€ (n : β„•), a + ↑(succ n) = b β†’ P
h'
: βˆ€ n :
β„•: Type
β„•
, a + ↑(
Nat.succ: β„• β†’ β„•
Nat.succ
n) = b β†’
P: Prop
P
) :
P: Prop
P
:=
Exists.elim: βˆ€ {Ξ± : Sort ?u.253} {p : Ξ± β†’ Prop} {b : Prop}, (βˆƒ x, p x) β†’ (βˆ€ (a : Ξ±), p a β†’ b) β†’ b
Exists.elim
(
lt.dest: βˆ€ {a b : β„€}, a < b β†’ βˆƒ n, a + ↑(succ n) = b
lt.dest
h: a < b
h
)
h': βˆ€ (n : β„•), a + ↑(succ n) = b β†’ P
h'
#align int.lt.elim
Int.lt.elim: βˆ€ {a b : β„€}, a < b β†’ βˆ€ {P : Prop}, (βˆ€ (n : β„•), a + ↑(succ n) = b β†’ P) β†’ P
Int.lt.elim
alias
ofNat_lt: βˆ€ {n m : β„•}, ↑n < ↑m ↔ n < m
ofNat_lt
↔
lt_of_ofNat_lt_ofNat: βˆ€ {n m : β„•}, ↑n < ↑m β†’ n < m
lt_of_ofNat_lt_ofNat
ofNat_lt_ofNat_of_lt: βˆ€ {n m : β„•}, n < m β†’ ↑n < ↑m
ofNat_lt_ofNat_of_lt
#align int.coe_nat_lt_coe_nat_iff
Int.ofNat_lt: βˆ€ {n m : β„•}, ↑n < ↑m ↔ n < m
Int.ofNat_lt
#align int.lt_of_coe_nat_lt_coe_nat
Int.lt_of_ofNat_lt_ofNat: βˆ€ {n m : β„•}, ↑n < ↑m β†’ n < m
Int.lt_of_ofNat_lt_ofNat
#align int.coe_nat_lt_coe_nat_of_lt
Int.ofNat_lt_ofNat_of_lt: βˆ€ {n m : β„•}, n < m β†’ ↑n < ↑m
Int.ofNat_lt_ofNat_of_lt
instance :
LinearOrder: Type ?u.295 β†’ Type ?u.295
LinearOrder
β„€: Type
β„€
where le :=
(·≀·): β„€ β†’ β„€ β†’ Prop
(·≀·)
le_refl :=
Int.le_refl: βˆ€ (a : β„€), a ≀ a
Int.le_refl
le_trans := @
Int.le_trans: βˆ€ {a b c : β„€}, a ≀ b β†’ b ≀ c β†’ a ≀ c
Int.le_trans
le_antisymm := @
Int.le_antisymm: βˆ€ {a b : β„€}, a ≀ b β†’ b ≀ a β†’ a = b
Int.le_antisymm
lt :=
(Β·<Β·): β„€ β†’ β„€ β†’ Prop
(Β·<Β·)
lt_iff_le_not_le := @
Int.lt_iff_le_not_le: βˆ€ {a b : β„€}, a < b ↔ a ≀ b ∧ Β¬b ≀ a
Int.lt_iff_le_not_le
le_total :=
Int.le_total: βˆ€ (a b : β„€), a ≀ b ∨ b ≀ a
Int.le_total
decidableEq :=

Goals accomplished! πŸ™

Goals accomplished! πŸ™
decidableLE :=

Goals accomplished! πŸ™

DecidableRel fun x x_1 => x ≀ x_1

Goals accomplished! πŸ™
decidableLT :=

Goals accomplished! πŸ™

DecidableRel fun x x_1 => x < x_1

Goals accomplished! πŸ™
#align int.eq_nat_abs_of_zero_le
Int.eq_natAbs_of_zero_le: βˆ€ {a : β„€}, 0 ≀ a β†’ a = ↑(natAbs a)
Int.eq_natAbs_of_zero_le
#align int.le_nat_abs
Int.le_natAbs: βˆ€ {a : β„€}, a ≀ ↑(natAbs a)
Int.le_natAbs
#align int.neg_succ_lt_zero
Int.negSucc_lt_zero: βˆ€ (n : β„•), -[n+1] < 0
Int.negSucc_lt_zero
#align int.eq_neg_succ_of_lt_zero
Int.eq_negSucc_of_lt_zero: βˆ€ {a : β„€}, a < 0 β†’ βˆƒ n, a = -[n+1]
Int.eq_negSucc_of_lt_zero
#align int.sub_eq_zero_iff_eq
Int.sub_eq_zero: βˆ€ {a b : β„€}, a - b = 0 ↔ a = b
Int.sub_eq_zero
theorem
neg_mul_eq_neg_mul_symm: βˆ€ (a b : β„€), -a * b = -(a * b)
neg_mul_eq_neg_mul_symm
(a b :
β„€: Type
β„€
) : -a * b = -(a * b) := (
Int.neg_mul_eq_neg_mul: βˆ€ (a b : β„€), -(a * b) = -a * b
Int.neg_mul_eq_neg_mul
a b).
symm: βˆ€ {Ξ± : Sort ?u.1054} {a b : Ξ±}, a = b β†’ b = a
symm
#align int.neg_mul_eq_neg_mul_symm
Int.neg_mul_eq_neg_mul_symm: βˆ€ (a b : β„€), -a * b = -(a * b)
Int.neg_mul_eq_neg_mul_symm
theorem
mul_neg_eq_neg_mul_symm: βˆ€ (a b : β„€), a * -b = -(a * b)
mul_neg_eq_neg_mul_symm
(a b :
β„€: Type
β„€
) : a * -b = -(a * b) := (
Int.neg_mul_eq_mul_neg: βˆ€ (a b : β„€), -(a * b) = a * -b
Int.neg_mul_eq_mul_neg
a b).
symm: βˆ€ {Ξ± : Sort ?u.1140} {a b : Ξ±}, a = b β†’ b = a
symm
#align int.mul_neg_eq_neg_mul_symm
Int.mul_neg_eq_neg_mul_symm: βˆ€ (a b : β„€), a * -b = -(a * b)
Int.mul_neg_eq_neg_mul_symm
#align int.of_nat_nonneg
Int.ofNat_nonneg: βˆ€ (n : β„•), 0 ≀ ↑n
Int.ofNat_nonneg
#align int.coe_succ_pos
Int.ofNat_succ_pos: βˆ€ (n : β„•), 0 < ↑(succ n)
Int.ofNat_succ_pos
#align int.exists_eq_neg_of_nat
Int.exists_eq_neg_ofNat: βˆ€ {a : β„€}, a ≀ 0 β†’ βˆƒ n, a = -↑n
Int.exists_eq_neg_ofNat
#align int.nat_abs_of_nonneg
Int.natAbs_of_nonneg: βˆ€ {a : β„€}, 0 ≀ a β†’ ↑(natAbs a) = a
Int.natAbs_of_nonneg
#align int.of_nat_nat_abs_of_nonpos
Int.ofNat_natAbs_of_nonpos: βˆ€ {a : β„€}, a ≀ 0 β†’ ↑(natAbs a) = -a
Int.ofNat_natAbs_of_nonpos
protected theorem
eq_zero_or_eq_zero_of_mul_eq_zero: βˆ€ {a b : β„€}, a * b = 0 β†’ a = 0 ∨ b = 0
eq_zero_or_eq_zero_of_mul_eq_zero
{a b :
β„€: Type
β„€
} (
h: a * b = 0
h
: a * b =
0: ?m.1163
0
) : a =
0: ?m.1219
0
∨ b =
0: ?m.1235
0
:= match
lt_trichotomy: βˆ€ {Ξ± : Type ?u.1253} [inst : LinearOrder Ξ±] (a b : Ξ±), a < b ∨ a = b ∨ b < a
lt_trichotomy
0: ?m.1257
0
a with |
Or.inl: βˆ€ {a b : Prop}, a β†’ a ∨ b
Or.inl
hlt₁: 0 < a
hlt₁
=> match
lt_trichotomy: βˆ€ {Ξ± : Type ?u.1286} [inst : LinearOrder Ξ±] (a b : Ξ±), a < b ∨ a = b ∨ b < a
lt_trichotomy
0: ?m.1290
0
b with |
Or.inl: βˆ€ {a b : Prop}, a β†’ a ∨ b
Or.inl
hltβ‚‚: 0 < b
hltβ‚‚
=>

Goals accomplished! πŸ™
a, b: β„€

h: a * b = 0

hlt₁: 0 < a

hltβ‚‚: 0 < b


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hlt₁: 0 < a

hltβ‚‚: 0 < b

this: 0 < a * b


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hlt₁: 0 < a

hltβ‚‚: 0 < b


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hlt₁: 0 < a

hltβ‚‚: 0 < b

this: 0 < a * b


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hlt₁: 0 < a

hltβ‚‚: 0 < b

this: 0 < 0


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hlt₁: 0 < a

hltβ‚‚: 0 < b

this: 0 < 0


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hlt₁: 0 < a

hltβ‚‚: 0 < b

this: 0 < 0


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hlt₁: 0 < a

hltβ‚‚: 0 < b


a = 0 ∨ b = 0

Goals accomplished! πŸ™
|
Or.inr: βˆ€ {a b : Prop}, b β†’ a ∨ b
Or.inr
(
Or.inl: βˆ€ {a b : Prop}, a β†’ a ∨ b
Or.inl
heqβ‚‚: 0 = b
heqβ‚‚
) =>
Or.inr: βˆ€ {a b : Prop}, b β†’ a ∨ b
Or.inr
heqβ‚‚: 0 = b
heqβ‚‚
.
symm: βˆ€ {Ξ± : Sort ?u.1338} {a b : Ξ±}, a = b β†’ b = a
symm
|
Or.inr: βˆ€ {a b : Prop}, b β†’ a ∨ b
Or.inr
(
Or.inr: βˆ€ {a b : Prop}, b β†’ a ∨ b
Or.inr
hgtβ‚‚: b < 0
hgtβ‚‚
) =>

Goals accomplished! πŸ™
a, b: β„€

h: a * b = 0

hlt₁: 0 < a

hgtβ‚‚: b < 0


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hlt₁: 0 < a

hgtβ‚‚: b < 0

this: 0 > a * b


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hlt₁: 0 < a

hgtβ‚‚: b < 0


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hlt₁: 0 < a

hgtβ‚‚: b < 0

this: 0 > a * b


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hlt₁: 0 < a

hgtβ‚‚: b < 0

this: 0 > 0


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hlt₁: 0 < a

hgtβ‚‚: b < 0

this: 0 > 0


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hlt₁: 0 < a

hgtβ‚‚: b < 0

this: 0 > 0


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hlt₁: 0 < a

hgtβ‚‚: b < 0


a = 0 ∨ b = 0

Goals accomplished! πŸ™
|
Or.inr: βˆ€ {a b : Prop}, b β†’ a ∨ b
Or.inr
(
Or.inl: βˆ€ {a b : Prop}, a β†’ a ∨ b
Or.inl
heq₁: 0 = a
heq₁
) =>
Or.inl: βˆ€ {a b : Prop}, a β†’ a ∨ b
Or.inl
heq₁: 0 = a
heq₁
.
symm: βˆ€ {Ξ± : Sort ?u.1502} {a b : Ξ±}, a = b β†’ b = a
symm
|
Or.inr: βˆ€ {a b : Prop}, b β†’ a ∨ b
Or.inr
(
Or.inr: βˆ€ {a b : Prop}, b β†’ a ∨ b
Or.inr
hgt₁: a < 0
hgt₁
) => match
lt_trichotomy: βˆ€ {Ξ± : Type ?u.1532} [inst : LinearOrder Ξ±] (a b : Ξ±), a < b ∨ a = b ∨ b < a
lt_trichotomy
0: ?m.1536
0
b with |
Or.inl: βˆ€ {a b : Prop}, a β†’ a ∨ b
Or.inl
hltβ‚‚: 0 < b
hltβ‚‚
=>

Goals accomplished! πŸ™
a, b: β„€

h: a * b = 0

hgt₁: a < 0

hltβ‚‚: 0 < b


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hgt₁: a < 0

hltβ‚‚: 0 < b

this: 0 > a * b


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hgt₁: a < 0

hltβ‚‚: 0 < b


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hgt₁: a < 0

hltβ‚‚: 0 < b

this: 0 > a * b


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hgt₁: a < 0

hltβ‚‚: 0 < b

this: 0 > 0


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hgt₁: a < 0

hltβ‚‚: 0 < b

this: 0 > 0


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hgt₁: a < 0

hltβ‚‚: 0 < b

this: 0 > 0


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hgt₁: a < 0

hltβ‚‚: 0 < b


a = 0 ∨ b = 0

Goals accomplished! πŸ™
|
Or.inr: βˆ€ {a b : Prop}, b β†’ a ∨ b
Or.inr
(
Or.inl: βˆ€ {a b : Prop}, a β†’ a ∨ b
Or.inl
heqβ‚‚: 0 = b
heqβ‚‚
) =>
Or.inr: βˆ€ {a b : Prop}, b β†’ a ∨ b
Or.inr
heqβ‚‚: 0 = b
heqβ‚‚
.
symm: βˆ€ {Ξ± : Sort ?u.1586} {a b : Ξ±}, a = b β†’ b = a
symm
|
Or.inr: βˆ€ {a b : Prop}, b β†’ a ∨ b
Or.inr
(
Or.inr: βˆ€ {a b : Prop}, b β†’ a ∨ b
Or.inr
hgtβ‚‚: b < 0
hgtβ‚‚
) =>

Goals accomplished! πŸ™
a, b: β„€

h: a * b = 0

hgt₁: a < 0

hgtβ‚‚: b < 0


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hgt₁: a < 0

hgtβ‚‚: b < 0

this: 0 < a * b


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hgt₁: a < 0

hgtβ‚‚: b < 0


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hgt₁: a < 0

hgtβ‚‚: b < 0

this: 0 < a * b


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hgt₁: a < 0

hgtβ‚‚: b < 0

this: 0 < 0


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hgt₁: a < 0

hgtβ‚‚: b < 0

this: 0 < 0


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hgt₁: a < 0

hgtβ‚‚: b < 0

this: 0 < 0


a = 0 ∨ b = 0
a, b: β„€

h: a * b = 0

hgt₁: a < 0

hgtβ‚‚: b < 0


a = 0 ∨ b = 0

Goals accomplished! πŸ™
#align int.eq_zero_or_eq_zero_of_mul_eq_zero
Int.eq_zero_or_eq_zero_of_mul_eq_zero: βˆ€ {a b : β„€}, a * b = 0 β†’ a = 0 ∨ b = 0
Int.eq_zero_or_eq_zero_of_mul_eq_zero