module Functions.Recursive where
open import Data.Bool using (Bool; true; false) open import Data.Nat using (ℕ; suc; zero)
_+_: AdditionDefinition of addition:
_+_ : ℕ → ℕ → ℕ zero + n = n suc m + n = suc (m + n) infixl 6 _+_
pred, _*_, _⊔_, _⊓_ and ⌊_/2⌋Define the following functions:
pred : ℕ → ℕ -- predecessor (pred 0 = 0)
infixl 6 _∸_ _∸_ : ℕ → ℕ → ℕ -- subtraction (0 ∸ n = n)
infixl 7 _*_ _*_ : ℕ → ℕ → ℕ -- multiplication
infixl 6 _⊔_ _⊔_ : ℕ → ℕ → ℕ -- maximum
infixl 7 _⊓_ _⊓_ : ℕ → ℕ → ℕ -- minimum
⌊_/2⌋ : ℕ → ℕ -- half (⌊ 1 /2⌋ = 0)
even, oddodd : ℕ → Bool -- is odd
even : ℕ → Bool -- is even
Define even and odd mutually with the mutual keyword!
_≡?_, _≤?__≡?_ : ℕ → ℕ → Bool -- is equal
_≤?_ : ℕ → ℕ → Bool -- is less than or equal
ℕImport the binary representation of natural numbers:
open import Sets.Recursive using (ℕ⁺; one; double; double+1; ℕ₂; zero; id)
Exercise: define the conversion function:
from : ℕ₂ → ℕ -- hint: use _*_
from should define the backward function of the following isomorphism between ℕ and ℕ₂ (we prove that from is an isomorphism later):
| ℕ | ℕ₂ |
|---|---|
zero |
zero |
suc zero |
id one |
suc (suc zero) |
id (double one) |
suc (suc (suc zero)) |
id (double+1 one) |
| ... | ... |
We will see how to define the conversion to the other direction later.
Define ℤ and some operations on it (_+_, _-_, _*_)!
data BinTree : Set where leaf : BinTree node : BinTree → BinTree → BinTree
Exercise: define (recursive) mirroring of binary trees!