SymbolMapAnalysis.hs revision b0442fc87b3d8a47626543df44e4227d6933f8bd
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian MaederModule : $Header$
c58a94c44b76b072ace930f2126c889c0b64cb2aChristian MaederDescription : symbol map analysis for the CASL logic.
97018cf5fa25b494adffd7e9b4e87320dae6bf47Christian MaederCopyright : (c) Till Mossakowski, C. Maeder and Uni Bremen 2002-2005
ea03c5d09694b4a966fbd19d46cfa5772648d95fChristian MaederLicense : GPLv2 or higher, see LICENSE.txt
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian MaederMaintainer : Christian.Maeder@dfki.de
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian MaederStability : provisional
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian MaederPortability : portable
ea03c5d09694b4a966fbd19d46cfa5772648d95fChristian MaederSymbol map analysis for the CASL logic.
ea03c5d09694b4a966fbd19d46cfa5772648d95fChristian Maeder Follows Sect. III:4.1 of the CASL Reference Manual.
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder ( inducedFromMorphism
0a85c4dc6f4bba88e1994e8f1cd3657b6503b220Christian Maeder , inducedFromToMorphism
0a85c4dc6f4bba88e1994e8f1cd3657b6503b220Christian Maeder , inducedFromMorphismExt
f8c07dc6526e0134d66885d461a30abadc2c6038Christian Maeder , inducedFromToMorphismExt
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder , cogeneratedSign
dc6b48bb46df8e56da3491c98476e6da0d1d5d1dChristian Maeder , generatedSign
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder , constMorphExt
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder , profileContainsSort
502ed7ed7fecd10b6d0c83cdd48a244ec45e840aChristian Maederimport CASL.Overload (leqF, leqP)
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maederimport qualified Data.Map as Map
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maederimport qualified Data.Set as Set
502ed7ed7fecd10b6d0c83cdd48a244ec45e840aChristian Maederimport qualified Common.Lib.Rel as Rel
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maederimport Data.List (partition, find)
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian MaederinducedFromMorphism :: RawSymbolMap -> sign -> Result morphism
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian MaederHere is Bartek Klin's algorithm that has benn used for CATS.
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian MaederOur algorithm deviates from it. The exact details need to be checked.
9348e8460498ddfcd9da11cd8b5794c06023e004Christian MaederInducing morphism from raw symbol map and signature
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian MaederInput: raw symbol map "Rsm"
e1839fb37a3a2ccd457464cb0dcc5efd466dbe22Christian Maeder signature "Sigma1"
9348e8460498ddfcd9da11cd8b5794c06023e004Christian MaederOutput: morphims "Mrph": Sigma1 -> "Sigma2".
e1839fb37a3a2ccd457464cb0dcc5efd466dbe22Christian Maeder1. let "Ssm" be an empty list of pairs (symbol, raw symbol).
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder2. for each pair "Rsym1,Rsym2" in Rsm do:
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder 2.1. if there is no symbol in Sigma1 matching Rsym1, return error.
cf3232cec840a6945667bdb06f5b47b22243bc8fChristian Maeder 2.2. for each symbol "Sym" from Sigma1 matching Rsym1
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder 2.2.1. add a pair "Sym,Rsym2" to Ssm.
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder//computing the "sort part" of the morphism
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder3. let Sigma2 be an empty signature.
975642b989852fc24119c59cf40bc1af653608ffChristian Maeder4. let Mrph be an empty "morphism" from Sigma1 to Sigma2.
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder5. for each pair "Sym,Rsym2" in Ssm such that Sym is a sort symbol
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder 5.1. if Rsym2 is not a sort raw symbol, return error.
e8a2ca3a7b3e9a19ef03b6b1c0b5d03dbad6463cChristian Maeder 5.2. if in Mrph there is a mapping of sort in Sym to sort with
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder name other than that in Rsym2, return error.
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder 5.3. if in Mrph there is no mappinh of sort in Sym
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder 5.3.1. add sort from Rsym2 to Sigma2
1d589334ba6b4a4cbfb35307a7a732261e77b0cdChristian Maeder 5.3.2. add mapping from sort(Sym) to sort(Rsym2) to Mrph.
975642b989852fc24119c59cf40bc1af653608ffChristian Maeder6. for each sort symbol "S" in Sigma1
1d589334ba6b4a4cbfb35307a7a732261e77b0cdChristian Maeder 6.1. if S is not mapped by Mrph,
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder 6.1.1. add sort S to Sigma2
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder 6.1.2. add mapping from S to S to Mrph.
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder//computing the "function/predicate part" of the morphism
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder7. for each pair "Sym,Rsym2" in Ssm such that Sym is a function/predicate
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder 7.1. let "F" be name contained in Sym, let "Fprof" be the profile.
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder 7.2. let "Fprof1" be the value of Fprof via Mrph
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder (it can be computed, as we already have the "sort" part of
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder 7.3. if Rsym2 is not of appriopriate type, return error, otherwise
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder let "F2" be the name of the symbol.
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder 7.4. if Rsym2 enforces the profile of the symbol (i.e., it is not
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder an implicit symbol), compare the profile to Fprof1. If it is
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder not equal, return error.
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder 7.5. if in Mrph there is a mapping of F1 with profile Fprof to
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder some name different than F2, return error.
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder 7.6. add an operation/predicate with name F2 and profile Fprof1 to
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder Sigma2. If it is a partial function and if in Sigma2 there
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder exists a total function with the same name and profile, do not
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder add it. Otherwise if it is a total function and if in Sigma2
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder there exists a partial function with the same name and profile,
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder add the total function removing the partial one.
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder 7.7. add to Mrph a mapping from operation/predicate of name F1 and
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder profile Fprof to name F2.
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder8. for each operation/predicate symbol "F" with profile "Fprof" in Sigma1
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder that is not mapped by Mrph,
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder 8.1. as in 7.2
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder 8.2. as in 7.6, replacing F2 with F1.
e1839fb37a3a2ccd457464cb0dcc5efd466dbe22Christian Maeder 8.3. as in 7.7, replacing F2 with F1.
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder9. for each sort relation "S1,S2" in Sigma1,
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder 9.1. compute S3=(S1 via Mrph) and S4=(S2 via Mrph)
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder 9.2. add sort relation "S3,S4" in Sigma2.
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder10. Compute transitive closure of subsorting relation in Sigma2.
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maedertype InducedMorphism e m = RawSymbolMap -> e -> Result m
36c6cc568751e4235502cfee00ba7b597dae78dcChristian MaederconstMorphExt :: m -> InducedMorphism e m
36c6cc568751e4235502cfee00ba7b597dae78dcChristian MaederconstMorphExt m _ _ = return m
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder{- | function and preds in the overloading relation are mapped in the same way
fd5d3885a092ac0727fa2436cdfc3b248318ebd8Christian Maederthus preserving the overload-relation -}
9348e8460498ddfcd9da11cd8b5794c06023e004Christian MaederinducedFromMorphism :: (Pretty e, Show f) => m -> RawSymbolMap -> Sign f e
628310b42327ad76ce471caf0dde6563d6fa6307Christian Maeder -> Result (Morphism f e m)
9348e8460498ddfcd9da11cd8b5794c06023e004Christian MaederinducedFromMorphism =
31242f7541fd6ef179e4eb5be7522ddf54ae397bChristian Maeder inducedFromMorphismExt (\ _ _ _ _ -> extendedInfo) . constMorphExt
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian MaederinducedFromMorphismExt :: (Pretty e, Show f) => InducedSign f e m e
31242f7541fd6ef179e4eb5be7522ddf54ae397bChristian Maeder -> InducedMorphism e m
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder -> RawSymbolMap -> Sign f e -> Result (Morphism f e m)
76fa667489c5e0868ac68de9f0253ac10f73d0b5Christian MaederinducedFromMorphismExt extInd extEm rmap sigma = do
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder -- compute the sort map (as a Map)
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder sort_Map <- Set.fold (\ s m -> do
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder s' <- sortFun rmap s
628310b42327ad76ce471caf0dde6563d6fa6307Christian Maeder return $ if s' == s then m1 else Map.insert s s' m1)
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder (return Map.empty) (sortSet sigma)
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder -- compute the op map (as a Map)
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder op_Map <- Map.foldWithKey (opFun sigma rmap sort_Map)
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder (return Map.empty) (opMap sigma)
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder -- compute the pred map (as a Map)
628310b42327ad76ce471caf0dde6563d6fa6307Christian Maeder pred_Map <- Map.foldWithKey (predFun sigma rmap sort_Map)
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder (return Map.empty) (predMap sigma)
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder em <- extEm rmap $ extendedInfo sigma
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder -- return assembled morphism
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder return (embedMorphism em sigma $ closeSortRel
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder $ inducedSignAux extInd sort_Map op_Map pred_Map em sigma)
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder { sort_map = sort_Map
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder , op_map = op_Map
cbbb99ab370e6ad265b14a37e7d35b7f08a50d43Christian Maeder , pred_map = pred_Map }
0a85c4dc6f4bba88e1994e8f1cd3657b6503b220Christian Maeder {- the sorts of the source signature
fd5d3885a092ac0727fa2436cdfc3b248318ebd8Christian Maeder sortFun is the sort map as a Haskell function -}
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian MaedersortFun :: RawSymbolMap -> Id -> Result Id
c9892acbf03a509d874ac6d79b9a2cb09042e0dcChristian MaedersortFun rmap s
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder -- rsys contains the raw symbols to which s is mapped to
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maeder | Set.null rsys = return s -- use default = identity mapping
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder return $ rawSymName $ Set.findMin rsys -- take the unique rsy
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder | otherwise = plain_error s -- ambiguity! generate an error
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder ("sort " ++ showId s
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder " is mapped ambiguously: " ++ showDoc rsys "")
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder $ getRange rsys
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder -- get all raw symbols to which s is mapped to
154d4152b38c55c3c4ab8f35578669a65fc04df9Christian Maeder rsys = Set.fromList $ mapMaybe (`Map.lookup` rmap)
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder [ ASymbol $ idToSortSymbol s
b49276c9f50038e0bd499ad49f7bd6444566a834Christian Maeder , AKindedSymb Implicit s ]
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder {- to a Op_map, add everything resulting from mapping (id, ots)
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder according to rmap -}
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian MaederopFun :: Sign f e -> RawSymbolMap -> Sort_map -> Id -> Set.Set OpType
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder -> Result Op_map -> Result Op_map
afa6848d579d235c9677e1ab477916df8e5ae11aChristian MaederopFun src rmap sort_Map ide ots m =
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder -- first consider all directly mapped profiles
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder let otls = Rel.partSet (leqF src) ots
f8c07dc6526e0134d66885d461a30abadc2c6038Christian Maeder m1 = foldr (directOpMap rmap sort_Map ide) m otls
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder -- now try the remaining ones with (un)kinded raw symbol
f8c07dc6526e0134d66885d461a30abadc2c6038Christian Maeder in case (Map.lookup (AKindedSymb Ops_kind ide) rmap,
f8c07dc6526e0134d66885d461a30abadc2c6038Christian Maeder Map.lookup (AKindedSymb Implicit ide) rmap) of
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder (Just rsy1, Just rsy2) -> let
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder m2 = Set.fold (insertmapOpSym sort_Map ide rsy1) m1 ots
f8c07dc6526e0134d66885d461a30abadc2c6038Christian Maeder in Set.fold (insertmapOpSym sort_Map ide rsy2) m2 ots
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder (Just rsy, Nothing) ->
f8c07dc6526e0134d66885d461a30abadc2c6038Christian Maeder Set.fold (insertmapOpSym sort_Map ide rsy) m1 ots
f8c07dc6526e0134d66885d461a30abadc2c6038Christian Maeder (Nothing, Just rsy) ->
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder Set.fold (insertmapOpSym sort_Map ide rsy) m1 ots
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder -- Anything not mapped explicitly is left unchanged
f8c07dc6526e0134d66885d461a30abadc2c6038Christian Maeder (Nothing, Nothing) -> m1
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder {- try to map an operation symbol directly
f8c07dc6526e0134d66885d461a30abadc2c6038Christian Maeder collect all opTypes that cannot be mapped directly -}
afa6848d579d235c9677e1ab477916df8e5ae11aChristian MaederdirectOpMap :: RawSymbolMap -> Sort_map -> Id -> Set.Set OpType
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder -> Result Op_map -> Result Op_map
f8c07dc6526e0134d66885d461a30abadc2c6038Christian MaederdirectOpMap rmap sort_Map ide ots m =
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder rl = map (lookupOpSymbol rmap ide) ol
f8c07dc6526e0134d66885d461a30abadc2c6038Christian Maeder (ms, os) = partition (isJust . fst) $ zip rl ol
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder in case ms of
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder l@((Just rsy, _) : rs) ->
f8c07dc6526e0134d66885d461a30abadc2c6038Christian Maeder foldr (\ (_, ot) ->
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder insertmapOpSym sort_Map ide
f8c07dc6526e0134d66885d461a30abadc2c6038Christian Maeder (ASymbol $ idToOpSymbol (rawSymName rsy)
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder $ mapOpType sort_Map ot) ot)
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder (foldr (\ (rsy2, ot) ->
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder insertmapOpSym sort_Map ide (fromJust rsy2) ot) m l)
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian MaederlookupOpSymbol :: RawSymbolMap -> Id -> OpType -> Maybe RawSymbol
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian MaederlookupOpSymbol rmap ide' ot = let mkS = idToOpSymbol ide' in
f8c07dc6526e0134d66885d461a30abadc2c6038Christian Maeder case Map.lookup (ASymbol (mkS $ mkPartial ot)) rmap of
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder (ASymbol (mkS $ mkTotal ot)) rmap
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder -- map op symbol (ide, ot) to raw symbol rsy
f8c07dc6526e0134d66885d461a30abadc2c6038Christian MaedermappedOpSym :: Sort_map -> Id -> OpType -> RawSymbol -> Result (Id, OpKind)
afa6848d579d235c9677e1ab477916df8e5ae11aChristian MaedermappedOpSym sort_Map ide ot rsy =
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder let opSym = "operation symbol " ++ showDoc (idToOpSymbol ide ot)
f8c07dc6526e0134d66885d461a30abadc2c6038Christian Maeder " is mapped to "
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder kind = opKind ot
f8c07dc6526e0134d66885d461a30abadc2c6038Christian Maeder ot2 = mapOpType sort_Map ot
f8c07dc6526e0134d66885d461a30abadc2c6038Christian Maeder in case rsy of
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder ASymbol (Symbol ide' (OpAsItemType ot')) ->
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder if compatibleOpTypes ot2 ot'
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder then return (ide', opKind ot')
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder else plain_error (ide, kind)
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder (opSym ++ "type " ++ showDoc ot'
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder " but should be mapped to type " ++
f8c07dc6526e0134d66885d461a30abadc2c6038Christian Maeder showDoc ot2 "") $ getRange rsy
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder AKindedSymb k ide' | elem k [Implicit, Ops_kind] -> return (ide', kind)
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder _ -> plain_error (ide, kind)
717686b54b9650402e2ebfbaadf433eab8ba5171Christian Maeder (opSym ++ "symbol of wrong kind: " ++ showDoc rsy "")
717686b54b9650402e2ebfbaadf433eab8ba5171Christian Maeder $ getRange rsy
717686b54b9650402e2ebfbaadf433eab8ba5171Christian Maeder -- insert mapping of op symbol (ide, ot) to raw symbol rsy into m
717686b54b9650402e2ebfbaadf433eab8ba5171Christian MaederinsertmapOpSym :: Sort_map -> Id -> RawSymbol -> OpType
717686b54b9650402e2ebfbaadf433eab8ba5171Christian Maeder -> Result Op_map -> Result Op_map
717686b54b9650402e2ebfbaadf433eab8ba5171Christian MaederinsertmapOpSym sort_Map ide rsy ot m = do
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder (ide', kind') <- mappedOpSym sort_Map ide ot rsy
717686b54b9650402e2ebfbaadf433eab8ba5171Christian Maeder let otsy = Symbol ide $ OpAsItemType ot
717686b54b9650402e2ebfbaadf433eab8ba5171Christian Maeder pos = getRange rsy
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder m2 = Map.insert (ide, mkPartial ot) (ide', kind') m1
717686b54b9650402e2ebfbaadf433eab8ba5171Christian Maeder case Map.lookup (ide, mkPartial ot) m1 of
717686b54b9650402e2ebfbaadf433eab8ba5171Christian Maeder Nothing -> if ide == ide' && kind' == opKind ot then
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder ASymbol _ -> return m1
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder _ -> hint m1 ("identity mapping of "
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder ++ showDoc otsy "") pos
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder else return m2
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder Just (ide'', kind'') -> if ide' == ide'' then
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder warning (if kind' < kind'' then m2 else m1)
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder ("ignoring duplicate mapping of " ++ showDoc otsy "")
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder else plain_error m1
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder ("conflicting mapping of " ++ showDoc otsy " to " ++
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder show ide' ++ " and " ++ show ide'') pos
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder {- to a Pred_map, add evering resulting from mapping (ide, pts)
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder according to rmap -}
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian MaederpredFun :: Sign f e -> RawSymbolMap -> Sort_map -> Id -> Set.Set PredType
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder -> Result Pred_map -> Result Pred_map
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian MaederpredFun src rmap sort_Map ide pts m =
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder -- first consider all directly mapped profiles
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder let ptls = Rel.partSet (leqP src) pts
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder m1 = foldr (directPredMap rmap sort_Map ide) m ptls
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder -- now try the remaining ones with (un)kinded raw symbol
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder in case (Map.lookup (AKindedSymb Preds_kind ide) rmap,
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder Map.lookup (AKindedSymb Implicit ide) rmap) of
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder (Just rsy1, Just rsy2) -> let
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder m2 = Set.fold (insertmapPredSym sort_Map ide rsy1) m1 pts
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder in Set.fold (insertmapPredSym sort_Map ide rsy2) m2 pts
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder (Just rsy, Nothing) ->
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder Set.fold (insertmapPredSym sort_Map ide rsy) m1 pts
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder (Nothing, Just rsy) ->
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder Set.fold (insertmapPredSym sort_Map ide rsy) m1 pts
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder -- Anything not mapped explicitly is left unchanged
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder (Nothing, Nothing) -> m1
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder {- try to map a predicate symbol directly
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder collect all predTypes that cannot be mapped directly -}
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian MaederdirectPredMap :: RawSymbolMap -> Sort_map -> Id -> Set.Set PredType
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder -> Result Pred_map -> Result Pred_map
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian MaederdirectPredMap rmap sort_Map ide pts m =
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder rl = map (\ pt -> Map.lookup (ASymbol $ idToPredSymbol ide pt) rmap) pl
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder (ms, ps) = partition (isJust . fst) $ zip rl pl
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder in case ms of
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder l@((Just rsy, _) : rs) ->
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder foldr (\ (_, pt) ->
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder insertmapPredSym sort_Map ide
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder (ASymbol $ idToPredSymbol (rawSymName rsy)
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder $ mapPredType sort_Map pt) pt)
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder (foldr (\ (rsy2, pt) ->
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder insertmapPredSym sort_Map ide (fromJust rsy2) pt) m l)
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder -- map pred symbol (ide, pt) to raw symbol rsy
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian MaedermappedPredSym :: Sort_map -> Id -> PredType -> RawSymbol -> Result Id
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian MaedermappedPredSym sort_Map ide pt rsy =
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder let predSym = "predicate symbol " ++ showDoc (idToPredSymbol ide pt)
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder " is mapped to "
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder pt2 = mapPredType sort_Map pt
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder in case rsy of
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder ASymbol (Symbol ide' (PredAsItemType pt')) ->
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder if pt2 == pt'
e7ce154edb906685b3fa7f6c0a764e18a4658068Christian Maeder then return ide'
m2 = Map.insert (ide, pt) ide' m1
case Map.lookup (ide, pt) m1 of
The algorithm has additionally to take care of default values (i.e.
1. compute the morphism mor1 induced by rmap and sigma1 (i.e. the renaming)
pos = concatMapRange getRange $ Map.keys rmap
(map ASymbol $ Set.toList ss1)
$ map ASymbol $ Set.toList sy2
$ concatMapRange getRange $ Map.keys rmap
sigma1 = Set.fold revealSym sigma
{ sortSet = Set.empty
, opMap = Map.empty
, predMap = Map.empty } sys -- 4.
{ sortRel = sortRel sigma `Rel.restrict` sortSet sigma1
, emptySortSet = Set.intersection (sortSet sigma1) $ emptySortSet sigma }
in if not $ Set.isSubsetOf sys symset -- 2.
sigma1 {sortSet = Set.insert (symName sy) $ sortSet sigma1}
sigma1 { sortSet = foldr Set.insert (sortSet sigma1)
, opMap = Rel.setInsert (symName sy) ot $ opMap sigma1 }
sigma1 { sortSet = foldr Set.insert (sortSet sigma1) $ predArgs pt
, predMap = Rel.setInsert (symName sy) pt $ predMap sigma1 }
3.1.1.2. For each function/predicate symbol in
symset1 = Set.fold hideSym symset0 symset -- 3.
in if Set.isSubsetOf symset symset0 -- 2.
Set.filter (not . profileContainsSort (symName sy) . symbType)
$ Set.delete sy symset1'
Set.delete sy symset1'
Set.delete sy symset1'
mkp = Map.map makePartial
let extP = Map.map (map $ \ s -> (s, [], False))
d1 = Map.differenceWith (listOfSetDiff True) o1 o3
e1 = Map.differenceWith (listOfSetDiff True) p1 p3
let sIn = Set.isSubsetOf s
Nothing -> error "CASL.finalUnion.listOfSetDiff1"
(s2, filter (`Set.isSubsetOf` s2) l1, b) : l, r)
_ -> error "CASL.finalUnion.listOfSetDiff2")