Changeset 11825

Show
Ignore:
Timestamp:
19.06.2009 18:33:04 (9 months ago)
Author:
maeder
Message:

corrected map composition

Location:
trunk
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • trunk/CASL/Morphism.hs

    r11466 r11825  
    2424import Common.Id 
    2525import Common.Result 
     26import Common.Utils (composeMap) 
    2627 
    2728import Control.Exception (assert) 
     
    357358      oMap2 = op_map mor2 
    358359      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 
    363361      oMap = if Map.null oMap2 then oMap1 else 
    364362                 Map.foldWithKey ( \ i t m -> 
  • trunk/Common/Utils.hs

    r11812 r11825  
    104104 
    105105-- | 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 in1 
     106composeMap :: Ord a => Map.Map a a -> Map.Map a a -> Map.Map a a 
     107composeMap 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 
    111111 
    112112-- | keep only minimal elements 
  • trunk/CspCASL/Morphism.hs

    r11824 r11825  
    2929import qualified CASL.MapSentence as CASL_MapSen 
    3030 
    31 import Common.Doc 
    3231import Common.DocUtils 
    3332import Common.Id 
    3433import Common.Result 
     34import Common.Utils (composeMap) 
    3535 
    3636import Control.Monad (unless) 
     
    8282    } deriving (Eq, Ord, Show) 
    8383 
    84 -- | Compose two Maps. We use this for Composing the channel and 
    85 --   process maps of a CspAddMorphism. 
    86 composeMaps :: (Ord a, Ord b) => Map.Map a b -> Map.Map b c -> 
    87                Map.Map a c 
    88 composeMaps m1 m2 = 
    89     Map.foldWithKey (\ i j -> case Map.lookup j m2 of 
    90                                 Nothing -> error "SignCsp.composeMaps" 
    91                                 Just k -> Map.insert i k) Map.empty m1 
    92  
    9384-- | Compose two CspAddMorphisms 
    9485composeCspAddMorphism :: CspAddMorphism -> CspAddMorphism 
    9586                      -> Result CspAddMorphism 
    9687composeCspAddMorphism m1 m2 = return emptyCspAddMorphism 
    97   { channelMap = composeMaps (channelMap m1) $ channelMap m2 
    98   , processMap = composeMaps (processMap m1) $ processMap m2 } 
     88  { channelMap = composeMap (channelMap m1) $ channelMap m2 
     89  , processMap = composeMap (processMap m1) $ processMap m2 } 
    9990 
    10091-- | Calculate the inverse of a CspAddMorphism 
     
    128119-- | Pretty printing for Csp morphisms 
    129120instance 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 
    131124 
    132125-- | Instance for CspCASL morphism extension (used for Category) 
     
    136129      composeMorphismExtension = composeCspAddMorphism 
    137130      inverseMorphismExtension = inverseCspAddMorphism 
    138       isInclusionMorphismExtension _ = True -- missing! BUG 
     131      isInclusionMorphismExtension m = 
     132        Map.null (channelMap m) && Map.null (processMap m) 
    139133 
    140134-- Application of morhisms to sentences 
  • trunk/HasCASL/Morphism.hs

    r11466 r11825  
    2929import Common.Id 
    3030import Common.Result 
     31import Common.Utils (composeMap) 
    3132import qualified Data.Set as Set 
    3233import qualified Data.Map as Map 
     
    9293mapDataEntry :: IdMap -> TypeMap -> IdMap -> FunMap -> DataEntry -> DataEntry 
    9394mapDataEntry jm tm im fm de@(DataEntry dm i k args rk alts) = 
    94     let tim = Map.intersection (compIdMap dm im) $ setToMap $ getDatatypeIds de 
     95    let tim = Map.intersection (composeMap dm im) $ setToMap $ getDatatypeIds de 
    9596        newargs = map (mapTypeArg jm tm im) args 
    9697    in DataEntry tim i k newargs rk $ Set.map 
     
    154155ideMor e = mkMorphism e e 
    155156 
    156 compIdMap :: IdMap -> IdMap -> IdMap 
    157 compIdMap im1 im2 = if Map.null im2 then im1 else Map.foldWithKey ( \ i j -> 
    158     let k = Map.findWithDefault j j im2 in 
    159     if i == k then Map.delete i else Map.insert i k) im2 im1 
    160  
    161157compMor :: Morphism -> Morphism -> Result Morphism 
    162158compMor m1 m2 = 
    163159     let  tm1 = typeIdMap m1 
    164160          tm2 = typeIdMap m2 
    165           im = compIdMap tm1 tm2 
     161          im = composeMap tm1 tm2 
    166162          cm1 = classIdMap m1 
    167163          cm2 = classIdMap m2 
    168           cm = compIdMap cm1 cm2 
     164          cm = composeMap cm1 cm2 
    169165          fm2 = funMap m2 
    170166          fm1 = funMap m1 
  • trunk/HasCASL/SymbolMapAnalysis.hs

    r11818 r11825  
    3535import Common.ExtSign 
    3636import Common.Result 
     37import Common.Utils (composeMap) 
    3738import Common.Lib.State 
    3839import qualified Data.Map as Map 
     
    127128mapTypeDefn im td = case td of 
    128129    DatatypeDefn de@(DataEntry tm i k args rk alts) -> 
    129         DatatypeDefn (DataEntry (Map.intersection (compIdMap tm im) $ 
     130        DatatypeDefn (DataEntry (Map.intersection (composeMap tm im) $ 
    130131              setToMap $ getDatatypeIds de) i k args rk alts) 
    131132    AliasTypeDefn sc -> AliasTypeDefn $ mapType im sc 
  • trunk/RelationalScheme/Sign.hs

    r11439 r11825  
    129129          case Map.lookup ih $ column_map imorh of 
    130130            Just iM -> do 
    131                 oM <- comp_c_map (col_map imaph) (col_map iM) 
     131                let oM = composeMap (col_map imaph) (col_map iM) 
    132132                return (ih, RSTMap oM) 
    133133            Nothing -> fail "apply_comp_c_map" 
     
    142142comp_rst_mor mor1 mor2 = 
    143143    do 
    144         t_map <- composeMap (table_map mor1) (table_map mor2) 
     144        let t_map = composeMap (table_map mor1) (table_map mor2) 
    145145        c_map <- mapM (\x -> apply_comp_c_map x mor1 mor2) $ map t_name $ 
    146146            Set.toList $ tables $ domain $ mor1 
     
    153153                ,   column_map = cm_map 
    154154                } 
    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 c2 
    159155 
    160156emptyRSSign :: RSTables