Documentation

Mathlib.Data.PNat.Defs

The positive natural numbers #

This file contains the definitions, and basic results. Most algebraic facts are deferred to Data.PNat.Basic, as they need more imports.

@[simp]
theorem PNat.mk_coe (n : ) (h : 0 < n) :
n, h = n
def PNat.natPred (i : ℕ+) :

Predecessor of a ℕ+, as a .

Equations
    Instances For
      @[simp]
      theorem PNat.natPred_eq_pred {n : } (h : 0 < n) :
      def Nat.toPNat (n : ) (h : 0 < n := by decide) :

      Convert a natural number to a positive natural number. The positivity assumption is inferred by dec_trivial.

      Equations
        Instances For
          def Nat.succPNat (n : ) :

          Write a successor as an element of ℕ+.

          Equations
            Instances For
              @[simp]
              theorem Nat.succPNat_coe (n : ) :
              n.succPNat = n.succ
              def Nat.toPNat' (n : ) :

              Convert a natural number to a PNat. n+1 is mapped to itself, and 0 becomes 1.

              Equations
                Instances For
                  @[simp]
                  theorem Nat.toPNat'_coe (n : ) :
                  n.toPNat' = if 0 < n then n else 1
                  theorem PNat.mk_le_mk (n k : ) (hn : 0 < n) (hk : 0 < k) :
                  n, hn k, hk n k

                  We now define a long list of structures on ℕ+ induced by similar structures on ℕ. Most of these behave in a completely obvious way, but there are a few things to be said about subtraction, division and powers.

                  theorem PNat.mk_lt_mk (n k : ) (hn : 0 < n) (hk : 0 < k) :
                  n, hn < k, hk n < k
                  @[simp]
                  theorem PNat.coe_le_coe (n k : ℕ+) :
                  n k n k
                  @[simp]
                  theorem PNat.coe_lt_coe (n k : ℕ+) :
                  n < k n < k
                  @[simp]
                  theorem PNat.pos (n : ℕ+) :
                  0 < n
                  theorem PNat.eq {m n : ℕ+} :
                  m = nm = n
                  @[simp]
                  theorem PNat.ne_zero (n : ℕ+) :
                  n 0
                  theorem PNat.toPNat'_coe {n : } :
                  0 < nn.toPNat' = n
                  @[simp]
                  theorem PNat.coe_toPNat' (n : ℕ+) :
                  (↑n).toPNat' = n
                  @[simp]
                  theorem PNat.one_le (n : ℕ+) :
                  1 n
                  @[simp]
                  theorem PNat.not_lt_one (n : ℕ+) :
                  ¬n < 1
                  @[simp]
                  theorem PNat.mk_one {h : 0 < 1} :
                  1, h = 1
                  @[simp]
                  theorem PNat.coe_eq_one_iff {m : ℕ+} :
                  m = 1 m = 1
                  @[irreducible]
                  def PNat.strongInductionOn {p : ℕ+Sort u_1} (n : ℕ+) :
                  ((k : ℕ+) → ((m : ℕ+) → m < kp m)p k)p n

                  Strong induction on ℕ+.

                  Equations
                    Instances For
                      def PNat.modDivAux :
                      ℕ+ℕ+ ×

                      We define m % k and m / k in the same way as for except that when m = n * k we take m % k = k and m / k = n - 1. This ensures that m % k is always positive and m = (m % k) + k * (m / k) in all cases. Later we define a function div_exact which gives the usual m / k in the case where k divides m.

                      Equations
                        Instances For
                          def PNat.modDiv (m k : ℕ+) :

                          mod_div m k = (m % k, m / k). We define m % k and m / k in the same way as for except that when m = n * k we take m % k = k and m / k = n - 1. This ensures that m % k is always positive and m = (m % k) + k * (m / k) in all cases. Later we define a function div_exact which gives the usual m / k in the case where k divides m.

                          Equations
                            Instances For
                              def PNat.mod (m k : ℕ+) :

                              We define m % k in the same way as for except that when m = n * k we take m % k = k This ensures that m % k is always positive.

                              Equations
                                Instances For
                                  def PNat.div (m k : ℕ+) :

                                  We define m / k in the same way as for except that when m = n * k we take m / k = n - 1. This ensures that m = (m % k) + k * (m / k) in all cases. Later we define a function div_exact which gives the usual m / k in the case where k divides m.

                                  Equations
                                    Instances For
                                      theorem PNat.mod_coe (m k : ℕ+) :
                                      (m.mod k) = if m % k = 0 then k else m % k
                                      theorem PNat.div_coe (m k : ℕ+) :
                                      m.div k = if m % k = 0 then (m / k).pred else m / k
                                      def PNat.divExact (m k : ℕ+) :

                                      If h : k | m, then k * (div_exact m k) = m. Note that this is not equal to m / k.

                                      Equations
                                        Instances For
                                          instance Int.canLiftPNat :
                                          CanLift ℕ+ (fun (x : ℕ+) => x) fun (x : ) => 0 < x