root/trunk/CspCASL/SignCSP.hs @ 11215

Revision 11215, 7.0 kB (checked in by csliam, 11 months ago)

Large commit - improved static analysis of cspcasl and translation of cspcasl to isabelle

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1{- |
2Module      :  $Id$
3Description :  CspCASL signatures
4Copyright   :  (c) Markus Roggenbach and Till Mossakowski and Uni Bremen 2004
5License     :  similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
6
7Maintainer  :  M.Roggenbach@swansea.ac.uk
8Stability   :  provisional
9Portability :  portable
10
11signatures for CSP-CASL
12
13-}
14
15-- todo:  implement isInclusion, computeExt
16
17module CspCASL.SignCSP where
18
19import CspCASL.AS_CspCASL_Process (CHANNEL_NAME, PROCESS_NAME,
20    PROCESS(..), CommAlpha(..), CommType(..), TypedChanName(..))
21
22import CspCASL.AS_CspCASL ()
23import CspCASL.Print_CspCASL
24
25import CASL.AS_Basic_CASL (FORMULA, SORT)
26import CASL.Sign (emptySign, Sign, extendedInfo, sortRel)
27import CASL.Morphism (Morphism)
28
29import Common.AS_Annotation (Named)
30
31import Common.Doc
32import Common.DocUtils
33
34import Common.Id (Id, SIMPLE_ID, mkSimpleId, nullRange)
35import Common.Lib.Rel (predecessors)
36import Common.Result
37
38import Control.Monad (unless)
39import qualified Data.Map as Map
40import qualified Data.Set as Set
41
42-- | A process has zero or more parameter sorts, and a communication
43-- alphabet.
44data ProcProfile = ProcProfile [SORT] CommAlpha
45                   deriving (Eq, Show)
46
47type ChanNameMap = Map.Map CHANNEL_NAME SORT
48type ProcNameMap = Map.Map PROCESS_NAME ProcProfile
49type ProcVarMap = Map.Map SIMPLE_ID SORT
50type ProcVarList = [(SIMPLE_ID, SORT)]
51
52-- Close a communication alphabet under CASL subsort
53closeCspCommAlpha :: CspCASLSign -> CommAlpha -> CommAlpha
54closeCspCommAlpha sig = Set.unions . Set.toList . Set.map (closeOneCspComm sig)
55
56-- Close one CommType under CASL subsort
57closeOneCspComm :: CspCASLSign -> CommType -> CommAlpha
58closeOneCspComm sig x = let
59  mkTypedChan c s = CommTypeChan $ TypedChanName c s
60  subsorts s' = Set.singleton s' `Set.union` predecessors (sortRel sig) s'
61  in case x of
62    CommTypeSort s -> Set.map CommTypeSort (subsorts s)
63    CommTypeChan (TypedChanName c s) -> Set.map CommTypeSort (subsorts s)
64      `Set.union` Set.map (mkTypedChan c) (subsorts s)
65
66{- Will probably be useful, but doesn't appear to be right now.
67
68-- Extract the sorts from a process alphabet
69procAlphaSorts :: CommAlpha -> Set.Set SORT
70procAlphaSorts a = stripMaybe $ Set.map justSort a
71    where justSort n = case n of
72                         (CommTypeSort s) -> Just s
73                         _ -> Nothing
74-- Extract the typed channel names from a process alphabet
75procAlphaChans :: CommAlpha -> Set.Set TypedChanName
76procAlphaChans a = stripMaybe $ Set.map justChan a
77    where justChan n = case n of
78                         (CommTypeChan c) -> Just c
79                         _ -> Nothing
80-- Given a set of Maybes, filter to keep only the Justs
81stripMaybe :: Ord a => Set.Set (Maybe a) -> Set.Set a
82stripMaybe x = Set.fromList $ Maybe.catMaybes $ Set.toList x
83
84-- Close a set of sorts under a subsort relation
85cspSubsortCloseSorts :: CspCASLSign -> Set.Set SORT -> Set.Set SORT
86cspSubsortCloseSorts sig sorts =
87    Set.unions subsort_sets
88        where subsort_sets = Set.toList $ Set.map (cspSubsortPreds sig) sorts
89
90-}
91
92-- | CSP process signature.
93data CspSign = CspSign
94    { chans :: ChanNameMap
95    , procSet :: ProcNameMap
96    -- | Added for uniformity to the CASL static analysis. After
97    --   static analysis this is the empty list.
98    , ccSentences :: [Named CspCASLSen]
99    } deriving (Eq, Show)
100
101-- | A CspCASL signature is a CASL signature with a CSP process
102-- signature in the extendedInfo part.
103type CspCASLSign = Sign () CspSign
104
105ccSig2CASLSign :: CspCASLSign -> Sign () ()
106ccSig2CASLSign sigma = sigma { extendedInfo = () }
107
108ccSig2CspSign :: CspCASLSign -> CspSign
109ccSig2CspSign sigma = extendedInfo sigma
110
111-- | Empty CspCASL signature.
112emptyCspCASLSign :: CspCASLSign
113emptyCspCASLSign = emptySign emptyCspSign
114
115-- | Empty CSP process signature.
116emptyCspSign :: CspSign
117emptyCspSign = CspSign
118    { chans = Map.empty
119    , procSet = Map.empty
120    , ccSentences =[]
121    }
122
123-- | Compute union of two CSP process signatures.
124addCspProcSig :: CspSign -> CspSign -> CspSign
125addCspProcSig a b =
126    a { chans = chans a `Map.union` chans b
127      , procSet = procSet a `Map.union` procSet b
128      }
129
130-- XXX looks incomplete!
131isInclusion :: CspSign -> CspSign -> Bool
132isInclusion _ _ = True
133
134
135-- XXX morphisms between CSP process signatures?
136
137data CspAddMorphism = CspAddMorphism
138    { channelMap :: Map.Map Id Id
139    , processMap :: Map.Map Id Id
140    } deriving (Eq, Show)
141
142composeIdMaps :: Map.Map Id Id -> Map.Map Id Id -> Map.Map Id Id
143composeIdMaps m1 m2 = Map.foldWithKey (\ i j -> case Map.lookup j m2 of
144  Nothing -> error "SignCsp.composeIdMaps"
145  Just k -> Map.insert i k) Map.empty m1
146
147composeCspAddMorphism :: CspAddMorphism -> CspAddMorphism
148                      -> Result CspAddMorphism
149composeCspAddMorphism m1 m2 = return emptyCspAddMorphism
150  { channelMap = composeIdMaps (channelMap m1) $ channelMap m2
151  , processMap = composeIdMaps (processMap m1) $ processMap m2 }
152
153inverseCspAddMorphism :: CspAddMorphism -> Result CspAddMorphism
154inverseCspAddMorphism cm = do
155  let chL = Map.toList $ channelMap cm
156      prL = Map.toList $ processMap cm
157      swap = map $ \ (a, b) -> (b, a)
158      isInj l = length l == Set.size (Set.fromList $ map snd l)
159  unless (isInj chL) $ fail "invertCspAddMorphism.channelMap"
160  unless (isInj prL) $ fail "invertCspAddMorphism.processMap"
161  return emptyCspAddMorphism
162    { channelMap = Map.fromList $ swap chL
163    , processMap = Map.fromList $ swap prL }
164
165type CspMorphism = Morphism () CspSign CspAddMorphism
166
167emptyCspAddMorphism :: CspAddMorphism
168emptyCspAddMorphism = CspAddMorphism
169  { channelMap = Map.empty -- ???
170  , processMap = Map.empty
171  }
172
173-- dummy instances, need to be elaborated!
174instance Pretty CspSign where
175  pretty = text . show
176instance Pretty CspAddMorphism where
177  pretty = text . show
178
179-- Sentences
180
181-- A CspCASl senetence is either a CASL formula or a Procsses
182-- equation. A process equation has on the LHS a process name, a list
183-- of parameters which are qualified variables (which are terms), a
184-- constituent communication alphabet and finally on the RHS a fully
185-- qualified process.
186data CspCASLSen = CASLSen (FORMULA ())
187                | ProcessEq PROCESS_NAME ProcVarList CommAlpha PROCESS
188                  deriving (Show, Eq, Ord)
189
190instance Pretty CspCASLSen where
191    -- Not implemented yet - the pretty printing of the casl sentences
192    pretty(CASLSen _) = text "Pretty printing for CASLSen not implemented yet"
193    pretty(ProcessEq pn varList alpha proc) =
194        let varDoc = if (null varList)
195                     then empty
196                     else parens $ sepByCommas $ map pretty (map fst varList)
197        in pretty pn <+> varDoc <+> equals <+> pretty proc
198
199emptyCCSen :: CspCASLSen
200emptyCCSen =
201    let emptyProcName = mkSimpleId "empty"
202        emptyVarList = []
203        emptyAlphabet = Set.empty
204        emptyProc = Skip nullRange
205    in ProcessEq emptyProcName emptyVarList emptyAlphabet emptyProc
206
207isCASLSen :: CspCASLSen -> Bool
208isCASLSen (CASLSen _) = True
209isCASLSen _           = False
210
211isProcessEq :: CspCASLSen -> Bool
212isProcessEq (ProcessEq _ _ _ _) = True
213isProcessEq _ = False
214
Note: See TracBrowser for help on using the browser.