Advertisement
Guest User

Untitled

a guest
Nov 16th, 2018
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.17 KB | None | 0 0
  1. module Interpreter where
  2. import Control.Exception
  3. import Debug.Trace
  4. import Data.List
  5. import Text.Read
  6. import Data.Set (toList, fromList, difference)
  7.  
  8. --interpret(x) = x
  9. --interpret(λx.E1) = let f = interpret(E1)
  10. -- in case f of
  11. -- λx.E3 -> interpret(E3[a/x])
  12. -- - -> λx.E1
  13. --interpret(E1 E2) = let f = interpret(E1)
  14. -- a = interpret(E2)
  15. -- in case f of
  16. -- λx.E3 -> interpret(E3[a/x])
  17. -- - -> f a
  18.  
  19. ---- Data types ----
  20. type Name = String
  21.  
  22. data Expr =
  23. Var Name
  24. | Lambda Name Expr
  25. | App Expr Expr
  26. deriving
  27. (Eq,Show)
  28.  
  29. ---- Functions ----
  30.  
  31. --functions to help with debugging
  32. toStrang (Var a) = "(Var " ++ a ++ ")"
  33. toStrang (App a b) = "(App " ++ (toStrang a) ++ " " ++ (toStrang b) ++ ")"
  34. toStrang (Lambda a b) = "(Lambda " ++ a ++ (toStrang b) ++ ")"
  35. subst_print x m e1 = "replacing " ++ x ++ " with " ++ (toStrang m) ++ " in all instances of: " ++ (toStrang e1)
  36.  
  37. freeVars::Expr -> [Name]
  38. ---- YOUR CODE HERE
  39. freeVars (Var e1) = [e1]
  40. freeVars (App e1 e2) = toList $ fromList ((freeVars e1) ++ (freeVars e2))
  41. freeVars (Lambda binds e1) = filter (/= binds) (freeVars e1)
  42.  
  43.  
  44. freshVars::[Expr]->[Name]
  45. ---- YOUR CODE HERE
  46. -- List of all possible variable names before parsing expression
  47. all_numbers = 1 : map (+1) all_numbers
  48. str_numbers = map (++ "_") (map show all_numbers)
  49. -- get a list of all of our free vars
  50. freeVarslst exp = toList $ fromList (foldl (++) [] (map freeVars exp))
  51. -- now remove all free vars from our list of vars
  52. freshVars exp = filter (\x -> notElem x (freeVarslst exp)) str_numbers
  53.  
  54.  
  55.  
  56. subst::(Name,Expr) -> Expr -> Expr
  57. -- ---- YOUR CODE HERE
  58. -- returns E[e/x]
  59. -- replacing all instances of x in (Var y) with m
  60. subst (x, m) (Var y) =
  61. if (x == y) then m
  62. else (Var y)
  63.  
  64. subst (x, m) (App e1 e2) = App (subst (x,m) e1) (subst (x,m) e2)
  65.  
  66. subst (x, m) (Lambda y e1) =
  67. if (x == y) then (Lambda y e1)
  68. else
  69. let zip = head (freshVars [e1, m, Var x])
  70. in (Lambda zip (subst (x,m) (subst (y, Var zip) e1)))
  71.  
  72.  
  73. appNF_OneStep::Expr -> Maybe Expr
  74. ---- YOUR CODE HERE
  75.  
  76. appNF_OneStep (Var x) = --(traceShow (toStrang (Var x)))
  77. Nothing
  78. appNF_OneStep (Lambda x y) = --(traceShow (toStrang (Lambda x y)))
  79. let z = appNF_OneStep y in
  80. case z of
  81. Just z -> Just (Lambda x z)
  82. Nothing -> Nothing
  83.  
  84. appNF_OneStep (App e1 e2) = --(traceShow (toStrang (App e1 e2)))
  85. let
  86. f = appNF_OneStep e1
  87. a = appNF_OneStep e2
  88. c = trySubst e1 e2
  89. in
  90. case f of
  91. Just f -> Just (App f e2)
  92. Nothing -> case a of
  93. Just a -> Just (App e1 a)
  94. Nothing -> case c of
  95. Just c -> Just c
  96. Nothing -> Nothing
  97.  
  98.  
  99. trySubst:: Expr -> Expr -> Maybe Expr
  100. trySubst e1 e2 =
  101. case e1 of
  102. Lambda x m -> Just (subst (x, e2) m)
  103. Var _ -> Nothing
  104. App _ _ -> Nothing
  105.  
  106.  
  107. appNF_n::Int -> Expr -> Expr
  108. ---- YOUR CODE HERE
  109. appNF_n n e1 =
  110. if (n <= 0) then e1
  111. else let e2 = (appNF_OneStep e1) in
  112. case e2 of
  113. Just e2 -> appNF_n (subtract 1 n) e2
  114. Nothing -> e1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement