Morphism.hs revision 8e80792f474d154ff11762fac081a422e34f1acc
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian MaederModule : $Header$
e47d29b522739fbf08aac80c6faa447dde113fbcChristian MaederCopyright : (c) Christian Maeder, Till Mossakowski and Uni Bremen 2002-2004
11d6ec73ee5550e00cb56b221bdbeb709142e779Christian MaederLicense : similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
f3cd81f98592d1dbf301f48af31677a6a0cc666aChristian MaederMaintainer : maeder@tzi.de
3f69b6948966979163bdfe8331c38833d5d90ecdChristian MaederStability : provisional
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian MaederPortability : portable
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian MaederSymbols and signature morphisms for the CASL logic
ac142c1b088711f911018d8108a64be80b2f2a58Christian Maederissue warning for symbols lists like __ * __, __ + __: Elem * Elem -> Elem
ac142c1b088711f911018d8108a64be80b2f2a58Christian Maederthe qualification only applies to __+__ !
f3cd81f98592d1dbf301f48af31677a6a0cc666aChristian Maederpossibly reuse SYMB_KIND for Kind
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian Maederimport qualified Common.Lib.Map as Map
1c67beb3720d0b84d8d71ee2012166a09be81fbdChristian Maederimport qualified Common.Lib.Set as Set
1c67beb3720d0b84d8d71ee2012166a09be81fbdChristian Maederimport qualified Common.Lib.Rel as Rel
f3cd81f98592d1dbf301f48af31677a6a0cc666aChristian Maedertype SymbolSet = Set.Set Symbol
ff9a53595208f532c25ac5168f772f48fd80fdb5Christian Maedertype SymbolMap = Map.Map Symbol Symbol
1eb10c0c30323eed3cc21082fd242cd09a612dc5Christian Maederdata RawSymbol = ASymbol Symbol | AnID Id | AKindedId Kind Id
1eb10c0c30323eed3cc21082fd242cd09a612dc5Christian Maeder deriving (Show, Eq, Ord)
e47d29b522739fbf08aac80c6faa447dde113fbcChristian Maederinstance PosItem RawSymbol where
975642b989852fc24119c59cf40bc1af653608ffChristian Maeder getRange rs =
975642b989852fc24119c59cf40bc1af653608ffChristian Maeder ASymbol s -> getRange s
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder AnID i -> getRange i
975642b989852fc24119c59cf40bc1af653608ffChristian Maeder AKindedId _ i -> getRange i
836e72a3c413366ba9801726f3b249c7791cb9caChristian Maedertype RawSymbolSet = Set.Set RawSymbol
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maedertype RawSymbolMap = Map.Map RawSymbol RawSymbol
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maederdata Kind = SortKind | FunKind | PredKind
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder deriving (Show, Eq, Ord)
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maedertype Sort_map = Map.Map SORT SORT
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder-- allways use the partial profile as key!
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maedertype Fun_map = Map.Map (Id,OpType) (Id, FunKind)
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maedertype Pred_map = Map.Map (Id,PredType) Id
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maederdata Morphism f e m = Morphism
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder { msource :: Sign f e
53301de22afd7190981b363b57c48df86fcb50f7Christian Maeder , mtarget :: Sign f e
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder , sort_map :: Sort_map
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder , fun_map :: Fun_map
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder , pred_map :: Pred_map
1eb10c0c30323eed3cc21082fd242cd09a612dc5Christian Maeder , extended_map :: m
fa45d098e1c9d468f128be9505eb7e5b2705b304Christian Maeder } deriving (Eq, Show)
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian MaedermapSort :: Sort_map -> SORT -> SORT
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian MaedermapSort sorts s = Map.findWithDefault s s sorts
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian MaedermapOpType :: Sort_map -> OpType -> OpType
36c6cc568751e4235502cfee00ba7b597dae78dcChristian MaedermapOpType sorts t = if Map.null sorts then t else
7de39d39bc1700cc8a9bb9df90b920aad9e18d4aChristian Maeder t { opArgs = map (mapSort sorts) $ opArgs t
1eb10c0c30323eed3cc21082fd242cd09a612dc5Christian Maeder , opRes = mapSort sorts $ opRes t }
36c6cc568751e4235502cfee00ba7b597dae78dcChristian MaedermapOpTypeK :: Sort_map -> FunKind -> OpType -> OpType
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian MaedermapOpTypeK sorts k t = makeTotal k $ mapOpType sorts t
f454c20b6c126bea7d31d400cc8824b9ee8cc6eaChristian MaedermakeTotal :: FunKind -> OpType -> OpType
18b709ce961d68328da768318dcc70067f066d86Christian MaedermakeTotal Total t = t { opKind = Total }
ac142c1b088711f911018d8108a64be80b2f2a58Christian MaedermakeTotal _ t = t
0216a1580abf46ed8981f25e89d6fd99b2944ac2Christian MaedermapOpSym :: Sort_map -> Fun_map -> (Id, OpType) -> (Id, OpType)
0216a1580abf46ed8981f25e89d6fd99b2944ac2Christian MaedermapOpSym sMap fMap (i, ot) =
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder let mot = mapOpType sMap ot in
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder case Map.lookup (i, ot {opKind = Partial} ) fMap of
9c5b1136299d9052e4e995614a3a36a051a2682fChristian Maeder Nothing -> (i, mot)
9c5b1136299d9052e4e995614a3a36a051a2682fChristian Maeder Just (j, k) -> (j, makeTotal k mot)
0216a1580abf46ed8981f25e89d6fd99b2944ac2Christian Maeder-- | Check if two OpTypes are equal modulo totality or partiality
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian MaedercompatibleOpTypes :: OpType -> OpType -> Bool
797f811e57952d59e73b8cd03b667eef276db972Christian MaedercompatibleOpTypes ot1 ot2 = opArgs ot1 == opArgs ot2 && opRes ot1 == opRes ot2
fe5dbb45b6a8abf34375b4bc5f2a81cda664c0e4Christian MaedermapPredType :: Sort_map -> PredType -> PredType
797f811e57952d59e73b8cd03b667eef276db972Christian MaedermapPredType sorts t = if Map.null sorts then t else
797f811e57952d59e73b8cd03b667eef276db972Christian Maeder t { predArgs = map (mapSort sorts) $ predArgs t }
42c01284bba8d7c8d995c8dfb96ace57d28ed1bcTill MossakowskimapPredSym :: Sort_map -> Pred_map -> (Id, PredType) -> (Id, PredType)
369454f9b2dbea113cbb40544a9b0f31425b2c69Christian MaedermapPredSym sMap fMap (i, pt) =
b52ad1aed6b1eb8b8416aaf100695f54ea59aea0Christian Maeder (Map.findWithDefault i (i, pt) fMap, mapPredType sMap pt)
18b709ce961d68328da768318dcc70067f066d86Christian Maedertype Ext f e m = Sign f e -> Sign f e -> m
5581c4644d91dcb9b7e2e7f6052f7cbf5f97b6deChristian MaederembedMorphism :: Ext f e m -> Sign f e -> Sign f e -> Morphism f e m
3daa82a175c7cfabf22455aa77c4beda327404e4Christian MaederembedMorphism extEm a b = Morphism
3daa82a175c7cfabf22455aa77c4beda327404e4Christian Maeder { msource = a
3daa82a175c7cfabf22455aa77c4beda327404e4Christian Maeder , mtarget = b
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder , extended_map = extEm a b
22fc8a1bd14dc53c5c7f482d2e0c04eb5ee4beb4Christian MaederidToSortSymbol :: Id -> Symbol
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian MaederidToSortSymbol idt = Symbol idt SortAsItemType
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian MaederidToOpSymbol :: Id -> OpType -> Symbol
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian MaederidToOpSymbol idt typ = Symbol idt (OpAsItemType typ)
adfdcfa67b7f12df6df7292e238c3f9a4b637980Christian MaederidToPredSymbol :: Id -> PredType -> Symbol
adfdcfa67b7f12df6df7292e238c3f9a4b637980Christian MaederidToPredSymbol idt typ = Symbol idt (PredAsItemType typ)
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian MaedersymbTypeToKind :: SymbType -> Kind
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian MaedersymbTypeToKind (OpAsItemType _) = FunKind
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian MaedersymbTypeToKind (PredAsItemType _) = PredKind
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian MaedersymbTypeToKind SortAsItemType = SortKind
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian MaedersymbolToRaw :: Symbol -> RawSymbol
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian MaedersymbolToRaw sym = ASymbol sym
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian MaederidToRaw :: Id -> RawSymbol
f454c20b6c126bea7d31d400cc8824b9ee8cc6eaChristian MaederidToRaw x = AnID x
5581c4644d91dcb9b7e2e7f6052f7cbf5f97b6deChristian MaederrawSymName :: RawSymbol -> Id
369454f9b2dbea113cbb40544a9b0f31425b2c69Christian MaederrawSymName (ASymbol sym) = symName sym
11d6ec73ee5550e00cb56b221bdbeb709142e779Christian MaederrawSymName (AnID i) = i
9c5b1136299d9052e4e995614a3a36a051a2682fChristian MaederrawSymName (AKindedId _ i) = i
ac142c1b088711f911018d8108a64be80b2f2a58Christian MaedersymOf :: Sign f e -> SymbolSet
fcec1ffa4a95dbc47cf23f75e6843ceff93a925eChristian Maeder let sorts = Set.map idToSortSymbol $ sortSet sigma
b52ad1aed6b1eb8b8416aaf100695f54ea59aea0Christian Maeder concatMap (\ (i, ts) -> map ( \ t -> idToOpSymbol i t)
5581c4644d91dcb9b7e2e7f6052f7cbf5f97b6deChristian Maeder concatMap (\ (i, ts) -> map ( \ t -> idToPredSymbol i t)
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder Map.toList $ predMap sigma
f454c20b6c126bea7d31d400cc8824b9ee8cc6eaChristian Maeder in Set.unions [sorts, ops, preds]
65835942d66905c377fa503e0d577df5aade58feChristian MaederstatSymbMapItems :: [SYMB_MAP_ITEMS] -> Result RawSymbolMap
65835942d66905c377fa503e0d577df5aade58feChristian MaederstatSymbMapItems sl = do
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder ls <- sequence $ map s1 sl
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder foldl insertRsys (return Map.empty) (concat ls)
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder s1 (Symb_map_items kind l _) = sequence (map (symbOrMapToRaw kind) l)
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder insertRsys m (rsy1,rsy2) = do
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder case Map.lookup rsy1 m1 of
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder Nothing -> return $ Map.insert rsy1 rsy2 m1
fcec1ffa4a95dbc47cf23f75e6843ceff93a925eChristian Maeder plain_error m1 ("Symbol " ++ showDoc rsy1 " mapped twice to "
5581c4644d91dcb9b7e2e7f6052f7cbf5f97b6deChristian Maeder ++ showDoc rsy2 " and " ++ showDoc rsy3 "") nullRange
case Map.lookup (Symbol {symName = s, symbType = SortAsItemType}) smap
Map.insert s t m
mapFun i ots m = Set.fold (insFun i) m ots
case Map.lookup (Symbol {symName = i, symbType = OpAsItemType ot}) smap
else Map.insert (i, ot {opKind = Partial}) (j, k) m
mapPred i pts m = Set.fold (insPred i) m pts
case Map.lookup (Symbol {symName = i, symbType = PredAsItemType pt}) smap
PredAsItemType _ -> if i == j then m else Map.insert (i, pt) j m
Map.empty $ sortSet src
opSymMap = Map.foldWithKey
( \ i s m -> Set.fold
( \ t -> Map.insert (idToOpSymbol i t)
Map.empty $ opMap src
predSymMap = Map.foldWithKey
( \ i s m -> Set.fold
( \ t -> Map.insert (idToPredSymbol i t)
Map.empty $ predMap src
foldr Map.union sortSymMap [opSymMap,predSymMap]
sMap = if Map.null sMap2 then sMap1 else
Set.fold ( \ i ->
if i == j then id else Map.insert i j)
Map.empty $ sortSet src
fun_map = if Map.null fMap2 then fMap1 else
Map.foldWithKey ( \ i t m ->
Set.fold ( \ ot ->
Map.insert (i, ot {opKind = Partial }) (ni, k)) m t)
Map.empty $ opMap src,
pred_map = if Map.null pMap2 then pMap1 else
Map.foldWithKey ( \ i t m ->
Set.fold ( \ pt ->
if i == ni then id else Map.insert (i, pt) ni) m t)
Map.empty $ predMap src,
Map.foldWithKey (\s sset b -> b && legalSort s && all legalSort
(Set.toList sset))
True (Rel.toMap (sortRel sigma))
legalSort s = Set.member s sorts
msorts = Set.map (mapSort smap) $ sortSet s1
mops = Map.foldWithKey ( \ i ->
flip $ Set.fold ( \ ot ->
mpreds = Map.foldWithKey ( \ i ->
flip $ Set.fold ( \ pt ->
&& Set.isSubsetOf msorts (sortSet s2)
uo1 = foldr delOp (opMap s1) $ Map.keys omap1
uo2 = foldr delOp (opMap s2) $ Map.keys omap2
delOp (n, ot) m = diffMapSet m $ Map.singleton n $
Set.fromList [ot {opKind = Partial}, ot {opKind =Total}]
up1 = foldr delPred (predMap s1) $ Map.keys pmap1
up2 = foldr delPred (predMap s2) $ Map.keys pmap2
(sds, smap) = foldr ( \ (i, j) (ds, m) -> case Map.lookup i m of
Nothing -> (ds, Map.insert i j m)
(Map.toList smap2 ++ map (\ a -> (a, a))
case Map.lookup isc m of
Nothing -> (ds, Map.insert isc jsc m)
else (ds, Map.insert isc (j, Total) m) else
(sds, omap1) (Map.toList omap2 ++ concatMap
case Map.lookup isc m of
Nothing -> (ds, Map.insert isc j m)
(Map.toList pmap2 ++ concatMap ( \ (a, s) -> map
sort_map = Map.filterWithKey (/=) smap,
fun_map = Map.filterWithKey
(\ (i, ot) (j, k) -> i /= j || k == Total && Set.member ot
pred_map = Map.filterWithKey (\ (i, _) j -> i /= j) pmap,
src = Map.keys sm
where src = Map.keys symmap
pretty (Map.filterWithKey (/=) $ morphismToSymbMap mor)