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
Implementation note #
Std has a home-baked development of the algebraic and order theoretic theory of ℕ
which, in
particular, is not typeclass-mediated. This is useful to set up the algebra and finiteness libraries
in mathlib (naturals show up as indices in lists, cardinality in finsets, powers in groups, ...).
This home-baked development is pursued in this file.
Less basic uses of ℕ
should however use the typeclass-mediated development. Data.Nat.Basic
gives
access to the algebraic instances. Data.Nat.Order.Basic
is the one giving access to the algebraic
order instances.
TODO #
The names of this file, Data.Nat.Basic
and Data.Nat.Order.Basic
are archaic and don't match up
with reality anymore. Rename them.
succ
, pred
#
Alias of Nat.succ_le_of_lt
.
pred
#
add
#
sub
#
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
.
Equations
- Nat.leRecOn' H x x_1 = Eq.recOn ⋯ x_1
- Nat.leRecOn' H x x_1 = Or.by_cases ⋯ (fun (h : n ≤ m) => x h (Nat.leRecOn' h x x_1)) fun (h : n = m + 1) => Eq.recOn h x_1
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.leRecOn'
.
Equations
- Nat.leRecOn H x x_1 = Eq.recOn ⋯ x_1
- Nat.leRecOn H x x_1 = Or.by_cases ⋯ (fun (h : n ≤ m) => x (Nat.leRecOn h (fun {k : ℕ} => x) x_1)) fun (h : n = m + 1) => Eq.recOn h x_1
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
- Nat.strongRecOn' n h = Nat.strongRec' h n
Instances For
Induction principle starting at a non-zero number. For maps to a Sort*
see leRecOn
.
To use in an induction proof, the syntax is induction n, hn using Nat.le_induction
(or the same
for induction'
).
Decreasing induction: if P (k+1)
implies P k
, then P n
implies P m
for all m ≤ n
.
Also works for functions to Sort*
. For m version assuming only the assumption for k < n
, see
decreasing_induction'
.
Equations
- Nat.decreasingInduction h mn hP = Nat.leRecOn mn (fun {k : ℕ} (ih : P k → P m) (hsk : P (k + 1)) => ih (h k hsk)) (fun (h : P m) => h) hP
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 (Nat.succ m) (Nat.succ n) = H m n (Nat.pincerRecursion Ha0 H0b H m (Nat.succ n)) (Nat.pincerRecursion Ha0 H0b H (Nat.succ m) n)
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 decreasing_induction
.
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
#
find
#
Nat.findGreatest P n
is the largest i ≤ bound
such that P i
holds, or 0
if no such i
exists
Equations
- Nat.findGreatest P 0 = 0
- Nat.findGreatest P (Nat.succ n) = if P (n + 1) then n + 1 else Nat.findGreatest P n
Instances For
Decidability of predicates #
Equations
- Nat.decidableLoHi lo hi P = decidable_of_iff (∀ (x : ℕ), x < hi - lo → P (lo + x)) ⋯
Equations
- Nat.decidableLoHiLe lo hi P = decidable_of_iff (∀ (x : ℕ), lo ≤ x → x < hi + 1 → P x) ⋯