packages feed

HTab-1.5.4: tests/test-example-formulas.hs

module Main ( main ) where

import Data.List ( tails )
import qualified Data.Set as Set

import Control.Applicative ( (<$>) )
import HyLo.Util           ( sequenceUntil )

import System.Exit        ( exitFailure          )
import System.FilePath    ( (</>)                )
import System.Directory   ( getDirectoryContents )
import System.Environment ( getArgs              )

import HyLo.Model
import HyLo.Model.Herbrand
import HyLo.InputFile
import HyLo.Signature.String ( NomSymbol(..), PropSymbol(..), RelSymbol(..) )


import HTab.CommandLine
import HTab.Main

main :: IO ()
main =
  do (sat_dir, sat_no_mod_dir, unsat_dir) <- parseArgs
     --
     sat_tests        <- map (runExpecting Sat)      <$> frmFiles sat_dir
     sat_no_mod_tests <- map (runExpecting SatNoMod) <$> frmFiles sat_no_mod_dir
     unsat_tests      <- map (runExpecting Unsat)    <$> frmFiles unsat_dir
     --
     success <- and <$> sequenceUntil not (sat_tests ++ sat_no_mod_tests ++ unsat_tests)
     if success
       then putStrLn "SUCCESS"
       else putStrLn "FAILURE" >> exitFailure

data Expected = Sat | SatNoMod | Unsat deriving (Eq, Show)

parseArgs :: IO (FilePath, FilePath, FilePath)
parseArgs = go =<< getArgs
    where go [sd, snmd, ud] = return (sd, snmd, ud)
          go _              = fail "Required args: <sat dir> <sat no model dir> <unsat dir>"

frmFiles :: FilePath -> IO [FilePath]
frmFiles dir = map (dir </>) . filter (endsWith ".frm") <$>
                   getDirectoryContents dir

endsWith :: String -> String -> Bool
endsWith t s = t `elem` (tails s)

runHTab :: FilePath -> IO TaskRunFlag
runHTab f = runWithParams clp
    where clp = defaultParams{filename   = Just f,
                              maxtimeout = 20,
                              quietMode  = True,
                              genModel   = Just modelTmpFile}

modelTmpFile :: String
modelTmpFile = "model.tmp"

runExpecting :: Expected -> FilePath -> IO Bool
runExpecting exp_result file =
    do putStr (file ++ "......... ")
       r <- runHTab file
       case (r, exp_result) of
         (FAILURE, Unsat)    -> putStrLn "OK!" >> return True
         (FAILURE, _)        -> putStrLn "FAILED! (unsat)" >> return False
         (SUCCESS, SatNoMod) -> putStrLn "OK!" >> return True
         (SUCCESS, Sat)      -> do b <- isASatisfyingModel
                                   if b
                                     then do putStrLn "OK!"
                                             return True
                                     else do putStrLn "MODELCHECK FAILED"
                                             return False
         (SUCCESS, Unsat)    -> putStrLn "FAILED! (sat)" >> return False
         (TIMEOUT_ , _)      -> putStrLn "FAILED! (timeout)" >> return False
    --

    where isASatisfyingModel =
            do fs <- parse <$> readFile file
               m  <- read  <$> readFile modelTmpFile :: IO M
               --
               let ws = Set.toList (worlds m)
               --
               return $ any (\w -> and [(m,w) |= f | f <- fs]) ws

type M = Model NomSymbol NomSymbol PropSymbol RelSymbol