Advertisement
Guest User

Agda Fizzbuzz w/o Standard Library

a guest
Jan 21st, 2018
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. {-- fundamental types: equality, optional, natural --}
  3. data _≡_ {A : Set} : (x y : A) → Set where
  4.   refl :{x}(x ≡ x)
  5.  
  6. data Maybe (A : Set) : Set where
  7.   none : Maybe A
  8.   some : A → Maybe A
  9.  
  10. data: Set where
  11.   zer :
  12.   suc : ℕ → ℕ
  13.  
  14. pattern `0 = zer
  15. pattern `3 = suc (suc (suc `0))
  16. pattern `5 = suc (suc `3)
  17.  
  18. {-- compare naturals --}
  19. _==_ :(n m :)Maybe (n ≡ m)
  20. zer == zer = some refl
  21. zer == suc m = none
  22. suc n == zer = none
  23. suc n == suc m with (n == m)
  24. ... | some refl = some refl
  25. ... | none = none
  26. infix 2 _==_
  27.  
  28. {-- subtract naturals, returning 'none' if n < m --}
  29. _-_ : (n m :)Maybe
  30. n     - zer = some n
  31. zer   - suc m = none
  32. suc n - suc m = n - m
  33. infixr 3 _-_
  34.  
  35. {-- modulo; agda isn't convinced that this terminates --}
  36. {-# TERMINATING #-}
  37. _mod_ : (x n :) → ℕ
  38. zer mod n = zer
  39. suc x mod n with (suc x - n)
  40. ... | none = suc x
  41. ... | some d = d mod n
  42. infix 4 _mod_ _div_
  43.  
  44. {-- is x divisible by n? --}
  45. _div_ : (x n :) → Set
  46. x div n = (x mod n) ≡ `0
  47.  
  48. {-- fizzbuzz type --}
  49. data FB (n :) : Set where
  50.   fizz : (n div `3) → FB n
  51.   buzz : (n div `5) → FB n
  52.   fizz-buzz : (n div `3)(n div `5) → FB n
  53.   number : FB n
  54.  
  55. {-- fizzbuzz algorithm --}
  56. fb : (n :) → FB n
  57. fb n with (n mod `3 == `0)
  58. fb n | some p₃ with (n mod `5 == `0)
  59. fb n | some p₃ | none    = fizz p₃
  60. fb n | some p₃ | some p₅ = fizz-buzz p₃ p₅
  61. fb n | none    with (n mod `5 == `0)
  62. fb n | none    | some p₅ = buzz p₅
  63. fb n | none    | none    = number
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement