packages feed

cpsa-3.3.2: src/CPSA/Lib/State.hs

module CPSA.Lib.State where

import Data.Maybe (catMaybes)
import CPSA.Lib.Algebra
import CPSA.Lib.Utilities

-- A transition
newtype Tran t = Tran (Maybe t, Maybe t, Maybe t) deriving (Show, Eq, Ord)

now :: Tran t -> Maybe t
now (Tran (t, _, _)) = t

next :: Tran t -> Maybe t
next (Tran (_, t, _)) = t

-- Labels are ignored
-- label :: Tran t -> Maybe t
-- label (Tran (_, _, t)) = t

observer :: Tran t -> Bool
observer (Tran (_, Nothing, _)) = True
observer _ = False

path :: Tran t -> Bool
path x = not (observer x)

transition :: Tran t -> Bool
transition (Tran (Just _, Just _, _)) = True
transition _ = False

tranTerms :: Tran t -> [t]
tranTerms (Tran (Nothing, Nothing, _)) =
  assertError ("Encountered sync with no pre- or post-state in State.hs:tranTerms")
tranTerms (Tran (now, next, label)) =
  catMaybes [now, next, label]

mapTran :: (t -> t) -> Tran t -> Tran t
mapTran f (Tran (now, next, label)) =
  Tran (maybe Nothing (Just . f) now, maybe Nothing (Just . f) next,
        maybe Nothing (Just . f) label)

matchTran :: Algebra t p g s e c => Tran t -> Tran t -> (g, e) -> [(g, e)]
matchTran (Tran (c, n, l)) (Tran (c', n', l')) ge =
  do
    ge0 <- matchNext c c' ge
    ge1 <- matchNext n n' ge0
    matchNext l l' ge1

matchNext :: Algebra t p g s e c => Maybe t -> Maybe t -> (g, e) -> [(g, e)]
matchNext Nothing Nothing ge = [ge]
matchNext (Just t) (Just t') ge = match t t' ge
matchNext _ _ _ = []

unifyTran :: Algebra t p g s e c => Tran t -> Tran t -> (g, s) -> [(g, s)]
unifyTran (Tran (c, n, l)) (Tran (c', n', l')) gs =
  do
    gs0 <- unifyNext c c' gs
    gs1 <- unifyNext n n' gs0
    unifyNext l l' gs1

unifyNext :: Algebra t p g s e c => Maybe t -> Maybe t -> (g, s) -> [(g, s)]
unifyNext Nothing Nothing ge = [ge]
unifyNext (Just t) (Just t') ge = unify t t' ge
unifyNext _ _ _ = []