-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathQualify.hs
105 lines (94 loc) · 3.61 KB
/
Qualify.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
{- |
Module : $Header$
Description : Code out overloading and qualify all names
Copyright : (c) Christian Maeder, DFKI GmbH 2008
License : GPLv2 or higher, see LICENSE.txt
Maintainer : Christian.Maeder@dfki.de
Stability : provisional
Portability : portable
Code out overloading and qualify all names
-}
module CASL.Qualify
( qualifySig
, qualifySigExt
, inverseMorphism
) where
import CASL.AS_Basic_CASL
import CASL.Disambiguate
import CASL.Sign
import CASL.Morphism
import CASL.Monoton
import Common.AS_Annotation
import Common.Id
import Common.LibName
import Common.Result
import qualified Common.Lib.MapSet as MapSet
import Control.Monad
import qualified Data.Map as Map
import qualified Data.Set as Set
mkOrReuseQualSortName :: Sort_map -> SIMPLE_ID -> LibId -> Id -> Id
mkOrReuseQualSortName sm nodeId libId i =
case Map.lookup i sm of
Just j | isQualName j -> j
_ -> mkQualName nodeId libId i
qualifySig :: SIMPLE_ID -> LibId -> Morphism f e () -> Sign f e
-> Result (Morphism f e (), [Named (FORMULA f)])
qualifySig = qualifySigExt (\ _ _ _ _ -> extendedInfo) ()
qualifySigExt :: InducedSign f e m e -> m -> SIMPLE_ID -> LibId
-> Morphism f e m -> Sign f e
-> Result (Morphism f e m, [Named (FORMULA f)])
qualifySigExt extInd extEm nodeId libId m sig = do
let ps = predMap sig
os = opMap sig
ss = sortSet sig
sm = Set.fold (\ s -> Map.insert s
$ mkOrReuseQualSortName (sort_map m) nodeId libId s)
Map.empty ss
sMap = Set.fold (`Map.insert` 1) Map.empty ss
om = createOpMorMap $ qualOverloaded sMap (Map.map fst $ op_map m)
nodeId libId (mapOpType sm) mkPartial os
oMap = Map.foldWithKey (\ i ->
Map.insertWith (+) i . Set.size) sMap $ MapSet.toMap os
pm = Map.map fst $ qualOverloaded oMap (pred_map m) nodeId libId
(mapPredType sm) id ps
return ((embedMorphism extEm sig $ inducedSignAux extInd sm om pm extEm sig)
{ sort_map = sm
, op_map = om
, pred_map = pm }, monotonicities sig)
qualOverloaded :: Ord a => Map.Map Id Int -> Map.Map (Id, a) Id -> SIMPLE_ID
-> LibId -> (a -> a) -> (a -> a) -> MapSet.MapSet Id a
-> Map.Map (Id, a) (Id, a)
qualOverloaded oMap rn nodeId libId f g =
Map.foldWithKey (\ i s m -> foldr (\ (e, n) -> let ge = g e in
Map.insert (i, ge)
(case Map.lookup (i, ge) rn of
Just j | isQualName j -> j
_ -> mkQualName nodeId libId $ mkOverloadedId n i, f e)) m
$ zip (Set.toList s) [1 + Map.findWithDefault 0 i oMap ..])
Map.empty . MapSet.toMap
inverseMorphism :: (Morphism f e m -> Result m) -> Morphism f e m
-> Result (Morphism f e m)
inverseMorphism invExt m = do
iExt <- invExt m
let src = msource m
ss = sortSet src
os = opMap src
ps = predMap src
sm = sort_map m
om = op_map m
pm = pred_map m
ism = Map.fromList $ map (\ (s1, s2) -> (s2, s1)) $ Map.toList sm
iom = Map.fromList $ map (\ ((i, t), (j, k)) ->
((j, mapOpType sm t), (i, k))) $ Map.toList om
ipm = Map.fromList $ map (\ ((i, t), j) ->
((j, mapPredType sm t), i)) $ Map.toList pm
unless (ss == Set.map (mapSort ism . mapSort sm) ss)
$ fail "no injective CASL sort mapping"
unless (os == inducedOpMap ism iom (inducedOpMap sm om os))
$ fail "no injective CASL op mapping"
unless (ps == inducedPredMap ism ipm (inducedPredMap sm pm ps))
$ fail "no injective CASL pred mapping"
return (embedMorphism iExt (imageOfMorphism m) src)
{ sort_map = ism
, op_map = iom
, pred_map = ipm }