- alpha vs (Var x) = Var x
-
-pattern RedEx x t s = App (Lambda x t) s
-pattern AppApp a b c = App a (App b c)
-pattern EmLambda x y t = Lambda x (Lambda y t)
-
-
-instance Show Term where
- show (Var x) = x
- show (EmLambda x y t) = show (Lambda (x ++ " " ++ y) t)
- show (Lambda x t) = "(λ" ++ x ++ "." ++ show t ++ ")"
- show (AppApp a b c) = show a ++ " " ++ braced (App b c)
- show (App t r) = show t ++ " " ++ show r
-
-braced :: Term -> String
-braced t = "(" ++ show t ++ ")"
-
--- |
--- prop> t == tRead (show (t :: Term))
-
-tRead :: String -> Term
-tRead s = case parseOnly (parseTerm <* endOfInput) (T.pack s) of
- (Right t) -> t
- (Left e) -> error e
-
-parseVar :: Parser Term
-parseVar = do
- x <- many1 (letter <|> digit)
- return $! Var x
-
-parseLambda :: Parser Term
-parseLambda = do
- char '\\' <|> char 'λ'
- vars <- sepBy1 parseVar (char ' ')
- char '.'
- t <- parseTerm
- return $! createLambda vars t
-
-createLambda :: [Term] -> Term -> Term
-createLambda (Var x : vs) t = Lambda x $ createLambda vs t
-createLambda [] t = t
-createLambda _ _ = error "createLambda failed"
-
-parseApp :: Parser Term
-parseApp = do
- aps <- sepBy1 (parseBraces <|> parseLambda <|> parseVar) (char ' ')
- return $! createApp aps
-
-createApp :: [Term] -> Term
-createApp [t] = t
-createApp (t:ts:tss) = createApp (App t ts : tss)
-createApp [] = error "empty createApp"
-
-parseBraces :: Parser Term
-parseBraces = do
- char '('
- t <- parseTerm
- char ')'
- return t
-
-parseTerm :: Parser Term
-parseTerm = parseApp <|>
- parseBraces <|>
- parseLambda <|>
- parseVar
-
--------------------------------------------------