\begin{code}
{-# OPTIONS --safe --without-K #-}
open import MLTT.Spartan renaming (_+_ to _∔_)
open import Naturals.Addition
open import Naturals.Properties
open import Naturals.Multiplication
module Naturals.Exponentiation where
_ℕ^_ : ℕ → ℕ → ℕ
a ℕ^ b = ((a *_) ^ b) 1
infixl 33 _ℕ^_
2^ : ℕ → ℕ
2^ = 2 ℕ^_
zero-base : (a : ℕ) → a ℕ^ 0 = 1
zero-base a = refl
prod-of-powers : (n a b : ℕ) → (n ℕ^ a) * (n ℕ^ b) = n ℕ^ (a + b)
prod-of-powers n a 0 = refl
prod-of-powers n a (succ b) = I
where
I : (n ℕ^ a) * (n ℕ^ succ b) = (n ℕ^ (a + succ b))
I = (n ℕ^ a) * (n ℕ^ succ b) =⟨ refl ⟩
(n ℕ^ a) * (n * (n ℕ^ b)) =⟨ i ⟩
(n ℕ^ a) * n * (n ℕ^ b) =⟨ ii ⟩
n * n ℕ^ a * n ℕ^ b =⟨ iii ⟩
n * (n ℕ^ a * n ℕ^ b) =⟨ iv ⟩
n ℕ^ (a + succ b) ∎
where
i = mult-associativity (n ℕ^ a) n (n ℕ^ b) ⁻¹
ii = ap (_* (n ℕ^ b)) (mult-commutativity (n ℕ^ a) n)
iii = mult-associativity n (n ℕ^ a) (n ℕ^ b)
iv = ap (n *_) (prod-of-powers n a b)
power-of-power : (n a b : ℕ) → (n ℕ^ a) ℕ^ b = n ℕ^ (a * b)
power-of-power n a 0 = refl
power-of-power n a (succ b) = I
where
IH : n ℕ^ a ℕ^ b = n ℕ^ (a * b)
IH = power-of-power n a b
I : n ℕ^ a ℕ^ succ b = n ℕ^ (a * succ b)
I = n ℕ^ a ℕ^ succ b =⟨ refl ⟩
n ℕ^ a * (n ℕ^ a) ℕ^ b =⟨ ap (n ℕ^ a *_) IH ⟩
n ℕ^ a * n ℕ^ (a * b) =⟨ prod-of-powers n a (a * b) ⟩
n ℕ^ (a + a * b) =⟨ refl ⟩
n ℕ^ (a * succ b) ∎
exponents-not-zero : (n : ℕ) → ¬ (2^ n = 0)
exponents-not-zero 0 e = positive-not-zero 0 e
exponents-not-zero (succ n) e = exponents-not-zero n I
where
I : 2^ n = 0
I = mult-left-cancellable (2^ n) 0 1 e
\end{code}