Chuangjie Xu 2011, with changes by Martin Escardo later.

\begin{code}

{-# OPTIONS --without-K --exact-split --safe #-}

module NaturalsAddition where

open import SpartanMLTT hiding (_+_)

infixl 31 _+_

_+_ : ℕ → ℕ → ℕ
n + 0 = n
n + (succ m) = succ (n + m)


zero-right-neutral : (n : ℕ) → n + 0 ≡ n
zero-right-neutral n = refl

zero-left-neutral : (n : ℕ) → 0 + n ≡ n
zero-left-neutral = induction base step
  where
   base : 0 + 0 ≡ 0
   base = refl

   step : (n : ℕ) → 0 + n ≡ n → 0 + succ n ≡ succ n
   step n IH = 0 + succ n   ≡⟨ refl ⟩
               succ (0 + n) ≡⟨ ap succ IH ⟩
               succ n       ∎

addition-associativity : (l n m : ℕ) → (l + n) + m ≡ l + (n + m)
addition-associativity l n = induction base step
  where
   base : (l + n) + 0 ≡ l + (n + 0)
   base = (l + n) + 0  ≡⟨ refl ⟩
           l + n       ≡⟨ refl ⟩
           l + (n + 0) ∎

   step : (m : ℕ) → (l + n) + m ≡ l + (n + m)
                  → (l + n) + succ m ≡ l + (n + succ m)
   step m IH = (l + n) + succ m   ≡⟨ refl ⟩
               succ ((l + n) + m) ≡⟨ ap succ IH ⟩
               succ (l + (n + m)) ≡⟨ refl ⟩
               l + succ (n + m)   ≡⟨ refl ⟩
               l + (n + succ m)   ∎

addition-commutativity : (n m : ℕ) → n + m ≡ m + n
addition-commutativity n = induction base step
  where
   base : n + 0 ≡ 0 + n
   base = n + 0 ≡⟨ zero-right-neutral n ⟩
          n     ≡⟨ (zero-left-neutral n)⁻¹ ⟩
          0 + n ∎

   step : (m : ℕ) → n + m ≡ m + n → n + succ m ≡ succ m + n
   step m IH = n + succ m   ≡⟨ refl ⟩
               succ (n + m) ≡⟨ ap succ IH ⟩
               succ (m + n) ≡⟨ lemma₀ (m + n) ⟩
               1 + (m + n)  ≡⟨ (addition-associativity 1 m n)⁻¹ ⟩
               (1 + m) + n  ≡⟨ ap (_+ n) ((lemma₀ m)⁻¹) ⟩
               succ m + n   ∎
     where
      lemma₀ : (k : ℕ) → succ k ≡ 1 + k
      lemma₀ = induction base₀ step₀
        where
         base₀ : succ 0 ≡ 1 + 0
         base₀ = refl

         step₀ : (k : ℕ) → succ k ≡ 1 + k → succ (succ k) ≡ 1 + succ k
         step₀ k IH = succ (succ k) ≡⟨ ap succ IH ⟩
                      succ (1 + k)  ≡⟨ refl ⟩
                      1 + succ k    ∎

trivial-addition-rearrangement : (x y z : ℕ) → x + y + z ≡ x + z + y
trivial-addition-rearrangement x y z =
  (x + y) + z ≡⟨ addition-associativity x y z ⟩
  x + (y + z) ≡⟨ ap (x +_) (addition-commutativity y z) ⟩
  x + (z + y) ≡⟨ (addition-associativity x z y)⁻¹ ⟩
  (x + z) + y ∎

\end{code}