1
Fork 0
mirror of https://git.cs.ou.nl/joshua.moerman/mealy-decompose.git synced 2025-04-30 02:07:44 +02:00
mealy-decompose/app/Playground.hs
2024-03-12 09:48:50 +01:00

43 lines
1.4 KiB
Haskell

module Main where
import DotParser ( convertToMealy, parseTransFull )
import Mealy ( MealyMachine(..) )
import SplittingTree ( PRState(..), refine, initialPRState )
import StateIdentifiers ( stateIdentifierFor )
import Trie qualified as Trie
import Control.Monad.Trans.State ( execStateT )
import Data.Map.Strict qualified as Map
import Data.Maybe ( mapMaybe )
import System.Environment ( getArgs )
import Text.Megaparsec ( parseMaybe )
main :: IO ()
main = do
[dotFile] <- getArgs
print dotFile
transitions <- mapMaybe (parseMaybe parseTransFull) . lines <$> readFile dotFile
-- convert to mealy
let
MealyMachine{..} = convertToMealy transitions
outputFuns = [(i, fun) | i <- inputs, let fun s = fst (behaviour s i)]
reverseTransitionMaps i = Map.fromListWith (++) [ (t, [s]) | s <- states, let t = snd (behaviour s i)]
reverseFuns = [(i, fun) | i <- inputs, let m = reverseTransitionMaps i, let fun s = Map.findWithDefault [] s m]
PRState{..} <- execStateT (refine print outputFuns reverseFuns) (initialPRState states)
putStrLn "\nPARTITION"
print partition
putStrLn "\nTREE"
print splittingTree
let
siFor s = stateIdentifierFor s partition splittingTree
putStrLn "\nHARMONISED STATE IDENTIFIERS"
sis <- mapM (\s -> let si = siFor s in print (Trie.toList si) >> return si) states
putStrLn "\nW-SET"
print (Trie.toList . foldr Trie.union Trie.empty $ sis)