Basic operations on the natural numbers #
This file contains:
- some basic lemmas about natural numbers
- extra recursors:
leRecOn
,le_induction
: recursion and induction principles starting at non-zero numbersdecreasing_induction
: recursion growing downwardsle_rec_on'
,decreasing_induction'
: versions with slightly weaker assumptionsstrong_rec'
: recursion based on strong inequalities
- decidability instances on predicates about the natural numbers
See note [foundational algebra order theory].
TODO #
Split this file into:
Data.Nat.Init
(or maybeData.Nat.Batteries
?) for lemmas that could go to BatteriesData.Nat.Basic
for the lemmas that require mathlib definitions
Equations
- Nat.instLinearOrder = LinearOrder.mk Nat.le_total inferInstance inferInstance inferInstance Nat.instLinearOrder.proof_1 Nat.instLinearOrder.proof_2 Nat.instLinearOrder.proof_3
succ
, pred
#
Alias of the forward direction of Nat.le_succ_iff
.
pred
#
add
#
Alias of Nat.add_eq
.
sub
#
A version of Nat.sub_succ
in the form _ - 1
instead of Nat.pred _
.
mul
#
div
#
A version of Nat.div_lt_self
using successors, rather than additional hypotheses.
pow
#
TODO #
- Rename
Nat.pow_le_pow_of_le_left
toNat.pow_le_pow_left
, protect it, remove the alias - Rename
Nat.pow_le_pow_of_le_right
toNat.pow_le_pow_right
, protect it, remove the alias
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.
Recursion starting at a non-zero number: given a map C k → C (k+1)
for each k ≥ n
,
there is a map from C n
to each C m
, n ≤ m
.
This is a version of Nat.le.rec
that works for Sort u
.
Similarly to Nat.le.rec
, it can be used as
induction hle using Nat.leRec with
| refl => sorry
| le_succ_of_le hle ih => sorry
Equations
- One or more equations did not get rendered due to their size.
Instances For
Recursion starting at a non-zero number: given a map C k → C (k+1)
for each k ≥ n
,
there is a map from C n
to each C m
, n ≤ m
.
Prefer Nat.leRec
, which can be used as induction h using Nat.leRec
.
Equations
- Nat.leRecOn' h of_succ self = Nat.leRec self of_succ h
Instances For
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 Nat.leRec
.
Equations
- Nat.leRecOn h of_succ self = Nat.leRec self (fun (x : ℕ) (x_1 : n ≤ x) => of_succ) h
Instances For
Recursion principle based on <
.
Equations
- Nat.strongRec' H x = H x fun (m : ℕ) (x : m < x) => Nat.strongRec' H m
Instances For
Recursion principle based on <
applied to some natural number.
Equations
- n.strongRecOn' h = Nat.strongRec' h n
Instances For
Induction principle starting at a non-zero number.
To use in an induction proof, the syntax is induction n, hn using Nat.le_induction
(or the same
for induction'
).
This is an alias of Nat.leRec
, specialized to Prop
.
Induction principle deriving the next case from the two previous ones.
Equations
- Nat.twoStepInduction zero one more 0 = zero
- Nat.twoStepInduction zero one more 1 = one
- Nat.twoStepInduction zero one more n.succ.succ = more n (Nat.twoStepInduction zero one more n) (Nat.twoStepInduction zero one more (n + 1))
Instances For
Decreasing induction: if P (k+1)
implies P k
for all k < n
, then P n
implies P m
for
all m ≤ n
.
Also works for functions to Sort*
.
For a version also assuming m ≤ k
, see Nat.decreasingInduction'
.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Given P : ℕ → ℕ → Sort*
, if for all m n : ℕ
we can extend P
from the rectangle
strictly below (m, n)
to P m n
, then we have P n m
for all n m : ℕ
.
Note that for non-Prop
output it is preferable to use the equation compiler directly if possible,
since this produces equation lemmas.
Equations
- Nat.strongSubRecursion H x✝ x = H x✝ x fun (x_1 y : ℕ) (x_2 : x_1 < x✝) (x : y < x) => Nat.strongSubRecursion H x_1 y
Instances For
Given P : ℕ → ℕ → Sort*
, if we have P m 0
and P 0 n
for all m n : ℕ
, and for any
m n : ℕ
we can extend P
from (m, n + 1)
and (m + 1, n)
to (m + 1, n + 1)
then we have
P m n
for all m n : ℕ
.
Note that for non-Prop
output it is preferable to use the equation compiler directly if possible,
since this produces equation lemmas.
Equations
- Nat.pincerRecursion Ha0 H0b H x 0 = Ha0 x
- Nat.pincerRecursion Ha0 H0b H 0 x = H0b x
- Nat.pincerRecursion Ha0 H0b H n.succ n_1.succ = H n n_1 (Nat.pincerRecursion Ha0 H0b H n n_1.succ) (Nat.pincerRecursion Ha0 H0b H n.succ n_1)
Instances For
Decreasing induction: if P (k+1)
implies P k
for all m ≤ k < n
, then P n
implies P m
.
Also works for functions to Sort*
.
Weakens the assumptions of Nat.decreasingInduction
.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Given a predicate on two naturals P : ℕ → ℕ → Prop
, P a b
is true for all a < b
if
P (a + 1) (a + 1)
is true for all a
, P 0 (b + 1)
is true for all b
and for all
a < b
, P (a + 1) b
is true and P a (b + 1)
is true implies P (a + 1) (b + 1)
is true.
mod
, dvd
#
dvd
is injective in the left argument