-- |This module implements a command-line interface to the implementation of -- Carneades. CAES + Haskell = caell -- -- Code in this module partly taken from/inspired by Shinobu -- See: http://zuttobenkyou.wordpress.com/2011/04/19/haskell-using-cmdargs-single-and-multi-mode/ -- and http://listx.github.com/ {-# LANGUAGE DeriveDataTypeable, RecordWildCards #-} module Main ( main ) where import Language.CarneadesIntoDung.Translation import Language.Carneades.CarneadesDSL(CAES(..), getAllArgs, applicable, getProps, acceptable) import Language.Carneades.Input import Language.Dung.AF(groundedExt, preferredExt, stableExt, semiStableExt, DungAF(..)) import Language.Dung.Output import System.Console.CmdArgs import System.Environment (getArgs, withArgs) import System.Exit import Control.Monad (when, unless) data MyOptions = MyOptions { cegartix :: Bool, laxCegartix :: Bool, fileName :: String, outputFile :: String, correspondence :: Bool, extension :: Bool, xSemantics :: Bool } deriving (Show, Data, Typeable) myProgOpts :: MyOptions myProgOpts = MyOptions { cegartix = True &= help "Output in strict CEGARTIX/PrefSat format (standard)" , laxCegartix = False &= help "Output in lax CEGARTIX/PrefSat format (+parentheses)" , fileName = def &= typFile &= help "Name of the file to be read" , outputFile = def &= typFile &= help "Name of the file to be written" , extension = True &= help "Output unique complete extension for the translated CAES (standard)" , correspondence = False &= help "Display satisfaction of correspondence result" , xSemantics = False &= help "Output evaluation of the original Carneades semantics" } getOpts :: IO MyOptions getOpts = cmdArgs $ myProgOpts &= versionArg [explicit, name "version", name "v", summary _PROGRAM_INFO] &= summary (_PROGRAM_INFO ++ ", " ++ _COPYRIGHT) &= help _PROGRAM_ABOUT &= helpArg [explicit, name "help", name "h"] &= program _PROGRAM_NAME _PROGRAM_NAME = "caell" _PROGRAM_VERSION = "1.0" _PROGRAM_INFO = _PROGRAM_NAME ++ " version " ++ _PROGRAM_VERSION _PROGRAM_ABOUT = "An implementation of Carneades in Haskell" _COPYRIGHT = "(C) Bas van Gijzel 2014" main :: IO () main = do args <- getArgs opts <- (if null args then withArgs ["--help"] else id) getOpts optionHandler opts -- |Check any malformed arguments/missing arguments. optionHandler :: MyOptions -> IO () optionHandler opts@MyOptions{..} = do when (null fileName) $ putStrLn "--fileName is blank!" >> exitWith (ExitFailure 1) input <- readFile fileName let opts' = opts {cegartix = not laxCegartix} caes <- case parseCAES input of Left err -> putStrLn "Parsing error: " >> print err >> exitWith (ExitFailure 1) Right caes -> return caes exec opts' caes -- |Execute supplied options exec :: MyOptions -> CAES -> IO () exec opts@MyOptions{..} caes@(CAES (argSet, (assumptions, _), _)) = do let args = getAllArgs argSet let transCaes = translate caes putStrLn $ "Argument set: " ++ show args when xSemantics $ putStrLn "Evaluation under original semantics:" >> putStrLn "Applicable arguments:" >> print (filter (`applicable` caes) args) >> putStrLn "Acceptable propositions:" >> print (filter (\ p -> p `acceptable` caes || p `elem` assumptions) (getProps argSet)) when extension $ putStrLn "Extension after translation: " >> print (groundedExt transCaes) when correspondence $ putStrLn ("Correspondence of applicability is: " ++ show (corApp caes)) >> putStrLn ("Correspondence of acceptability is: " ++ show (corAcc caes)) unless (null outputFile) $ if cegartix then writeFile outputFile (toStrictCegartix transCaes) >> putStrLn "File outputted." else writeFile outputFile (toCegartix transCaes) >> putStrLn "File outputted."