Advertisement
Guest User

Untitled

a guest
Sep 17th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.58 KB | None | 0 0
  1. {-# LANGUAGE LambdaCase #-}
  2. module TaPL7 where
  3.  
  4. import Data.Function ( on )
  5. import Data.List ( unfoldr )
  6.  
  7. data Term
  8. = TmVar Int
  9. | TmAbs Term
  10. | TmApp Term Term
  11. deriving Show
  12.  
  13.  
  14. tShift :: Int -> Term -> Term
  15. tShift d =
  16. let walk :: Int -> Term -> Term
  17. walk c = \case
  18. TmVar k | k < c -> TmVar k
  19. | otherwise -> TmVar (k + d)
  20. TmAbs t -> TmAbs $ walk (succ c) t
  21. TmApp t1 t2 -> (TmApp `on` walk c) t1 t2
  22. in walk 0
  23.  
  24.  
  25. tSubst :: Int -> Term -> Term -> Term
  26. tSubst j s = \case
  27. TmVar k | k == j -> s
  28. | otherwise -> TmVar k
  29. TmAbs t -> TmAbs $ tSubst (succ j) (tShift 1 s) t
  30. TmApp t1 t2 -> (TmApp `on` tSubst j s) t1 t2
  31.  
  32.  
  33. tSubstTop :: Term -> Term -> Term
  34. tSubstTop v t = tShift (-1) $ tSubst 0 (tShift 1 v) t
  35.  
  36.  
  37. tEval :: Term -> Maybe Term
  38. tEval = \case
  39. TmApp (TmAbs t1) t2 -> Just $ tSubstTop t2 t1
  40. TmApp t1 t2 | isval t1 -> TmApp t1 <$> tEval t2
  41. TmApp t1 t2 -> flip TmApp t2 <$> tEval t1
  42. _ -> Nothing
  43. where
  44. isval :: Term -> Bool
  45. isval = \case
  46. TmAbs _ -> True
  47. _ -> False
  48.  
  49.  
  50. tEvalAll :: Term -> [Term]
  51. tEvalAll = unfoldr $ fmap delta . tEval where delta a = (a, a)
  52.  
  53.  
  54. printEvals :: Term -> IO ()
  55. printEvals = mapM_ printTerm . tEvalAll
  56.  
  57.  
  58. printTerm :: Term -> IO ()
  59. printTerm = putStrLn . showTerm
  60.  
  61.  
  62. showTerm :: Term -> String
  63. showTerm = \case
  64. TmVar n -> show n
  65. TmAbs t -> "(λ." ++ showTerm t ++ ")"
  66. TmApp t1 t2 -> showTerm t1 ++ " " ++ showTerm t2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement