Subversion

Galculator

?curdirlinks? -

Blame information for rev 1

Line No. Rev Author Line
1 1 paulosilva  
2 {-# LANGUAGE GADTs, TypeOperators, FlexibleContexts, Rank2Types #-}
3 {-# OPTIONS_GHC -Wall #-}
4  
5 -------------------------------------------------------------------------------
6  
7 {- |
8 Module      :  Galculator.Engine.GcToLaw
9 Description :  
10 Copyright   :  (c) Paulo Silva
11 License     :  LGPL
12  
13 Maintainer  :  paufil@di.uminho.pt
14 Stability   :  experimental
15 Portability :  portable
16  
17 -}
18  
19 -------------------------------------------------------------------------------
20  
21 module Galculator.Engine.GcToLaw (
22   --gc2Rules,
23   rType2Law,
24   gcProperties,
25   gcPropertyFunc,
26   gcShunting,
27   gcDistributivityUpper,
28   gcDistributivityLower,
29   gcMonotonicityUpper,
30   gcMonotonicityLower,
31   gcPreservingBottom,
32   gcPreservingTop,
33   gcCancellationUpper,
34   gcCancellationLower
35  )  where
36  
37 import Control.GalcError
38 import Control.Monad.Error
39 import Control.Monad.Fresh
40 import Data.Existential
41 --import Galculator.Engine.LawToRule
42 --import Galculator.Rule
43 import Language.Law.Syntax
44 import Language.R.Syntax
45 import Language.Type.Syntax
46  
47 -------------------------------------------------------------------------------
48 {-
49 gc2Rules :: Type (GC b a) -> R (GC b a) -> [Rule]
50 gc2Rules t gc = map getRule pp  ++
51                 map getRuleInv pp
52   where pp = gcProperties t gc
53 -}
54 -------------------------------------------------------------------------------
55  
56 rType2Law :: (MonadFresh [String] String m, MonadError GalcError m)
57           => RType -> (forall a . Type a -> R a -> m Law) -> m Law
58 rType2Law (Exists t g) f = f t g
59  
60 -------------------------------------------------------------------------------
61  
62 gcProperties :: Type (GC b a) -> R (GC b a) -> [Law]
63 gcProperties t gc = map (\f -> f t gc) gcPropertyFunc
64  
65 -------------------------------------------------------------------------------
66  
67 gcPropertyFunc :: [Type (GC b a) -> R (GC b a) -> Law]
68 gcPropertyFunc = [] {- [
69   gcShunting,
70   --gcDistributivityUpper,
71   --gcDistributivityLower,
72   gcMonotonicityUpper,
73   gcMonotonicityLower,
74   gcPreservingTop,
75   gcPreservingBottom,
76   gcCancellationUpper,
77   gcCancellationLower
78  ]-}
79  
80 -------------------------------------------------------------------------------
81  
82 gcShunting :: (MonadFresh [String] String m, MonadError GalcError m)
83            => Type a -> R a -> m Law
84 gcShunting (GC b a) g = do
85   ladj <- lowerAdjoint g
86   uadj <- upperAdjoint g
87   lord <- lowerOrder g
88   uord <- upperOrder g
89   return $
90         EQUIV (Meta "Shunting" (Just GCSHUNT))
91         (Rel a b)
92         (COMP b (CONV ladj) (ORD lord))
93         (COMP a (ORD uord) uadj)
94 gcShunting _ _ = throwError ImpossibleError
95  
96 -------------------------------------------------------------------------------
97  
98 gcDistributivityUpper :: (MonadFresh [String] String m, MonadError GalcError m)
99                       => Type a -> R a -> m Law
100 gcDistributivityUpper (GC b a) g = do
101   uadj <- upperAdjoint g
102   lord <- lowerOrder g
103   uord <- upperOrder g
104   return $
105         EQUIV (Meta ("Distributivity (Upper adjoint)") (Just GCDISTR) )
106         (Rel a (Prod b b))
107         (COMP b uadj (FUN (OMeet lord)))
108         (COMP (Prod a a) (FUN (OMeet uord)) (PROD uadj uadj))
109 gcDistributivityUpper _ _ = error "gcDistributivityUpper"
110  
111 -------------------------------------------------------------------------------
112  
113 gcDistributivityLower :: (MonadFresh [String] String m, MonadError GalcError m)
114                       => Type a -> R a -> m Law
115 gcDistributivityLower (GC b a) g = do
116   ladj <- lowerAdjoint g
117   lord <- lowerOrder g
118   uord <- upperOrder g
119   return $
120         EQUIV (Meta ("Distributivity (Lower adjoint)") (Just GCDISTR) )
121         (Rel b (Prod a a))
122         (COMP a ladj (FUN (OJoin uord)))
123         (COMP (Prod b b) (FUN (OJoin lord)) (PROD ladj ladj))
124 gcDistributivityLower _ _ = error "gcDistributivityLower"
125  
126 -------------------------------------------------------------------------------
127  
128 gcMonotonicityUpper :: (MonadFresh [String] String m, MonadError GalcError m)
129                     => Type a -> R a -> m Law
130 gcMonotonicityUpper (GC b a) g = do
131   uadj <- upperAdjoint g
132   lord <- lowerOrder g
133   uord <- upperOrder g
134   return $
135        IMPL (Meta "Monotonicity (upper adjoint)" (Just GCMONOT))
136        (Rel a b)
137        (COMP b uadj (ORD lord))
138        (COMP a (ORD uord) uadj)
139 gcMonotonicityUpper _ _ = error "gcMonotonicityUpper"
140  
141 -------------------------------------------------------------------------------
142  
143 gcMonotonicityLower :: (MonadFresh [String] String m, MonadError GalcError m)
144                     => Type a -> R a -> m Law
145 gcMonotonicityLower (GC b a) g = do
146   ladj <- lowerAdjoint g
147   lord <- lowerOrder g
148   uord <- upperOrder g
149   return $
150        IMPL (Meta "Monotonicity (lower adjoint)" (Just GCMONOT))
151        (Rel b a)
152        (COMP a ladj (ORD uord))
153        (COMP b (ORD lord) ladj)
154 gcMonotonicityLower _ _ = error "gcMonotonicityLower"
155  
156 -------------------------------------------------------------------------------
157  
158 gcPreservingTop :: (MonadFresh [String] String m, MonadError GalcError m)
159                 => Type a -> R a -> m Law
160 gcPreservingTop (GC b a) g = do
161   uadj <- upperAdjointF g
162   lord <- lowerOrder g
163   uord <- upperOrder g
164   return $
165         EQUIV (Meta "Top preserving" (Just GCTOP))
166         a
167         (APPLY b uadj (OMax lord))
168         (OMax uord)
169 gcPreservingTop _ _ = error "gcPreservingTop"
170  
171 -------------------------------------------------------------------------------
172  
173 gcPreservingBottom :: (MonadFresh [String] String m, MonadError GalcError m)
174                    => Type a -> R a -> m Law
175 gcPreservingBottom (GC b a) g = do
176   ladj <- lowerAdjointF g
177   lord <- lowerOrder g
178   uord <- upperOrder g
179   return $
180         EQUIV (Meta "Bottom preserving" (Just GCBOT))
181         b
182         (APPLY a ladj (OMin uord))
183         (OMin lord)
184 gcPreservingBottom _ _ = error "gcPreservingBottom"
185  
186 -------------------------------------------------------------------------------
187  
188 gcCancellationUpper :: (MonadFresh [String] String m, MonadError GalcError m)
189                     => Type a -> R a -> m Law
190 gcCancellationUpper (GC b a) g = do
191   ladj <- lowerAdjoint g
192   uadj <- upperAdjoint g
193   uord <- upperOrder g
194   return $
195        IMPL (Meta "Cancellation (upper adjoint)" (Just GCCANC))
196        (Rel a a)
197        (ORD uord)
198        (COMP a (ORD uord) (COMP b uadj ladj))
199 gcCancellationUpper _ _ = error "gcCancellationUpper"
200  
201 -------------------------------------------------------------------------------
202  
203 gcCancellationLower :: (MonadFresh [String] String m, MonadError GalcError m)
204                     => Type a -> R a -> m Law
205 gcCancellationLower (GC b a) g = do
206   ladj <- lowerAdjoint g
207   uadj <- upperAdjoint g
208   lord <- lowerOrder g
209   return $
210        IMPL (Meta "Cancellation (lowerAdjoint)" (Just GCCANC))
211        (Rel b b)
212        (COMP b (COMP a ladj uadj) (ORD lord))
213        (ORD lord)
214 gcCancellationLower _ _ = error "gcCancellationLower"
215  
216 -------------------------------------------------------------------------------
217  
218 upperAdjoint :: MonadError GalcError m => R (GC b a) -> m (R (a :<->: b))
219 upperAdjoint (GDef _ _ g _ _) = return $ FUN g
220 upperAdjoint GId = return ID
221 upperAdjoint (GComp t g1 g2) = do
222   g1' <- upperAdjoint g1
223   g2' <- upperAdjoint g2
224   return $ COMP t g2' g1'
225 upperAdjoint (GConv g) = lowerAdjoint g
226 upperAdjoint _ = throwError ImpossibleError
227  
228 -------------------------------------------------------------------------------
229  
230 lowerAdjoint :: MonadError GalcError m => R (GC b a) -> m (R (b :<->: a))
231 lowerAdjoint (GDef _ f _ _ _) = return $ FUN f
232 lowerAdjoint GId = return ID
233 lowerAdjoint (GComp t g1 g2) = do
234   g1' <- lowerAdjoint g1
235   g2' <- lowerAdjoint g2
236   return $ COMP t g1' g2'
237 lowerAdjoint (GConv g) = upperAdjoint g
238 lowerAdjoint _ = throwError ImpossibleError
239  
240 -------------------------------------------------------------------------------
241  
242 upperAdjointF :: MonadError GalcError m => R (GC b a) -> m (R (a :<-: b))
243 upperAdjointF (GDef _ _ g _ _) = return g
244 upperAdjointF GId = return FId
245 upperAdjointF (GComp t g1 g2) = do
246   g1' <- upperAdjointF g1
247   g2' <- upperAdjointF g2
248   return $ FComp t g2' g1'
249 upperAdjointF (GConv g) = lowerAdjointF g
250 upperAdjointF _ = throwError ImpossibleError
251  
252 -------------------------------------------------------------------------------
253  
254 lowerAdjointF :: MonadError GalcError m => R (GC b a) -> m (R (b :<-: a))
255 lowerAdjointF (GDef _ f _ _ _) = return f
256 lowerAdjointF GId = return FId
257 lowerAdjointF (GComp t g1 g2) = do
258   g1' <- lowerAdjointF g1
259   g2' <- lowerAdjointF g2
260   return $ FComp t g1' g2'
261 lowerAdjointF (GConv g) = upperAdjointF g
262 lowerAdjointF _ = throwError ImpossibleError
263  
264 -------------------------------------------------------------------------------
265  
266 lowerOrder :: (MonadFresh [String] String m, MonadError GalcError m)
267            => R (GC b a) -> m (R (PO b))
268 lowerOrder (GDef _ _ _ o _) = return o
269 lowerOrder GId = do
270   o <- getFresh
271   return $ Var ('o':o)
272 lowerOrder (GComp _ g1 _) = lowerOrder g1
273 lowerOrder (GConv g) = do
274   g' <- upperOrder g
275   return $ OConv g'
276 lowerOrder _ = error "lowerOrder"
277  
278 -------------------------------------------------------------------------------
279  
280 upperOrder :: (MonadFresh [String] String m, MonadError GalcError m)
281            => R (GC b a) -> m (R (PO a))
282 upperOrder (GDef _ _ _ _ o) = return o
283 upperOrder GId = do
284   o <- getFresh
285   return $ Var ('o':o)
286 upperOrder (GComp _ _ g2) = upperOrder g2
287 upperOrder (GConv g) = do
288   g' <- lowerOrder g
289   return $ OConv g'
290 upperOrder _ = error "upperOrder"
291  
292 -------------------------------------------------------------------------------
293  

Theme by Vikram Singh | Powered by WebSVN v2.3.3