AnalysisStructured.hs revision 12368e292c1abf7eaf975f20ee30ef7820ac5dd5
3980fec332f0cc3d65051ce86f11c357686ed784Daniel CalegariModule : $Header$
3980fec332f0cc3d65051ce86f11c357686ed784Daniel CalegariDescription : static analysis of heterogeneous structured specifications
3980fec332f0cc3d65051ce86f11c357686ed784Daniel CalegariCopyright : (c) Till Mossakowski and Uni Bremen 2003-2006
3980fec332f0cc3d65051ce86f11c357686ed784Daniel CalegariLicense : similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
3980fec332f0cc3d65051ce86f11c357686ed784Daniel CalegariMaintainer : till@informatik.uni-bremen.de
3980fec332f0cc3d65051ce86f11c357686ed784Daniel CalegariStability : provisional
3980fec332f0cc3d65051ce86f11c357686ed784Daniel CalegariPortability : non-portable (imports Logic.Grothendieck)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel CalegariStatic analysis of CASL (heterogeneous) structured specifications
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari Follows the verfication semantic rules in Chap. IV:4.7
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari of the CASL Reference Manual.
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari , isStructured
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari , ana_RENAMING
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari , ana_RESTRICTION
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari , homogenizeGM
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari , extendMorphism
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegariimport Common.AS_Annotation hiding (isAxiom, isDef)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegariimport qualified Data.Set as Set
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegariimport qualified Data.Map as Map
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegariimport qualified Common.Lib.Rel as Rel(image, setInsert)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegariimport Data.Graph.Inductive.Graph as Graph (Node)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel CalegariinsGTheory :: DGraph -> NodeName -> DGOrigin -> G_theory -> (NodeSig, DGraph)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel CalegariinsGTheory dg name orig (G_theory lid sig ind sens tind) =
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari let (sgMap, s) = sigMapI dg
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (tMap, t) = thMapI dg
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari nind = if ind == startSigId then succ s else ind
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari tb = tind == startThId && not (Map.null sens)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari ntind = if tb then succ t else tind
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari nsig = G_sign lid sig nind
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari nth = G_theory lid sig nind sens ntind
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari node_contents = newNodeLab name orig nth
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari node = getNewNodeDG dg
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari in (NodeSig node nsig,
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (if tb then setThMapDG $ Map.insert (succ t) nth tMap else id) $
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (if ind == startSigId
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari then setSigMapDG $ Map.insert (succ s) nsig sgMap else id)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari $ insNodeDG (node, node_contents) dg)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel CalegariinsGSig :: DGraph -> NodeName -> DGOrigin -> G_sign -> (NodeSig, DGraph)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel CalegariinsGSig dg name orig (G_sign lid sig ind) =
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari insGTheory dg name orig $ noSensGTheory lid sig ind
3980fec332f0cc3d65051ce86f11c357686ed784Daniel CalegariinsLink :: DGraph -> GMorphism -> DGLinkType -> DGLinkOrigin -> Node -> Node
3980fec332f0cc3d65051ce86f11c357686ed784Daniel CalegariinsLink dg (GMorphism cid sign si mor mi) ty orig n t =
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari let (sgMap, s) = sigMapI dg
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (mrMap, m) = morMapI dg
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari nsi = if si == startSigId then succ s else si
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari nmi = if mi == startMorId then succ m else mi
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari nmor = GMorphism cid sign nsi mor nmi
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari link = DGLink
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari { dgl_morphism = nmor
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari , dgl_type = ty
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari , dgl_origin = orig
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari , dgl_id = defaultEdgeId }
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari in (if mi == startMorId then setMorMapDG $ Map.insert (succ m)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (toG_morphism nmor) mrMap else id) $
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (if si == startSigId then setSigMapDG $ Map.insert (succ s)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (G_sign (sourceLogic cid) sign nsi) sgMap else id)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari $ insLEdgeNubDG (n, t, link) dg
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari-- | analyze a SPEC
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari-- first Parameter determines if incoming symbols shall be ignored
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari-- options: here we need the info: shall only the structure be analysed?
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegariana_SPEC :: Bool -> LogicGraph -> DGraph -> MaybeNode -> NodeName ->
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari HetcatsOpts -> SPEC -> Result (SPEC, NodeSig, DGraph)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegariana_SPEC addSyms lg dg nsig name opts sp = case sp of
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari Basic_spec (G_basic_spec lid bspec) pos ->
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari do G_sign lid' sigma' i1 <- return (getMaybeSig nsig)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari let adj = adjustPos pos
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari sigma@(ExtSign sig sys) <-
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari adj $ coerceSign lid' lid "Analysis of basic spec" sigma'
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (bspec', ExtSign sigma_complete sysd, ax) <- adj $
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari if isStructured opts
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari then return (bspec, mkExtSign $ empty_signature lid, [])
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari else do b <- maybeToMonad
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari ("no basic analysis for logic "
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari ++ language_name lid)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (basic_analysis lid)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari b (bspec, sig, globalAnnos dg)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari let (ns@(NodeSig node gsig), dg') = insGTheory dg name DGBasic
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari $ G_theory lid (ExtSign sigma_complete
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (if addSyms then Set.union sys sysd else sysd)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari $ sym_of lid sigma_complete) startSigId (toThSens ax) startThId
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari incl <- adj $ ginclusion lg (G_sign lid sigma i1) gsig
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari return (Basic_spec (G_basic_spec lid bspec') pos, ns, case nsig of
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari EmptyNode _ -> dg'
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari JustNode (NodeSig n _) ->
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari insLink dg' incl GlobalDef DGLinkExtension n node)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari EmptySpec pos -> case nsig of
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari EmptyNode _ -> do
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari warning () "empty spec" pos
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari let (ns, dg') = insGSig dg name DGEmpty (getMaybeSig nsig)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari return (sp, ns, dg')
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari {- ana_SPEC should be changed to return a MaybeNode!
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari Then this duplicate dummy node could be avoided.
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari Also empty unions could be treated then -}
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari JustNode ns -> return (sp, ns ,dg)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari Translation asp ren ->
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari do let sp1 = item asp
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (sp1', NodeSig n' gsigma, dg') <-
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari ana_SPEC addSyms lg dg nsig (inc name) opts sp1
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari mor <- ana_RENAMING lg nsig gsigma opts ren
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari -- ??? check that mor is identity on local env
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari let (ns@(NodeSig node _), dg'') =
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari insGSig dg' name DGTranslation $ cod Grothendieck mor
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari -- ??? too simplistic for non-comorphism inter-logic translations
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari return (Translation (replaceAnnoted sp1' asp) ren, ns,
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari insLink dg'' mor GlobalDef SeeTarget n' node)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari Reduction asp restr ->
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari do let sp1 = item asp
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (sp1', NodeSig n' gsigma', dg') <-
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari ana_SPEC addSyms lg dg nsig (inc name) opts sp1
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari let gsigma = getMaybeSig nsig
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (hmor, tmor) <- ana_RESTRICTION gsigma gsigma' opts restr
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari -- we treat hiding and revealing differently
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari -- in order to keep the dg as simple as possible
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari do let (ns@(NodeSig node _), dg'') =
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari insGSig dg' name DGHiding $ dom Grothendieck hmor
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari -- ??? too simplistic for non-comorphism inter-logic reductions
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari return (Reduction (replaceAnnoted sp1' asp) restr, ns,
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari insLink dg'' hmor HidingDef SeeTarget n' node)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari Just tmor' -> do
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari let gsigma1 = dom Grothendieck tmor'
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari gsigma'' = cod Grothendieck tmor'
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari -- ??? too simplistic for non-comorphism inter-logic reductions
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari -- the case with identity translation leads to a simpler dg
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari if tmor' == ide Grothendieck (dom Grothendieck tmor')
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari let (ns@(NodeSig node1 _), dg'') =
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari insGSig dg' name DGRevealing gsigma1
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari return (Reduction (replaceAnnoted sp1' asp) restr, ns,
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari insLink dg'' hmor HidingDef SeeTarget n' node1)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari let (NodeSig node1 _, dg'') =
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari insGSig dg' (extName "T" name) DGRevealing gsigma1
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (ns@(NodeSig node2 _), dg3) =
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari insGSig dg'' name DGRevealTranslation gsigma''
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari dg4 = insLink dg3 hmor HidingDef SeeTarget n' node1
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari return (Reduction (replaceAnnoted sp1' asp) restr, ns,
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari insLink dg4 tmor' GlobalDef SeeTarget node1 node2)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari Union [] pos -> adjustPos pos $ fail $ "empty union"
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari Union asps pos ->
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari do let sps = map item asps
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (sps', nsigs, dg', _) <-
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari let ana (sps1, nsigs, dg', n) sp' = do
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (sp1, nsig', dg1) <- ana_SPEC addSyms lg dg' nsig n opts sp'
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari return (sp1 : sps1, nsig' : nsigs, dg1, inc n)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari in foldM ana ([], [], dg, extName "U" name) sps
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari let nsigs' = reverse nsigs
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari adj = adjustPos pos
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari gbigSigma <- adj $ gsigManyUnion lg (map getSig nsigs')
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari let (ns@(NodeSig node _), dg2) = insGSig dg' name DGUnion gbigSigma
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari insE dgl (NodeSig n gsigma) = do
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari incl <- adj $ ginclusion lg gsigma gbigSigma
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari return $ insLink dgl incl GlobalDef SeeTarget n node
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari dg3 <- foldM insE dg2 nsigs'
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari return (Union (map (uncurry replaceAnnoted)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (zip (reverse sps') asps))
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari pos, ns, dg3)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari Extension asps pos -> do
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (sps', nsig1', dg1, _, _, _, _) <-
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari foldM ana_Extension ([], nsig, dg, lg, opts, pos, addSyms) namedSps
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari case nsig1' of
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari EmptyNode _ -> fail "empty extension"
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari JustNode nsig1 -> return (Extension (map (uncurry replaceAnnoted)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (zip (reverse sps') asps))
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari pos, nsig1,dg1)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari namedSps = zip (reverse (name: tail (take (length asps)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (iterate inc (extName "E" name)))))
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari Free_spec asp poss -> do
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (nasp, nsig', dg') <-
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari anaPlainSpec addSyms lg opts dg nsig name DGFree (FreeDef nsig)
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari return (Free_spec nasp poss, nsig', dg')
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari Cofree_spec asp poss -> do
3980fec332f0cc3d65051ce86f11c357686ed784Daniel Calegari (nasp, nsig', dg') <-
(sys1 `Set.difference` sys) sigma2
isChanged sy = case Map.lookup sy m of
forbiddenSys = Set.filter isChanged sysLenv
when (not $ Set.null forbiddenSys) $ plain_error () (
sys' = Set.filter (\ sy -> any (matches lid1 sy) rsys) sys
forbiddenSys = sys' `Set.intersection` sysLenv
when (not $ Set.null forbiddenSys)
return $ GMorphism cid (ExtSign (dom lid1 mor1) $ Set.fold (\ sy ->
case Map.lookup sy $ symmap_of lid1 mor1 of
[sy | sy <- Set.toList sys', rsy <-
Map.keys rmap, matches lid' sy rsy]
mor1 <- adj $ ext_generated_sign lid' (sys1 `Set.union` sys'') sigma'
rmap' <- if null sis then return Map.empty
unknowns = filter (noMatch sigmaP) (Map.keys rmap')
++ filter (noMatch sigmaA') (Map.elems rmap')
if Set.all (\sy -> lookupFM symmap_mor sy == Just sy) symI
case Map.lookup i idmap of
Just ids -> if Set.null ids then return i else
else return (Map.insert i (Id toks compsnew pos1) m1)
idsB = Set.map (sym_name lid) symsB
idh = Map.foldWithKey
(\sy1 sy2 -> Rel.setInsert (sym_name lid sy1) (sym_name lid sy2))
r = rh `Map.union` rIdExt
sigmaAD = ExtSign (cod lid mor) $ Set.map (\ sy ->
Map.findWithDefault sy sy $ symmap_of lid mor) sysB
let illShared = (ext_sym_of lid sigmaA `Set.intersection`
Set.\\ Rel.image h symsP
when (not (Set.null illShared))
when (not (Set.null newIdentifications))
homogenizeGM :: AnyLogic -> [Syntax.AS_Structured.G_mapping]
Syntax.AS_Structured.G_symb_map (G_symb_map_items_list lid1 sis1) -> do
_ -> error "Static.AnalysisStructured: this cannot happen"