diff --git a/plfa/Naturals.agda b/plfa/Naturals.agda new file mode 100644 index 0000000..627f9ac --- /dev/null +++ b/plfa/Naturals.agda @@ -0,0 +1,68 @@ +module Naturals where + +import Relation.Binary.PropositionalEquality as Eq +open Eq using (_≡_; refl) +open Eq.≡-Reasoning using (begin_; _≡⟨⟩_; _∎) + +data ℕ : Set where + zero : ℕ + suc : ℕ → ℕ + +{-# BUILTIN NATURAL ℕ #-} + +_+_ : ℕ → ℕ → ℕ +zero + n = n +suc m + n = suc (m + n) + +_*_ : ℕ → ℕ → ℕ +zero * n = zero +suc m * n = n + (m * n) + +_^_ : ℕ → ℕ → ℕ +n ^ 0 = 1 +n ^ suc m = n * (n ^ m) + +_∸_ : ℕ → ℕ → ℕ +m ∸ zero = m +zero ∸ suc n = zero +suc m ∸ suc n = m ∸ n + +infixl 6 _+_ _∸_ +infixl 7 _*_ + +{-# BUILTIN NATPLUS _+_ #-} +{-# BUILTIN NATTIMES _*_ #-} +{-# BUILTIN NATMINUS _∸_ #-} + +-- Bin stretch exercise + +data Bin : Set where + ⟨⟩ : Bin + _O : Bin → Bin + _I : Bin → Bin + +inc : Bin → Bin +inc ⟨⟩ = ⟨⟩ I +inc (m O) = m I +inc (m I) = (inc m) O + +_ : inc (⟨⟩ I O I I) ≡ ⟨⟩ I I O O +_ = refl + +_ : inc (⟨⟩ I) ≡ ⟨⟩ I O +_ = refl + +to : ℕ -> Bin +to 0 = ⟨⟩ +to (suc n) = inc (to n) + +_ : to 11 ≡ ⟨⟩ I O I I +_ = refl + +from : Bin -> ℕ +from ⟨⟩ = 0 +from (m O) = 2 * from m +from (m I) = 1 + 2 * from m + +_ : from (⟨⟩ I O I I) ≡ 11 +_ = refl diff --git a/plfa/README.md b/plfa/README.md new file mode 100644 index 0000000..a564f37 --- /dev/null +++ b/plfa/README.md @@ -0,0 +1,4 @@ +# PLFA + +I’m following along [PLFA](https://plfa.github.io/). This repo only contains the +stretch exercises and supporting materials. diff --git a/Dep.agda b/self/Dep.agda similarity index 100% rename from Dep.agda rename to self/Dep.agda diff --git a/Distrib.agda b/self/Distrib.agda similarity index 100% rename from Distrib.agda rename to self/Distrib.agda diff --git a/Peano.agda b/self/Peano.agda similarity index 100% rename from Peano.agda rename to self/Peano.agda