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:
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 #
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_lefttoNat.pow_le_pow_left, protect it, remove the alias - Rename
Nat.pow_le_pow_of_le_righttoNat.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 = ⋯.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 = ⋯.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
- n.strongRecOn' 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 m.succ n.succ = H m n (Nat.pincerRecursion Ha0 H0b H m n.succ) (Nat.pincerRecursion Ha0 H0b H m.succ 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 #
dvd is injective in the left argument
sqrt #
See [Wikipedia, Methods of computing square roots] (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Binary_numeral_system_(base_2)).
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 n.succ = if P (n + 1) then n + 1 else Nat.findGreatest P n