----------------------------------------------------------------------------- -- | -- Module : MP -- Copyright : (c) Masahiro Sakai 2007-2009 -- License : BSD3-style (see LICENSE) -- -- Maintainer: masahiro.sakai@gmail.com -- Stability : experimental -- Portability : portable module MP ( applyMP ) where import Expr applyMP :: Expr -> Expr -- MP1 -- MP4 applyMP (Const tv) | tv `elem` ["find","lose","eat","love"] = lambda "p" $ lambda "x" $ FVar "p" <@> (int $ lambda "y" $ Const tv :@ int (lambda "P" $ FVar "P" <@> FVar "y") :@ FVar "x") -- MP8 applyMP (Const "in") = lambda "p" $ lambda "P" $ lambda "x" $ FVar "p" <@> (int $ lambda "y" $ Const "in" :@ int (lambda "z" $ FVar "z" <@> FVar "y") :@ FVar "P" :@ FVar "x") -- MP9 applyMP (Const "seek") = lambda "P" $ Const "try" :@ int (find' :@ FVar "P") where find' = applyMP (Const "find") applyMP (Bind q (Sc body)) = Bind q (Sc (applyMP body)) applyMP (fun :@ arg) = applyMP fun :@ applyMP arg applyMP (Op1 op a) = Op1 op (applyMP a) applyMP (Op2 op a b) = Op2 op (applyMP a) (applyMP b) applyMP x = x