Subversion

Galculator

?curdirlinks? - Rev 3

?prevdifflink? - Blame



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

{- |
Module      :  Language.Law.TypeInference
Description :  Type inference for the law representation.
Copyright   :  (c) Paulo Silva
License     :  LGPL
 
Maintainer  :  paufil@di.uminho.pt
Stability   :  experimental
Portability :  portable
 
-}


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

module Language.Law.TypeInference (
  infer
 ) where

import Control.GalcError
import Control.MonadOr
import Control.Monad.Error
import Control.Monad.Fresh
import Control.Monad.State
import Data.Existential
import Data.Env
import Language.Law.Syntax
import Language.Law.SyntaxADT
import Language.R.SafeCast
import qualified Language.R.TypeInference as R
import Language.Type.Constraint
import Language.Type.Unification

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

infer :: (MonadOr m, MonadError GalcError m, MonadFresh [String] String m)
      => LawS -> m Law
infer s = evalStateT (infer' s) emptyEnv

-------------------------------------------------------------------------------
infer' :: (MonadOr m, MonadError GalcError m, MonadState R.InfEnv m, MonadFresh [String] String m)
       => LawS -> m Law
-------------------------------------------------------------------------------
infer' a@(EquivS _ ident r1a r2a) = R.catchInfer a $ do
  (Exists tr1 r1, Exists tr2 r2, unif, _) <- R.inferBin r1a r2a
  constr <- unify $ [tr1 :=: tr2] ++ unif
  Hide t1' <- typeRewrite constr tr1
  r1' <- rCast constr t1' r1
  r2' <- rCast constr t1' r2
  return $ EQUIV (Meta {name = ident, ruleType = Nothing}) t1' r1' r2'
-------------------------------------------------------------------------------
infer' a@(ImplS _ ident r1a r2a) = R.catchInfer a $ do
  (Exists tr1 r1, Exists tr2 r2, unif, _) <- R.inferBin r1a r2a
  constr <- unify $ [tr1 :=: tr2] ++ unif
  Hide t1' <- typeRewrite constr tr1
  r1' <- rCast constr t1' r1
  r2' <- rCast constr t1' r2
  return $ IMPL (Meta {name = ident, ruleType = Nothing}) t1' r1' r2'
-------------------------------------------------------------------------------


 

Theme by Vikram Singh | Powered by WebSVN v2.3.3