From 494e6afee1f1c583a880fca4e1f234de6823271a Mon Sep 17 00:00:00 2001 From: Tomas Musil Date: Wed, 3 Dec 2014 16:15:42 +0100 Subject: [PATCH 1/1] multiple applications --- Arithmetic.lc | 10 +++++----- Logic.lc | 6 +++--- src/Lambda.hs | 21 ++++++++++++++++----- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/Arithmetic.lc b/Arithmetic.lc index 5a30a17..6851970 100644 --- a/Arithmetic.lc +++ b/Arithmetic.lc @@ -1,12 +1,12 @@ import Logic -Succ=\n.\f.\x.(f ((n f) x)) -Zero=\f.\x.x +Succ=\n f x.(f ((n f) x)) +Zero=\f x.x One=(Succ Zero) Two=(Succ One) Three=(Succ Two) -Add=\n.\m.\f.\x.((n f) ((m f) x)) -Mult=\n.\m.\f.(n (m f)) -IsZero=\n.\x.\y.((n \z.y) x) +Add=\n m f x.((n f) ((m f) x)) +Mult=\n m f.(n (m f)) +IsZero=\n x y.((n \z.y) x) ((Add Two) Three) ((Mult Two) Three) (PrintBool (IsZero Zero)) diff --git a/Logic.lc b/Logic.lc index 27b52fc..8193a34 100644 --- a/Logic.lc +++ b/Logic.lc @@ -1,5 +1,5 @@ -True=\x.\y.x -False=\x.\y.y -And=\a.\b.((a b) False) +True=\x y.x +False=\x y.y +And=\a b.((a b) False) If=\x.x PrintBool=\x.(((If x) TRUE) FALSE) diff --git a/src/Lambda.hs b/src/Lambda.hs index f9fbe2b..54c4065 100644 --- a/src/Lambda.hs +++ b/src/Lambda.hs @@ -28,7 +28,7 @@ parseVar = do parseLambda :: Parser Term parseLambda = do char '\\' - vars <- many1 (parseVar <* char ' ') + vars <- sepBy1 parseVar (char ' ') char '.' t <- parseTerm return $! createLambda vars t @@ -40,15 +40,26 @@ 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 ' ' - r <- parseTerm char ')' - return $! App t r + return t parseTerm :: Parser Term -parseTerm = parseVar <|> parseLambda <|> parseApp +parseTerm = parseApp <|> + parseBraces <|> + parseLambda <|> + parseVar ------------------------------------------------- -- 2.4.2