Skip to content

Instantly share code, notes, and snippets.

@pedrominicz
Last active October 4, 2019 21:46
Show Gist options
  • Save pedrominicz/b06f3cf22d9f4fa12aee7cd22c80c415 to your computer and use it in GitHub Desktop.
Save pedrominicz/b06f3cf22d9f4fa12aee7cd22c80c415 to your computer and use it in GitHub Desktop.
Proof that addition (of Peano numbers) is associative in Agda.
module Peano where
import Relation.Binary.PropositionalEquality as Eq
open Eq using (_≡_; refl; cong)
open Eq.≡-Reasoning using (begin_; _≡⟨⟩_; _≡⟨_⟩_; _∎)
data ℕ : Set where
zero : ℕ
suc : ℕ → ℕ
{-# BUILTIN NATURAL ℕ #-}
_+_ : ℕ → ℕ → ℕ
zero + x = x
(suc x) + y = suc (x + y)
+-assoc : ∀ (a b c : ℕ) → (a + b) + c ≡ a + (b + c)
+-assoc zero b c = refl
+-assoc (suc a) b c =
begin
(suc a + b) + c
≡⟨⟩
suc (a + b) + c
≡⟨⟩
suc ((a + b) + c)
≡⟨ cong suc (+-assoc a b c) ⟩
suc (a + (b + c))
≡⟨⟩
suc a + (b + c)
_*_ : ℕ → ℕ → ℕ
zero * n = zero
(suc n) * m = (n * m) + m
ack : ℕ → ℕ → ℕ
ack zero n = n + 1
ack (suc m) zero = ack m 1
ack (suc m) (suc n) = ack m (ack (suc m) n)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment