packages feed

smcdel-1.0.0: src/SMCDEL/Translations/K/Change.hs

{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}

module SMCDEL.Translations.K.Change where

import Data.HasCacBDD hiding (Top,Bot)
import Data.List ((\\),nub,sort)
import qualified Data.Map.Strict as M
import Data.Map.Strict ((!),fromList)

import SMCDEL.Explicit.K.Change
import SMCDEL.Internal.Help (apply,powerset)
import SMCDEL.Language
import SMCDEL.Translations.S5 (booloutof)
import SMCDEL.Other.BDD2Form
import SMCDEL.Symbolic.K
import SMCDEL.Symbolic.K.Change
import SMCDEL.Symbolic.S5 (boolBddOf)

actionToEvent :: PointedChangeModel -> Event
actionToEvent (ChM chm, faction) = (Trf addprops addlaw changeprops changelaw eventObs, efacts) where
  actions      = M.keys chm
  (P fstnewp)  = freshp $ concatMap -- avoid props in pre and postconditions
    (\c -> propsInForms (pre c : M.elems (post c)) ++ M.keys (post c)) (M.elems chm)
  addprops     = [P fstnewp..P maxactprop] -- new props to distinguish all actions
  maxactprop   = fstnewp + ceiling (logBase 2 (fromIntegral $ length actions) :: Float) - 1
  ell          = apply $ zip actions (powerset addprops) -- injectively label actions with sets of propositions
  addlaw       = simplify $ Disj [ Conj [ booloutofForm (ell a) addprops, pre $ chm ! a ] | a <- actions ]
  changeprops  = sort $ nub $ concatMap M.keys . M.elems $ M.map post chm -- propositions to be changed
  changelaw    = M.fromList [ (p, changeFor p) | p <- changeprops ] -- encode postconditions
  changeFor p  = disSet [ booloutof (ell k) addprops `con` boolBddOf (safepost (chm ! k) p) | k <- actions ]
  eventObs     = M.fromList [ (i, obsLawFor i) | i <- agentsOf (ChM chm) ]
  obsLawFor i  = pure $ disSet (M.elems $ M.mapWithKey (link i) chm)
  link i k ch  = booloutof (mv $ ell k) (mv addprops) `con` -- encode relations
                 disSet [ booloutof (cp $ ell there) (cp addprops) | there <- rel ch ! i ]
  efacts       = ell faction

eventToAction' :: Event -> PointedChangeModel
eventToAction' (t@(Trf addprops addlaw changeprops changelaw eventObs), efacts) = (ChM chm, faction) where
  actlist    = zip (powerset addprops) [0..]
  chm        = fromList [ (a, Ch (preFor ps) (postFor ps) (relFor ps)) | (ps,a) <- actlist ]
  preFor ps  = simplify $
    substitSet (zip ps (repeat Top) ++ zip (addprops \\ ps) (repeat Bot)) addlaw
  postFor ps = fromList
    [ (q, formOf $ restrictSet (changelaw ! q) [(p, P p `elem` ps) | (P p) <- addprops]) | q <- changeprops ]
  relFor ps = fromList [(i,rFor i) | i <- agentsOf t] where
    rFor i = concatMap (\(qs,b) -> [ b | tagBddEval (mv ps ++ cp qs) (eventObs ! i) ]) actlist
  faction   = apply actlist efacts