Documentation

LeanPool.ZFLean.Naturals

ZFC Natural numbers #

This file defines the natural numbers in ZF set theory. The definition is based on the construction of the Von Neumann ordinals, where each natural number is represented as the set of all smaller natural numbers.

The set of all natural numbers is defined as the smallest inductive set. Because of the axiom of separation, the definition relies on the existence of an infinite set, which is provided by the someInf constant. It can be shown that the choice of someInf does not affect the definition of the natural numbers and leads to isomorphic definitions.

The file also includes the definition of the ZFNat type for ZF natural numbers, and provides various properties and usual arithmetic operations on natural numbers.

Preliminary definitions #

A set x is transitive if every element of x is a subset of x: ∀ y ∈ x, y ⊆ x.

Equations
Instances For

    An inductive set is defined as a set that contains the empty set ∅ and is closed under successor.

    The "successor" of a set x is defined as the insertion of x into itself.

    Equations
    Instances For
      theorem ZFSet.inductive_sep {S : ZFSet.{u_1}} (P : ZFSet.{u_1} → Prop) (ind : S.inductiveSet) (h₀ : P ∅) (h₁ : ∀ n ∈ S, P n → P (insert n n)) :

      Imported ZFLean declaration.

      Equations
      Instances For

        The first Von Neumann ordinal ω is an inductive set.

        @[reducible, inline]
        noncomputable abbrev ZFSet.someInf :

        Witness for an infinite set, meant to be used for definitional purpose only.

        Equations
        Instances For

          Natural numbers #

          noncomputable def ZFSet.Nat :

          The set of natural numbers Nat is defined as the smallest inductive set. This definition avoids the use of ω, even though ω may be thought of as ℕ.

          Equations
          Instances For
            @[reducible, inline]
            abbrev ZFSet.ZFNat :
            Type (u_1 + 1)

            The type of natural numbers ZFNat is defined as the subtype of Nat.

            Equations
            Instances For

              Nat is an infinite inductive set.

              @[instance_reducible]
              Equations
              @[instance_reducible]
              Equations
              theorem ZFSet.ZFNat.zero_lt_ne_zero {n : ZFNat} :
              0 < n → n ≠ 0

              Any inductive set contains zero.

              theorem ZFSet.ZFNat.insert_mem_inductive {a n : ZFSet.{u_1}} (h : a.inductiveSet) (h' : n ∈ a) :
              insert n n ∈ a

              Any inductive set containing an element also contains its successor.

              Any inductive set is a subset of someInf.

              The successor function succ is build from the insertion of a set into itself embedded into the ZFNat type.

              Equations
              Instances For
                @[instance_reducible]
                Equations
                theorem ZFSet.ZFNat.succ_inj_aux {m n a : ZFSet.{u_1}} (h : insert m m = insert n n) (h' : a ∈ m) :
                a ∈ n
                theorem ZFSet.ZFNat.succ_inj_aux' {m n : ZFSet.{u_1}} (h : insert m m = insert n n) :
                m = n
                theorem ZFSet.ZFNat.succ_inj {m n : ZFNat} (h : m.succ = n.succ) :
                m = n
                theorem ZFSet.ZFNat.sep_of_ind_is_ind (P : ZFSet.{u_1} → Prop) {a : ZFSet.{u_1}} (h : a.inductiveSet) (h₀ : P ∅) (ih : ∀ n ∈ a, P n → P (insert n n)) :

                Any inductive set a separated by an inductive predicate P is inductive.

                Recursion on natural numbers #

                theorem ZFSet.ZFNat.succ_subrelation_mem' :
                Subrelation (fun (x y : ZFSet.{u_1}) => insert x x = y) fun (x y : ZFSet.{u_1}) => x ∈ y
                theorem ZFSet.ZFNat.mem_wf' :
                WellFounded fun (x1 x2 : ZFNat) => ↑x1 ∈ ↑x2
                theorem ZFSet.ZFNat.succ_subrelation_mem :
                Subrelation (fun (x1 x2 : ZFNat) => x1.succ = x2) fun (x1 x2 : ZFNat) => ↑x1 ∈ ↑x2

                The relation built over the successor function is a subrelation of the membership relation.

                theorem ZFSet.ZFNat.succ_wf :
                WellFounded fun (x1 x2 : ZFNat) => x1.succ = x2
                theorem ZFSet.ZFNat.ind {P : ZFSet.{u_1} → Prop} (n : ZFSet.{u_1}) (h : n ∈ Nat) (zero : P ∅) (succ : ∀ n ∈ Nat, P n → P (insert n n)) :
                P n

                The induction principle for sets in Nat. This principle is meant to be used for definitional purposes only.

                theorem ZFSet.ZFNat.induction {P : ZFNat → Prop} (n : ZFNat) (zero : P 0) (succ : ∀ (n : ZFNat), P n → P n.succ) :
                P n

                The (weak) induction principle for natural numbers.

                theorem ZFSet.ZFNat.cases {P : ZFNat → Prop} (n : ZFNat) (zero : P 0) (succ : ∀ (n : ZFNat), P n.succ) :
                P n
                theorem ZFSet.ZFNat.lt_trans {x y z : ZFNat} :
                x < y → y < z → x < z
                theorem ZFSet.ZFNat.lt_imp_ne {n m : ZFNat} :
                n < m → n ≠ m
                theorem ZFSet.ZFNat.le_trans {x y z : ZFNat} :
                x ≤ y → y ≤ z → x ≤ z
                theorem ZFSet.ZFNat.le_antisymm {x y : ZFNat} :
                x ≤ y → y ≤ x → x = y
                theorem ZFSet.ZFNat.lt_le_iff {n m : ZFNat} :
                n ≤ m ↔ n < m.succ
                theorem ZFSet.ZFNat.lt_mono {x y : ZFNat} :
                x < y → x.succ < y.succ
                theorem ZFSet.ZFNat.succ_lt_mono {x y : ZFNat} :
                x.succ < y.succ → x < y
                theorem ZFSet.ZFNat.le_mono {x y : ZFNat} :
                x ≤ y → x.succ ≤ y.succ
                theorem ZFSet.ZFNat.succ_le_mono {x y : ZFNat} :
                x.succ ≤ y.succ → x ≤ y
                theorem ZFSet.ZFNat.le_lt_iff {n m : ZFNat} :
                n.succ ≤ m ↔ n < m
                theorem ZFSet.ZFNat.le_total {x y : ZFNat} :
                x ≤ y ∨ y ≤ x
                theorem ZFSet.ZFNat.strong_induction {P : ZFNat → Prop} (n : ZFNat) (ind : ∀ (n : ZFNat), (∀ m < n, P m) → P n) :
                P n

                The (strong) induction principle for natural numbers.

                theorem ZFSet.ZFNat.not_zero_imp_succ {n : ZFNat} :
                n ≠ 0 → ∃ (m : ZFNat), n = m.succ

                The predecessor function on natural numbers, defined directly as the union of a set.

                Equations
                Instances For
                  theorem ZFSet.ZFNat.pred_eq (n : ZFNat) :
                  n.pred = ⟨(↑n).sUnion, ⋯⟩
                  @[simp]
                  @[simp]
                  @[simp]
                  @[simp]
                  theorem ZFSet.ZFNat.succ_pred {n : ZFNat} (h : n ≠ 0) :
                  n.pred.succ = n
                  noncomputable def ZFSet.ZFNat.rec' {motive : ZFSet.{u_1} → Sort u} (n : ZFSet.{u_1}) (h : n ∈ Nat) (zero : motive ∅) (succ : (x : ZFSet.{u_1}) → x ∈ Nat → motive x → motive (insert x x)) :
                  motive n

                  The recursion principle for sets in Nat. This principle is meant to be used for definitional purposes only.

                  Equations
                  • One or more equations did not get rendered due to their size.
                  Instances For
                    theorem ZFSet.ZFNat.rec'_zero {motive : ZFSet.{u_1} → Sort u} (zero : motive ∅) (succ : (x : ZFSet.{u_1}) → x ∈ Nat → motive x → motive (insert x x)) :
                    rec' ∅ zero_in_Nat zero succ = zero

                    Provides the base case of the recursion principle for sets in Nat.

                    theorem ZFSet.ZFNat.rec'_succ {motive : ZFSet.{u_1} → Sort u} (n : ZFSet.{u_1}) (n_Nat : n ∈ Nat) (zero : motive ∅) (succ : (x : ZFSet.{u_1}) → x ∈ Nat → motive x → motive (insert x x)) :
                    rec' (insert n n) ⋯ zero succ = succ n n_Nat (rec' n n_Nat zero succ)

                    Provides the inductive step of the recursion principle for sets in Nat.

                    noncomputable def ZFSet.ZFNat.rec {motive : ZFNat → Sort u} (n : ZFNat) (zero : motive 0) (succ : (x : ZFNat) → motive x → motive x.succ) :
                    motive n

                    The recursion principle for natural numbers. This recursor allows inductive definitions over natural numbers to be defined in a more natural way.

                    Equations
                    • One or more equations did not get rendered due to their size.
                    Instances For
                      theorem ZFSet.ZFNat.induction_is_rec_into_Prop {motive : ZFNat → Prop} :
                      ⋯ = ⋯

                      The induction principle of ZFNat is a universe-specialized version of the recursion principle.

                      theorem ZFSet.ZFNat.rec_zero {motive : ZFNat → Sort u} (zero : motive 0) (succ : (x : ZFNat) → motive x → motive x.succ) :
                      rec 0 zero succ = zero
                      theorem ZFSet.ZFNat.rec_succ {motive : ZFNat → Sort u} (n : ZFNat) (zero : motive 0) (succ' : (x : ZFNat) → motive x → motive x.succ) :
                      rec n.succ zero succ' = succ' n (rec n zero succ')
                      @[reducible, inline]
                      noncomputable abbrev ZFSet.ZFNat.pred' (m : ZFNat) :

                      The predecessor function pred' on natural numbers, defined inductively. This definition is equivalent to pred, as proven by pred'_eq_pred.

                      Equations
                      Instances For

                        The definitions of pred and pred' are equivalent.

                        Arithmetic #

                        theorem ZFSet.ZFNat.pos_of_ne_zero {n : ZFNat} :
                        0 ≠ n → 0 < n
                        @[instance_reducible]
                        Equations
                        @[instance_reducible]
                        Equations
                        • One or more equations did not get rendered due to their size.
                        @[reducible, inline]
                        noncomputable abbrev ZFSet.ZFNat.add (n : ZFNat) (m : ZFNat) :

                        The addition function on natural numbers, defined inductively.

                        Equations
                        Instances For
                          @[instance_reducible]
                          noncomputable instance ZFSet.ZFNat.addInst :
                          Equations
                          theorem ZFSet.ZFNat.addInst_eq {n m : ZFNat} :
                          n + m = n.add m
                          theorem ZFSet.ZFNat.add_zero {n : ZFNat} :
                          n + 0 = n
                          theorem ZFSet.ZFNat.zero_add {n : ZFNat} :
                          0 + n = n
                          theorem ZFSet.ZFNat.add_succ {n m : ZFNat} :
                          n.succ + m = (n + m).succ
                          theorem ZFSet.ZFNat.succ_add {n m : ZFNat} :
                          (n + m).succ = n + m.succ
                          theorem ZFSet.ZFNat.add_comm (n m : ZFNat) :
                          n + m = m + n
                          @[simp]
                          theorem ZFSet.ZFNat.add_assoc (n m k : ZFNat) :
                          n + (m + k) = n + m + k
                          theorem ZFSet.ZFNat.add_left_comm (n m k : ZFNat) :
                          n + (m + k) = m + (n + k)
                          theorem ZFSet.ZFNat.add_right_comm (n m k : ZFNat) :
                          n + m + k = n + k + m
                          theorem ZFSet.ZFNat.add_left_cancel {n m k : ZFNat} :
                          n + m = n + k ↔ m = k
                          theorem ZFSet.ZFNat.add_right_cancel {n m k : ZFNat} :
                          n + m = k + m ↔ n = k
                          theorem ZFSet.ZFNat.eq_zero_of_add_eq_zero {n m : ZFNat} :
                          n + m = 0 → n = 0 ∧ m = 0
                          theorem ZFSet.ZFNat.eq_zero_of_add_eq_zero_left {n m : ZFNat} (h : n + m = 0) :
                          m = 0
                          @[simp]
                          theorem ZFSet.ZFNat.add_left_eq_self {a b : ZFNat} :
                          a + b = b ↔ a = 0
                          theorem ZFSet.ZFNat.add_right_eq_self {a b : ZFNat} :
                          a + b = a ↔ b = 0
                          theorem ZFSet.ZFNat.self_eq_add_right {a b : ZFNat} :
                          a = a + b ↔ b = 0
                          @[simp]
                          theorem ZFSet.ZFNat.self_eq_add_left {a b : ZFNat} :
                          a = b + a ↔ b = 0
                          theorem ZFSet.ZFNat.lt_of_succ_le {n m : ZFNat} (h : n.succ ≤ m) :
                          n < m
                          theorem ZFSet.ZFNat.succ_le_of_lt {n m : ZFNat} (h : n < m) :
                          n.succ ≤ m
                          theorem ZFSet.ZFNat.le.dest {n m : ZFNat} :
                          n ≤ m → ∃ (k : ZFNat), n + k = m
                          theorem ZFSet.ZFNat.le_succ_of_le {n m : ZFNat} (h : n ≤ m) :
                          n ≤ m.succ
                          @[simp]
                          theorem ZFSet.ZFNat.le_add_right (n k : ZFNat) :
                          n ≤ n + k
                          @[simp]
                          theorem ZFSet.ZFNat.le_add_left (n m : ZFNat) :
                          n ≤ m + n
                          theorem ZFSet.ZFNat.le.intro {n m k : ZFNat} (h : n + k = m) :
                          n ≤ m
                          theorem ZFSet.ZFNat.le_of_add_le_add_left {a b c : ZFNat} (h : a + b ≤ a + c) :
                          b ≤ c
                          theorem ZFSet.ZFNat.add_le_add_left {n m : ZFNat} (h : n ≤ m) (k : ZFNat) :
                          k + n ≤ k + m
                          @[simp]
                          theorem ZFSet.ZFNat.add_le_add_iff_left {n m k : ZFNat} :
                          n + m ≤ n + k ↔ m ≤ k
                          theorem ZFSet.ZFNat.lt_of_add_lt_add_right {n m k : ZFNat} :
                          k + n < m + n → k < m
                          theorem ZFSet.ZFNat.add_lt_add_left {n m : ZFNat} (h : n < m) (k : ZFNat) :
                          k + n < k + m
                          theorem ZFSet.ZFNat.add_lt_add_right {n m : ZFNat} (h : n < m) (k : ZFNat) :
                          n + k < m + k
                          theorem ZFSet.ZFNat.lt_add_of_pos_right {n k : ZFNat} (h : 0 < k) :
                          n < n + k
                          theorem ZFSet.ZFNat.lt_of_add_lt_add_left {n m k : ZFNat} :
                          n + k < n + m → k < m
                          @[simp]
                          theorem ZFSet.ZFNat.add_lt_add_iff_left {k n m : ZFNat} :
                          k + n < k + m ↔ n < m
                          @[simp]
                          theorem ZFSet.ZFNat.add_lt_add_iff_right {k n m : ZFNat} :
                          n + k < m + k ↔ n < m
                          theorem ZFSet.ZFNat.add_le_add_right {n m : ZFNat} (h : n ≤ m) (k : ZFNat) :
                          n + k ≤ m + k
                          theorem ZFSet.ZFNat.add_lt_add_of_le_of_lt {a b c d : ZFNat} (hle : a ≤ b) (hlt : c < d) :
                          a + c < b + d
                          theorem ZFSet.ZFNat.add_lt_add_of_lt_of_le {a b c d : ZFNat} (hlt : a < b) (hle : c ≤ d) :
                          a + c < b + d
                          theorem ZFSet.ZFNat.lt_add_of_pos_left {k n : ZFNat} :
                          0 < k → n < k + n
                          theorem ZFSet.ZFNat.pos_of_lt_add_right {n k : ZFNat} (h : n < n + k) :
                          0 < k
                          theorem ZFSet.ZFNat.pos_of_lt_add_left {n k : ZFNat} :
                          n < k + n → 0 < k
                          @[simp]
                          theorem ZFSet.ZFNat.lt_add_right_iff_pos {n k : ZFNat} :
                          n < n + k ↔ 0 < k
                          @[simp]
                          theorem ZFSet.ZFNat.lt_add_left_iff_pos {n k : ZFNat} :
                          n < k + n ↔ 0 < k
                          theorem ZFSet.ZFNat.add_pos_left {m : ZFNat} (h : 0 < m) (n : ZFNat) :
                          0 < m + n
                          theorem ZFSet.ZFNat.add_pos_right {n : ZFNat} (m : ZFNat) (h : 0 < n) :
                          0 < m + n
                          theorem ZFSet.ZFNat.pred_le_pred {n m : ZFNat} :
                          n ≤ m → n.pred ≤ m.pred
                          theorem ZFSet.ZFNat.lt_of_succ_lt_succ {n m : ZFNat} :
                          n.succ < m.succ → n < m
                          @[reducible, inline]
                          noncomputable abbrev ZFSet.ZFNat.sub (n : ZFNat) (m : ZFNat) :

                          Natural-number subtraction in the ZF natural model.

                          Equations
                          Instances For
                            @[instance_reducible]
                            noncomputable instance ZFSet.ZFNat.subInst :

                            Imported ZFLean declaration.

                            Equations
                            theorem ZFSet.ZFNat.subInst_eq {n m : ZFNat} :
                            n - m = n.sub m
                            theorem ZFSet.ZFNat.sub_zero {n : ZFNat} :
                            n - 0 = n
                            theorem ZFSet.ZFNat.succ_mono {n m : ZFNat} :
                            n < m ↔ n.succ < m.succ
                            theorem ZFSet.ZFNat.sub_succ (n m : ZFNat) :
                            n - m.succ = (n - m).pred
                            theorem ZFSet.ZFNat.zero_sub {n : ZFNat} :
                            0 - n = 0
                            theorem ZFSet.ZFNat.sub_self {n : ZFNat} :
                            n - n = 0
                            theorem ZFSet.ZFNat.sub_add_distrib {n m k : ZFNat} :
                            n - (m + k) = n - m - k
                            theorem ZFSet.ZFNat.sub_ne_zero_of_lt {a b : ZFNat} :
                            a < b → b - a ≠ 0
                            theorem ZFSet.ZFNat.le_of_succ_le {n m : ZFNat} :
                            n.succ ≤ m → n ≤ m
                            theorem ZFSet.ZFNat.lt_of_succ_lt {n m : ZFNat} (h : n.succ < m) :
                            n < m
                            theorem ZFSet.ZFNat.le_of_lt {n m : ZFNat} :
                            n < m → n ≤ m
                            theorem ZFSet.ZFNat.add_sub_of_le {a b : ZFNat} (h : a ≤ b) :
                            a + (b - a) = b
                            theorem ZFSet.ZFNat.sub_one_cancel {a b : ZFNat} :
                            0 < a → 0 < b → a - 1 = b - 1 → a = b
                            theorem ZFSet.ZFNat.sub_add_cancel {n m : ZFNat} (h : m ≤ n) :
                            n - m + m = n
                            theorem ZFSet.ZFNat.add_sub_add_right (n k m : ZFNat) :
                            n + k - (m + k) = n - m
                            theorem ZFSet.ZFNat.add_sub_add_left (k n m : ZFNat) :
                            k + n - (k + m) = n - m
                            theorem ZFSet.ZFNat.add_sub_cancel (n m : ZFNat) :
                            n + m - m = n
                            theorem ZFSet.ZFNat.add_sub_assoc {m k : ZFNat} (h : k ≤ m) (n : ZFNat) :
                            n + m - k = n + (m - k)
                            theorem ZFSet.ZFNat.eq_add_of_sub_eq {a b c : ZFNat} (hle : b ≤ a) (h : a - b = c) :
                            a = c + b
                            theorem ZFSet.ZFNat.sub_eq_of_eq_add {a b c : ZFNat} (h : a = c + b) :
                            a - b = c
                            theorem ZFSet.ZFNat.add_eq_add_sub_eq_sub {a b c d : ZFNat} :
                            a + b = c + d → a - c = d - b
                            theorem ZFSet.ZFNat.sub_factor {m k n : ZFNat} :
                            k ≤ m → m ≤ n → n - m + k = n - (m - k)
                            theorem ZFSet.ZFNat.sub_add_comm {m n k : ZFNat} (h : m ≤ n) :
                            n - m + k = n + k - m
                            theorem ZFSet.ZFNat.succ_le_succ {n m : ZFNat} :
                            n ≤ m → n.succ ≤ m.succ
                            theorem ZFSet.ZFNat.le_zero_imp_eq {n : ZFNat} :
                            n ≤ 0 → n = 0
                            @[reducible, inline]
                            noncomputable abbrev ZFSet.ZFNat.mul (n : ZFNat) (m : ZFNat) :

                            The multiplication function on natural numbers, defined inductively.

                            Equations
                            Instances For
                              @[instance_reducible]
                              noncomputable instance ZFSet.ZFNat.mulInst :
                              Equations
                              theorem ZFSet.ZFNat.mulInst_eq {n m : ZFNat} :
                              n * m = n.mul m
                              theorem ZFSet.ZFNat.mul_zero {n : ZFNat} :
                              n * 0 = 0
                              theorem ZFSet.ZFNat.zero_mul {n : ZFNat} :
                              0 * n = 0
                              theorem ZFSet.ZFNat.mul_one {n : ZFNat} :
                              n * 1 = n
                              theorem ZFSet.ZFNat.one_mul {n : ZFNat} :
                              1 * n = n
                              theorem ZFSet.ZFNat.mul_succ {n m : ZFNat} :
                              (n + 1) * m = n * m + m
                              theorem ZFSet.ZFNat.succ_mul {n m : ZFNat} :
                              n.succ * m = n * m + m
                              theorem ZFSet.ZFNat.left_distrib {n m k : ZFNat} :
                              n * (m + k) = n * m + n * k
                              theorem ZFSet.ZFNat.mul_comm (n m : ZFNat) :
                              n * m = m * n
                              theorem ZFSet.ZFNat.succ_mul' {n m : ZFNat} :
                              m * n.succ = m * n + m
                              theorem ZFSet.ZFNat.right_distrib {n m k : ZFNat} :
                              (n + m) * k = n * k + m * k
                              theorem ZFSet.ZFNat.mul_assoc (n m k : ZFNat) :
                              n * m * k = n * (m * k)
                              theorem ZFSet.ZFNat.mul_left_comm (n m k : ZFNat) :
                              n * (m * k) = m * (n * k)
                              theorem ZFSet.ZFNat.two_mul (n : ZFNat) :
                              (1 + 1) * n = n + n
                              theorem ZFSet.ZFNat.mul_two (n : ZFNat) :
                              n * (1 + 1) = n + n
                              theorem ZFSet.ZFNat.sub_lt_eq_zero {n m : ZFNat} (h : n ≤ m) :
                              n - m = 0
                              theorem ZFSet.ZFNat.add_lt_trans {n m p q : ZFNat} :
                              n < m → p < q → n + p < m + q
                              theorem ZFSet.ZFNat.pos_mul_pos {k n : ZFNat} (h : 0 < k) :
                              0 < k * n → 0 < n
                              theorem ZFSet.ZFNat.mul_lt_mono {n m k : ZFNat} (h : 0 < k) :
                              n < m → k * n < k * m
                              theorem ZFSet.ZFNat.mul_le_mono {k m n : ZFNat} :
                              n ≤ m → k * n ≤ k * m
                              theorem ZFSet.ZFNat.mul_lt_cancel {k m n : ZFNat} :
                              k * n < k * m → n < m
                              theorem ZFSet.ZFNat.lt_mul_iff {n m k : ZFNat} :
                              n < m ↔ (k + 1) * n < (k + 1) * m
                              theorem ZFSet.ZFNat.left_distrib_mul_sub_one {n m : ZFNat} :
                              n * (m - 1) = n * m - n
                              theorem ZFSet.ZFNat.left_distrib_mul_sub_aux {n m k : ZFNat} (h : k < m) :
                              n * (m - k) = n * m - n * k
                              theorem ZFSet.ZFNat.sub_eq_zero_mul {n a b : ZFNat} :
                              a - b = 0 → n * a - n * b = 0
                              theorem ZFSet.ZFNat.left_distrib_mul_sub {n m k : ZFNat} :
                              n * (m - k) = n * m - n * k
                              theorem ZFSet.ZFNat.right_distrib_mul_sub {n m k : ZFNat} :
                              (m - k) * n = m * n - k * n
                              theorem ZFSet.ZFNat.add_eq_zero_iff {n m : ZFNat} :
                              n + m = 0 ↔ n = 0 ∧ m = 0
                              theorem ZFSet.ZFNat.mul_eq_zero_iff {n m : ZFNat} :
                              n * m = 0 ↔ n = 0 ∨ m = 0
                              theorem ZFSet.ZFNat.eq_le_le_iff {n m : ZFNat} :
                              n = m ↔ n ≤ m ∧ m ≤ n
                              theorem ZFSet.ZFNat.mul_left_cancel_iff {n m k : ZFNat} (k_pos : k ≠ 0) :
                              k * m = k * n ↔ m = n
                              theorem ZFSet.ZFNat.mul_right_cancel_iff {n m k : ZFNat} (k_pos : k ≠ 0) :
                              m * k = n * k ↔ m = n
                              @[reducible, inline]
                              noncomputable abbrev ZFSet.ZFNat.pow (n : ZFNat) (p : ZFNat) :

                              The power function on natural numbers, defined inductively.

                              Equations
                              Instances For
                                @[instance_reducible]
                                noncomputable instance ZFSet.ZFNat.powInst :
                                Equations
                                theorem ZFSet.ZFNat.powInst_eq {n p : ZFNat} :
                                n ^ p = n.pow p
                                theorem ZFSet.ZFNat.pow_zero {n : ZFNat} :
                                n ^ 0 = 1
                                theorem ZFSet.ZFNat.pow_one {n : ZFNat} :
                                n ^ 1 = n
                                theorem ZFSet.ZFNat.induction' {P : ZFNat → Prop} (n : ZFNat) (zero : P 0) (succ : ∀ (n : ZFNat), P n → P (n + 1)) :
                                P n

                                Induction principle for ZFNat, using natural notations.

                                Declared as an induction eliminator.

                                @[reducible, inline]

                                Scalar multiplication by a Lean natural number.

                                Equations
                                Instances For
                                  @[instance_reducible]
                                  noncomputable instance ZFSet.ZFNat.instSemiring :

                                  Imported ZFLean declaration.

                                  Equations
                                  • One or more equations did not get rendered due to their size.
                                  @[instance_reducible]
                                  Equations
                                  noncomputable def ZFSet.ZFNat.toNat (n : ZFNat) :

                                  Converts a ZF natural number to a Lean natural number.

                                  Equations
                                  Instances For
                                    noncomputable def ZFSet.ZFNat.ofNat (n : ℕ) :

                                    Imported ZFLean declaration.

                                    Equations
                                    Instances For
                                      theorem ZFSet.ZFNat.toNat_is_id {n : ℕ} :
                                      (↑n).toNat = n

                                      Nat is an inductive set.

                                      theorem ZFSet.ZFNat.ofNat_inj {n m : ℕ} :
                                      ↑n = ↑m ↔ n = m
                                      theorem ZFSet.ZFNat.toNat_eq (n : ZFNat) :
                                      ↑n.toNat = n

                                      The equivalence between ZF natural numbers and Lean natural numbers.

                                      Equations
                                      • One or more equations did not get rendered due to their size.
                                      Instances For