Documentation

Foundation.Vorspiel.Arith

theorem Nat.pos_of_eq_one {n : } (h : n = 1) :
0 < n
def Nat.isEqNat (n m : ) :
Equations
  • n.isEqNat m = if n = m then 1 else 0
def Nat.isLtNat (n m : ) :
Equations
  • n.isLtNat m = if n < m then 1 else 0
def Nat.isLeNat (n m : ) :
Equations
  • n.isLeNat m = if n m then 1 else 0
def Nat.isDvdNat (n m : ) :
Equations
  • n.isDvdNat m = if n m then 1 else 0
@[simp]
theorem Nat.isEqNat_pos_iff {n m : } :
0 < n.isEqNat m n = m
@[simp]
theorem Nat.isLtNat_pos_iff {n m : } :
0 < n.isLtNat m n < m
@[simp]
theorem Nat.isLeNat_pos_iff {n m : } :
0 < n.isLeNat m n m
@[simp]
theorem Nat.isDvdNat_pos_iff {n m : } :
0 < n.isDvdNat m n m
def Nat.inv (n : ) :
Equations
  • n.inv = n.isEqNat 0
def Nat.pos (n : ) :
Equations
@[simp]
theorem Nat.inv_zero :
inv 0 = 1
@[simp]
theorem Nat.inv_iff_ne_zero {n : } :
n.inv = 0 0 < n
@[simp]
theorem Nat.inv_ne_zero {n : } (h : n 0) :
n.inv = 0
@[simp]
theorem Nat.pos_zero :
pos 0 = 0
@[simp]
theorem Nat.pos_ne_zero {n : } (h : n 0) :
n.pos = 1
def Nat.and (n m : ) :
Equations
def Nat.or (n m : ) :
Equations
theorem Nat.and_eq (n m : ) :
n.and m = if 0 < n 0 < m then 1 else 0
theorem Nat.and_eq_one (n m : ) :
n.and m = 1 0 < n 0 < m
theorem Nat.or_eq (n m : ) :
n.or m = if 0 < n 0 < m then 1 else 0
@[simp]
theorem Nat.and_pos_iff (n m : ) :
0 < n.and m 0 < n 0 < m
@[simp]
theorem Nat.or_pos_iff (n m : ) :
0 < n.or m 0 < n 0 < m
@[simp]
theorem Nat.inv_pos_iff (n : ) :
0 < n.inv ¬0 < n
@[simp]
theorem Nat.pos_pos_iff (n : ) :
0 < n.pos 0 < n
def Nat.ball (n : ) (φ : ) :
Equations
  • n.ball φ = Nat.rec 1 (fun (n ih : ) => (φ n).pos.and ih) n
@[simp]
theorem Nat.ball_pos_iff {φ : } {n : } :
0 < n.ball φ m < n, 0 < φ m
@[simp]
theorem Nat.ball_eq_zero_iff {φ : } {n : } :
n.ball φ = 0 m < n, φ m = 0
theorem Nat.ball_pos_iff_eq_one {φ : } {n : } :
n.ball φ = 1 0 < n.ball φ
inductive Nat.ArithPart₁ {n : } :
theorem Nat.ArithPart₁.of_eq {n : } {f g : List.Vector n →. } (hf : ArithPart₁ f) (H : ∀ (i : List.Vector n), f i = g i) :
theorem Nat.ArithPart₁.bind {n : } (f : List.Vector n →. ) (hf : ArithPart₁ fun (v : List.Vector (n + 1)) => f v.tail v.head) {g : List.Vector n →. } (hg : ArithPart₁ g) :
ArithPart₁ fun (v : List.Vector n) => (g v).bind (f v)
theorem Nat.ArithPart₁.map {n : } (f : List.Vector n) (hf : Arith₁ fun (v : List.Vector (n + 1)) => f v.tail v.head) {g : List.Vector n →. } (hg : ArithPart₁ g) :
ArithPart₁ fun (v : List.Vector n) => Part.map (f v) (g v)
theorem Nat.ArithPart₁.comp₁ (f : →. ) (hf : ArithPart₁ fun (v : List.Vector 1) => f (v.get 0)) {n : } {g : List.Vector n} (hg : Arith₁ g) :
ArithPart₁ fun (v : List.Vector n) => f (g v)
theorem Nat.ArithPart₁.comp₂ (f : →. ) (hf : ArithPart₁ fun (v : List.Vector 2) => f (v.get 0) (v.get 1)) {n : } {g h : List.Vector n} (hg : Arith₁ g) (hh : Arith₁ h) :
ArithPart₁ fun (v : List.Vector n) => f (g v) (h v)
theorem Nat.ArithPart₁.rfind' {n : } {f : List.Vector n} (h : Arith₁ fun (v : List.Vector (n + 1)) => f v.head v.tail) :
ArithPart₁ fun (v : List.Vector n) => Nat.rfind fun (n : ) => Part.some (decide (f n v = 0))
theorem Nat.ArithPart₁.rfind'₁ {n : } (i : Fin n) {f : } (h : Arith₁ fun (v : List.Vector 2) => f (v.get 0) (v.get 1)) :
ArithPart₁ fun (v : List.Vector n) => Nat.rfind fun (n_1 : ) => Part.some (decide (f n_1 (v.get i) = 0))
theorem Nat.Arith₁.of_eq {n : } {f g : List.Vector n} (hf : Arith₁ f) (H : ∀ (i : List.Vector n), f i = g i) :
theorem Nat.Arith₁.zero {n : } :
Arith₁ fun (x : List.Vector n) => 0
theorem Nat.Arith₁.one {n : } :
Arith₁ fun (x : List.Vector n) => 1
theorem Nat.Arith₁.add {n : } (i j : Fin n) :
Arith₁ fun (v : List.Vector n) => v.get i + v.get j
theorem Nat.Arith₁.mul {n : } (i j : Fin n) :
Arith₁ fun (v : List.Vector n) => v.get i * v.get j
theorem Nat.Arith₁.proj {n : } (i : Fin n) :
Arith₁ fun (v : List.Vector n) => v.get i
theorem Nat.Arith₁.head {n : } :
Arith₁ fun (v : List.Vector (n + 1)) => v.head
theorem Nat.Arith₁.equal {n : } (i j : Fin n) :
Arith₁ fun (v : List.Vector n) => (v.get i).isEqNat (v.get j)
theorem Nat.Arith₁.lt {n : } (i j : Fin n) :
Arith₁ fun (v : List.Vector n) => (v.get i).isLtNat (v.get j)
theorem Nat.Arith₁.comp {m n : } {f : List.Vector n} (g : Fin nList.Vector m) (hf : Arith₁ f) (hg : ∀ (i : Fin n), Arith₁ (g i)) :
Arith₁ fun (v : List.Vector m) => f (List.Vector.ofFn fun (i : Fin n) => g i v)
Equations
theorem Nat.Arith₁.cons {n m : } {f : List.Vector n} {g : List.Vector nList.Vector m} (hf : Arith₁ f) (hg : Vec g) :
Vec fun (v : List.Vector n) => f v ::ᵥ g v
theorem Nat.Arith₁.tail {n : } {f : List.Vector n} (hf : Arith₁ f) :
Arith₁ fun (v : List.Vector n.succ) => f v.tail
theorem Nat.Arith₁.comp' {n m : } {f : List.Vector m} {g : List.Vector nList.Vector m} (hf : Arith₁ f) (hg : Vec g) :
Arith₁ fun (v : List.Vector n) => f (g v)
theorem Nat.Arith₁.comp₁ (f : ) (hf : Arith₁ fun (v : List.Vector 1) => f (v.get 0)) {n : } {g : List.Vector n} (hg : Arith₁ g) :
Arith₁ fun (v : List.Vector n) => f (g v)
theorem Nat.Arith₁.comp₂ (f : ) (hf : Arith₁ fun (v : List.Vector 2) => f (v.get 0) (v.get 1)) {n : } {g h : List.Vector n} (hg : Arith₁ g) (hh : Arith₁ h) :
Arith₁ fun (v : List.Vector n) => f (g v) (h v)
theorem Nat.Arith₁.succ {n : } (i : Fin n) :
Arith₁ fun (v : List.Vector n) => v.get i + 1
theorem Nat.Arith₁.const {n : } (m : ) :
Arith₁ fun (x : List.Vector n) => m
theorem Nat.Arith₁.inv {n : } (i : Fin n) :
Arith₁ fun (v : List.Vector n) => (v.get i).inv
theorem Nat.Arith₁.pos {n : } (i : Fin n) :
Arith₁ fun (v : List.Vector n) => (v.get i).pos
theorem Nat.Arith₁.and {n : } (i j : Fin n) :
Arith₁ fun (v : List.Vector n) => (v.get i).and (v.get j)
theorem Nat.Arith₁.or {n : } (i j : Fin n) :
Arith₁ fun (v : List.Vector n) => (v.get i).or (v.get j)
theorem Nat.Arith₁.le {n : } (i j : Fin n) :
Arith₁ fun (v : List.Vector n) => (v.get i).isLeNat (v.get j)
theorem Nat.Arith₁.if_pos {n : } {f g h : List.Vector n} (hf : Arith₁ f) (hg : Arith₁ g) (hh : Arith₁ h) :
Arith₁ fun (v : List.Vector n) => if 0 < f v then g v else h v
theorem Nat.Arith₁.to_arith₁ {n : } {f : List.Vector n} (h : Arith₁ f) :
ArithPart₁ fun (x : List.Vector n) => (some (f x))
theorem Nat.ArithPart₁.rfindPos {n : } {f : List.Vector (n + 1)} (h : Arith₁ f) :
ArithPart₁ fun (v : List.Vector n) => Nat.rfind fun (n_1 : ) => Part.some (decide (0 < f (n_1 ::ᵥ v)))
theorem Nat.ArithPart₁.rfindPos₁ {n : } (i : Fin n) {f : } (h : Arith₁ fun (v : List.Vector 2) => f (v.get 0) (v.get 1)) :
ArithPart₁ fun (v : List.Vector n) => Nat.rfind fun (n_1 : ) => Part.some (decide (0 < f n_1 (v.get i)))
theorem Nat.ArithPart₁.inv_fun {n : } (i : Fin n) (f : ) (hf : Arith₁ fun (v : List.Vector 1) => f (v.get 0)) :
ArithPart₁ fun (v : List.Vector n) => Nat.rfind fun (x : ) => Part.some (decide (f x v.get i v.get i < f (x + 1)))
theorem Nat.ArithPart₁.implicit_fun {n : } (i : Fin n) (f : List.Vector n) (hf : Arith₁ fun (v : List.Vector (n + 1)) => f v.tail v.head) :
ArithPart₁ fun (v : List.Vector n) => Nat.rfind fun (x : ) => Part.some (decide (f v x v.get i v.get i < f v (x + 1)))
theorem Nat.Arith₁.sqrt {n : } (i : Fin n) :
Arith₁ fun (v : List.Vector n) => (v.get i).sqrt
theorem Nat.Arith₁.sub {n : } (i j : Fin n) :
Arith₁ fun (v : List.Vector n) => v.get i - v.get j
theorem Nat.Arith₁.pair {n : } (i j : Fin n) :
Arith₁ fun (v : List.Vector n) => pair (v.get i) (v.get j)
theorem Nat.Arith₁.unpair₁ {n : } (i : Fin n) :
Arith₁ fun (v : List.Vector n) => (unpair (v.get i)).1
theorem Nat.Arith₁.unpair₂ {n : } (i : Fin n) :
Arith₁ fun (v : List.Vector n) => (unpair (v.get i)).2
theorem Nat.Arith₁.dvd {n : } (i j : Fin n) :
Arith₁ fun (v : List.Vector n) => (v.get i).isDvdNat (v.get j)
theorem Nat.Arith₁.rem {n : } (i j : Fin n) :
Arith₁ fun (v : List.Vector n) => v.get i % v.get j
theorem Nat.Arith₁.beta {n : } (i j : Fin n) :
Arith₁ fun (v : List.Vector n) => (v.get i).beta (v.get j)
theorem Nat.Arith₁.ball {n : } {φ : List.Vector n} (hp : Arith₁ fun (v : List.Vector (n + 1)) => φ v.tail v.head) (i : Fin n) :
Arith₁ fun (v : List.Vector n) => (v.get i).ball (φ v)
def Nat.Arith₁.recSequence {n : } (f : List.Vector n) (g : List.Vector (n + 2)) (z : ) (v : List.Vector n) :
Equations
theorem Nat.Arith₁.beta_unbeta_recSequence_eq {n : } (f : List.Vector n) (g : List.Vector (n + 2)) (z : ) (v : List.Vector n) (m : ) (hm : m < z + 1) :
(unbeta (recSequence f g z v)).beta m = rec (f v) (fun (y IH : ) => g (y ::ᵥ IH ::ᵥ v)) m
theorem Nat.Arith₁.beta_unbeta_recSequence_zero {n : } (f : List.Vector n) (g : List.Vector (n + 2)) (z : ) (v : List.Vector n) :
(unbeta (recSequence f g z v)).beta 0 = f v
theorem Nat.Arith₁.beta_unbeta_recSequence_succ {n : } (f : List.Vector n) (g : List.Vector (n + 2)) (z : ) (v : List.Vector n) {m : } (hm : m < z) :
(unbeta (recSequence f g z v)).beta (m + 1) = g (m ::ᵥ (unbeta (recSequence f g z v)).beta m ::ᵥ v)
theorem Nat.Arith₁.beta_eq_rec {n m : } (f : List.Vector n) (g : List.Vector (n + 2)) {z : } {v : List.Vector n} (h0 : z.beta 0 = f v) (hs : i < m, z.beta (i + 1) = g (i ::ᵥ z.beta i ::ᵥ v)) :
z.beta m = rec (f v) (fun (y IH : ) => g (y ::ᵥ IH ::ᵥ v)) m
theorem Nat.Arith₁.prec {n : } {f : List.Vector n} {g : List.Vector (n + 2)} (hf : Arith₁ f) (hg : Arith₁ g) :
Arith₁ fun (v : List.Vector (n + 1)) => rec (f v.tail) (fun (y IH : ) => g (y ::ᵥ IH ::ᵥ v.tail)) v.head
theorem Nat.Arith₁.of_primrec {n : } {f : List.Vector n} (hf : Primrec' f) :
Instances For
theorem Nat.ArithPart₁.exists_code {n : } {f : List.Vector n →. } :
ArithPart₁ f∃ (c : Code n), c.eval f