Ana.hs revision e00f5b4d89ac027e883461aab6248e33ad10ae8e
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder{-# LANGUAGE TypeSynonymInstances #-}
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian MaederModule : $Header$
97018cf5fa25b494adffd7e9b4e87320dae6bf47Christian MaederDescription : static analysis of VSE parts
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian MaederCopyright : (c) C. Maeder, DFKI Bremen 2008
b4fbc96e05117839ca409f5f20f97b3ac872d1edTill MossakowskiLicense : GPLv2 or higher, see LICENSE.txt
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian MaederMaintainer : Christian.Maeder@dfki.de
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian MaederStability : provisional
f3a94a197960e548ecd6520bb768cb0d547457bbChristian MaederPortability : portable
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maederanalysis of VSE logic extension of CASL
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder , constBoolType
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder , procsToOpMap
d6025ee06343191f356a59704d467866afa29900Paolo Torrini , procsToPredMap
ae59cddaa1f9e2dd031cae95a3ba867b9e8e095dPaolo Torrini , profileToOpType
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder , profileToPredType
ae59cddaa1f9e2dd031cae95a3ba867b9e8e095dPaolo Torrini , mapDlformula
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder , simpDlformula
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder , correctSign
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder , correctTarget
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder , VSEBasicSpec
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder , extVSEColimit
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maederimport Data.Char (toLower)
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maederimport qualified Data.Map as Map
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maederimport qualified Data.Set as Set
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maederimport qualified Common.Lib.Rel as Rel
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maederimport Common.Utils (hasMany)
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maedertype VSESign = Sign Dlformula Procs
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian MaedergetVariables :: Sentence -> Set.Set Token
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian MaedergetVariables = foldFormula $ getVarsRec $ getVSEVars . unRanged
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian MaedergetVarsRec :: (f -> Set.Set Token) -> Record f (Set.Set Token) (Set.Set Token)
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian MaedergetVarsRec f =
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder { foldQuantification = \ _ _ vs r _ -> Set.union r
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder $ Set.fromList $ map fst $ flatVAR_DECLs vs
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder , foldQual_var = \ _ v _ _ -> Set.singleton v }
ae59cddaa1f9e2dd031cae95a3ba867b9e8e095dPaolo TorrinigetVSEVars :: VSEforms -> Set.Set Token
ae59cddaa1f9e2dd031cae95a3ba867b9e8e095dPaolo TorrinigetVSEVars vf = case vf of
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder Dlformula _ p s -> Set.union (getProgVars p) $ getVariables s
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder Defprocs l -> Set.unions $ map getDefprogVars l
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder _ -> Set.empty -- no variables in a sort generation constraint
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian MaedergetProgVars :: Program -> Set.Set Token
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder let vrec = getVarsRec $ const Set.empty
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder getTermVars = foldTerm vrec
7f39d44f0b8c39a92606ba06fd668dc0cc2752caPaolo Torrini getCondVars = foldFormula vrec
d5ef5a29a89fa5548f81fcd49fcf0ffda69d45b0Christian Maeder in foldProg (progToSetRec getTermVars getCondVars)
7f39d44f0b8c39a92606ba06fd668dc0cc2752caPaolo Torrini { foldAssign = \ _ v t -> Set.insert v $ getTermVars t
7f39d44f0b8c39a92606ba06fd668dc0cc2752caPaolo Torrini , foldBlock = \ _ vs p -> Set.union p
7f39d44f0b8c39a92606ba06fd668dc0cc2752caPaolo Torrini $ Set.fromList $ map fst $ flatVAR_DECLs vs }
7f39d44f0b8c39a92606ba06fd668dc0cc2752caPaolo TorrinigetDefprogVars :: Defproc -> Set.Set Token
7f39d44f0b8c39a92606ba06fd668dc0cc2752caPaolo TorrinigetDefprogVars (Defproc _ _ vs p _) = Set.union (getProgVars p)
getCases :: String -> Set.Set Id -> [Diagnosis]
map (mkDiag Error ("overlapping " ++ msg ++ " identifiers") . Set.toList)
. filter hasMany . Map.elems
++ getCases "op or function" (Map.keysSet $ opMap sig)
++ getCases "pred or proc" (Map.keysSet $ predMap sig)
{ sortSet = Set.singleton uBoolean
lookupProc i = Map.lookup i . procsMap . extendedInfo
(getCases "var" . Set.map simpleIdToId . getVariables . sentence) sens
$ Map.keys $ interMapSet (diffMapSet (predMap sig2) $ predMap sigIn)
$ Map.keysSet uOpMap
parenProg = foldProg $ mapProg (Paren.mapTerm id) $ mapFormula id
Nothing -> Rel.setInsert n (profileToPredType pr) pm
Just ot -> Rel.setInsert n ot om
np <- minExpProg Set.empty Nothing sig p
minExpProg :: Set.Set VAR -> Maybe SORT -> Sign () Procs
Assign v t -> case Map.lookup v $ varMap sig of
when (Set.member v invars)
sig { predMap = Rel.setInsert i (funProfileToPredType pr)
else return sig { predMap = Rel.setInsert i (profileToPredType pr)
let invars = Set.fromList $ map fst $
np <- minExpProg invars re sig { varMap = Map.fromList $ zipWith
Nothing -> Set.member (profileToPredType p) l
foldProg (mapProg (MapSen.mapTerm (const id) m)
nts = map (MapSen.mapTerm (const id) m) ts
Nothing -> error $ "VSE.mapProcId unknown " ++ show i
(map (MapSen.mapConstr m) constr)
$ Map.toList restr)
_ -> error "VSE.Ana.simpProg" }
else sign { varMap = Map.fromList $ zipWith
{ foldAssign = \ _ v t -> (case Map.lookup v $ varMap sig of
Just s -> Set.insert (v, s)
Nothing -> Set.insert (v, sortOfTerm t)) $ ft t
Set.difference (freeProgVars (execState (mapM_ addVars vs) sig) p)
$ Set.fromList $ flatVAR_DECLs vs
_ -> error "VSE.Ana.freeProgVars" }
Dlformula _ p s -> Set.union (freeProgVars (castSign sig) p) $
Defprocs _ -> Set.empty
RestrictedConstraint _ _ _ -> Set.empty
inducedExt sm om pm _ = Procs . Map.fromList
. Map.toList . procsMap . extendedInfo
{ extendedInfo = Procs $ Map.filterWithKey (\ i p -> case profileToOpType p of
Just t -> case Map.lookup i $ opMap sig of
Nothing -> case Map.lookup i $ predMap sig of
Just s -> Set.member (profileToPredType p) s
toSen = foldFormula $ mapRecord (error "CASL2VSEImport.mapSen")
Map.Map Int VSEMor ->
(Procs, Map.Map Int VSEMorExt)
procs = Map.fromList $ nub $
phi = Map.findWithDefault (error "extVSEColimit") n morMap
Map.toList p) $
in (Procs procs, Map.fromList $ map (\ n -> (n, emptyMorExt)) $
sm = Map.toList $ sort_map m
eqOps = Map.fromList $ map (\ (s, t) ->
restrPreds = Map.fromList $ map (\ (s, t) ->
opsProcs = Map.fromList $ map (\ ((idN, OpType _ w s), (idN', _)) ->
, (mkGenName idN', Partial))) $ Map.toList om
predProcs = Map.fromList $ map (\ ((idN, PredType w), idN') ->
((mkGenName idN, PredType w), mkGenName idN')) $ Map.toList pm