69 lines
1.1 KiB
Agda
69 lines
1.1 KiB
Agda
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
|