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) 2014 Floris van Doorn (c) 2016 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Floris van Doorn, Leonardo de Moura, Jeremy Avigad, Mario Carneiro

! This file was ported from Lean 3 source module data.nat.basic
! leanprover-community/mathlib commit bd835ef554f37ef9b804f0903089211f89cb370b
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Order.Basic
import Mathlib.Algebra.GroupWithZero.Basic
import Mathlib.Algebra.Ring.Defs

/-!
# Basic operations on the natural numbers

This file contains:
- instances on the natural numbers
- some basic lemmas about natural numbers
- extra recursors:
  * `le_rec_on`, `le_induction`: recursion and induction principles starting at non-zero numbers
  * `decreasing_induction`: recursion growing downwards
  * `le_rec_on'`, `decreasing_induction'`: versions with slightly weaker assumptions
  * `strong_rec'`: recursion based on strong inequalities
- decidability instances on predicates about the natural numbers

Many theorems that used to live in this file have been moved to `Data.Nat.Order`,
so that this file requires fewer imports.
For each section here there is a corresponding section in that file with additional results.
It may be possible to move some of these results here, by tweaking their proofs.


-/


universe u v

namespace Nat

/-! ### instances -/

instance 
nontrivial: Nontrivial โ„•
nontrivial
:
Nontrivial: Type ?u.2 โ†’ Prop
Nontrivial
โ„•: Type
โ„•
:= โŸจโŸจ
0: ?m.22
0
,
1: ?m.42
1
,
Nat.zero_ne_one: 0 โ‰  1
Nat.zero_ne_one
โŸฉโŸฉ instance
commSemiring: CommSemiring โ„•
commSemiring
:
CommSemiring: Type ?u.55 โ†’ Type ?u.55
CommSemiring
โ„•: Type
โ„•
where add :=
Nat.add: โ„• โ†’ โ„• โ†’ โ„•
Nat.add
add_assoc :=
Nat.add_assoc: โˆ€ (n m k : โ„•), n + m + k = n + (m + k)
Nat.add_assoc
zero :=
Nat.zero: โ„•
Nat.zero
zero_add :=
Nat.zero_add: โˆ€ (n : โ„•), 0 + n = n
Nat.zero_add
add_zero :=
Nat.add_zero: โˆ€ (n : โ„•), n + 0 = n
Nat.add_zero
add_comm :=
Nat.add_comm: โˆ€ (n m : โ„•), n + m = m + n
Nat.add_comm
mul :=
Nat.mul: โ„• โ†’ โ„• โ†’ โ„•
Nat.mul
mul_assoc :=
Nat.mul_assoc: โˆ€ (n m k : โ„•), n * m * k = n * (m * k)
Nat.mul_assoc
one :=
Nat.succ: โ„• โ†’ โ„•
Nat.succ
Nat.zero: โ„•
Nat.zero
one_mul :=
Nat.one_mul: โˆ€ (n : โ„•), 1 * n = n
Nat.one_mul
mul_one :=
Nat.mul_one: โˆ€ (n : โ„•), n * 1 = n
Nat.mul_one
left_distrib :=
Nat.left_distrib: โˆ€ (n m k : โ„•), n * (m + k) = n * m + n * k
Nat.left_distrib
right_distrib :=
Nat.right_distrib: โˆ€ (n m k : โ„•), (n + m) * k = n * k + m * k
Nat.right_distrib
zero_mul :=
Nat.zero_mul: โˆ€ (n : โ„•), 0 * n = 0
Nat.zero_mul
mul_zero :=
Nat.mul_zero: โˆ€ (n : โ„•), n * 0 = 0
Nat.mul_zero
mul_comm :=
Nat.mul_comm: โˆ€ (n m : โ„•), n * m = m * n
Nat.mul_comm
natCast
n: ?m.275
n
:=
n: ?m.275
n
natCast_zero :=
rfl: โˆ€ {ฮฑ : Sort ?u.279} {a : ฮฑ}, a = a
rfl
natCast_succ
n: ?m.283
n
:=
rfl: โˆ€ {ฮฑ : Sort ?u.285} {a : ฮฑ}, a = a
rfl
nsmul
m: ?m.111
m
n: ?m.114
n
:=
m: ?m.111
m
*
n: ?m.114
n
nsmul_zero :=
Nat.zero_mul: โˆ€ (n : โ„•), 0 * n = 0
Nat.zero_mul
nsmul_succ
_: ?m.172
_
_: ?m.175
_
:=

Goals accomplished! ๐Ÿ™
xโœยน, xโœ: โ„•


(fun m n => m * n) (xโœยน + 1) xโœ = xโœ + (fun m n => m * n) xโœยน xโœ
xโœยน, xโœ: โ„•


(xโœยน + 1) * xโœ = xโœ + xโœยน * xโœ
xโœยน, xโœ: โ„•


(xโœยน + 1) * xโœ = xโœ + xโœยน * xโœ
xโœยน, xโœ: โ„•


(fun m n => m * n) (xโœยน + 1) xโœ = xโœ + (fun m n => m * n) xโœยน xโœ
xโœยน, xโœ: โ„•


(xโœยน + 1) * xโœ = xโœ + xโœยน * xโœ
xโœยน, xโœ: โ„•


(1 + xโœยน) * xโœ = xโœ + xโœยน * xโœ
xโœยน, xโœ: โ„•


(xโœยน + 1) * xโœ = xโœ + xโœยน * xโœ
xโœยน, xโœ: โ„•


1 * xโœ + xโœยน * xโœ = xโœ + xโœยน * xโœ
xโœยน, xโœ: โ„•


(xโœยน + 1) * xโœ = xโœ + xโœยน * xโœ
xโœยน, xโœ: โ„•


xโœ + xโœยน * xโœ = xโœ + xโœยน * xโœ

Goals accomplished! ๐Ÿ™
npow
m: ?m.293
m
n: ?m.296
n
:=
n: ?m.296
n
^
m: ?m.293
m
npow_zero :=
Nat.pow_zero: โˆ€ (n : โ„•), n ^ 0 = 1
Nat.pow_zero
npow_succ
_: ?m.350
_
_: ?m.353
_
:=
Nat.pow_succ': โˆ€ {m n : โ„•}, m ^ succ n = m * m ^ n
Nat.pow_succ'
/-! Extra instances to short-circuit type class resolution and ensure computability -/ instance
addCommMonoid: AddCommMonoid โ„•
addCommMonoid
:
AddCommMonoid: Type ?u.892 โ†’ Type ?u.892
AddCommMonoid
โ„•: Type
โ„•
:=
inferInstance: {ฮฑ : Sort ?u.894} โ†’ [i : ฮฑ] โ†’ ฮฑ
inferInstance
instance
addMonoid: AddMonoid โ„•
addMonoid
:
AddMonoid: Type ?u.1154 โ†’ Type ?u.1154
AddMonoid
โ„•: Type
โ„•
:=
inferInstance: {ฮฑ : Sort ?u.1156} โ†’ [i : ฮฑ] โ†’ ฮฑ
inferInstance
instance
monoid: Monoid โ„•
monoid
:
Monoid: Type ?u.1406 โ†’ Type ?u.1406
Monoid
โ„•: Type
โ„•
:=
inferInstance: {ฮฑ : Sort ?u.1408} โ†’ [i : ฮฑ] โ†’ ฮฑ
inferInstance
instance
commMonoid: CommMonoid โ„•
commMonoid
:
CommMonoid: Type ?u.1586 โ†’ Type ?u.1586
CommMonoid
โ„•: Type
โ„•
:=
inferInstance: {ฮฑ : Sort ?u.1588} โ†’ [i : ฮฑ] โ†’ ฮฑ
inferInstance
instance
commSemigroup: CommSemigroup โ„•
commSemigroup
:
CommSemigroup: Type ?u.1721 โ†’ Type ?u.1721
CommSemigroup
โ„•: Type
โ„•
:=
inferInstance: {ฮฑ : Sort ?u.1723} โ†’ [i : ฮฑ] โ†’ ฮฑ
inferInstance
instance
semigroup: Semigroup โ„•
semigroup
:
Semigroup: Type ?u.1890 โ†’ Type ?u.1890
Semigroup
โ„•: Type
โ„•
:=
inferInstance: {ฮฑ : Sort ?u.1892} โ†’ [i : ฮฑ] โ†’ ฮฑ
inferInstance
instance
addCommSemigroup: AddCommSemigroup โ„•
addCommSemigroup
:
AddCommSemigroup: Type ?u.2056 โ†’ Type ?u.2056
AddCommSemigroup
โ„•: Type
โ„•
:=
inferInstance: {ฮฑ : Sort ?u.2058} โ†’ [i : ฮฑ] โ†’ ฮฑ
inferInstance
instance
addSemigroup: AddSemigroup โ„•
addSemigroup
:
AddSemigroup: Type ?u.2156 โ†’ Type ?u.2156
AddSemigroup
โ„•: Type
โ„•
:=
inferInstance: {ฮฑ : Sort ?u.2158} โ†’ [i : ฮฑ] โ†’ ฮฑ
inferInstance
instance
distrib: Distrib โ„•
distrib
:
Distrib: Type ?u.2244 โ†’ Type ?u.2244
Distrib
โ„•: Type
โ„•
:=
inferInstance: {ฮฑ : Sort ?u.2246} โ†’ [i : ฮฑ] โ†’ ฮฑ
inferInstance
instance
semiring: Semiring โ„•
semiring
:
Semiring: Type ?u.2414 โ†’ Type ?u.2414
Semiring
โ„•: Type
โ„•
:=
inferInstance: {ฮฑ : Sort ?u.2416} โ†’ [i : ฮฑ] โ†’ ฮฑ
inferInstance
protected theorem
nsmul_eq_mul: โˆ€ (m n : โ„•), m โ€ข n = m * n
nsmul_eq_mul
(m n :
โ„•: Type
โ„•
) : m โ€ข n = m * n :=
rfl: โˆ€ {ฮฑ : Sort ?u.2602} {a : ฮฑ}, a = a
rfl
#align nat.nsmul_eq_mul
Nat.nsmul_eq_mul: โˆ€ (m n : โ„•), m โ€ข n = m * n
Nat.nsmul_eq_mul
-- Moved to core #align nat.eq_of_mul_eq_mul_right
Nat.eq_of_mul_eq_mul_right: โˆ€ {n m k : โ„•}, 0 < m โ†’ n * m = k * m โ†’ n = k
Nat.eq_of_mul_eq_mul_right
instance
cancelCommMonoidWithZero: CancelCommMonoidWithZero โ„•
cancelCommMonoidWithZero
:
CancelCommMonoidWithZero: Type ?u.2611 โ†’ Type ?u.2611
CancelCommMonoidWithZero
โ„•: Type
โ„•
:= { (
inferInstance: {ฮฑ : Sort ?u.2617} โ†’ [i : ฮฑ] โ†’ ฮฑ
inferInstance
:
CommMonoidWithZero: Type ?u.2616 โ†’ Type ?u.2616
CommMonoidWithZero
โ„•: Type
โ„•
) with mul_left_cancel_of_ne_zero := fun
h1: ?m.2697
h1
h2: ?m.2700
h2
=>
Nat.eq_of_mul_eq_mul_left: โˆ€ {m k n : โ„•}, 0 < n โ†’ n * m = n * k โ†’ m = k
Nat.eq_of_mul_eq_mul_left
(
Nat.pos_of_ne_zero: โˆ€ {n : โ„•}, n โ‰  0 โ†’ 0 < n
Nat.pos_of_ne_zero
h1: ?m.2697
h1
)
h2: ?m.2700
h2
} #align nat.cancel_comm_monoid_with_zero
Nat.cancelCommMonoidWithZero: CancelCommMonoidWithZero โ„•
Nat.cancelCommMonoidWithZero
attribute [simp]
Nat.not_lt_zero: โˆ€ (n : โ„•), ยฌn < 0
Nat.not_lt_zero
Nat.succ_ne_zero: โˆ€ (n : โ„•), succ n โ‰  0
Nat.succ_ne_zero
Nat.succ_ne_self: โˆ€ (n : โ„•), succ n โ‰  n
Nat.succ_ne_self
Nat.zero_ne_one: 0 โ‰  1
Nat.zero_ne_one
Nat.one_ne_zero: 1 โ‰  0
Nat.one_ne_zero
-- Nat.zero_ne_bit1 Nat.bit1_ne_zero Nat.bit0_ne_one Nat.one_ne_bit0 Nat.bit0_ne_bit1 -- Nat.bit1_ne_bit0 variable {m n k :
โ„•: Type
โ„•
} /-! ### Recursion and `forall`/`exists` -/ -- Porting note: -- this doesn't work as a simp lemma in Lean 4 -- @[simp] theorem
and_forall_succ: โˆ€ {p : โ„• โ†’ Prop}, (p 0 โˆง โˆ€ (n : โ„•), p (n + 1)) โ†” โˆ€ (n : โ„•), p n
and_forall_succ
{
p: โ„• โ†’ Prop
p
:
โ„•: Type
โ„•
โ†’
Prop: Type
Prop
} : (
p: โ„• โ†’ Prop
p
0: ?m.2960
0
โˆง โˆ€
n: ?m.2971
n
,
p: โ„• โ†’ Prop
p
(
n: ?m.2971
n
+
1: ?m.2978
1
)) โ†” โˆ€
n: ?m.3033
n
,
p: โ„• โ†’ Prop
p
n: ?m.3033
n
:= โŸจfun
h: ?m.3055
h
n: ?m.3058
n
=>
Nat.casesOn: โˆ€ {motive : โ„• โ†’ Sort ?u.3060} (t : โ„•), motive zero โ†’ (โˆ€ (n : โ„•), motive (succ n)) โ†’ motive t
Nat.casesOn
n: ?m.3058
n
h: ?m.3055
h
.
1: โˆ€ {a b : Prop}, a โˆง b โ†’ a
1
h: ?m.3055
h
.
2: โˆ€ {a b : Prop}, a โˆง b โ†’ b
2
, fun
h: ?m.3086
h
=> โŸจ
h: ?m.3086
h
_, fun
_: ?m.3100
_
=>
h: ?m.3086
h
_โŸฉโŸฉ #align nat.and_forall_succ
Nat.and_forall_succ: โˆ€ {p : โ„• โ†’ Prop}, (p 0 โˆง โˆ€ (n : โ„•), p (n + 1)) โ†” โˆ€ (n : โ„•), p n
Nat.and_forall_succ
-- Porting note: -- this doesn't work as a simp lemma in Lean 4 -- @[simp] theorem
or_exists_succ: โˆ€ {p : โ„• โ†’ Prop}, (p 0 โˆจ โˆƒ n, p (n + 1)) โ†” โˆƒ n, p n
or_exists_succ
{
p: โ„• โ†’ Prop
p
:
โ„•: Type
โ„•
โ†’
Prop: Type
Prop
} : (
p: โ„• โ†’ Prop
p
0: ?m.3136
0
โˆจ โˆƒ
n: ?m.3149
n
,
p: โ„• โ†’ Prop
p
(
n: ?m.3149
n
+
1: ?m.3155
1
)) โ†” โˆƒ
n: ?m.3213
n
,
p: โ„• โ†’ Prop
p
n: ?m.3213
n
:= โŸจfun
h: ?m.3234
h
=>
h: ?m.3234
h
.
elim: โˆ€ {a b c : Prop}, a โˆจ b โ†’ (a โ†’ c) โ†’ (b โ†’ c) โ†’ c
elim
(fun
h0: ?m.3248
h0
=> โŸจ
0: ?m.3263
0
,
h0: ?m.3248
h0
โŸฉ) fun โŸจn,
hn: p (n + 1)
hn
โŸฉ => โŸจn +
1: ?m.3310
1
,
hn: p (n + 1)
hn
โŸฉ,

Goals accomplished! ๐Ÿ™
m, n, k: โ„•

p: โ„• โ†’ Prop


(โˆƒ n, p n) โ†’ p 0 โˆจ โˆƒ n, p (n + 1)
m, n, k: โ„•

p: โ„• โ†’ Prop

hn: p zero


intro.zero
p 0 โˆจ โˆƒ n, p (n + 1)
m, nโœ, k: โ„•

p: โ„• โ†’ Prop

n: โ„•

hn: p (succ n)


intro.succ
p 0 โˆจ โˆƒ n, p (n + 1)
m, n, k: โ„•

p: โ„• โ†’ Prop


(โˆƒ n, p n) โ†’ p 0 โˆจ โˆƒ n, p (n + 1)

Goals accomplished! ๐Ÿ™
โŸฉ #align nat.or_exists_succ
Nat.or_exists_succ: โˆ€ {p : โ„• โ†’ Prop}, (p 0 โˆจ โˆƒ n, p (n + 1)) โ†” โˆƒ n, p n
Nat.or_exists_succ
/-! ### `succ` -/ theorem
_root_.LT.lt.nat_succ_le: โˆ€ {n m : โ„•}, n < m โ†’ succ n โ‰ค m
_root_.LT.lt.nat_succ_le
{n m :
โ„•: Type
โ„•
} (
h: n < m
h
: n < m) :
succ: โ„• โ†’ โ„•
succ
n โ‰ค m :=
succ_le_of_lt: โˆ€ {n m : โ„•}, n < m โ†’ succ n โ‰ค m
succ_le_of_lt
h: n < m
h
#align has_lt.lt.nat_succ_le
LT.lt.nat_succ_le: โˆ€ {n m : โ„•}, n < m โ†’ succ n โ‰ค m
LT.lt.nat_succ_le
-- Moved to Std #align nat.succ_eq_one_add
Nat.succ_eq_one_add: โˆ€ (n : โ„•), succ n = 1 + n
Nat.succ_eq_one_add
theorem
eq_of_lt_succ_of_not_lt: โˆ€ {a b : โ„•}, a < b + 1 โ†’ ยฌa < b โ†’ a = b
eq_of_lt_succ_of_not_lt
{a b :
โ„•: Type
โ„•
} (
h1: a < b + 1
h1
: a < b +
1: ?m.3569
1
) (
h2: ยฌa < b
h2
: ยฌa < b) : a = b := have
h3: a โ‰ค b
h3
: a โ‰ค b :=
le_of_lt_succ: โˆ€ {m n : โ„•}, m < succ n โ†’ m โ‰ค n
le_of_lt_succ
h1: a < b + 1
h1
Or.elim: โˆ€ {a b c : Prop}, a โˆจ b โ†’ (a โ†’ c) โ†’ (b โ†’ c) โ†’ c
Or.elim
(
eq_or_lt_of_not_lt: โˆ€ {ฮฑ : Type ?u.3667} [inst : LinearOrder ฮฑ] {a b : ฮฑ}, ยฌa < b โ†’ a = b โˆจ b < a
eq_or_lt_of_not_lt
h2: ยฌa < b
h2
) (fun
h: ?m.3690
h
=>
h: ?m.3690
h
) fun
h: ?m.3695
h
=>
absurd: โˆ€ {a : Prop} {b : Sort ?u.3697}, a โ†’ ยฌa โ†’ b
absurd
h: ?m.3695
h
(
not_lt_of_ge: โˆ€ {ฮฑ : Type ?u.3700} [inst : Preorder ฮฑ] {a b : ฮฑ}, a โ‰ฅ b โ†’ ยฌa < b
not_lt_of_ge
h3: a โ‰ค b
h3
) #align nat.eq_of_lt_succ_of_not_lt
Nat.eq_of_lt_succ_of_not_lt: โˆ€ {a b : โ„•}, a < b + 1 โ†’ ยฌa < b โ†’ a = b
Nat.eq_of_lt_succ_of_not_lt
theorem
eq_of_le_of_lt_succ: โˆ€ {n m : โ„•}, n โ‰ค m โ†’ m < n + 1 โ†’ m = n
eq_of_le_of_lt_succ
{n m :
โ„•: Type
โ„•
} (
hโ‚: n โ‰ค m
hโ‚
: n โ‰ค m) (
hโ‚‚: m < n + 1
hโ‚‚
: m < n +
1: ?m.3770
1
) : m = n :=
Nat.le_antisymm: โˆ€ {n m : โ„•}, n โ‰ค m โ†’ m โ‰ค n โ†’ n = m
Nat.le_antisymm
(
le_of_succ_le_succ: โˆ€ {n m : โ„•}, succ n โ‰ค succ m โ†’ n โ‰ค m
le_of_succ_le_succ
hโ‚‚: m < n + 1
hโ‚‚
)
hโ‚: n โ‰ค m
hโ‚
#align nat.eq_of_le_of_lt_succ
Nat.eq_of_le_of_lt_succ: โˆ€ {n m : โ„•}, n โ‰ค m โ†’ m < n + 1 โ†’ m = n
Nat.eq_of_le_of_lt_succ
-- Moved to Std #align nat.one_add
Nat.one_add: โˆ€ (n : โ„•), 1 + n = succ n
Nat.one_add
@[simp] theorem
succ_pos': โˆ€ {n : โ„•}, 0 < succ n
succ_pos'
{n :
โ„•: Type
โ„•
} :
0: ?m.3872
0
<
succ: โ„• โ†’ โ„•
succ
n :=
succ_pos: โˆ€ (n : โ„•), 0 < succ n
succ_pos
n #align nat.succ_pos'
Nat.succ_pos': โˆ€ {n : โ„•}, 0 < succ n
Nat.succ_pos'
-- Moved to Std #align nat.succ_inj'
Nat.succ_inj': โˆ€ {n m : โ„•}, succ n = succ m โ†” n = m
Nat.succ_inj'
theorem
succ_injective: Function.Injective succ
succ_injective
:
Function.Injective: {ฮฑ : Sort ?u.3928} โ†’ {ฮฒ : Sort ?u.3927} โ†’ (ฮฑ โ†’ ฮฒ) โ†’ Prop
Function.Injective
Nat.succ: โ„• โ†’ โ„•
Nat.succ
:= fun
_: ?m.3936
_
_: ?m.3939
_
=>
succ.inj: โˆ€ {n n_1 : โ„•}, succ n = succ n_1 โ†’ n = n_1
succ.inj
#align nat.succ_injective
Nat.succ_injective: Function.Injective succ
Nat.succ_injective
theorem
succ_ne_succ: โˆ€ {n m : โ„•}, succ n โ‰  succ m โ†” n โ‰  m
succ_ne_succ
{n m :
โ„•: Type
โ„•
} :
succ: โ„• โ†’ โ„•
succ
n โ‰ 
succ: โ„• โ†’ โ„•
succ
m โ†” n โ‰  m :=
succ_injective: Function.Injective succ
succ_injective
.
ne_iff: โˆ€ {ฮฑ : Sort ?u.3971} {ฮฒ : Sort ?u.3972} {f : ฮฑ โ†’ ฮฒ}, Function.Injective f โ†’ โˆ€ {x y : ฮฑ}, f x โ‰  f y โ†” x โ‰  y
ne_iff
#align nat.succ_ne_succ
Nat.succ_ne_succ: โˆ€ {n m : โ„•}, succ n โ‰  succ m โ†” n โ‰  m
Nat.succ_ne_succ
-- Porting note: no longer a simp lemma, as simp can prove this theorem
succ_succ_ne_one: โˆ€ (n : โ„•), succ (succ n) โ‰  1
succ_succ_ne_one
(n :
โ„•: Type
โ„•
) : n.
succ: โ„• โ†’ โ„•
succ
.
succ: โ„• โ†’ โ„•
succ
โ‰ 
1: ?m.4009
1
:=
succ_ne_succ: โˆ€ {n m : โ„•}, succ n โ‰  succ m โ†” n โ‰  m
succ_ne_succ
.
mpr: โˆ€ {a b : Prop}, (a โ†” b) โ†’ b โ†’ a
mpr
n.
succ_ne_zero: โˆ€ (n : โ„•), succ n โ‰  0
succ_ne_zero
#align nat.succ_succ_ne_one
Nat.succ_succ_ne_one: โˆ€ (n : โ„•), succ (succ n) โ‰  1
Nat.succ_succ_ne_one
@[simp] theorem
one_lt_succ_succ: โˆ€ (n : โ„•), 1 < succ (succ n)
one_lt_succ_succ
(n :
โ„•: Type
โ„•
) :
1: ?m.4064
1
< n.
succ: โ„• โ†’ โ„•
succ
.
succ: โ„• โ†’ โ„•
succ
:=
succ_lt_succ: โˆ€ {n m : โ„•}, n < m โ†’ succ n < succ m
succ_lt_succ
<|
succ_pos: โˆ€ (n : โ„•), 0 < succ n
succ_pos
n #align nat.one_lt_succ_succ
Nat.one_lt_succ_succ: โˆ€ (n : โ„•), 1 < succ (succ n)
Nat.one_lt_succ_succ
-- Porting note: Nat.succ_le_succ_iff is in Std theorem
max_succ_succ: โˆ€ {m n : โ„•}, max (succ m) (succ n) = succ (max m n)
max_succ_succ
{m n :
โ„•: Type
โ„•
} :
max: {ฮฑ : Type ?u.4149} โ†’ [self : Max ฮฑ] โ†’ ฮฑ โ†’ ฮฑ โ†’ ฮฑ
max
(
succ: โ„• โ†’ โ„•
succ
m) (
succ: โ„• โ†’ โ„•
succ
n) =
succ: โ„• โ†’ โ„•
succ
(
max: {ฮฑ : Type ?u.4155} โ†’ [self : Max ฮฑ] โ†’ ฮฑ โ†’ ฮฑ โ†’ ฮฑ
max
m n) :=

Goals accomplished! ๐Ÿ™
mโœ, nโœ, k, m, n: โ„•


max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: m โ‰ค n


pos
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: ยฌm โ‰ค n


neg
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•


max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: m โ‰ค n


pos
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: ยฌm โ‰ค n


neg
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: m โ‰ค n


pos
max (succ m) (succ n) = succ n
mโœ, nโœ, k, m, n: โ„•

h1: ยฌm โ‰ค n


neg
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: m โ‰ค n


pos
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: ยฌm โ‰ค n


neg
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: m โ‰ค n


pos
succ n = succ n
mโœ, nโœ, k, m, n: โ„•

h1: ยฌm โ‰ค n


neg
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: ยฌm โ‰ค n


neg
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•


max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: ยฌm โ‰ค n


neg
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: ยฌm โ‰ค n


neg
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: ยฌm โ‰ค n


neg
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: n < m


neg
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: n < m


neg
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: n < m


neg
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: ยฌm โ‰ค n


neg
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: n < m

h2: n โ‰ค m


neg
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: ยฌm โ‰ค n


neg
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: n < m

h2: n โ‰ค m


neg
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: n < m

h2: n โ‰ค m


neg
max (succ m) (succ n) = succ m
mโœ, nโœ, k, m, n: โ„•

h1: n < m

h2: n โ‰ค m


neg
max (succ m) (succ n) = succ (max m n)
mโœ, nโœ, k, m, n: โ„•

h1: n < m

h2: n โ‰ค m


neg
succ m = succ m

Goals accomplished! ๐Ÿ™
#align nat.max_succ_succ
Nat.max_succ_succ: โˆ€ {m n : โ„•}, max (succ m) (succ n) = succ (max m n)
Nat.max_succ_succ
theorem
not_succ_lt_self: โˆ€ {n : โ„•}, ยฌsucc n < n
not_succ_lt_self
{n :
โ„•: Type
โ„•
} : ยฌ
succ: โ„• โ†’ โ„•
succ
n < n :=
not_lt_of_ge: โˆ€ {ฮฑ : Type ?u.4396} [inst : Preorder ฮฑ] {a b : ฮฑ}, a โ‰ฅ b โ†’ ยฌa < b
not_lt_of_ge
(
Nat.le_succ: โˆ€ (n : โ„•), n โ‰ค succ n
Nat.le_succ
_) #align nat.not_succ_lt_self
Nat.not_succ_lt_self: โˆ€ {n : โ„•}, ยฌsucc n < n
Nat.not_succ_lt_self
theorem
lt_succ_iff: โˆ€ {m n : โ„•}, m < succ n โ†” m โ‰ค n
lt_succ_iff
{m n :
โ„•: Type
โ„•
} : m <
succ: โ„• โ†’ โ„•
succ
n โ†” m โ‰ค n := โŸจ
le_of_lt_succ: โˆ€ {m n : โ„•}, m < succ n โ†’ m โ‰ค n
le_of_lt_succ
,
lt_succ_of_le: โˆ€ {n m : โ„•}, n โ‰ค m โ†’ n < succ m
lt_succ_of_le
โŸฉ #align nat.lt_succ_iff
Nat.lt_succ_iff: โˆ€ {m n : โ„•}, m < succ n โ†” m โ‰ค n
Nat.lt_succ_iff
theorem
succ_le_iff: โˆ€ {m n : โ„•}, succ m โ‰ค n โ†” m < n
succ_le_iff
{m n :
โ„•: Type
โ„•
} :
succ: โ„• โ†’ โ„•
succ
m โ‰ค n โ†” m < n := โŸจ
lt_of_succ_le: โˆ€ {n m : โ„•}, succ n โ‰ค m โ†’ n < m
lt_of_succ_le
,
succ_le_of_lt: โˆ€ {n m : โ„•}, n < m โ†’ succ n โ‰ค m
succ_le_of_lt
โŸฉ #align nat.succ_le_iff
Nat.succ_le_iff: โˆ€ {m n : โ„•}, succ m โ‰ค n โ†” m < n
Nat.succ_le_iff
theorem
lt_iff_add_one_le: โˆ€ {m n : โ„•}, m < n โ†” m + 1 โ‰ค n
lt_iff_add_one_le
{m n :
โ„•: Type
โ„•
} : m < n โ†” m +
1: ?m.4569
1
โ‰ค n :=

Goals accomplished! ๐Ÿ™
mโœ, nโœ, k, m, n: โ„•


m < n โ†” m + 1 โ‰ค n
mโœ, nโœ, k, m, n: โ„•


m < n โ†” m + 1 โ‰ค n
mโœ, nโœ, k, m, n: โ„•


m < n โ†” m < n

Goals accomplished! ๐Ÿ™
#align nat.lt_iff_add_one_le
Nat.lt_iff_add_one_le: โˆ€ {m n : โ„•}, m < n โ†” m + 1 โ‰ค n
Nat.lt_iff_add_one_le
-- Just a restatement of `Nat.lt_succ_iff` using `+1`. theorem
lt_add_one_iff: โˆ€ {a b : โ„•}, a < b + 1 โ†” a โ‰ค b
lt_add_one_iff
{a b :
โ„•: Type
โ„•
} : a < b +
1: ?m.4678
1
โ†” a โ‰ค b :=
lt_succ_iff: โˆ€ {m n : โ„•}, m < succ n โ†” m โ‰ค n
lt_succ_iff
#align nat.lt_add_one_iff
Nat.lt_add_one_iff: โˆ€ {a b : โ„•}, a < b + 1 โ†” a โ‰ค b
Nat.lt_add_one_iff
-- A flipped version of `lt_add_one_iff`. theorem
lt_one_add_iff: โˆ€ {a b : โ„•}, a < 1 + b โ†” a โ‰ค b
lt_one_add_iff
{a b :
โ„•: Type
โ„•
} : a <
1: ?m.4780
1
+ b โ†” a โ‰ค b :=

Goals accomplished! ๐Ÿ™
m, n, k, a, b: โ„•


a < 1 + b โ†” a โ‰ค b

Goals accomplished! ๐Ÿ™
#align nat.lt_one_add_iff
Nat.lt_one_add_iff: โˆ€ {a b : โ„•}, a < 1 + b โ†” a โ‰ค b
Nat.lt_one_add_iff
-- This is true reflexively, by the definition of `โ‰ค` on โ„•, -- but it's still useful to have, to convince Lean to change the syntactic type. theorem
add_one_le_iff: โˆ€ {a b : โ„•}, a + 1 โ‰ค b โ†” a < b
add_one_le_iff
{a b :
โ„•: Type
โ„•
} : a +
1: ?m.5016
1
โ‰ค b โ†” a < b :=
Iff.refl: โˆ€ (a : Prop), a โ†” a
Iff.refl
_: Prop
_
#align nat.add_one_le_iff
Nat.add_one_le_iff: โˆ€ {a b : โ„•}, a + 1 โ‰ค b โ†” a < b
Nat.add_one_le_iff
theorem
one_add_le_iff: โˆ€ {a b : โ„•}, 1 + a โ‰ค b โ†” a < b
one_add_le_iff
{a b :
โ„•: Type
โ„•
} :
1: ?m.5118
1
+ a โ‰ค b โ†” a < b :=

Goals accomplished! ๐Ÿ™
m, n, k, a, b: โ„•


1 + a โ‰ค b โ†” a < b

Goals accomplished! ๐Ÿ™
#align nat.one_add_le_iff
Nat.one_add_le_iff: โˆ€ {a b : โ„•}, 1 + a โ‰ค b โ†” a < b
Nat.one_add_le_iff
theorem
of_le_succ: โˆ€ {n m : โ„•}, n โ‰ค succ m โ†’ n โ‰ค m โˆจ n = succ m
of_le_succ
{n m :
โ„•: Type
โ„•
} (
H: n โ‰ค succ m
H
: n โ‰ค m.
succ: โ„• โ†’ โ„•
succ
) : n โ‰ค m โˆจ n = m.
succ: โ„• โ†’ โ„•
succ
:=
H: n โ‰ค succ m
H
.
lt_or_eq_dec: โˆ€ {ฮฑ : Type ?u.5377} [inst : PartialOrder ฮฑ] [inst_1 : DecidableRel fun x x_1 => x โ‰ค x_1] {a b : ฮฑ}, a โ‰ค b โ†’ a < b โˆจ a = b
lt_or_eq_dec
.
imp: โˆ€ {a c b d : Prop}, (a โ†’ c) โ†’ (b โ†’ d) โ†’ a โˆจ b โ†’ c โˆจ d
imp
le_of_lt_succ: โˆ€ {m n : โ„•}, m < succ n โ†’ m โ‰ค n
le_of_lt_succ
id: โˆ€ {ฮฑ : Sort ?u.5449}, ฮฑ โ†’ ฮฑ
id
#align nat.of_le_succ
Nat.of_le_succ: โˆ€ {n m : โ„•}, n โ‰ค succ m โ†’ n โ‰ค m โˆจ n = succ m
Nat.of_le_succ
theorem
succ_lt_succ_iff: โˆ€ {m n : โ„•}, succ m < succ n โ†” m < n
succ_lt_succ_iff
{m n :
โ„•: Type
โ„•
} :
succ: โ„• โ†’ โ„•
succ
m <
succ: โ„• โ†’ โ„•
succ
n โ†” m < n := โŸจ
lt_of_succ_lt_succ: โˆ€ {n m : โ„•}, succ n < succ m โ†’ n < m
lt_of_succ_lt_succ
,
succ_lt_succ: โˆ€ {n m : โ„•}, n < m โ†’ succ n < succ m
succ_lt_succ
โŸฉ #align nat.succ_lt_succ_iff
Nat.succ_lt_succ_iff: โˆ€ {m n : โ„•}, succ m < succ n โ†” m < n
Nat.succ_lt_succ_iff
theorem
div_le_iff_le_mul_add_pred: โˆ€ {m n k : โ„•}, 0 < n โ†’ (m / n โ‰ค k โ†” m โ‰ค n * k + (n - 1))
div_le_iff_le_mul_add_pred
{m n k :
โ„•: Type
โ„•
} (
n0: 0 < n
n0
:
0: ?m.5521
0
< n) : m / n โ‰ค k โ†” m โ‰ค n * k + (n -
1: ?m.5613
1
) :=

Goals accomplished! ๐Ÿ™
mโœ, nโœ, kโœ, m, n, k: โ„•

n0: 0 < n


m / n โ‰ค k โ†” m โ‰ค n * k + (n - 1)
mโœ, nโœ, kโœ, m, n, k: โ„•

n0: 0 < n


m / n โ‰ค k โ†” m โ‰ค n * k + (n - 1)
mโœ, nโœ, kโœ, m, n, k: โ„•

n0: 0 < n


m / n < succ k โ†” m โ‰ค n * k + (n - 1)
mโœ, nโœ, kโœ, m, n, k: โ„•

n0: 0 < n


m / n โ‰ค k โ†” m โ‰ค n * k + (n - 1)
mโœ, nโœ, kโœ, m, n, k: โ„•

n0: 0 < n


m < succ k * n โ†” m โ‰ค n * k + (n - 1)
mโœ, nโœ, kโœ, m, n, k: โ„•

n0: 0 < n


m / n โ‰ค k โ†” m โ‰ค n * k + (n - 1)
mโœ, nโœ, kโœ, m, n, k: โ„•

n0: 0 < n


m < k * n + n โ†” m โ‰ค n * k + (n - 1)
mโœ, nโœ, kโœ, m, n, k: โ„•

n0: 0 < n


m / n โ‰ค k โ†” m โ‰ค n * k + (n - 1)
mโœ, nโœ, kโœ, m, n, k: โ„•

n0: 0 < n


m < n * k + n โ†” m โ‰ค n * k + (n - 1)
mโœ, nโœ, kโœ, m, n, k: โ„•

n0: 0 < n


m < n * k + n โ†” m โ‰ค n * k + (n - 1)
mโœ, nโœ, kโœ, m, n, k: โ„•

n0: 0 < n


m / n โ‰ค k โ†” m โ‰ค n * k + (n - 1)
mโœ, n, kโœ, m, k: โ„•

n0: 0 < zero


zero
mโœ, n, kโœ, m, k, nโœ: โ„•

n0: 0 < succ nโœ


succ
m < succ nโœ * k + succ nโœ โ†” m โ‰ค succ nโœ * k + (succ nโœ - 1)
mโœ, nโœ, kโœ, m, n, k: โ„•

n0: 0 < n


m / n โ‰ค k โ†” m โ‰ค n * k + (n - 1)
mโœ, n, kโœ, m, k: โ„•

n0: 0 < zero


zero
mโœ, n, kโœ, m, k: โ„•

n0: 0 < zero


zero
mโœ, n, kโœ, m, k, nโœ: โ„•

n0: 0 < succ nโœ


succ
m < succ nโœ * k + succ nโœ โ†” m โ‰ค succ nโœ * k + (succ nโœ - 1)

Goals accomplished! ๐Ÿ™
mโœ, nโœ, kโœ, m, n, k: โ„•

n0: 0 < n


m / n โ‰ค k โ†” m โ‰ค n * k + (n - 1)

Goals accomplished! ๐Ÿ™
#align nat.div_le_iff_le_mul_add_pred
Nat.div_le_iff_le_mul_add_pred: โˆ€ {m n k : โ„•}, 0 < n โ†’ (m / n โ‰ค k โ†” m โ‰ค n * k + (n - 1))
Nat.div_le_iff_le_mul_add_pred
theorem
two_lt_of_ne: โˆ€ {n : โ„•}, n โ‰  0 โ†’ n โ‰  1 โ†’ n โ‰  2 โ†’ 2 < n
two_lt_of_ne
: โˆ€ {
n: ?m.6021
n
},
n: ?m.6021
n
โ‰ 
0: ?m.6028
0
โ†’
n: ?m.6021
n
โ‰ 
1: ?m.6044
1
โ†’
n: ?m.6021
n
โ‰ 
2: ?m.6057
2
โ†’
2: ?m.6067
2
<
n: ?m.6021
n
| 0,
h: 0 โ‰  0
h
, _, _ => (
h: 0 โ‰  0
h
rfl: โˆ€ {ฮฑ : Sort ?u.6259} {a : ฮฑ}, a = a
rfl
).
elim: โˆ€ {C : Sort ?u.6265}, False โ†’ C
elim
| 1, _,
h: 1 โ‰  1
h
, _ => (
h: 1 โ‰  1
h
rfl: โˆ€ {ฮฑ : Sort ?u.6299} {a : ฮฑ}, a = a
rfl
).
elim: โˆ€ {C : Sort ?u.6302}, False โ†’ C
elim
| 2, _, _,
h: 2 โ‰  2
h
=> (
h: 2 โ‰  2
h
rfl: โˆ€ {ฮฑ : Sort ?u.6336} {a : ฮฑ}, a = a
rfl
).
elim: โˆ€ {C : Sort ?u.6339}, False โ†’ C
elim
-- Porting note: was `by decide` | n + 3, _, _, _ =>

Goals accomplished! ๐Ÿ™
m, nโœ, k, n: โ„•

xโœยฒ: n + 3 โ‰  0

xโœยน: n + 3 โ‰  1

xโœ: n + 3 โ‰  2


2 < n + 3
m, nโœ, k, n: โ„•

xโœยฒ: n + 3 โ‰  0

xโœยน: n + 3 โ‰  1

xโœ: n + 3 โ‰  2


2 < n + 3
m, nโœ, k, n: โ„•

xโœยฒ: n + 3 โ‰  0

xโœยน: n + 3 โ‰  1

xโœ: n + 3 โ‰  2


2 + 1 โ‰ค n + 3
m, nโœ, k, n: โ„•

xโœยฒ: n + 3 โ‰  0

xโœยน: n + 3 โ‰  1

xโœ: n + 3 โ‰  2


2 + 1 โ‰ค n + 3
m, nโœ, k, n: โ„•

xโœยฒ: n + 3 โ‰  0

xโœยน: n + 3 โ‰  1

xโœ: n + 3 โ‰  2


2 + 1 โ‰ค n + 3
m, nโœ, k, n: โ„•

xโœยฒ: n + 3 โ‰  0

xโœยน: n + 3 โ‰  1

xโœ: n + 3 โ‰  2


2 < n + 3

Goals accomplished! ๐Ÿ™
#align nat.two_lt_of_ne
Nat.two_lt_of_ne: โˆ€ {n : โ„•}, n โ‰  0 โ†’ n โ‰  1 โ†’ n โ‰  2 โ†’ 2 < n
Nat.two_lt_of_ne
theorem
forall_lt_succ: โˆ€ {P : โ„• โ†’ Prop} {n : โ„•}, (โˆ€ (m : โ„•), m < n + 1 โ†’ P m) โ†” (โˆ€ (m : โ„•), m < n โ†’ P m) โˆง P n
forall_lt_succ
{
P: โ„• โ†’ Prop
P
:
โ„•: Type
โ„•
โ†’
Prop: Type
Prop
} {n :
โ„•: Type
โ„•
} : (โˆ€
m: ?m.6925
m
< n +
1: ?m.6934
1
,
P: โ„• โ†’ Prop
P
m: ?m.6925
m
) โ†” (โˆ€
m: ?m.7003
m
< n,
P: โ„• โ†’ Prop
P
m: ?m.7003
m
) โˆง
P: โ„• โ†’ Prop
P
n :=

Goals accomplished! ๐Ÿ™
m, nโœ, k: โ„•

P: โ„• โ†’ Prop

n: โ„•


(โˆ€ (m : โ„•), m < n + 1 โ†’ P m) โ†” (โˆ€ (m : โ„•), m < n โ†’ P m) โˆง P n

Goals accomplished! ๐Ÿ™
#align nat.forall_lt_succ
Nat.forall_lt_succ: โˆ€ {P : โ„• โ†’ Prop} {n : โ„•}, (โˆ€ (m : โ„•), m < n + 1 โ†’ P m) โ†” (โˆ€ (m : โ„•), m < n โ†’ P m) โˆง P n
Nat.forall_lt_succ
theorem
exists_lt_succ: โˆ€ {P : โ„• โ†’ Prop} {n : โ„•}, (โˆƒ m, m < n + 1 โˆง P m) โ†” (โˆƒ m, m < n โˆง P m) โˆจ P n
exists_lt_succ
{
P: โ„• โ†’ Prop
P
:
โ„•: Type
โ„•
โ†’
Prop: Type
Prop
} {n :
โ„•: Type
โ„•
} : (โˆƒ
m: ?m.7394
m
< n +
1: ?m.7401
1
,
P: โ„• โ†’ Prop
P
m: ?m.7394
m
) โ†” (โˆƒ
m: ?m.7471
m
< n,
P: โ„• โ†’ Prop
P
m: ?m.7471
m
) โˆจ
P: โ„• โ†’ Prop
P
n :=

Goals accomplished! ๐Ÿ™
m, nโœ, k: โ„•

P: โ„• โ†’ Prop

n: โ„•


(โˆƒ m, m < n + 1 โˆง P m) โ†” (โˆƒ m, m < n โˆง P m) โˆจ P n
m, nโœ, k: โ„•

P: โ„• โ†’ Prop

n: โ„•


(โˆƒ m, m < n + 1 โˆง P m) โ†” (โˆƒ m, m < n โˆง P m) โˆจ P n
m, nโœ, k: โ„•

P: โ„• โ†’ Prop

n: โ„•


(ยฌโˆƒ m, m < n + 1 โˆง P m) โ†” ยฌ((โˆƒ m, m < n โˆง P m) โˆจ P n)
m, nโœ, k: โ„•

P: โ„• โ†’ Prop

n: โ„•


(ยฌโˆƒ m, m < n + 1 โˆง P m) โ†” ยฌ((โˆƒ m, m < n โˆง P m) โˆจ P n)
m, nโœ, k: โ„•

P: โ„• โ†’ Prop

n: โ„•


(โˆƒ m, m < n + 1 โˆง P m) โ†” (โˆƒ m, m < n โˆง P m) โˆจ P n
m, nโœ, k: โ„•

P: โ„• โ†’ Prop

n: โ„•


(โˆ€ (m : โ„•), m < n + 1 โ†’ ยฌP m) โ†” (โˆ€ (m : โ„•), m < n โ†’ ยฌP m) โˆง ยฌP n
m, nโœ, k: โ„•

P: โ„• โ†’ Prop

n: โ„•


(โˆƒ m, m < n + 1 โˆง P m) โ†” (โˆƒ m, m < n โˆง P m) โˆจ P n

Goals accomplished! ๐Ÿ™
#align nat.exists_lt_succ
Nat.exists_lt_succ: โˆ€ {P : โ„• โ†’ Prop} {n : โ„•}, (โˆƒ m, m < n + 1 โˆง P m) โ†” (โˆƒ m, m < n โˆง P m) โˆจ P n
Nat.exists_lt_succ
/-! ### `add` -/ -- Sometimes a bare `Nat.add` or similar appears as a consequence of unfolding -- during pattern matching. These lemmas package them back up as typeclass -- mediated operations. @[simp] theorem
add_def: โˆ€ {a b : โ„•}, Nat.add a b = a + b
add_def
{a b :
โ„•: Type
โ„•
} :
Nat.add: โ„• โ†’ โ„• โ†’ โ„•
Nat.add
a b = a + b :=
rfl: โˆ€ {ฮฑ : Sort ?u.7695} {a : ฮฑ}, a = a
rfl
#align nat.add_def
Nat.add_def: โˆ€ {a b : โ„•}, Nat.add a b = a + b
Nat.add_def
@[simp] theorem
mul_def: โˆ€ {a b : โ„•}, Nat.mul a b = a * b
mul_def
{a b :
โ„•: Type
โ„•
} :
Nat.mul: โ„• โ†’ โ„• โ†’ โ„•
Nat.mul
a b = a * b :=
rfl: โˆ€ {ฮฑ : Sort ?u.7771} {a : ฮฑ}, a = a
rfl
#align nat.mul_def
Nat.mul_def: โˆ€ {a b : โ„•}, Nat.mul a b = a * b
Nat.mul_def
theorem
exists_eq_add_of_le: m โ‰ค n โ†’ โˆƒ k, n = m + k
exists_eq_add_of_le
(
h: m โ‰ค n
h
: m โ‰ค n) : โˆƒ k :
โ„•: Type
โ„•
, n = m + k := โŸจn - m, (
add_sub_of_le: โˆ€ {a b : โ„•}, a โ‰ค b โ†’ a + (b - a) = b
add_sub_of_le
h: m โ‰ค n
h
).
symm: โˆ€ {ฮฑ : Sort ?u.7908} {a b : ฮฑ}, a = b โ†’ b = a
symm
โŸฉ #align nat.exists_eq_add_of_le
Nat.exists_eq_add_of_le: โˆ€ {m n : โ„•}, m โ‰ค n โ†’ โˆƒ k, n = m + k
Nat.exists_eq_add_of_le
theorem
exists_eq_add_of_le': m โ‰ค n โ†’ โˆƒ k, n = k + m
exists_eq_add_of_le'
(
h: m โ‰ค n
h
: m โ‰ค n) : โˆƒ k :
โ„•: Type
โ„•
, n = k + m := โŸจn - m, (
Nat.sub_add_cancel: โˆ€ {n m : โ„•}, m โ‰ค n โ†’ n - m + m = n
Nat.sub_add_cancel
h: m โ‰ค n
h
).
symm: โˆ€ {ฮฑ : Sort ?u.8046} {a b : ฮฑ}, a = b โ†’ b = a
symm
โŸฉ #align nat.exists_eq_add_of_le'
Nat.exists_eq_add_of_le': โˆ€ {m n : โ„•}, m โ‰ค n โ†’ โˆƒ k, n = k + m
Nat.exists_eq_add_of_le'
theorem
exists_eq_add_of_lt: โˆ€ {m n : โ„•}, m < n โ†’ โˆƒ k, n = m + k + 1
exists_eq_add_of_lt
(
h: m < n
h
: m < n) : โˆƒ k :
โ„•: Type
โ„•
, n = m + k +
1: ?m.8088
1
:= โŸจn - (m +
1: ?m.8193
1
),

Goals accomplished! ๐Ÿ™
m, n, k: โ„•

h: m < n


n = m + (n - (m + 1)) + 1
m, n, k: โ„•

h: m < n


n = m + (n - (m + 1)) + 1
m, n, k: โ„•

h: m < n


n = m + 1 + (n - (m + 1))
m, n, k: โ„•

h: m < n


n = m + (n - (m + 1)) + 1
m, n, k: โ„•

h: m < n


n = n

Goals accomplished! ๐Ÿ™
โŸฉ #align nat.exists_eq_add_of_lt
Nat.exists_eq_add_of_lt: โˆ€ {m n : โ„•}, m < n โ†’ โˆƒ k, n = m + k + 1
Nat.exists_eq_add_of_lt
/-! ### `pred` -/ @[simp] theorem
add_succ_sub_one: โˆ€ (n m : โ„•), n + succ m - 1 = n + m
add_succ_sub_one
(n m :
โ„•: Type
โ„•
) : n +
succ: โ„• โ†’ โ„•
succ
m -
1: ?m.8348
1
= n + m :=

Goals accomplished! ๐Ÿ™
mโœ, nโœ, k, n, m: โ„•


n + succ m - 1 = n + m
mโœ, nโœ, k, n, m: โ„•


n + succ m - 1 = n + m
mโœ, nโœ, k, n, m: โ„•


succ (n + m) - 1 = n + m
mโœ, nโœ, k, n, m: โ„•


n + succ m - 1 = n + m
mโœ, nโœ, k, n, m: โ„•


n + m = n + m

Goals accomplished! ๐Ÿ™
#align nat.add_succ_sub_one
Nat.add_succ_sub_one: โˆ€ (n m : โ„•), n + succ m - 1 = n + m
Nat.add_succ_sub_one
@[simp] theorem
succ_add_sub_one: โˆ€ (n m : โ„•), succ n + m - 1 = n + m
succ_add_sub_one
(n m :
โ„•: Type
โ„•
) :
succ: โ„• โ†’ โ„•
succ
n + m -
1: ?m.8550
1
= n + m :=

Goals accomplished! ๐Ÿ™
mโœ, nโœ, k, n, m: โ„•


succ n + m - 1 = n + m
mโœ, nโœ, k, n, m: โ„•


succ n + m - 1 = n + m
mโœ, nโœ, k, n, m: โ„•


succ (n + m) - 1 = n + m
mโœ, nโœ, k, n, m: โ„•


succ n + m - 1 = n + m
mโœ, nโœ, k, n, m: โ„•


n + m = n + m

Goals accomplished! ๐Ÿ™
#align nat.succ_add_sub_one
Nat.succ_add_sub_one: โˆ€ (n m : โ„•), succ n + m - 1 = n + m
Nat.succ_add_sub_one
theorem
pred_eq_sub_one: โˆ€ (n : โ„•), pred n = n - 1
pred_eq_sub_one
(n :
โ„•: Type
โ„•
) :
pred: โ„• โ†’ โ„•
pred
n = n -
1: ?m.8747
1
:=
rfl: โˆ€ {ฮฑ : Sort ?u.8810} {a : ฮฑ}, a = a
rfl
#align nat.pred_eq_sub_one
Nat.pred_eq_sub_one: โˆ€ (n : โ„•), pred n = n - 1
Nat.pred_eq_sub_one
theorem
pred_eq_of_eq_succ: โˆ€ {m n : โ„•}, m = succ n โ†’ pred m = n
pred_eq_of_eq_succ
{m n :
โ„•: Type
โ„•
} (
H: m = succ n
H
: m = n.
succ: โ„• โ†’ โ„•
succ
) : m.
pred: โ„• โ†’ โ„•
pred
= n :=

Goals accomplished! ๐Ÿ™
mโœ, nโœ, k, m, n: โ„•

H: m = succ n


pred m = n

Goals accomplished! ๐Ÿ™
#align nat.pred_eq_of_eq_succ
Nat.pred_eq_of_eq_succ: โˆ€ {m n : โ„•}, m = succ n โ†’ pred m = n
Nat.pred_eq_of_eq_succ
@[simp] theorem
pred_eq_succ_iff: โˆ€ {n m : โ„•}, pred n = succ m โ†” n = m + 2
pred_eq_succ_iff
{n m :
โ„•: Type
โ„•
} :
pred: โ„• โ†’ โ„•
pred
n =
succ: โ„• โ†’ โ„•
succ
m โ†” n = m +
2: ?m.8954
2
:=

Goals accomplished! ๐Ÿ™
mโœ, nโœ, k, n, m: โ„•


pred n = succ m โ†” n = m + 2
mโœ, n, k, m: โ„•


zero
mโœ, n, k, m, nโœ: โ„•


succ
pred (succ nโœ) = succ m โ†” succ nโœ = m + 2
mโœ, nโœ, k, n, m: โ„•


pred n = succ m โ†” n = m + 2
mโœ, n, k, m: โ„•


zero
mโœ, n, k, m, nโœ: โ„•


succ
pred (succ nโœ) = succ m โ†” succ nโœ = m + 2
mโœ, nโœ, k, n, m: โ„•


pred n = succ m โ†” n = m + 2
mโœ, n, k, m, nโœ: โ„•


succ.mp
pred (succ nโœ) = succ m โ†’ succ nโœ = m + 2
mโœ, n, k, m, nโœ: โ„•


succ.mpr
succ nโœ = m + 2 โ†’ pred (succ nโœ) = succ m
mโœ, nโœ, k, n, m: โ„•


pred n = succ m โ†” n = m + 2
mโœ, n, k, m: โ„•


zero.mp
pred zero = succ m โ†’ zero = m + 2
mโœ, n, k, m: โ„•


zero.mpr
zero = m + 2 โ†’ pred zero = succ m
mโœ, n, k, m, nโœ: โ„•


succ.mp
pred (succ nโœ) = succ m โ†’ succ nโœ = m + 2
mโœ, n, k, m, nโœ: โ„•


succ.mpr
succ nโœ = m + 2 โ†’ pred (succ nโœ) = succ m
mโœ, nโœ, k, n, m: โ„•


pred n = succ m โ†” n = m + 2

Goals accomplished! ๐Ÿ™
mโœ, nโœ, k, n, m: โ„•


pred n = succ m โ†” n = m + 2
mโœ, n, k, m: โ„•


succ.mp.refl
succ (succ m) = m + 2
mโœ, n, k, m: โ„•


succ.mpr.refl
pred (succ (Nat.add m 1)) = succ m
mโœ, nโœ, k, n, m: โ„•


pred n = succ m โ†” n = m + 2

Goals accomplished! ๐Ÿ™
#align nat.pred_eq_succ_iff
Nat.pred_eq_succ_iff: โˆ€ {n m : โ„•}, pred n = succ m โ†” n = m + 2
Nat.pred_eq_succ_iff
theorem
pred_sub: โˆ€ (n m : โ„•), pred n - m = pred (n - m)
pred_sub
(n m :
โ„•: Type
โ„•
) :
pred: โ„• โ†’ โ„•
pred
n - m =
pred: โ„• โ†’ โ„•
pred
(n - m) :=

Goals accomplished! ๐Ÿ™
mโœ, nโœ, k, n, m: โ„•


pred n - m = pred (n - m)
mโœ, nโœ, k, n, m: โ„•


pred n - m = pred (n - m)
mโœ, nโœ, k, n, m: โ„•


n - 1 - m = pred (n - m)
mโœ, nโœ, k, n, m: โ„•


pred n - m = pred (n - m)
mโœ, nโœ, k, n, m: โ„•


n - (1 + m) = pred (n - m)
mโœ, nโœ, k, n, m: โ„•


pred n - m = pred (n - m)
mโœ, nโœ, k, n, m: โ„•


n - succ m = pred (n - m)
mโœ, nโœ, k, n, m: โ„•


pred n - m = pred (n - m)
mโœ, nโœ, k, n, m: โ„•


pred (n - m) = pred (n - m)

Goals accomplished! ๐Ÿ™
#align nat.pred_sub
Nat.pred_sub: โˆ€ (n m : โ„•), pred n - m = pred (n - m)
Nat.pred_sub
-- Moved to Std #align nat.le_pred_of_lt
Nat.le_pred_of_lt: โˆ€ {m n : โ„•}, m < n โ†’ m โ‰ค n - 1
Nat.le_pred_of_lt
theorem
le_of_pred_lt: โˆ€ {m n : โ„•}, pred m < n โ†’ m โ‰ค n
le_of_pred_lt
{m n :
โ„•: Type
โ„•
} :
pred: โ„• โ†’ โ„•
pred
m < n โ†’ m โ‰ค n := match m with | 0 =>
le_of_lt: โˆ€ {ฮฑ : Type ?u.9620} [inst : Preorder ฮฑ] {a b : ฮฑ}, a < b โ†’ a โ‰ค b
le_of_lt
| _ + 1 =>
id: โˆ€ {ฮฑ : Sort ?u.9749}, ฮฑ โ†’ ฮฑ
id
#align nat.le_of_pred_lt
Nat.le_of_pred_lt: โˆ€ {m n : โ„•}, pred m < n โ†’ m โ‰ค n
Nat.le_of_pred_lt
/-- This ensures that `simp` succeeds on `pred (n + 1) = n`. -/ @[simp] theorem
pred_one_add: โˆ€ (n : โ„•), pred (1 + n) = n
pred_one_add
(n :
โ„•: Type
โ„•
) :
pred: โ„• โ†’ โ„•
pred
(
1: ?m.9843
1
+ n) = n :=

Goals accomplished! ๐Ÿ™
m, nโœ, k, n: โ„•


pred (1 + n) = n
m, nโœ, k, n: โ„•


pred (1 + n) = n
m, nโœ, k, n: โ„•


pred (n + 1) = n
m, nโœ, k, n: โ„•


pred (1 + n) = n
m, nโœ, k, n: โ„•


pred (succ n) = n
m, nโœ, k, n: โ„•


pred (1 + n) = n
m, nโœ, k, n: โ„•


n = n

Goals accomplished! ๐Ÿ™
#align nat.pred_one_add
Nat.pred_one_add: โˆ€ (n : โ„•), pred (1 + n) = n
Nat.pred_one_add
/-! ### `mul` -/ theorem
two_mul_ne_two_mul_add_one: โˆ€ {n m : โ„•}, 2 * n โ‰  2 * m + 1
two_mul_ne_two_mul_add_one
{
n: ?m.9988
n
m: ?m.9991
m
} :
2: ?m.10000
2
*
n: ?m.9988
n
โ‰ 
2: ?m.10033
2
*
m: ?m.9991
m
+
1: ?m.10043
1
:=
mt: โˆ€ {a b : Prop}, (a โ†’ b) โ†’ ยฌb โ†’ ยฌa
mt
(
congr_arg: โˆ€ {ฮฑ : Sort ?u.10389} {ฮฒ : Sort ?u.10388} {aโ‚ aโ‚‚ : ฮฑ} (f : ฮฑ โ†’ ฮฒ), aโ‚ = aโ‚‚ โ†’ f aโ‚ = f aโ‚‚
congr_arg
(ยท % 2): โ„• โ†’ โ„•
(ยท % 2)
) (

Goals accomplished! ๐Ÿ™
mโœ, nโœ, k, n, m: โ„•


ยฌ2 * n % 2 = (2 * m + 1) % 2
mโœ, nโœ, k, n, m: โ„•


ยฌ2 * n % 2 = (2 * m + 1) % 2
mโœ, nโœ, k, n, m: โ„•


ยฌ2 * n % 2 = (1 + 2 * m) % 2
mโœ, nโœ, k, n, m: โ„•


ยฌ2 * n % 2 = (2 * m + 1) % 2
mโœ, nโœ, k, n, m: โ„•


ยฌ2 * n % 2 = 1 % 2
mโœ, nโœ, k, n, m: โ„•


ยฌ2 * n % 2 = (2 * m + 1) % 2
mโœ, nโœ, k, n, m: โ„•


ยฌ0 = 1 % 2
mโœ, nโœ, k, n, m: โ„•


ยฌ2 * n % 2 = (2 * m + 1) % 2
mโœ, nโœ, k, n, m: โ„•


mโœ, nโœ, k, n, m: โ„•


1 < 2
mโœ, nโœ, k, n, m: โ„•


mโœ, nโœ, k, n, m: โ„•


1 < 2
mโœ, nโœ, k, n, m: โ„•


ยฌ2 * n % 2 = (2 * m + 1) % 2
mโœ, nโœ, k, n, m: โ„•


mโœ, nโœ, k, n, m: โ„•


1 < 2
mโœ, nโœ, k, n, m: โ„•


ยฌ2 * n % 2 = (2 * m + 1) % 2

Goals accomplished! ๐Ÿ™
) #align nat.two_mul_ne_two_mul_add_one
Nat.two_mul_ne_two_mul_add_one: โˆ€ {n m : โ„•}, 2 * n โ‰  2 * m + 1
Nat.two_mul_ne_two_mul_add_one
theorem
mul_ne_mul_left: โˆ€ {a b c : โ„•}, 0 < a โ†’ (b * a โ‰  c * a โ†” b โ‰  c)
mul_ne_mul_left
{a b c :
โ„•: Type
โ„•
} (
ha: 0 < a
ha
:
0: ?m.10686
0
< a) : b * a โ‰  c * a โ†” b โ‰  c := (
mul_left_injectiveโ‚€: โˆ€ {Mโ‚€ : Type ?u.10803} [inst : Mul Mโ‚€] [inst_1 : Zero Mโ‚€] [inst_2 : IsRightCancelMulZero Mโ‚€] {b : Mโ‚€}, b โ‰  0 โ†’ Function.Injective fun a => a * b
mul_left_injectiveโ‚€
ha: 0 < a
ha
.
ne': โˆ€ {ฮฑ : Type ?u.10809} [inst : Preorder ฮฑ] {x y : ฮฑ}, x < y โ†’ y โ‰  x
ne'
).
ne_iff: โˆ€ {ฮฑ : Sort ?u.10931} {ฮฒ : Sort ?u.10932} {f : ฮฑ โ†’ ฮฒ}, Function.Injective f โ†’ โˆ€ {x y : ฮฑ}, f x โ‰  f y โ†” x โ‰  y
ne_iff
#align nat.mul_ne_mul_left
Nat.mul_ne_mul_left: โˆ€ {a b c : โ„•}, 0 < a โ†’ (b * a โ‰  c * a โ†” b โ‰  c)
Nat.mul_ne_mul_left
theorem
mul_ne_mul_right: โˆ€ {a b c : โ„•}, 0 < a โ†’ (a * b โ‰  a * c โ†” b โ‰  c)
mul_ne_mul_right
{a b c :
โ„•: Type
โ„•
} (
ha: 0 < a
ha
:
0: ?m.10978
0
< a) : a * b โ‰  a * c โ†” b โ‰  c := (
mul_right_injectiveโ‚€: โˆ€ {Mโ‚€ : Type ?u.11095} [inst : Mul Mโ‚€] [inst_1 : Zero Mโ‚€] [inst_2 : IsLeftCancelMulZero Mโ‚€] {a : Mโ‚€}, a โ‰  0 โ†’ Function.Injective ((fun x x_1 => x * x_1) a)
mul_right_injectiveโ‚€
ha: 0 < a
ha
.
ne': โˆ€ {ฮฑ : Type ?u.11101} [inst : Preorder ฮฑ] {x y : ฮฑ}, x < y โ†’ y โ‰  x
ne'
).
ne_iff: โˆ€ {ฮฑ : Sort ?u.11190} {ฮฒ : Sort ?u.11191} {f : ฮฑ โ†’ ฮฒ}, Function.Injective f โ†’ โˆ€ {x y : ฮฑ}, f x โ‰  f y โ†” x โ‰  y
ne_iff
#align nat.mul_ne_mul_right
Nat.mul_ne_mul_right: โˆ€ {a b c : โ„•}, 0 < a โ†’ (a * b โ‰  a * c โ†” b โ‰  c)
Nat.mul_ne_mul_right
theorem
mul_right_eq_self_iff: โˆ€ {a b : โ„•}, 0 < a โ†’ (a * b = a โ†” b = 1)
mul_right_eq_self_iff
{a b :
โ„•: Type
โ„•
} (
ha: 0 < a
ha
:
0: ?m.11237
0
< a) : a * b = a โ†” b =
1: ?m.11322
1
:= suffices a * b = a *
1: ?m.11355
1
โ†” b =
1: ?m.11421
1
by
m, n, k, a, b: โ„•

ha: 0 < a

this: a * b = a * 1 โ†” b = 1


a * b = a โ†” b = 1
m, n, k, a, b: โ„•

ha: 0 < a

this: a * b = a โ†” b = 1


a * b = a โ†” b = 1
m, n, k, a, b: โ„•

ha: 0 < a

this: a * b = a โ†” b = 1


a * b = a โ†” b = 1

Goals accomplished! ๐Ÿ™
mul_right_inj': โˆ€ {Mโ‚€ : Type ?u.11437} [inst : CancelMonoidWithZero Mโ‚€] {a b c : Mโ‚€}, a โ‰  0 โ†’ (a * b = a * c โ†” b = c)
mul_right_inj'
ha: 0 < a
ha
.
ne': โˆ€ {ฮฑ : Type ?u.11474} [inst : Preorder ฮฑ] {x y : ฮฑ}, x < y โ†’ y โ‰  x
ne'
#align nat.mul_right_eq_self_iff
Nat.mul_right_eq_self_iff: โˆ€ {a b : โ„•}, 0 < a โ†’ (a * b = a โ†” b = 1)
Nat.mul_right_eq_self_iff
theorem
mul_left_eq_self_iff: โˆ€ {a b : โ„•}, 0 < b โ†’ (a * b = b โ†” a = 1)
mul_left_eq_self_iff
{a b :
โ„•: Type
โ„•
} (
hb: 0 < b
hb
:
0: ?m.11619
0
< b) : a * b = b โ†” a =
1: ?m.11704
1
:=

Goals accomplished! ๐Ÿ™
m, n, k, a, b: โ„•

hb: 0 < b


a * b = b โ†” a = 1
m, n, k, a, b: โ„•

hb: 0 < b


a * b = b โ†” a = 1
m, n, k, a, b: โ„•

hb: 0 < b


b * a = b โ†” a = 1
m, n, k, a, b: โ„•

hb: 0 < b


a * b = b โ†” a = 1
m, n, k, a, b: โ„•

hb: 0 < b


a = 1 โ†” a = 1

Goals accomplished! ๐Ÿ™
#align nat.mul_left_eq_self_iff
Nat.mul_left_eq_self_iff: โˆ€ {a b : โ„•}, 0 < b โ†’ (a * b = b โ†” a = 1)
Nat.mul_left_eq_self_iff
theorem
lt_succ_iff_lt_or_eq: โˆ€ {n i : โ„•}, n < succ i โ†” n < i โˆจ n = i
lt_succ_iff_lt_or_eq
{n i :
โ„•: Type
โ„•
} : n < i.
succ: โ„• โ†’ โ„•
succ
โ†” n < i โˆจ n = i :=
lt_succ_iff: โˆ€ {m n : โ„•}, m < succ n โ†” m โ‰ค n
lt_succ_iff
.
trans: โˆ€ {a b c : Prop}, (a โ†” b) โ†’ (b โ†” c) โ†’ (a โ†” c)
trans
Decidable.le_iff_lt_or_eq: โˆ€ {ฮฑ : Type ?u.11834} [inst : PartialOrder ฮฑ] [inst_1 : DecidableRel fun x x_1 => x โ‰ค x_1] {a b : ฮฑ}, a โ‰ค b โ†” a < b โˆจ a = b
Decidable.le_iff_lt_or_eq
#align nat.lt_succ_iff_lt_or_eq
Nat.lt_succ_iff_lt_or_eq: โˆ€ {n i : โ„•}, n < succ i โ†” n < i โˆจ n = i
Nat.lt_succ_iff_lt_or_eq
/-! ### Recursion and induction principles This section is here due to dependencies -- the lemmas here require some of the lemmas proved above, and some of the results in later sections depend on the definitions in this section. -/ -- Porting note: The type ascriptions of these two theorems need to be changed, -- as mathport wrote a lambda that wasn't there in mathlib3, that prevents `simp` applying them. @[simp] theorem
rec_zero: โˆ€ {C : โ„• โ†’ Sort u} (h0 : C 0) (h : (n : โ„•) โ†’ C n โ†’ C (n + 1)), rec h0 h 0 = h0
rec_zero
{
C: โ„• โ†’ Sort u
C
:
โ„•: Type
โ„•
โ†’
Sort u: Type u
Sort
Sort u: Type u
u
} (
h0: C 0
h0
:
C: โ„• โ†’ Sort u
C
0: ?m.11942
0
) (
h: (n : โ„•) โ†’ C n โ†’ C (n + 1)
h
: โˆ€
n: ?m.11955
n
,
C: โ„• โ†’ Sort u
C
n: ?m.11955
n
โ†’
C: โ„• โ†’ Sort u
C
(
n: ?m.11955
n
+
1: ?m.11964
1
)) :
Nat.rec: {motive : โ„• โ†’ Sort ?u.12061} โ†’ motive zero โ†’ ((n : โ„•) โ†’ motive n โ†’ motive (succ n)) โ†’ (t : โ„•) โ†’ motive t
Nat.rec
h0: C 0
h0
h: (n : โ„•) โ†’ C n โ†’ C (n + 1)
h
0: ?m.12081
0
=
h0: C 0
h0
:=
rfl: โˆ€ {ฮฑ : Sort ?u.12119} {a : ฮฑ}, a = a
rfl
#align nat.rec_zero
Nat.rec_zero: โˆ€ {C : โ„• โ†’ Sort u} (h0 : C 0) (h : (n : โ„•) โ†’ C n โ†’ C (n + 1)), rec h0 h 0 = h0
Nat.rec_zero
@[simp] theorem
rec_add_one: โˆ€ {C : โ„• โ†’ Sort u} (h0 : C 0) (h : (n : โ„•) โ†’ C n โ†’ C (n + 1)) (n : โ„•), rec h0 h (n + 1) = h n (rec h0 h n)
rec_add_one
{
C: โ„• โ†’ Sort u
C
:
โ„•: Type
โ„•
โ†’
Sort u: Type u
Sort
Sort u: Type u
u
} (
h0: C 0
h0
:
C: โ„• โ†’ Sort u
C
0: ?m.12160
0
) (
h: (n : โ„•) โ†’ C n โ†’ C (n + 1)
h
: โˆ€
n: ?m.12173
n
,
C: โ„• โ†’ Sort u
C
n: ?m.12173
n
โ†’
C: โ„• โ†’ Sort u
C
(
n: ?m.12173
n
+
1: ?m.12182
1
)) (n :
โ„•: Type
โ„•
) :
Nat.rec: {motive : โ„• โ†’ Sort ?u.12340} โ†’ motive zero โ†’ ((n : โ„•) โ†’ motive n โ†’ motive (succ n)) โ†’ (t : โ„•) โ†’ motive t
Nat.rec
h0: C 0
h0
h: (n : โ„•) โ†’ C n โ†’ C (n + 1)
h
(n +
1: ?m.12363
1
) =
h: (n : โ„•) โ†’ C n โ†’ C (n + 1)
h
n (
Nat.rec: {motive : โ„• โ†’ Sort ?u.12267} โ†’ motive zero โ†’ ((n : โ„•) โ†’ motive n โ†’ motive (succ n)) โ†’ (t : โ„•) โ†’ motive t
Nat.rec
h0: C 0
h0
h: (n : โ„•) โ†’ C n โ†’ C (n + 1)
h
n) :=
rfl: โˆ€ {ฮฑ : Sort ?u.12429} {a : ฮฑ}, a = a
rfl
#align nat.rec_add_one
Nat.rec_add_one: โˆ€ {C : โ„• โ†’ Sort u} (h0 : C 0) (h : (n : โ„•) โ†’ C n โ†’ C (n + 1)) (n : โ„•), rec h0 h (n + 1) = h n (rec h0 h n)
Nat.rec_add_one
/-- Recursion starting at a non-zero number: given a map `C k โ†’ C (k+1)` for each `k`, there is a map from `C n` to each `C m`, `n โ‰ค m`. For a version where the assumption is only made when `k โ‰ฅ n`, see `leRecOn`. -/ @[elab_as_elim] def
leRecOn: {C : โ„• โ†’ Sort u} โ†’ {n m : โ„•} โ†’ n โ‰ค m โ†’ ({k : โ„•} โ†’ C k โ†’ C (k + 1)) โ†’ C n โ†’ C m
leRecOn
{
C: โ„• โ†’ Sort u
C
:
โ„•: Type
โ„•
โ†’
Sort u: Type u
Sort
Sort u: Type u
u
} {n :
โ„•: Type
โ„•
} : โˆ€ {m :
โ„•: Type
โ„•
}, n โ‰ค m โ†’ (โˆ€ {
k: ?m.12508
k
},
C: โ„• โ†’ Sort u
C
k: ?m.12508
k
โ†’
C: โ„• โ†’ Sort u
C
(
k: ?m.12508
k
+
1: ?m.12517
1
)) โ†’
C: โ„• โ†’ Sort u
C
n โ†’
C: โ„• โ†’ Sort u
C
m | 0,
H: n โ‰ค 0
H
, _,
x: C n
x
=>
Eq.recOn: {ฮฑ : Sort ?u.12643} โ†’ {a : ฮฑ} โ†’ {motive : (a_1 : ฮฑ) โ†’ a = a_1 โ†’ Sort ?u.12644} โ†’ {a_1 : ฮฑ} โ†’ (t : a = a_1) โ†’ motive a (_ : a = a) โ†’ motive a_1 t
Eq.recOn
(
Nat.eq_zero_of_le_zero: โˆ€ {n : โ„•}, n โ‰ค 0 โ†’ n = 0
Nat.eq_zero_of_le_zero
H: n โ‰ค 0
H
)
x: C n
x
| m + 1,
H: n โ‰ค m + 1
H
,
next: {k : โ„•} โ†’ C k โ†’ C (k + 1)
next
,
x: C n
x
=>
Or.by_cases: {p q : Prop} โ†’ [inst : Decidable p] โ†’ {ฮฑ : Sort ?u.12773} โ†’ p โˆจ q โ†’ (p โ†’ ฮฑ) โ†’ (q โ†’ ฮฑ) โ†’ ฮฑ
Or.by_cases
(
of_le_succ: โˆ€ {n m : โ„•}, n โ‰ค succ m โ†’ n โ‰ค m โˆจ n = succ m
of_le_succ
H: n โ‰ค m + 1
H
) (fun
h: n โ‰ค m
h
: n โ‰ค m =>
next: {k : โ„•} โ†’ C k โ†’ C (k + 1)
next
<|
leRecOn: {C : โ„• โ†’ Sort u} โ†’ {n m : โ„•} โ†’ n โ‰ค m โ†’ ({k : โ„•} โ†’ C k โ†’ C (k + 1)) โ†’ C n โ†’ C m
leRecOn
h: n โ‰ค m
h
(@
next: {k : โ„•} โ†’ C k โ†’ C (k + 1)
next
)
x: C n
x
) fun
h: n = m + 1
h
: n = m +
1: ?m.12884
1
=>
Eq.recOn: {ฮฑ : Sort ?u.12922} โ†’ {a : ฮฑ} โ†’ {motive : (a_1 : ฮฑ) โ†’ a = a_1 โ†’ Sort ?u.12923} โ†’ {a_1 : ฮฑ} โ†’ (t : a = a_1) โ†’ motive a (_ : a = a) โ†’ motive a_1 t
Eq.recOn
h: n = m + 1
h
x: C n
x
#align nat.le_rec_on
Nat.leRecOn: {C : โ„• โ†’ Sort u} โ†’ {n m : โ„•} โ†’ n โ‰ค m โ†’ ({k : โ„•} โ†’ C k โ†’ C (k + 1)) โ†’ C n โ†’ C m
Nat.leRecOn
theorem
leRecOn_self: โˆ€ {C : โ„• โ†’ Sort u} {n : โ„•} {h : n โ‰ค n} {next : {k : โ„•} โ†’ C k โ†’ C (k + 1)} (x : C n), leRecOn h (fun {k} => next) x = x
leRecOn_self
{
C: โ„• โ†’ Sort u
C
:
โ„•: Type
โ„•
โ†’
Sort u: Type u
Sort
Sort u: Type u
u
} {
n: ?m.13782
n
} {
h: n โ‰ค n
h
:
n: ?m.13782
n
โ‰ค
n: ?m.13782
n
} {
next: {k : โ„•} โ†’ C k โ†’ C (k + 1)
next
: โˆ€ {
k: ?m.13826
k
},
C: โ„• โ†’ Sort u
C
k: ?m.13826
k
โ†’
C: โ„• โ†’ Sort u
C
(
k: ?m.13826
k
+
1: ?m.13835
1
)} (
x: C n
x
:
C: โ„• โ†’ Sort u
C
n: ?m.13782
n
) : (
leRecOn: {C : โ„• โ†’ Sort ?u.13905} โ†’ {n m : โ„•} โ†’ n โ‰ค m โ†’ ({k : โ„•} โ†’ C k โ†’ C (k + 1)) โ†’ C n โ†’ C m
leRecOn
h: n โ‰ค n
h
next: {k : โ„•} โ†’ C k โ†’ C (k + 1)
next
x: C n
x
:
C: โ„• โ†’ Sort u
C
n: ?m.13782
n
) =
x: C n
x
:=

Goals accomplished! ๐Ÿ™
m, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n: โ„•

h: n โ‰ค n

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn h (fun {k} => next) x = x
m, n, k: โ„•

C: โ„• โ†’ Sort u

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

h: zero โ‰ค zero

x: C zero


zero
leRecOn h (fun {k} => next) x = x
m, n, k: โ„•

C: โ„• โ†’ Sort u

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

nโœ: โ„•

h: succ nโœ โ‰ค succ nโœ

x: C (succ nโœ)


succ
leRecOn h (fun {k} => next) x = x
m, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n: โ„•

h: n โ‰ค n

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn h (fun {k} => next) x = x
m, n, k: โ„•

C: โ„• โ†’ Sort u

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

h: zero โ‰ค zero

x: C zero


zero
leRecOn h (fun {k} => next) x = x
m, n, k: โ„•

C: โ„• โ†’ Sort u

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

nโœ: โ„•

h: succ nโœ โ‰ค succ nโœ

x: C (succ nโœ)


succ
leRecOn h (fun {k} => next) x = x
m, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n: โ„•

h: n โ‰ค n

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn h (fun {k} => next) x = x
m, n, k: โ„•

C: โ„• โ†’ Sort u

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

nโœ: โ„•

h: succ nโœ โ‰ค succ nโœ

x: C (succ nโœ)


succ
(Or.by_cases (_ : succ nโœ โ‰ค nโœ โˆจ succ nโœ = succ nโœ) (fun h => (fun {k} => next) (leRecOn h (fun {k} => next) x)) fun h => h โ–ธ x) = x
m, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n: โ„•

h: n โ‰ค n

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn h (fun {k} => next) x = x
m, n, k: โ„•

C: โ„• โ†’ Sort u

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

h: zero โ‰ค zero

x: C zero


zero
(_ : zero = 0) โ–ธ x = x
m, n, k: โ„•

C: โ„• โ†’ Sort u

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

h: zero โ‰ค zero

x: C zero


zero
(_ : zero = 0) โ–ธ x = x
m, n, k: โ„•

C: โ„• โ†’ Sort u

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

nโœ: โ„•

h: succ nโœ โ‰ค succ nโœ

x: C (succ nโœ)


succ
(Or.by_cases (_ : succ nโœ โ‰ค nโœ โˆจ succ nโœ = succ nโœ) (fun h => (fun {k} => next) (leRecOn h (fun {k} => next) x)) fun h => h โ–ธ x) = x

Goals accomplished! ๐Ÿ™
m, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n: โ„•

h: n โ‰ค n

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn h (fun {k} => next) x = x
m, n, k: โ„•

C: โ„• โ†’ Sort u

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

nโœ: โ„•

h: succ nโœ โ‰ค succ nโœ

x: C (succ nโœ)


succ
(Or.by_cases (_ : succ nโœ โ‰ค nโœ โˆจ succ nโœ = succ nโœ) (fun h => (fun {k} => next) (leRecOn h (fun {k} => next) x)) fun h => h โ–ธ x) = x
m, n, k: โ„•

C: โ„• โ†’ Sort u

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

nโœ: โ„•

h: succ nโœ โ‰ค succ nโœ

x: C (succ nโœ)


succ
(Or.by_cases (_ : succ nโœ โ‰ค nโœ โˆจ succ nโœ = succ nโœ) (fun h => (fun {k} => next) (leRecOn h (fun {k} => next) x)) fun h => h โ–ธ x) = x
m, n, k: โ„•

C: โ„• โ†’ Sort u

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

nโœ: โ„•

h: succ nโœ โ‰ค succ nโœ

x: C (succ nโœ)


succ
(if hp : succ nโœ โ‰ค nโœ then (fun h => (fun {k} => next) (leRecOn h (fun {k} => next) x)) hp else (fun h => h โ–ธ x) (_ : succ nโœ = succ nโœ)) = x
m, n, k: โ„•

C: โ„• โ†’ Sort u

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

nโœ: โ„•

h: succ nโœ โ‰ค succ nโœ

x: C (succ nโœ)


succ
(Or.by_cases (_ : succ nโœ โ‰ค nโœ โˆจ succ nโœ = succ nโœ) (fun h => (fun {k} => next) (leRecOn h (fun {k} => next) x)) fun h => h โ–ธ x) = x
m, n, k: โ„•

C: โ„• โ†’ Sort u

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

nโœ: โ„•

h: succ nโœ โ‰ค succ nโœ

x: C (succ nโœ)


succ
(if hp : succ nโœ โ‰ค nโœ then (fun h => (fun {k} => next) (leRecOn h (fun {k} => next) x)) hp else (fun h => h โ–ธ x) (_ : succ nโœ = succ nโœ)) = x
m, n, k: โ„•

C: โ„• โ†’ Sort u

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

nโœ: โ„•

h: succ nโœ โ‰ค succ nโœ

x: C (succ nโœ)


succ
(fun h => h โ–ธ x) (_ : succ nโœ = succ nโœ) = x

Goals accomplished! ๐Ÿ™
#align nat.le_rec_on_self
Nat.leRecOn_self: โˆ€ {C : โ„• โ†’ Sort u} {n : โ„•} {h : n โ‰ค n} {next : {k : โ„•} โ†’ C k โ†’ C (k + 1)} (x : C n), leRecOn h (fun {k} => next) x = x
Nat.leRecOn_self
theorem
leRecOn_succ: โˆ€ {C : โ„• โ†’ Sort u} {n m : โ„•} (h1 : n โ‰ค m) {h2 : n โ‰ค m + 1} {next : {k : โ„•} โ†’ C k โ†’ C (k + 1)} (x : C n), leRecOn h2 next x = next (leRecOn h1 next x)
leRecOn_succ
{
C: โ„• โ†’ Sort u
C
:
โ„•: Type
โ„•
โ†’
Sort u: Type u
Sort
Sort u: Type u
u
} {
n: ?m.15988
n
m} (
h1: n โ‰ค m
h1
:
n: ?m.15988
n
โ‰ค
m: ?m.15991
m
) {
h2: n โ‰ค m + 1
h2
:
n: ?m.15988
n
โ‰ค
m: ?m.15991
m
+
1: ?m.16039
1
} {
next: ?m.16117
next
} (
x: C n
x
:
C: โ„• โ†’ Sort u
C
n: ?m.15988
n
) : (
leRecOn: {C : โ„• โ†’ Sort ?u.16188} โ†’ {n m : โ„•} โ†’ n โ‰ค m โ†’ ({k : โ„•} โ†’ C k โ†’ C (k + 1)) โ†’ C n โ†’ C m
leRecOn
h2: n โ‰ค m + 1
h2
(@
next: ?m.16117
next
)
x: C n
x
:
C: โ„• โ†’ Sort u
C
(
m: ?m.15991
m
+
1: ?m.16128
1
)) =
next: ?m.16117
next
(
leRecOn: {C : โ„• โ†’ Sort ?u.16236} โ†’ {n m : โ„•} โ†’ n โ‰ค m โ†’ ({k : โ„•} โ†’ C k โ†’ C (k + 1)) โ†’ C n โ†’ C m
leRecOn
h1: n โ‰ค m
h1
(@
next: ?m.16117
next
)
x: C n
x
:
C: โ„• โ†’ Sort u
C
m: ?m.15991
m
) :=

Goals accomplished! ๐Ÿ™
mโœ, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n, m: โ„•

h1: n โ‰ค m

h2: n โ‰ค m + 1

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn h2 next x = next (leRecOn h1 next x)
mโœ, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n, m: โ„•

h1: n โ‰ค m

h2: n โ‰ค m + 1

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


next (leRecOn h1 next x)
mโœ, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n, m: โ„•

h1: n โ‰ค m

h2: n โ‰ค m + 1

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn h2 next x = next (leRecOn h1 next x)
mโœ, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n, m: โ„•

h1: n โ‰ค m

h2: n โ‰ค m + 1

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn h2 next x
mโœ, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n, m: โ„•

h1: n โ‰ค m

h2: n โ‰ค m + 1

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn h2 next x = next (leRecOn h1 next x)
mโœ, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n, m: โ„•

h1: n โ‰ค m

h2: n โ‰ค m + 1

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn h2 next x
mโœ, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n, m: โ„•

h1: n โ‰ค m

h2: n โ‰ค m + 1

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


Or.by_cases (_ : n โ‰ค m โˆจ n = succ m) (fun h => next (leRecOn h next x)) fun h => Eq.recOn h x
mโœ, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n, m: โ„•

h1: n โ‰ค m

h2: n โ‰ค m + 1

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn h2 next x
mโœ, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n, m: โ„•

h1: n โ‰ค m

h2: n โ‰ค m + 1

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


if hp : n โ‰ค m then next (leRecOn hp next x) else Eq.recOn (_ : n = succ m) x
mโœ, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n, m: โ„•

h1: n โ‰ค m

h2: n โ‰ค m + 1

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn h2 next x
mโœ, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n, m: โ„•

h1: n โ‰ค m

h2: n โ‰ค m + 1

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


next (leRecOn h1 next x)
mโœ, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n, m: โ„•

h1: n โ‰ค m

h2: n โ‰ค m + 1

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


next (leRecOn h1 next x)
#align nat.le_rec_on_succ
Nat.leRecOn_succ: โˆ€ {C : โ„• โ†’ Sort u} {n m : โ„•} (h1 : n โ‰ค m) {h2 : n โ‰ค m + 1} {next : {k : โ„•} โ†’ C k โ†’ C (k + 1)} (x : C n), leRecOn h2 next x = next (leRecOn h1 next x)
Nat.leRecOn_succ
theorem
leRecOn_succ': โˆ€ {C : โ„• โ†’ Sort u} {n : โ„•} {h : n โ‰ค n + 1} {next : {k : โ„•} โ†’ C k โ†’ C (k + 1)} (x : C n), leRecOn h (fun {k} => next) x = next x
leRecOn_succ'
{
C: โ„• โ†’ Sort u
C
:
โ„•: Type
โ„•
โ†’
Sort u: Type u
Sort
Sort u: Type u
u
} {
n: ?m.16660
n
} {
h: n โ‰ค n + 1
h
:
n: ?m.16660
n
โ‰ค
n: ?m.16660
n
+
1: ?m.16668
1
} {
next: {k : โ„•} โ†’ C k โ†’ C (k + 1)
next
: โˆ€ {
k: ?m.16747
k
},
C: โ„• โ†’ Sort u
C
k: ?m.16747
k
โ†’
C: โ„• โ†’ Sort u
C
(
k: ?m.16747
k
+
1: ?m.16756
1
)} (
x: C n
x
:
C: โ„• โ†’ Sort u
C
n: ?m.16660
n
) : (
leRecOn: {C : โ„• โ†’ Sort ?u.16882} โ†’ {n m : โ„•} โ†’ n โ‰ค m โ†’ ({k : โ„•} โ†’ C k โ†’ C (k + 1)) โ†’ C n โ†’ C m
leRecOn
h: n โ‰ค n + 1
h
next: {k : โ„•} โ†’ C k โ†’ C (k + 1)
next
x: C n
x
:
C: โ„• โ†’ Sort u
C
(
n: ?m.16660
n
+
1: ?m.16838
1
)) =
next: {k : โ„•} โ†’ C k โ†’ C (k + 1)
next
x: C n
x
:=

Goals accomplished! ๐Ÿ™
m, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n: โ„•

h: n โ‰ค n + 1

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn h (fun {k} => next) x = next x
m, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n: โ„•

h: n โ‰ค n + 1

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn h (fun {k} => next) x = next x
m, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n: โ„•

h: n โ‰ค n + 1

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


next (leRecOn (_ : n โ‰ค n) (fun {k} => next) x) = next x
m, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n: โ„•

h: n โ‰ค n + 1

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn h (fun {k} => next) x = next x
m, nโœ, k: โ„•

C: โ„• โ†’ Sort u

n: โ„•

h: n โ‰ค n + 1

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


next x = next x

Goals accomplished! ๐Ÿ™
#align nat.le_rec_on_succ'
Nat.leRecOn_succ': โˆ€ {C : โ„• โ†’ Sort u} {n : โ„•} {h : n โ‰ค n + 1} {next : {k : โ„•} โ†’ C k โ†’ C (k + 1)} (x : C n), leRecOn h (fun {k} => next) x = next x
Nat.leRecOn_succ'
theorem
leRecOn_trans: โˆ€ {C : โ„• โ†’ Sort u} {n m k : โ„•} (hnm : n โ‰ค m) (hmk : m โ‰ค k) {next : {k : โ„•} โ†’ C k โ†’ C (k + 1)} (x : C n), leRecOn (_ : n โ‰ค k) next x = leRecOn hmk next (leRecOn hnm next x)
leRecOn_trans
{
C: โ„• โ†’ Sort u
C
:
โ„•: Type
โ„•
โ†’
Sort u: Type u
Sort
Sort u: Type u
u
} {
n: ?m.17052
n
m: ?m.17055
m
k} (
hnm: n โ‰ค m
hnm
:
n: ?m.17052
n
โ‰ค
m: ?m.17055
m
) (
hmk: m โ‰ค k
hmk
:
m: ?m.17055
m
โ‰ค
k: ?m.17058
k
) {
next: ?m.17141
next
} (
x: C n
x
:
C: โ„• โ†’ Sort u
C
n: ?m.17052
n
) : (
leRecOn: {C : โ„• โ†’ Sort ?u.17148} โ†’ {n m : โ„•} โ†’ n โ‰ค m โ†’ ({k : โ„•} โ†’ C k โ†’ C (k + 1)) โ†’ C n โ†’ C m
leRecOn
(
le_trans: โˆ€ {ฮฑ : Type ?u.17173} [inst : Preorder ฮฑ] {a b c : ฮฑ}, a โ‰ค b โ†’ b โ‰ค c โ†’ a โ‰ค c
le_trans
hnm: n โ‰ค m
hnm
hmk: m โ‰ค k
hmk
) (@
next: ?m.17141
next
)
x: C n
x
:
C: โ„• โ†’ Sort u
C
k: ?m.17058
k
) =
leRecOn: {C : โ„• โ†’ Sort ?u.17251} โ†’ {n m : โ„•} โ†’ n โ‰ค m โ†’ ({k : โ„•} โ†’ C k โ†’ C (k + 1)) โ†’ C n โ†’ C m
leRecOn
hmk: m โ‰ค k
hmk
(@
next: ?m.17141
next
) (
leRecOn: {C : โ„• โ†’ Sort ?u.17280} โ†’ {n m : โ„•} โ†’ n โ‰ค m โ†’ ({k : โ„•} โ†’ C k โ†’ C (k + 1)) โ†’ C n โ†’ C m
leRecOn
hnm: n โ‰ค m
hnm
(@
next: ?m.17141
next
)
x: C n
x
) :=

Goals accomplished! ๐Ÿ™
mโœ, nโœ, kโœ: โ„•

C: โ„• โ†’ Sort u

n, m, k: โ„•

hnm: n โ‰ค m

hmk: m โ‰ค k

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn (_ : n โ‰ค k) next x = leRecOn hmk next (leRecOn hnm next x)
mโœ, nโœ, kโœ: โ„•

C: โ„• โ†’ Sort u

n, m, k: โ„•

hnm: n โ‰ค m

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


refl
leRecOn (_ : n โ‰ค m) next x = leRecOn (_ : Nat.le m m) next (leRecOn hnm next x)
mโœ, nโœ, kโœยน: โ„•

C: โ„• โ†’ Sort u

n, m, kโœ: โ„•

hnm: n โ‰ค m

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n

k: โ„•

hmk: Nat.le m k

ih: leRecOn (_ : n โ‰ค k) next x = leRecOn hmk next (leRecOn hnm next x)


step
leRecOn (_ : n โ‰ค succ k) next x = leRecOn (_ : Nat.le m (succ k)) next (leRecOn hnm next x)
mโœ, nโœ, kโœ: โ„•

C: โ„• โ†’ Sort u

n, m, k: โ„•

hnm: n โ‰ค m

hmk: m โ‰ค k

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn (_ : n โ‰ค k) next x = leRecOn hmk next (leRecOn hnm next x)
mโœ, nโœ, kโœ: โ„•

C: โ„• โ†’ Sort u

n, m, k: โ„•

hnm: n โ‰ค m

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


refl
leRecOn (_ : n โ‰ค m) next x = leRecOn (_ : Nat.le m m) next (leRecOn hnm next x)
mโœ, nโœ, kโœ: โ„•

C: โ„• โ†’ Sort u

n, m, k: โ„•

hnm: n โ‰ค m

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


refl
leRecOn (_ : n โ‰ค m) next x = leRecOn (_ : Nat.le m m) next (leRecOn hnm next x)
mโœ, nโœ, kโœยน: โ„•

C: โ„• โ†’ Sort u

n, m, kโœ: โ„•

hnm: n โ‰ค m

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n

k: โ„•

hmk: Nat.le m k

ih: leRecOn (_ : n โ‰ค k) next x = leRecOn hmk next (leRecOn hnm next x)


step
leRecOn (_ : n โ‰ค succ k) next x = leRecOn (_ : Nat.le m (succ k)) next (leRecOn hnm next x)
mโœ, nโœ, kโœ: โ„•

C: โ„• โ†’ Sort u

n, m, k: โ„•

hnm: n โ‰ค m

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


refl
leRecOn (_ : n โ‰ค m) next x = leRecOn (_ : Nat.le m m) next (leRecOn hnm next x)
mโœ, nโœ, kโœ: โ„•

C: โ„• โ†’ Sort u

n, m, k: โ„•

hnm: n โ‰ค m

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


refl
leRecOn (_ : n โ‰ค m) next x = leRecOn hnm next x

Goals accomplished! ๐Ÿ™
mโœ, nโœ, kโœ: โ„•

C: โ„• โ†’ Sort u

n, m, k: โ„•

hnm: n โ‰ค m

hmk: m โ‰ค k

next: {k : โ„•} โ†’ C k โ†’ C (k + 1)

x: C n


leRecOn (_ : n โ‰ค k) next x = leRecOn hmk next (leRecOn hnm next x)
mโœ, nโœ, kโœยน: โ„•

C: โ„• โ†’ Sort u

n, m, kโœ: โ„•

hnm: n