Changeset 11825
- Timestamp:
- 19.06.2009 18:33:04 (9 months ago)
- Location:
- trunk
- Files:
-
- 6 modified
-
CASL/Morphism.hs (modified) (2 diffs)
-
Common/Utils.hs (modified) (1 diff)
-
CspCASL/Morphism.hs (modified) (4 diffs)
-
HasCASL/Morphism.hs (modified) (3 diffs)
-
HasCASL/SymbolMapAnalysis.hs (modified) (2 diffs)
-
RelationalScheme/Sign.hs (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/CASL/Morphism.hs
r11466 r11825 24 24 import Common.Id 25 25 import Common.Result 26 import Common.Utils (composeMap) 26 27 27 28 import Control.Exception (assert) … … 357 358 oMap2 = op_map mor2 358 359 pMap2 = pred_map mor2 359 sMap = if Map.null sMap2 then sMap1 else Set.fold ( \ i -> 360 let j = mapSort sMap2 (mapSort sMap1 i) in 361 if i == j then id else Map.insert i j) 362 Map.empty $ sortSet src 360 sMap = composeMap sMap1 sMap2 363 361 oMap = if Map.null oMap2 then oMap1 else 364 362 Map.foldWithKey ( \ i t m -> -
trunk/Common/Utils.hs
r11812 r11825 104 104 105 105 -- | composition of arbitrary maps 106 composeMap :: (Monad m, Ord a, Ord b, Ord c, Show b) =>107 Map.Map a b -> Map.Map b c -> m (Map.Map a c) 108 composeMap in1 in2 = foldM (\ m1 (x,y) -> case Map.lookup y in2 of 109 Nothing -> fail $ "Item " ++ show y ++ " not found in target map"110 Just z -> return $ Map.insert x z m1) Map.empty $ Map.toList in1106 composeMap :: Ord a => Map.Map a a -> Map.Map a a -> Map.Map a a 107 composeMap m1 m2 = 108 if Map.null m2 then m1 else Map.foldWithKey ( \ i j -> 109 let k = Map.findWithDefault j j m2 in 110 if i == k then Map.delete i else Map.insert i k) m2 m1 111 111 112 112 -- | keep only minimal elements -
trunk/CspCASL/Morphism.hs
r11824 r11825 29 29 import qualified CASL.MapSentence as CASL_MapSen 30 30 31 import Common.Doc32 31 import Common.DocUtils 33 32 import Common.Id 34 33 import Common.Result 34 import Common.Utils (composeMap) 35 35 36 36 import Control.Monad (unless) … … 82 82 } deriving (Eq, Ord, Show) 83 83 84 -- | Compose two Maps. We use this for Composing the channel and85 -- process maps of a CspAddMorphism.86 composeMaps :: (Ord a, Ord b) => Map.Map a b -> Map.Map b c ->87 Map.Map a c88 composeMaps m1 m2 =89 Map.foldWithKey (\ i j -> case Map.lookup j m2 of90 Nothing -> error "SignCsp.composeMaps"91 Just k -> Map.insert i k) Map.empty m192 93 84 -- | Compose two CspAddMorphisms 94 85 composeCspAddMorphism :: CspAddMorphism -> CspAddMorphism 95 86 -> Result CspAddMorphism 96 87 composeCspAddMorphism m1 m2 = return emptyCspAddMorphism 97 { channelMap = composeMap s(channelMap m1) $ channelMap m298 , processMap = composeMap s(processMap m1) $ processMap m2 }88 { channelMap = composeMap (channelMap m1) $ channelMap m2 89 , processMap = composeMap (processMap m1) $ processMap m2 } 99 90 100 91 -- | Calculate the inverse of a CspAddMorphism … … 128 119 -- | Pretty printing for Csp morphisms 129 120 instance Pretty CspAddMorphism where 130 pretty = text . show 121 pretty m = pretty $ Map.union 122 (Map.mapKeys makeChannelNameSymbol $ channelMap m) 123 $ Map.mapKeys makeProcNameSymbol $ processMap m 131 124 132 125 -- | Instance for CspCASL morphism extension (used for Category) … … 136 129 composeMorphismExtension = composeCspAddMorphism 137 130 inverseMorphismExtension = inverseCspAddMorphism 138 isInclusionMorphismExtension _ = True -- missing! BUG 131 isInclusionMorphismExtension m = 132 Map.null (channelMap m) && Map.null (processMap m) 139 133 140 134 -- Application of morhisms to sentences -
trunk/HasCASL/Morphism.hs
r11466 r11825 29 29 import Common.Id 30 30 import Common.Result 31 import Common.Utils (composeMap) 31 32 import qualified Data.Set as Set 32 33 import qualified Data.Map as Map … … 92 93 mapDataEntry :: IdMap -> TypeMap -> IdMap -> FunMap -> DataEntry -> DataEntry 93 94 mapDataEntry jm tm im fm de@(DataEntry dm i k args rk alts) = 94 let tim = Map.intersection (comp IdMap dm im) $ setToMap $ getDatatypeIds de95 let tim = Map.intersection (composeMap dm im) $ setToMap $ getDatatypeIds de 95 96 newargs = map (mapTypeArg jm tm im) args 96 97 in DataEntry tim i k newargs rk $ Set.map … … 154 155 ideMor e = mkMorphism e e 155 156 156 compIdMap :: IdMap -> IdMap -> IdMap157 compIdMap im1 im2 = if Map.null im2 then im1 else Map.foldWithKey ( \ i j ->158 let k = Map.findWithDefault j j im2 in159 if i == k then Map.delete i else Map.insert i k) im2 im1160 161 157 compMor :: Morphism -> Morphism -> Result Morphism 162 158 compMor m1 m2 = 163 159 let tm1 = typeIdMap m1 164 160 tm2 = typeIdMap m2 165 im = comp IdMap tm1 tm2161 im = composeMap tm1 tm2 166 162 cm1 = classIdMap m1 167 163 cm2 = classIdMap m2 168 cm = comp IdMap cm1 cm2164 cm = composeMap cm1 cm2 169 165 fm2 = funMap m2 170 166 fm1 = funMap m1 -
trunk/HasCASL/SymbolMapAnalysis.hs
r11818 r11825 35 35 import Common.ExtSign 36 36 import Common.Result 37 import Common.Utils (composeMap) 37 38 import Common.Lib.State 38 39 import qualified Data.Map as Map … … 127 128 mapTypeDefn im td = case td of 128 129 DatatypeDefn de@(DataEntry tm i k args rk alts) -> 129 DatatypeDefn (DataEntry (Map.intersection (comp IdMap tm im) $130 DatatypeDefn (DataEntry (Map.intersection (composeMap tm im) $ 130 131 setToMap $ getDatatypeIds de) i k args rk alts) 131 132 AliasTypeDefn sc -> AliasTypeDefn $ mapType im sc -
trunk/RelationalScheme/Sign.hs
r11439 r11825 129 129 case Map.lookup ih $ column_map imorh of 130 130 Just iM -> do 131 oM <- comp_c_map (col_map imaph) (col_map iM)131 let oM = composeMap (col_map imaph) (col_map iM) 132 132 return (ih, RSTMap oM) 133 133 Nothing -> fail "apply_comp_c_map" … … 142 142 comp_rst_mor mor1 mor2 = 143 143 do 144 t_map <-composeMap (table_map mor1) (table_map mor2)144 let t_map = composeMap (table_map mor1) (table_map mor2) 145 145 c_map <- mapM (\x -> apply_comp_c_map x mor1 mor2) $ map t_name $ 146 146 Set.toList $ tables $ domain $ mor1 … … 153 153 , column_map = cm_map 154 154 } 155 156 comp_c_map :: (Show b, Ord c, Ord b, Ord a, Monad m) =>157 Map.Map a b -> Map.Map b c -> m (Map.Map a c)158 comp_c_map c1 c2 = composeMap c1 c2159 155 160 156 emptyRSSign :: RSTables