Subversion

Galculator

?curdirlinks? - Rev 1

?prevdifflink? - Blame



{-# OPTIONS_GHC -Wall #-}

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

{- |
Module      :  Galculator.Engine.LawToRule
Description :  Engine that extracts rules from laws.
Copyright   :  (c) Paulo Silva
License     :  LGPL

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

-}


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

module Galculator.Engine.LawToRule (
  getRule,
  getRuleInv
 ) where

import Control.Monad
import Data.Existential
import Galculator.Rule
import Language.Law.Syntax
import Language.R.Constraint
import Language.R.Match
import Language.R.SafeCast
import Language.Type.Constraint
import Language.Type.Unification

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

getRule :: Law -> Rule
getRule (EQUIV m t1 r1 r2) t2 r = do
  rcns <- rConstraint r1 r
  cns <- unify $ [t1 :=: t2] ++ rcns
  Hide t1' <- typeRewrite cns t1
  r1' <- rCast cns t1' r1
  r'  <- rCast cns t1' r
  r2' <- rCast cns t2 r2
  cnsu <- rMatch r1' r'
  let r2u = rSubst cnsu t2 r2'
  successEquiv m t2 r r2u
 
getRule (IMPL m t1 r1 r2) t2 r = do
  rcns <- rConstraint r1 r
  cns <- unify $ [t1 :=: t2] ++ rcns
  Hide t1' <- typeRewrite cns t1
  r1' <- rCast cns t1' r1
  r'  <- rCast cns t1' r
  r2' <- rCast cns t2 r2
  cnsu <- rMatch r1' r'
  let r2u = rSubst cnsu t2 r2'
  successImpl m t2 r r2u

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

getRuleInv :: Law -> Rule
getRuleInv (EQUIV m t1 r1 r2) t2 r = do
  rcns <- rConstraint r2 r
  cns <- unify $ [t1 :=: t2] ++ rcns
  Hide t1' <- typeRewrite cns t1
  r2' <- rCast cns t1' r2
  r' <- rCast cns t1' r
  r1' <- rCast cns t2 r1
  cnsu <- rMatch r2' r'
  let r1u = rSubst cnsu t2 r1'
  successEquiv m t2 r r1u
getRuleInv (IMPL _ _ _ _) _ _ = mzero

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

 

Theme by Vikram Singh | Powered by WebSVN v2.3.3