packages feed

hyloutils-1.0: src/mcheck.hs

module Main ( main )

where

import System.Environment ( getArgs )

import Control.Applicative ( (<$>) )
import qualified Data.Set as Set

import HyLo.Model ( Model, (|=), worlds )

import HyLo.Signature.String ( NomSymbol, PropSymbol, RelSymbol )

import HyLo.InputFile ( InputFile, parse )

import Data.List ( delete )

main :: IO ()
main =
    do args <- getArgs
       case args of
         [mf, ff] -> do m  <- read  <$> readFile mf :: IO M
                        fs <- parseAnyFormat <$> readFile ff
                        --
                        let ws = Set.toList (worlds m)
                        --
                        print $ any (\w -> and [(m,w) |= f | f <- fs]) ws
         --
         _        -> putStrLn "Usage: mcheck <model> <formulas>"


parseAnyFormat :: String -> InputFile
parseAnyFormat s | head (words s) == "begin"
 =  parse $ "signature { automatic } theory { " ++ removeBeginEnd s ++ "}"
          where removeBeginEnd = unwords . delete "begin" . delete "end" . words
parseAnyFormat s = parse s


type M = Model NomSymbol NomSymbol PropSymbol RelSymbol