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 |