- zero: ∀ {n : ℕ}, Nat.ArithPart₁ fun (x : Mathlib.Vector ℕ n) => 0
- one: ∀ {n : ℕ}, Nat.ArithPart₁ fun (x : Mathlib.Vector ℕ n) => 1
- add: ∀ {n : ℕ} (i j : Fin n), Nat.ArithPart₁ ↑fun (v : Mathlib.Vector ℕ n) => v.get i + v.get j
- mul: ∀ {n : ℕ} (i j : Fin n), Nat.ArithPart₁ ↑fun (v : Mathlib.Vector ℕ n) => v.get i * v.get j
- proj: ∀ {n : ℕ} (i : Fin n), Nat.ArithPart₁ ↑fun (v : Mathlib.Vector ℕ n) => v.get i
- equal: ∀ {n : ℕ} (i j : Fin n), Nat.ArithPart₁ ↑fun (v : Mathlib.Vector ℕ n) => (v.get i).isEqNat (v.get j)
- lt: ∀ {n : ℕ} (i j : Fin n), Nat.ArithPart₁ ↑fun (v : Mathlib.Vector ℕ n) => (v.get i).isLtNat (v.get j)
- comp: ∀ {m n : ℕ} {f : Mathlib.Vector ℕ n →. ℕ} (g : Fin n → Mathlib.Vector ℕ m →. ℕ), Nat.ArithPart₁ f → (∀ (i : Fin n), Nat.ArithPart₁ (g i)) → Nat.ArithPart₁ fun (v : Mathlib.Vector ℕ m) => (Mathlib.Vector.mOfFn fun (i : Fin n) => g i v) >>= f
- rfind: ∀ {n : ℕ} {f : Mathlib.Vector ℕ (n + 1) → ℕ}, Nat.ArithPart₁ ↑f → Nat.ArithPart₁ fun (v : Mathlib.Vector ℕ n) => Nat.rfind fun (n_1 : ℕ) => Part.some (decide (f (n_1 ::ᵥ v) = 0))
Instances For
Equations
- Nat.Arith₁ f = Nat.ArithPart₁ ↑f
Instances For
theorem
Nat.ArithPart₁.of_eq
{n : ℕ}
{f : Mathlib.Vector ℕ n →. ℕ}
{g : Mathlib.Vector ℕ n →. ℕ}
(hf : Nat.ArithPart₁ f)
(H : ∀ (i : Mathlib.Vector ℕ n), f i = g i)
:
theorem
Nat.ArithPart₁.bind
{n : ℕ}
(f : Mathlib.Vector ℕ n → ℕ →. ℕ)
(hf : Nat.ArithPart₁ fun (v : Mathlib.Vector ℕ (n + 1)) => f v.tail v.head)
{g : Mathlib.Vector ℕ n →. ℕ}
(hg : Nat.ArithPart₁ g)
:
Nat.ArithPart₁ fun (v : Mathlib.Vector ℕ n) => (g v).bind (f v)
theorem
Nat.ArithPart₁.map
{n : ℕ}
(f : Mathlib.Vector ℕ n → ℕ → ℕ)
(hf : Nat.Arith₁ fun (v : Mathlib.Vector ℕ (n + 1)) => f v.tail v.head)
{g : Mathlib.Vector ℕ n →. ℕ}
(hg : Nat.ArithPart₁ g)
:
Nat.ArithPart₁ fun (v : Mathlib.Vector ℕ n) => Part.map (f v) (g v)
theorem
Nat.ArithPart₁.comp₁
(f : ℕ →. ℕ)
(hf : Nat.ArithPart₁ fun (v : Mathlib.Vector ℕ 1) => f (v.get 0))
{n : ℕ}
{g : Mathlib.Vector ℕ n → ℕ}
(hg : Nat.Arith₁ g)
:
Nat.ArithPart₁ fun (v : Mathlib.Vector ℕ n) => f (g v)
theorem
Nat.ArithPart₁.comp₂
(f : ℕ → ℕ →. ℕ)
(hf : Nat.ArithPart₁ fun (v : Mathlib.Vector ℕ 2) => f (v.get 0) (v.get 1))
{n : ℕ}
{g : Mathlib.Vector ℕ n → ℕ}
{h : Mathlib.Vector ℕ n → ℕ}
(hg : Nat.Arith₁ g)
(hh : Nat.Arith₁ h)
:
Nat.ArithPart₁ fun (v : Mathlib.Vector ℕ n) => f (g v) (h v)
theorem
Nat.ArithPart₁.rfind'
{n : ℕ}
{f : ℕ → Mathlib.Vector ℕ n → ℕ}
(h : Nat.Arith₁ fun (v : Mathlib.Vector ℕ (n + 1)) => f v.head v.tail)
:
Nat.ArithPart₁ fun (v : Mathlib.Vector ℕ n) => Nat.rfind fun (n : ℕ) => Part.some (decide (f n v = 0))
theorem
Nat.ArithPart₁.rfind'₁
{n : ℕ}
(i : Fin n)
{f : ℕ → ℕ → ℕ}
(h : Nat.Arith₁ fun (v : Mathlib.Vector ℕ 2) => f (v.get 0) (v.get 1))
:
Nat.ArithPart₁ fun (v : Mathlib.Vector ℕ n) => Nat.rfind fun (n_1 : ℕ) => Part.some (decide (f n_1 (v.get i) = 0))
theorem
Nat.Arith₁.of_eq
{n : ℕ}
{f : Mathlib.Vector ℕ n → ℕ}
{g : Mathlib.Vector ℕ n → ℕ}
(hf : Nat.Arith₁ f)
(H : ∀ (i : Mathlib.Vector ℕ n), f i = g i)
:
theorem
Nat.Arith₁.add
{n : ℕ}
(i : Fin n)
(j : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => v.get i + v.get j
theorem
Nat.Arith₁.mul
{n : ℕ}
(i : Fin n)
(j : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => v.get i * v.get j
theorem
Nat.Arith₁.equal
{n : ℕ}
(i : Fin n)
(j : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => (v.get i).isEqNat (v.get j)
theorem
Nat.Arith₁.lt
{n : ℕ}
(i : Fin n)
(j : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => (v.get i).isLtNat (v.get j)
theorem
Nat.Arith₁.comp
{m : ℕ}
{n : ℕ}
{f : Mathlib.Vector ℕ n → ℕ}
(g : Fin n → Mathlib.Vector ℕ m → ℕ)
(hf : Nat.Arith₁ f)
(hg : ∀ (i : Fin n), Nat.Arith₁ (g i))
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ m) => f (Mathlib.Vector.ofFn fun (i : Fin n) => g i v)
Equations
- Nat.Arith₁.Vec f = ∀ (i : Fin m), Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => (f v).get i
Instances For
theorem
Nat.Arith₁.cons
{n : ℕ}
{m : ℕ}
{f : Mathlib.Vector ℕ n → ℕ}
{g : Mathlib.Vector ℕ n → Mathlib.Vector ℕ m}
(hf : Nat.Arith₁ f)
(hg : Nat.Arith₁.Vec g)
:
Nat.Arith₁.Vec fun (v : Mathlib.Vector ℕ n) => f v ::ᵥ g v
theorem
Nat.Arith₁.tail
{n : ℕ}
{f : Mathlib.Vector ℕ n → ℕ}
(hf : Nat.Arith₁ f)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n.succ) => f v.tail
theorem
Nat.Arith₁.comp'
{n : ℕ}
{m : ℕ}
{f : Mathlib.Vector ℕ m → ℕ}
{g : Mathlib.Vector ℕ n → Mathlib.Vector ℕ m}
(hf : Nat.Arith₁ f)
(hg : Nat.Arith₁.Vec g)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => f (g v)
theorem
Nat.Arith₁.comp₁
(f : ℕ → ℕ)
(hf : Nat.Arith₁ fun (v : Mathlib.Vector ℕ 1) => f (v.get 0))
{n : ℕ}
{g : Mathlib.Vector ℕ n → ℕ}
(hg : Nat.Arith₁ g)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => f (g v)
theorem
Nat.Arith₁.comp₂
(f : ℕ → ℕ → ℕ)
(hf : Nat.Arith₁ fun (v : Mathlib.Vector ℕ 2) => f (v.get 0) (v.get 1))
{n : ℕ}
{g : Mathlib.Vector ℕ n → ℕ}
{h : Mathlib.Vector ℕ n → ℕ}
(hg : Nat.Arith₁ g)
(hh : Nat.Arith₁ h)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => f (g v) (h v)
theorem
Nat.Arith₁.inv
{n : ℕ}
(i : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => (v.get i).inv
theorem
Nat.Arith₁.pos
{n : ℕ}
(i : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => (v.get i).pos
theorem
Nat.Arith₁.and
{n : ℕ}
(i : Fin n)
(j : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => (v.get i).and (v.get j)
theorem
Nat.Arith₁.or
{n : ℕ}
(i : Fin n)
(j : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => (v.get i).or (v.get j)
theorem
Nat.Arith₁.le
{n : ℕ}
(i : Fin n)
(j : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => (v.get i).isLeNat (v.get j)
theorem
Nat.Arith₁.if_pos
{n : ℕ}
{f : Mathlib.Vector ℕ n → ℕ}
{g : Mathlib.Vector ℕ n → ℕ}
{h : Mathlib.Vector ℕ n → ℕ}
(hf : Nat.Arith₁ f)
(hg : Nat.Arith₁ g)
(hh : Nat.Arith₁ h)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => if 0 < f v then g v else h v
theorem
Nat.Arith₁.to_arith₁
{n : ℕ}
{f : Mathlib.Vector ℕ n → ℕ}
(h : Nat.Arith₁ f)
:
Nat.ArithPart₁ fun (x : Mathlib.Vector ℕ n) => ↑(some (f x))
theorem
Nat.ArithPart₁.rfindPos
{n : ℕ}
{f : Mathlib.Vector ℕ (n + 1) → ℕ}
(h : Nat.Arith₁ f)
:
Nat.ArithPart₁ fun (v : Mathlib.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 : Nat.Arith₁ fun (v : Mathlib.Vector ℕ 2) => f (v.get 0) (v.get 1))
:
Nat.ArithPart₁ fun (v : Mathlib.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 : Nat.Arith₁ fun (v : Mathlib.Vector ℕ 1) => f (v.get 0))
:
theorem
Nat.ArithPart₁.implicit_fun
{n : ℕ}
(i : Fin n)
(f : Mathlib.Vector ℕ n → ℕ → ℕ)
(hf : Nat.Arith₁ fun (v : Mathlib.Vector ℕ (n + 1)) => f v.tail v.head)
:
theorem
Nat.Arith₁.sqrt
{n : ℕ}
(i : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => (v.get i).sqrt
theorem
Nat.Arith₁.sub
{n : ℕ}
(i : Fin n)
(j : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => v.get i - v.get j
theorem
Nat.Arith₁.pair
{n : ℕ}
(i : Fin n)
(j : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => Nat.pair (v.get i) (v.get j)
theorem
Nat.Arith₁.unpair₁
{n : ℕ}
(i : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => (Nat.unpair (v.get i)).1
theorem
Nat.Arith₁.unpair₂
{n : ℕ}
(i : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => (Nat.unpair (v.get i)).2
theorem
Nat.Arith₁.dvd
{n : ℕ}
(i : Fin n)
(j : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => (v.get i).isDvdNat (v.get j)
theorem
Nat.Arith₁.rem
{n : ℕ}
(i : Fin n)
(j : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => v.get i % v.get j
theorem
Nat.Arith₁.beta
{n : ℕ}
(i : Fin n)
(j : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => (v.get i).beta (v.get j)
theorem
Nat.Arith₁.ball
{n : ℕ}
{p : Mathlib.Vector ℕ n → ℕ → ℕ}
(hp : Nat.Arith₁ fun (v : Mathlib.Vector ℕ (n + 1)) => p v.tail v.head)
(i : Fin n)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ n) => (v.get i).ball (p v)
def
Nat.Arith₁.recSequence
{n : ℕ}
(f : Mathlib.Vector ℕ n → ℕ)
(g : Mathlib.Vector ℕ (n + 2) → ℕ)
(z : ℕ)
(v : Mathlib.Vector ℕ n)
:
Equations
Instances For
theorem
Nat.Arith₁.beta_unbeta_recSequence_eq
{n : ℕ}
(f : Mathlib.Vector ℕ n → ℕ)
(g : Mathlib.Vector ℕ (n + 2) → ℕ)
(z : ℕ)
(v : Mathlib.Vector ℕ n)
(m : ℕ)
(hm : m < z + 1)
:
(Nat.unbeta (Nat.Arith₁.recSequence f g z v)).beta m = Nat.rec (f v) (fun (y IH : ℕ) => g (y ::ᵥ IH ::ᵥ v)) m
theorem
Nat.Arith₁.beta_unbeta_recSequence_zero
{n : ℕ}
(f : Mathlib.Vector ℕ n → ℕ)
(g : Mathlib.Vector ℕ (n + 2) → ℕ)
(z : ℕ)
(v : Mathlib.Vector ℕ n)
:
(Nat.unbeta (Nat.Arith₁.recSequence f g z v)).beta 0 = f v
theorem
Nat.Arith₁.beta_unbeta_recSequence_succ
{n : ℕ}
(f : Mathlib.Vector ℕ n → ℕ)
(g : Mathlib.Vector ℕ (n + 2) → ℕ)
(z : ℕ)
(v : Mathlib.Vector ℕ n)
{m : ℕ}
(hm : m < z)
:
(Nat.unbeta (Nat.Arith₁.recSequence f g z v)).beta (m + 1) = g (m ::ᵥ (Nat.unbeta (Nat.Arith₁.recSequence f g z v)).beta m ::ᵥ v)
theorem
Nat.Arith₁.prec
{n : ℕ}
{f : Mathlib.Vector ℕ n → ℕ}
{g : Mathlib.Vector ℕ (n + 2) → ℕ}
(hf : Nat.Arith₁ f)
(hg : Nat.Arith₁ g)
:
Nat.Arith₁ fun (v : Mathlib.Vector ℕ (n + 1)) => Nat.rec (f v.tail) (fun (y IH : ℕ) => g (y ::ᵥ IH ::ᵥ v.tail)) v.head
- zero: (n : ℕ) → Nat.ArithPart₁.Code n
- one: (n : ℕ) → Nat.ArithPart₁.Code n
- add: {n : ℕ} → Fin n → Fin n → Nat.ArithPart₁.Code n
- mul: {n : ℕ} → Fin n → Fin n → Nat.ArithPart₁.Code n
- proj: {n : ℕ} → Fin n → Nat.ArithPart₁.Code n
- equal: {n : ℕ} → Fin n → Fin n → Nat.ArithPart₁.Code n
- lt: {n : ℕ} → Fin n → Fin n → Nat.ArithPart₁.Code n
- comp: {m n : ℕ} → Nat.ArithPart₁.Code n → (Fin n → Nat.ArithPart₁.Code m) → Nat.ArithPart₁.Code m
- rfind: {n : ℕ} → Nat.ArithPart₁.Code (n + 1) → Nat.ArithPart₁.Code n
Instances For
Equations
- Nat.ArithPart₁.instInhabitedCode k = { default := Nat.ArithPart₁.Code.zero k }
inductive
Nat.ArithPart₁.Code.eval
{n : ℕ}
:
Nat.ArithPart₁.Code n → (Mathlib.Vector ℕ n →. ℕ) → Prop
- zero: ∀ {n : ℕ}, (Nat.ArithPart₁.Code.zero n).eval fun (x : Mathlib.Vector ℕ n) => 0
- one: ∀ {n : ℕ}, (Nat.ArithPart₁.Code.one n).eval fun (x : Mathlib.Vector ℕ n) => 1
- add: ∀ {n : ℕ} (i j : Fin n), (Nat.ArithPart₁.Code.add i j).eval fun (v : Mathlib.Vector ℕ n) => ↑(some (v.get i + v.get j))
- mul: ∀ {n : ℕ} (i j : Fin n), (Nat.ArithPart₁.Code.mul i j).eval fun (v : Mathlib.Vector ℕ n) => ↑(some (v.get i * v.get j))
- proj: ∀ {n : ℕ} (i : Fin n), (Nat.ArithPart₁.Code.proj i).eval fun (v : Mathlib.Vector ℕ n) => ↑(some (v.get i))
- equal: ∀ {n : ℕ} (i j : Fin n), (Nat.ArithPart₁.Code.equal i j).eval fun (v : Mathlib.Vector ℕ n) => ↑(some ((v.get i).isEqNat (v.get j)))
- lt: ∀ {n : ℕ} (i j : Fin n), (Nat.ArithPart₁.Code.lt i j).eval fun (v : Mathlib.Vector ℕ n) => ↑(some ((v.get i).isLtNat (v.get j)))
- comp: ∀ {m n : ℕ} (c : Nat.ArithPart₁.Code n) (d : Fin n → Nat.ArithPart₁.Code m) (f : Mathlib.Vector ℕ n →. ℕ) (g : Fin n → Mathlib.Vector ℕ m →. ℕ), c.eval f → (∀ (i : Fin n), (d i).eval (g i)) → (c.comp d).eval fun (v : Mathlib.Vector ℕ m) => (Mathlib.Vector.mOfFn fun (i : Fin n) => g i v) >>= f
- rfind: ∀ {n : ℕ} (c : Nat.ArithPart₁.Code (n + 1)) (f : Mathlib.Vector ℕ (n + 1) → ℕ), c.eval ↑f → c.rfind.eval fun (v : Mathlib.Vector ℕ n) => Nat.rfind fun (n_1 : ℕ) => Part.some (decide (f (n_1 ::ᵥ v) = 0))
Instances For
theorem
Nat.ArithPart₁.exists_code
{n : ℕ}
{f : Mathlib.Vector ℕ n →. ℕ}
:
Nat.ArithPart₁ f → ∃ (c : Nat.ArithPart₁.Code n), c.eval f