StatAnaCSP.hs revision 3b48e17c1da54ee669e70b626d9fbc32ce495b2c
e9458b1a7a19a63aa4c179f9ab20f4d50681c168Jens ElknerModule : $Id$
81d182b21020b815887e9057959228546cf61b6bChristian MaederDescription : Static analysis of CspCASL
14a1af9d9909dc47dc7fee6b0170b7ac0aef85daChristian MaederCopyright : (c) Andy Gimblett, Liam O'Reilly Markus Roggenbach,
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu Prodescu Swansea University 2008
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian MaederLicense : GPLv2 or higher, see LICENSE.txt
7abd0c58a5ce51db13f93de82407b2188d55d298Christian MaederMaintainer : a.m.gimblett@swansea.ac.uk
2ac1742771a267119f1d839054b5e45d0a468085Christian MaederStability : provisional
7abd0c58a5ce51db13f93de82407b2188d55d298Christian MaederPortability : portable
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian MaederStatic analysis of CSP-CASL specifications, following "Tool Support
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maederfor CSP-CASL", MPhil thesis by Andy Gimblett, 2008.
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maederimport qualified Control.Monad as Monad
14a1af9d9909dc47dc7fee6b0170b7ac0aef85daChristian Maederimport qualified Data.Map as Map
ad270004874ce1d0697fb30d7309f180553bb315Christian Maederimport qualified Data.Set as S
ad270004874ce1d0697fb30d7309f180553bb315Christian Maederimport CASL.AS_Basic_CASL (FORMULA(..), OpKind(..), SORT, TERM(..), VAR,
4ef2a978e66e2246ff0b7f00c77deb7aabb28b8eChristian Maeder VAR_DECL(..))
e8ffec0fa3d3061061bdc16e44247b9cf96b050fChristian Maederimport CASL.Overload (minExpFORMULA, oneExpTerm)
74a946e10a4b324c10d7a59f84298afbcae9b3cfChristian Maederimport CASL.StaticAna (allConstIds, allOpIds, allPredIds)
74a946e10a4b324c10d7a59f84298afbcae9b3cfChristian Maederimport qualified Common.Lib.Rel as Rel
c18e9c3c6d5039618f1f2c05526ece84c7794ea3Christian Maederimport Common.Id (getRange, Id, nullRange, simpleIdToId)
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maederimport qualified CspCASL.LocalTop as LocalTop
6b1153c560b677f9f5da2a60ee8a10de75ff90c5Christian Maederimport CspCASL.Morphism(makeChannelNameSymbol, makeFQProcNameSymbol)
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maederimport qualified Data.Set as Set
35597678f1c9da703de8d0b6b66ea63247ebe884Christian Maeder-- | The first element of the returned pair (CspBasicSpec) is the same
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder-- as the inputted version just with some very minor optimisations -
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder-- none in our case, but for CASL - brackets are otimized. This all
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder-- that happens, the mixfixed terms are still mixed fixed terms in
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder-- the returned version.
2ac1742771a267119f1d839054b5e45d0a468085Christian MaederbasicAnalysisCspCASL :: (CspBasicSpec, CspCASLSign, GlobalAnnos)
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder -> Result (CspBasicSpec, ExtSign CspCASLSign CspSymbol,
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder [Named CspCASLSen])
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian MaederbasicAnalysisCspCASL (cc, sigma, ga) =
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder let Result es mga = mergeGlobalAnnos ga $ globAnnos sigma
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder (_, accSig) = runState (ana_BASIC_CSP cc) $ case mga of
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder Nothing -> sigma
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder Just nga -> sigma { globAnnos = nga }
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder ds = reverse $ envDiags accSig
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder -- Extract process equations only.
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder ext = extendedInfo accSig
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder ccsents = reverse $ ccSentences ext
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder -- Clean signature here
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder cleanSig = accSig
ce7653c9c71e23bf04a5ec0ca5cb600c3738a909Christian Maeder { extendedInfo = ext { ccSentences = []}}
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder in Result (es ++ ds) $ Just (cc
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder , ExtSign cleanSig $ Set.map caslToCspSymbol $ declaredSymbols accSig
b1bd8688a1ce545444792a307412711c2c61df5fChristian MaedercaslToCspSymbol :: Symbol -> CspSymbol
b1bd8688a1ce545444792a307412711c2c61df5fChristian MaedercaslToCspSymbol sy = CspSymbol (symName sy) $ CaslSymbType $ symbType sy
b1bd8688a1ce545444792a307412711c2c61df5fChristian Maederana_BASIC_CSP :: CspBasicSpec -> State CspCASLSign ()
b1bd8688a1ce545444792a307412711c2c61df5fChristian Maederana_BASIC_CSP cc = do checkLocalTops
b1bd8688a1ce545444792a307412711c2c61df5fChristian Maeder mapM anaChanDecl (channels cc)
b1bd8688a1ce545444792a307412711c2c61df5fChristian Maeder mapM anaProcItem (proc_items cc)
74a946e10a4b324c10d7a59f84298afbcae9b3cfChristian Maeder-- Analysis of local top elements
74a946e10a4b324c10d7a59f84298afbcae9b3cfChristian Maeder-- | Check a CspCASL signature for local top elements in its subsort
74a946e10a4b324c10d7a59f84298afbcae9b3cfChristian MaedercheckLocalTops :: State CspCASLSign ()
74a946e10a4b324c10d7a59f84298afbcae9b3cfChristian MaedercheckLocalTops = do
74a946e10a4b324c10d7a59f84298afbcae9b3cfChristian Maeder let diags' = LocalTop.checkLocalTops $ sortRel sig
74a946e10a4b324c10d7a59f84298afbcae9b3cfChristian Maeder -- Only error will be added if there are any probelms. If there are no
b1bd8688a1ce545444792a307412711c2c61df5fChristian Maeder -- problems no errors will be added and hets will continue as normal.
b1bd8688a1ce545444792a307412711c2c61df5fChristian Maeder addDiags (diags')
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder-- Static analysis of channel declarations
ce7653c9c71e23bf04a5ec0ca5cb600c3738a909Christian Maeder-- | Statically analyse a CspCASL channel declaration.
2ac1742771a267119f1d839054b5e45d0a468085Christian MaederanaChanDecl :: CHANNEL_DECL -> State CspCASLSign ()
14a1af9d9909dc47dc7fee6b0170b7ac0aef85daChristian MaederanaChanDecl (ChannelDecl chanNames chanSort) = do
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder checkSorts [chanSort] -- check channel sort is known
0f0aa53f11a0d1ab08c76428b9de73db5b17c977Christian Maeder let ext = extendedInfo sig
7c35990c03276d1e675ea6f4ba38f47081620d77Christian Maeder oldChanMap = chans ext
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder newChanMap <- Monad.foldM (anaChannelName chanSort) oldChanMap chanNames
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder put sig2 { extendedInfo = ext { chans = newChanMap }}
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder-- | Statically analyse a CspCASL channel name.
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian MaederanaChannelName :: SORT -> ChanNameMap -> CHANNEL_NAME ->
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder State CspCASLSign ChanNameMap
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian MaederanaChannelName s m chanName = do
840b2a6f37ec58f3281da16fafbc4121462c856aChristian Maeder if (show chanName) `S.member` (S.map show (sortSet sig))
5ba383b1607c20c57e14324e72cee2c789436d5fChristian Maeder then do let err = "channel name already in use as a sort name"
5ba383b1607c20c57e14324e72cee2c789436d5fChristian Maeder addDiags [mkDiag Error err chanName]
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder else case Map.lookup chanName m of
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder -- Add the channel name as a symbol to the list of
5ba383b1607c20c57e14324e72cee2c789436d5fChristian Maeder -- newly defined symbols - which is stored in the CASL
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder do addSymbol (makeChannelNameSymbol chanName)
72909c6c1cfe9702f5910d0a135c8b55729c7917Christian Maeder return (Map.insert chanName s m) -- insert new.
72909c6c1cfe9702f5910d0a135c8b55729c7917Christian Maeder then do let warn = "channel redeclared with same sort"
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder addDiags [mkDiag Warning warn chanName]
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian Maeder return m -- already declared with this sort.
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian Maeder else do let err = "channel declared with multiple sorts"
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian Maeder addDiags [mkDiag Error err chanName]
2118d66b6aa3c90458925019c9b2fb986e2b2aabChristian Maeder-- Static analysis of process items
35597678f1c9da703de8d0b6b66ea63247ebe884Christian Maeder-- | Statically analyse a CspCASL process item.
2ac1742771a267119f1d839054b5e45d0a468085Christian MaederanaProcItem :: (Annoted PROC_ITEM) -> State CspCASLSign ()
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian MaederanaProcItem annotedProcItem =
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian Maeder let procItem = item annotedProcItem
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian Maeder in case procItem of
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian Maeder (Proc_Decl name argSorts alpha) -> anaProcDecl name argSorts alpha
35597678f1c9da703de8d0b6b66ea63247ebe884Christian Maeder (Proc_Eq parmProcName procTerm) ->
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder anaProcEq annotedProcItem parmProcName procTerm
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder-- Static analysis of process declarations
4805aaef9706fd26f102ffd712b99cb8778ba3c1Christian Maeder-- | Statically analyse a CspCASL process declaration.
4805aaef9706fd26f102ffd712b99cb8778ba3c1Christian MaederanaProcDecl :: SIMPLE_PROCESS_NAME -> PROC_ARGS -> PROC_ALPHABET
4805aaef9706fd26f102ffd712b99cb8778ba3c1Christian Maeder -> State CspCASLSign ()
35597678f1c9da703de8d0b6b66ea63247ebe884Christian MaederanaProcDecl name argSorts comms = do
89dc77946055c0e4cb4671c4a74c3dcd55ed41a1Christian Maeder let ext = extendedInfo sig
793945d4ac7c0f22760589c87af8e71427c76118Christian Maeder oldProcDecls = procSet ext
cc584a730c98e711c2a244e51b102ba1821e531dChristian Maeder newProcDecls <- do
cc584a730c98e711c2a244e51b102ba1821e531dChristian Maeder -- new process declation
cc584a730c98e711c2a244e51b102ba1821e531dChristian Maeder profile <- anaProcAlphabet argSorts comms
cc584a730c98e711c2a244e51b102ba1821e531dChristian Maeder -- Add the process name as a symbol to the list of
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder -- newly defined symbols - which is stored in the CASL
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder let fqPn = FQ_PROCESS_NAME name profile
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder addSymbol $ makeFQProcNameSymbol fqPn
d93bbbec133697cc79d59f9d7cc8e97458976c15Christian Maeder -- Check the name (with profile) is new (for warning only)
35597678f1c9da703de8d0b6b66ea63247ebe884Christian Maeder if isNameInProcNameMap name profile oldProcDecls
35597678f1c9da703de8d0b6b66ea63247ebe884Christian Maeder then -- name with profile already in signature
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder do let warn = "process name redeclared with same profile '" ++
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder show (printProcProfile profile) ++ "':"
35597678f1c9da703de8d0b6b66ea63247ebe884Christian Maeder addDiags [mkDiag Warning warn name]
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder return oldProcDecls
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder else -- New name with profile - add the name to the signature in the
d93bbbec133697cc79d59f9d7cc8e97458976c15Christian Maeder return $ addProcNameToProcNameMap name profile oldProcDecls
66f4f32855e7e2f0cf79b50ce6bd426598d9b166Christian Maeder put sig2 { extendedInfo = ext {procSet = newProcDecls }}
35597678f1c9da703de8d0b6b66ea63247ebe884Christian Maeder-- Static analysis of process equations
35597678f1c9da703de8d0b6b66ea63247ebe884Christian Maeder-- | Find a profile for a process name. Either the profile is given via a parsed
8dcc70ff9afdfe4aff258676718677a4d7076fd0Christian Maeder-- fully qualified process name, in which case we check everything is valid and
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder-- the process name with the profile is known. Or its a plain process name where
975642b989852fc24119c59cf40bc1af653608ffChristian Maeder-- we must deduce a unique profile is possible. We also know how many variables
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder-- / parameters the process name has.
35597678f1c9da703de8d0b6b66ea63247ebe884Christian MaederfindProfileForProcName :: FQ_PROCESS_NAME -> Int -> ProcNameMap ->
35597678f1c9da703de8d0b6b66ea63247ebe884Christian Maeder State CspCASLSign (Maybe ProcProfile)
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von SchroederfindProfileForProcName pn numParams procNameMap =
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder FQ_PROCESS_NAME _ _ ->
0f0aa53f11a0d1ab08c76428b9de73db5b17c977Christian Maeder -- We should not be trying to find a profile for a fully qualified process
a6f84880cea4485fba85b521d122eba73b0df70bChristian Maeder error $ "CspCASL.StatAnaCsp.findProfileForProcName: Process name\
a6f84880cea4485fba85b521d122eba73b0df70bChristian Maeder \ already fully qualified: " ++ show pn
a6f84880cea4485fba85b521d122eba73b0df70bChristian Maeder PARSED_FQ_PROCESS_NAME pn' argSorts comms -> do
a6f84880cea4485fba85b521d122eba73b0df70bChristian Maeder profile <- anaProcAlphabet argSorts comms
a6f84880cea4485fba85b521d122eba73b0df70bChristian Maeder let profiles = Map.findWithDefault Set.empty pn' procNameMap
a6f84880cea4485fba85b521d122eba73b0df70bChristian Maeder if profile `Set.member` profiles
a6f84880cea4485fba85b521d122eba73b0df70bChristian Maeder then return $ Just profile
a6f84880cea4485fba85b521d122eba73b0df70bChristian Maeder addDiags [mkDiag Error
a6f84880cea4485fba85b521d122eba73b0df70bChristian Maeder "Fully qualified process name not in signature" pn]
a6f84880cea4485fba85b521d122eba73b0df70bChristian Maeder return Nothing
a6f84880cea4485fba85b521d122eba73b0df70bChristian Maeder PROCESS_NAME pn' ->
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder let resProfile = getUniqueProfileInProcNameMap pn' numParams procNameMap
7de39d39bc1700cc8a9bb9df90b920aad9e18d4aChristian Maeder in case resultToMaybe resProfile of
10397bcc134edbcfbe3ae2c7ea4c6080036aae22Christian Maeder do addDiags $ diags resProfile
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder return Nothing
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder Just profile' ->
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder return $ Just profile'
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder-- | Analyse a process name an return a fully qualified one if possible. We also
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder-- know how many variables / parameters the process name has.
2ac1742771a267119f1d839054b5e45d0a468085Christian MaederanaProcName :: FQ_PROCESS_NAME -> Int -> State CspCASLSign (Maybe FQ_PROCESS_NAME)
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian MaederanaProcName pn numParams= do
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder let ext = extendedInfo sig
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder procDecls = procSet ext
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder simpPn = procNameToSimpProcName pn
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder maybeProf <- findProfileForProcName pn numParams procDecls
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder case maybeProf of
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder Nothing -> return Nothing
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder Just profile ->
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder -- We now construct the real fully qualified process name
10397bcc134edbcfbe3ae2c7ea4c6080036aae22Christian Maeder return $ Just $ FQ_PROCESS_NAME simpPn profile
10397bcc134edbcfbe3ae2c7ea4c6080036aae22Christian Maeder-- | Statically analyse a CspCASL process equation.
2ac1742771a267119f1d839054b5e45d0a468085Christian MaederanaProcEq :: Annoted a -> PARM_PROCNAME -> PROCESS -> State CspCASLSign ()
10397bcc134edbcfbe3ae2c7ea4c6080036aae22Christian MaederanaProcEq a (ParmProcname pn vs) proc =
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder -- the 'annoted a' contains the annotation of the process equation. We do not
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder -- care what the underlying item is in the annotation (but it probably will be
5ba383b1607c20c57e14324e72cee2c789436d5fChristian Maeder -- the proc eq)
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder let ext = extendedInfo sig
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder ccsens = ccSentences ext
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder -- procDecls = procSet ext
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder maybeFqPn <- anaProcName pn (length vs)
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder case maybeFqPn of
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder -- Only analyse a process if its name and profile is known
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder Nothing -> return ()
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder PROCESS_NAME _ ->
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder error "CspCasl.StatAnaCSP.anaProcEq: Impossible case"
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder PARSED_FQ_PROCESS_NAME _ _ _ ->
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder error "CspCasl.StatAnaCSP.anaProcEq: Impossible case"
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder FQ_PROCESS_NAME _ prof ->
d9953bc9d3d8aa7290bf6d3c2c86b84c984a0f09Christian Maeder ProcProfile procArgs procAlpha -> do
d9953bc9d3d8aa7290bf6d3c2c86b84c984a0f09Christian Maeder gVars <- anaProcVars pn
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder procArgs vs -- compute global
d9953bc9d3d8aa7290bf6d3c2c86b84c984a0f09Christian Maeder -- vars Change a procVarList to a FQProcVarList We do
5ba383b1607c20c57e14324e72cee2c789436d5fChristian Maeder -- not care about the range as we are building fully
5ba383b1607c20c57e14324e72cee2c789436d5fChristian Maeder -- qualified variables and they have already been
d9953bc9d3d8aa7290bf6d3c2c86b84c984a0f09Christian Maeder -- checked to be ok.
35597678f1c9da703de8d0b6b66ea63247ebe884Christian Maeder let mkFQProcVar (v,s) = Qual_var v s nullRange
35597678f1c9da703de8d0b6b66ea63247ebe884Christian Maeder let fqGVars = map mkFQProcVar gVars
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder (termAlpha, fqProc) <-
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder anaProcTerm proc (Map.fromList gVars) Map.empty
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder checkCommAlphaSub termAlpha procAlpha proc "process equation"
0a39036fa485579a7b7c81cdd44a412392571927Christian Maeder -- Save the diags from the checkCommAlphaSub
d9953bc9d3d8aa7290bf6d3c2c86b84c984a0f09Christian Maeder vds <- gets envDiags
d48085f765fca838c1d972d2123601997174583dChristian Maeder -- put CspCASL Sentences back in to the state with new sentence
ce7653c9c71e23bf04a5ec0ca5cb600c3738a909Christian Maeder -- BUG - What should the constituent alphabet be for this
bd6b297dcf467926715d0a6bd36e8d4071b6728eChristian Maeder -- process? probably the same as the inner one!
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder let namedSen = makeNamedSen $
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder -- We take the annotated item and replace the
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder -- inner item, thus preserving the annotations. We
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder -- then take this annotated sentence and make it a
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder -- named sentence in accordance to the (if
bd6b297dcf467926715d0a6bd36e8d4071b6728eChristian Maeder -- existing) name in the annotations.
bd6b297dcf467926715d0a6bd36e8d4071b6728eChristian Maeder ProcessEq fqPn fqGVars procAlpha fqProc}
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder put sig {envDiags = vds, extendedInfo =
35597678f1c9da703de8d0b6b66ea63247ebe884Christian Maeder ext {ccSentences = namedSen:ccsens}
35597678f1c9da703de8d0b6b66ea63247ebe884Christian Maeder-- | Statically analyse a CspCASL process equation's global variable
36c6cc568751e4235502cfee00ba7b597dae78dcChristian MaederanaProcVars :: FQ_PROCESS_NAME -> [SORT] -> [VAR] ->
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder State CspCASLSign ProcVarList
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian MaederanaProcVars pn ss vs =
840b2a6f37ec58f3281da16fafbc4121462c856aChristian Maeder case (compare (length ss) (length vs)) of
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder LT -> do addDiags [mkDiag Error
3bffe0f10ad93403e36288a1a4a92d50356956b5Christian Maeder "Process name applied to too many arguments:"
bb13d067514a3f474166f345e098b81f3de11dbeChristian Maeder GT -> do addDiags [mkDiag Error
bb13d067514a3f474166f345e098b81f3de11dbeChristian Maeder "process name not applied to enough arguments:"
bb13d067514a3f474166f345e098b81f3de11dbeChristian Maeder EQ -> Monad.foldM anaProcVar [] (zip vs ss)
840b2a6f37ec58f3281da16fafbc4121462c856aChristian Maeder return $ reverse $ vars
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder-- | Statically analyse a CspCASL process-global variable name.
bb13d067514a3f474166f345e098b81f3de11dbeChristian MaederanaProcVar :: ProcVarList -> (VAR, SORT) -> State CspCASLSign ProcVarList
ccf3de3d66b521a260e5c22d335c64a48e3f0195Christian MaederanaProcVar old (v, s) = do
9fb0db7f56cbb44c3df49552c04afc881267b84eChristian Maeder if v `elem` (map fst old)
9fb0db7f56cbb44c3df49552c04afc881267b84eChristian Maeder then do addDiags [mkDiag Error
9fb0db7f56cbb44c3df49552c04afc881267b84eChristian Maeder "Process argument declared more than once:" v]
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder else return ((v,s) : old)
ccf3de3d66b521a260e5c22d335c64a48e3f0195Christian Maeder-- Static analysis of process terms
(al, fqArgs) <- anaNamedProc proc name args (lVars `Map.union` gVars)
let fqProc = FQProcess (Skip r) S.empty r
return (S.empty, fqProc)
let fqProc = FQProcess (Stop r) S.empty r
return (S.empty, fqProc)
let fqProc = FQProcess (Div r) S.empty r
return (S.empty, fqProc)
(evComms, rcvMap, fqEvent) <- anaEvent e (lVars `Map.union` gVars)
(comms, pFQTerm) <- anaProcTerm p gVars (rcvMap `Map.union` lVars)
let newAlpha = comms `S.union` evComms
(qComms, qFQTerm) <- anaProcTerm q gVars Map.empty
let newAlpha = pComms `S.union` qComms
let newAlpha = pComms `S.union` qComms
let newAlpha = pComms `S.union` qComms
let newAlpha = pComms `S.union` qComms
let newAlpha = pComms `S.union` qComms
let newAlpha = S.unions [pComms, qComms, synComms]
let newAlpha = pComms `S.union` qComms
return (pComms `S.union` hidComms, FQProcess (Hiding pFQTerm fqEs r)
(pComms `S.union` hidComms) r)
let newAlpha = pComms `S.union` renAlpha
(pComms `S.union` renAlpha) r
mfs <- anaFormulaCspCASL (gVars `Map.union` lVars) f
Nothing -> S.empty
let newAlpha = S.unions [pComms, qComms, fComms]
error "CspCASL.StatAnaCSP.anaProcTerm: Unexpected FQProcess"
-- prof = error "NYI: CspCASL.StatAnaCSP.anaNamedProc: Sentence not\
-- \ yet" -- pn `Map.lookup` procDecls
return (S.empty, terms)
error "CspCasl.StatAnaCSP.anaNamedProc: Impossible case"
error "CspCasl.StatAnaCSP.anaNamedProc: Impossible case"
return (S.empty, terms)
(comms, fqEsElems) <- Monad.foldM (anaCommType sig)
(S.empty, []) es
error "CspCASL.StatAnaCSP.anaEventSet: Unexpected FQEventSet"
-- | Statically analyse a proc alphabet (i.e., a list of channel and sort
if ctSort `S.member` (sortSet sig)
do let newAlpha = S.insert (CommTypeSort ctSort) alpha
case Map.lookup ct (chans $ extendedInfo sig) of
let newAlpha = S.insert (mkTypedChan ct s) alpha
-- annChanSend failed - i.e. we forget
error "CspCASL.StatAnaCSP.anaEvent: Unexpected FQEvent"
let alpha = S.singleton $ CommTypeSort s
let binding = Map.singleton v s
case c `Map.lookup` (chans ext) of
case c `Map.lookup` (chans ext) of
-- communicate in i.e. the sort of the variable.
where subsorts = Rel.predecessors (sortRel sig)
error "CspCASL.StatAnaCSP.anaRenaming: Unexpected FQRenaming"
if (not $ S.null totOps)
then return (inAl `S.union` totOps, fqRenamingTerms)
if not (S.null parOps)
then return (inAl `S.union` parOps, fqRenamingTerms)
if not (S.null preds)
then return (inAl `S.union` preds, fqRenamingTerms)
getUnaryOpsById :: Id -> OpKind -> State CspCASLSign (S.Set CommType)
binOpsKind = S.filter (isBin kind) opsWithId
getBinPredsById :: Id -> State CspCASLSign (S.Set CommType)
binPreds = S.filter isBin predsWithId
let extras = ((closeCspCommAlpha sr sub) `S.difference`
if S.null extras
context ++ "): " ++ (show $ S.toList extras))
let newVars = Map.union pm (varMap sig)
mix = extendMix (Map.keysSet $ varMap sig)
if Rel.member termSort cSort (sortRel sig)
else if Rel.member cSort termSort (sortRel sig)
let newVars = Map.union pm (varMap sig)
mix = extendMix (Map.keysSet $ varMap sig)
Conjunction fs _ -> S.unions (map formulaComms fs)
Disjunction fs _ -> S.unions (map formulaComms fs)
Implication f1 f2 _ _ -> (formulaComms f1) `S.union` (formulaComms f2)
Equivalence f1 f2 _ -> (formulaComms f1) `S.union` (formulaComms f2)
Definedness t _ -> S.singleton (CommTypeSort (sortOfTerm t))
Existl_equation t1 t2 _ -> S.fromList [CommTypeSort (sortOfTerm t1),
Strong_equation t1 t2 _ -> S.fromList [CommTypeSort (sortOfTerm t1),
Membership t s _ -> S.fromList [CommTypeSort (sortOfTerm t),
Mixfix_formula t -> S.singleton (CommTypeSort (sortOfTerm t))
_ -> S.empty