Subversion

Galculator

?curdirlinks? - Rev 1

?prevdifflink? - Blame



{-# LANGUAGE FlexibleContexts #-}
{-# OPTIONS_GHC -Wall #-}

-------------------------------------------------------------------------------

{- |
Module      :  Language.Law.Verify
Description :  Validation of the uniqueness of definitions and the existence
               of references.
Copyright   :  (c) Paulo Silva
License     :  LGPL

Maintainer  :  paufil@di.uminho.pt
Stability   :  experimental
Portability :  portable

-}


-------------------------------------------------------------------------------

module Language.Law.Verify (
  verify,
  getDefs,
  replaceDefs
 ) where

import Control.GalcError
import Control.Monad.Error
import Control.Monad.Reader
import Data.Env
import Language.Law.SyntaxADT
import Language.R.SyntaxADT
import qualified Language.R.Verify as R

-------------------------------------------------------------------------------

verify :: MonadError GalcError m => R.ExtEnv -> LawS -> m LawS
verify extEnv l = let
    intEnv = getDefs l
    ids = R.reps $ indexes extEnv ++ map fst intEnv
    env = R.Env' {R.internal = fromListEnv intEnv, R.external = extEnv}
  in if null ids
     then runReaderT (replaceDefs l) env
     else throwError $ MultiDefError . concatMap ((++"\n") . show) $ ids
 
-------------------------------------------------------------------------------

getDefs :: LawS -> [(String, S)]
getDefs (EquivS _ _ s1 s2) = R.getDefs s1 ++ R.getDefs s2
getDefs (ImplS  _ _ s1 s2) = R.getDefs s1 ++ R.getDefs s2

-------------------------------------------------------------------------------

replaceDefs :: (MonadError GalcError m, MonadReader R.Env' m)
            => LawS -> m LawS
replaceDefs (EquivS p n s1 s2) = do
  s1' <- R.replaceDefs s1
  s2' <- R.replaceDefs s2
  return $ EquivS p n s1' s2'
replaceDefs (ImplS p n s1 s2) = do
  s1' <- R.replaceDefs s1
  s2' <- R.replaceDefs s2
  return $ ImplS p n s1' s2'

-------------------------------------------------------------------------------

 

Theme by Vikram Singh | Powered by WebSVN v2.3.3