Sign.hs revision be98c516a8ff1d496fcdeb9b8be8c5f4b908ab95
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian MaederModule : $Header$
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian MaederDescription : CASL signatures and local environments for basic analysis
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian MaederCopyright : (c) Christian Maeder and Uni Bremen 2002-2006
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian MaederLicense : similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian MaederMaintainer : Christian.Maeder@dfki.de
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian MaederStability : provisional
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian MaederPortability : portable
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian MaederCASL signatures also serve as local environments for the basic static analysis
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maederimport qualified Data.Map as Map
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maederimport qualified Data.Set as Set
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maederimport qualified Common.Lib.Rel as Rel
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maederimport qualified Common.Lib.State as State
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maederimport Data.List (isPrefixOf)
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maederimport Control.Monad (when, unless)
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder-- constants have empty argument lists
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maederdata OpType = OpType {opKind :: OpKind, opArgs :: [SORT], opRes :: SORT}
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder deriving (Show, Eq, Ord)
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maederdata PredType = PredType {predArgs :: [SORT]} deriving (Show, Eq, Ord)
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maederdata SymbType = SortAsItemType
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder | OtherTypeKind String
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder | OpAsItemType OpType
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder -- since symbols do not speak about totality, the totality
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder -- information in OpType has to be ignored
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder | PredAsItemType PredType
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder deriving (Show, Eq, Ord)
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maederdata Symbol = Symbol {symName :: Id, symbType :: SymbType}
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder deriving (Show, Eq, Ord)
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maederinstance GetRange Symbol where
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder getRange = getRange . symName
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian MaederidToSortSymbol :: Id -> Symbol
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian MaederidToSortSymbol idt = Symbol idt SortAsItemType
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian MaederidToOpSymbol :: Id -> OpType -> Symbol
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian MaederidToOpSymbol idt = Symbol idt . OpAsItemType
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian MaederidToPredSymbol :: Id -> PredType -> Symbol
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian MaederidToPredSymbol idt = Symbol idt . PredAsItemType
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maederdummy :: Sign f s -> a -> ()
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maederdummy _ _ = ()
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian MaederdummyMin :: b -> c -> Result ()
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian MaederdummyMin _ _ = return ()
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maedertype CASLSign = Sign () ()
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maederdata Sign f e = Sign
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder { sortSet :: Set.Set SORT
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder , emptySortSet :: Set.Set SORT
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder -- a subset of the sort set of possibly empty sorts
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder , sortRel :: Rel.Rel SORT
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder , opMap :: OpMap
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder , assocOps :: OpMap
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder , varMap :: Map.Map SIMPLE_ID SORT
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder , sentences :: [Named (FORMULA f)]
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder , declaredSymbols :: Set.Set Symbol
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder , envDiags :: [Diagnosis]
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder , annoMap :: Map.Map Symbol (Set.Set Annotation)
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder , globAnnos :: GlobalAnnos
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder , extendedInfo :: e
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder } deriving Show
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maeder-- better ignore assoc flags for equality
7bffb8b0e6cae4bb7ecb59b99327add6106c06b9Christian Maederinstance Eq e => Eq (Sign f e) where
ee31a8a5f5d786472f2b5dfb271b38e6d401fa35Christian Maeder sortSet e1 == sortSet e2 &&
b7413fd7a18b060775364d271c3e706c07227b13Christian Maeder emptySortSet e1 == emptySortSet e2 &&
b7413fd7a18b060775364d271c3e706c07227b13Christian Maeder sortRel e1 == sortRel e2 &&
b7413fd7a18b060775364d271c3e706c07227b13Christian Maeder opMap e1 == opMap e2 &&
b7413fd7a18b060775364d271c3e706c07227b13Christian Maeder predMap e1 == predMap e2 &&
b7413fd7a18b060775364d271c3e706c07227b13Christian Maeder extendedInfo e1 == extendedInfo e2
b7413fd7a18b060775364d271c3e706c07227b13Christian MaederemptySign :: e -> Sign f e
b7413fd7a18b060775364d271c3e706c07227b13Christian MaederemptySign e = Sign
b7413fd7a18b060775364d271c3e706c07227b13Christian Maeder , emptySortSet = Set.empty
b7413fd7a18b060775364d271c3e706c07227b13Christian Maeder , sentences = []
b7413fd7a18b060775364d271c3e706c07227b13Christian Maeder , declaredSymbols = Set.empty
b7413fd7a18b060775364d271c3e706c07227b13Christian Maeder , envDiags = []
b7413fd7a18b060775364d271c3e706c07227b13Christian Maeder , globAnnos = emptyGlobalAnnos
b7413fd7a18b060775364d271c3e706c07227b13Christian Maeder , extendedInfo = e }
subsortsOf :: SORT -> Sign f e -> Set.Set SORT
subsortsOf s e = Rel.predecessors (sortRel e) s
supersortsOf :: SORT -> Sign f e -> Set.Set SORT
supersortsOf s e = Rel.succs (sortRel e) s
ppWithCommas (Set.toList subsorts) <+> text lessS <+>
nsorts = Set.difference (sortSet s) esorts in
(if Set.null nsorts then empty else text (sortS++sS) <+>
sepByCommas (map idDoc (Set.toList nsorts))) $+$
(if Set.null esorts then empty else text (esortS++sS) <+>
sepByCommas (map idDoc (Set.toList esorts))) $+$
(if Rel.null (sortRel s) then empty
(fsep $ punctuate semi $ map printRel $ Map.toList
diffSig dif a b = let s = sortSet a `Set.difference` sortSet b in
, emptySortSet = Set.difference s
$ nonEmptySortSet a `Set.difference` nonEmptySortSet b
, sortRel = Rel.difference (sortRel a) $ sortRel b
diffOpMapSet m = diffMapSet m . Map.map (rmOrAddParts False)
diffMapSet = Map.differenceWith
(\ s t -> let d = Set.difference s t in
if Set.null d then Nothing else Just d)
makePartial = Set.mapMonotonic mkPartial
let t = makePartial $ Set.filter ((== Total) . opKind) s
addOpMapSet m = Map.map (rmOrAddParts True). addMapSet m
(\ s t -> rmOrAddParts True $ Set.intersection (rmOrAddParts False s)
nonEmptySortSet :: Sign f e -> Set.Set Id
nonEmptySortSet s = Set.difference (sortSet s) $ emptySortSet s
addSig ad a b = let s = sortSet a `Set.union` sortSet b in
, emptySortSet = Set.difference s
$ nonEmptySortSet a `Set.union` nonEmptySortSet b
, sortRel = Rel.union (sortRel a) $ sortRel b
interRel a = Rel.fromSet
interSig ef a b = let s = sortSet a `Set.intersection` sortSet b in
, emptySortSet = Set.difference s
$ nonEmptySortSet a `Set.intersection` nonEmptySortSet b
Set.null (sortSet s) &&
Rel.null (sortRel s) &&
Map.null (opMap s) &&
Map.null (predMap s) && ie (extendedInfo s)
isSubOpMap = Map.isSubmapOfBy $ \ s t ->
Partial -> Set.member (mkTotal e) t
isSubSig isSubExt a b = Set.isSubsetOf (sortSet a) (sortSet b)
&& Rel.isSubrelOf (sortRel a) (sortRel b)
addDiags :: [Diagnosis] -> State.State (Sign f e) ()
e <- State.get
State.put e { envDiags = reverse ds ++ envDiags e }
addAnnoSet :: Annoted a -> Symbol -> State.State (Sign f e) ()
unless (Set.null v) $ do
e <- State.get
addSymbol :: Symbol -> State.State (Sign f e) ()
e <- State.get
addSort :: SortsKind -> Annoted a -> SORT -> State.State (Sign f e) ()
e <- State.get
known = Set.member s m
NonEmptySorts -> when (Set.member s em) $ do
e2 <- State.get
e2 <- State.get
| not $ Set.member s $ sortSet e ]
checkSorts :: [SORT] -> State.State (Sign f e) ()
e <- State.get
addSubsort :: SORT -> SORT -> State.State (Sign f e) ()
addSubsortOrIso :: Bool -> SORT -> SORT -> State.State (Sign f e) ()
e <- State.get
$ Rel.insert sub super r }
if Rel.path super sub r then
if Rel.path sub super r
else when (Rel.path sub super r)
else if Rel.path super sub r then
if Rel.path sub super r
else when (Rel.path sub super r)
closeSubsortRel :: State.State (Sign f e) ()
do e <- State.get
checkWithOtherMap :: String -> String -> Map.Map Id a -> Id -> [Diagnosis]
case Map.lookup i m of
addVars :: VAR_DECL -> State.State (Sign f e) ()
addVar :: SORT -> SIMPLE_ID -> State.State (Sign f e) ()
do e <- State.get
ds = case Map.lookup v m of