Advertisement
Guest User

3(church)

a guest
Dec 14th, 2019
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.13 KB | None | 0 0
  1. %default total
  2.  
  3. record Church where
  4. constructor MkNat
  5. natF : {a : Type} -> (a -> a) -> a -> a
  6.  
  7. zero : Church
  8. zero = MkNat $ \_, x => x
  9.  
  10. succ : Church -> Church
  11. succ n = MkNat $ \f, x => f ((natF n f) x)
  12.  
  13. one : Church
  14. one = succ zero
  15.  
  16. churchToNat : Church -> Nat
  17. churchToNat n = (natF n S) Z
  18.  
  19. plus : Church -> Church -> Church
  20. plus n m = natF m succ n
  21.  
  22. mult : Church -> Church -> Church
  23. mult n m = natF m (plus n) zero
  24.  
  25. Product : (a : Type) -> (b : Type) -> Type
  26. Product a b = (ty : Type) -> (a -> b -> ty) -> ty
  27.  
  28. pair : a -> b -> Product a b
  29. pair l r = \_, f => f l r
  30.  
  31. first : Product a b -> a
  32. first p = p _ (\x, _ => x)
  33.  
  34. second : Product a b -> b
  35. second p = p _ (\_, x => x)
  36.  
  37. zeroP : Product Church Church
  38. zeroP = pair zero zero
  39.  
  40. succP : Product Church Church -> Product Church Church
  41. succP p = pair (succ $ first p) (first p)
  42.  
  43. nWithPred : Church -> Product Church Church
  44. nWithPred n = (natF n succP) zeroP
  45.  
  46. pred : Church -> Church
  47. pred = second . nWithPred
  48.  
  49. minus : Church -> Church -> Church
  50. minus n m = natF m pred n
  51.  
  52. main : IO()
  53. main = putStrLn . show . churchToNat $ (minus (plus one one) one)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement