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)