4 import Data.Attoparsec.Text
5 import Control.Applicative
8 data Term = Var VarName | Lambda VarName Term | App Term Term
10 instance Show Term where
12 show (Lambda x t) = "\\" ++ x ++ "." ++ show t
13 show (App t r) = "(" ++ show t ++ " " ++ show r ++ ")"
15 --instance Read Term where
16 tRead :: String -> Term
17 tRead s = case parseOnly (parseTerm <* endOfInput) (T.pack s) of
21 parseVar :: Parser Term
26 parseLambda :: Parser Term
34 parseApp :: Parser Term
43 parseTerm :: Parser Term
44 parseTerm = parseVar <|> parseLambda <|> parseApp
46 -------------------------------------------------
48 rename :: Term -> Term
49 rename (Lambda x t) = Lambda n (substitute x n t)
52 substitute :: VarName -> VarName -> Term -> Term
53 substitute a b (Var x) = if x == a then Var b else Var x
54 substitute a b (Lambda x t)
56 | x == b = substitute a b $ rename (Lambda x t)
57 | otherwise = Lambda x (substitute a b t)
58 substitute a b (App t u) = App (substitute a b t) (substitute a b u)