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
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.
succ
, pred
#
Alias of Nat.succ_le_of_lt
.
pred
#
add
#
mul
#
div
#
A version of Nat.div_lt_self
using successors, rather than additional hypotheses.
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
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