Subversion

Galculator

?curdirlinks? -

Blame information for rev 1

Line No. Rev Author Line
1 1 paulosilva  
2 {-# OPTIONS_GHC -Wall #-}
3  
4 -------------------------------------------------------------------------------
5  
6 {- |
7 Module      :  Galculator.Engine.LawToRule
8 Description :  Engine that extracts rules from laws.
9 Copyright   :  (c) Paulo Silva
10 License     :  LGPL
11  
12 Maintainer  :  paufil@di.uminho.pt
13 Stability   :  experimental
14 Portability :  portable
15  
16 -}
17  
18 -------------------------------------------------------------------------------
19  
20 module Galculator.Engine.LawToRule (
21   getRule,
22   getRuleInv
23  ) where
24  
25 import Control.Monad
26 import Data.Existential
27 import Galculator.Rule
28 import Language.Law.Syntax
29 import Language.R.Constraint
30 import Language.R.Match
31 import Language.R.SafeCast
32 import Language.Type.Constraint
33 import Language.Type.Unification
34  
35 -------------------------------------------------------------------------------
36  
37 getRule :: Law -> Rule
38 getRule (EQUIV m t1 r1 r2) t2 r = do
39   rcns <- rConstraint r1 r
40   cns <- unify $ [t1 :=: t2] ++ rcns
41   Hide t1' <- typeRewrite cns t1
42   r1' <- rCast cns t1' r1
43   r'  <- rCast cns t1' r
44   r2' <- rCast cns t2 r2
45   cnsu <- rMatch r1' r'
46   let r2u = rSubst cnsu t2 r2'
47   successEquiv m t2 r r2u
48  
49 getRule (IMPL m t1 r1 r2) t2 r = do
50   rcns <- rConstraint r1 r
51   cns <- unify $ [t1 :=: t2] ++ rcns
52   Hide t1' <- typeRewrite cns t1
53   r1' <- rCast cns t1' r1
54   r'  <- rCast cns t1' r
55   r2' <- rCast cns t2 r2
56   cnsu <- rMatch r1' r'
57   let r2u = rSubst cnsu t2 r2'
58   successImpl m t2 r r2u
59  
60 -------------------------------------------------------------------------------
61  
62 getRuleInv :: Law -> Rule
63 getRuleInv (EQUIV m t1 r1 r2) t2 r = do
64   rcns <- rConstraint r2 r
65   cns <- unify $ [t1 :=: t2] ++ rcns
66   Hide t1' <- typeRewrite cns t1
67   r2' <- rCast cns t1' r2
68   r' <- rCast cns t1' r
69   r1' <- rCast cns t2 r1
70   cnsu <- rMatch r2' r'
71   let r1u = rSubst cnsu t2 r1'
72   successEquiv m t2 r r1u
73 getRuleInv (IMPL _ _ _ _) _ _ = mzero
74  
75 -------------------------------------------------------------------------------
76  

Theme by Vikram Singh | Powered by WebSVN v2.3.3