mprover-0.0.0.0: MProver/Monad.hs
{-# LANGUAGE NoMonomorphismRestriction #-}
module MProver.Monad where
import MProver.Syntax
import Control.Monad.Reader
import Control.Monad.Error
import Control.Monad.Identity
import Unbound.LocallyNameless
import Data.Map (Map)
import qualified Data.Map as Map
type MPT m = ErrorT String (ReaderT Environment (FreshMT m))
type ExprEnv = Map (Name Expr) ((Maybe Ty),(Maybe Expr))
type ProofEnv = Map (Name Proof) Formula
type DTEnv = Map String (Bind [Name Ty] [ConstrDecl])
type CEnv = Map String (Bind [Name Ty] ConstrDecl,String)
type Environment = (ExprEnv,ProofEnv,DTEnv,CEnv)
askEE :: (Monad m) => MPT m ExprEnv
askEE = do
(ee,_,_,_) <- ask
return ee
askPE :: (Monad m) => MPT m ProofEnv
askPE = do
(_,pe,_,_) <- ask
return pe
askDTE :: (Monad m) => MPT m DTEnv
askDTE = do
(_,_,dte,_) <- ask
return dte
askCE :: (Monad m) => MPT m CEnv
askCE = do
(_,_,_,ce) <- ask
return ce
localEE :: (Monad m) => (ExprEnv -> ExprEnv) -> MPT m a -> MPT m a
localEE f = local (\(ee,pe,dte,ce) -> (f ee,pe,dte,ce))
localPE :: (Monad m) => (ProofEnv -> ProofEnv) -> MPT m a -> MPT m a
localPE f = local (\(ee,pe,dte,ce) -> (ee,f pe,dte,ce))
localDTE :: (Monad m) => (DTEnv -> DTEnv) -> MPT m a -> MPT m a
localDTE f = local (\(ee,pe,dte,ce) -> (ee,pe,f dte,ce))
localCE :: (Monad m) => (CEnv -> CEnv) -> MPT m a -> MPT m a
localCE f = local (\(ee,pe,dte,ce) -> (ee,pe,dte,f ce))
unbindEnv = Map.delete
bindEnv = Map.insert