Description : Interface to the TPTP theorem prover via Darwin.
Copyright : (c) Heng Jiang, Uni Bremen 2004-2007
Maintainer : Christian.Maeder@dfki.de
Portability : needs POSIX
, darwinCMDLautomaticBatch
-- preliminary hacks for display of CASL models
runProcess, terminateProcess)
import
System.IO (hGetContents, openFile, hClose, IOMode (WriteMode))
-- * Prover implementation
data ProverBinary = Darwin | DarwinFD | EDarwin | EProver | Leo | IProver
tptpProvers :: [ProverBinary]
tptpProvers = [minBound .. maxBound]
proverBinary :: ProverBinary -> String
proverBinary b = darwinExe b ++
darwinExe :: ProverBinary -> String
{- | The Prover implementation. First runs the batch prover (with
graphical feedback), then starts the GUI prover. -}
:: ProverBinary -> Prover Sign Sentence SoftFOLMorphism () ProofTree
mkAutomaticProver (darwinExe b) (proverBinary b) () (darwinGUI b)
$ darwinCMDLautomaticBatchAux b
:: ProverBinary -> ConsChecker Sign Sentence () SoftFOLMorphism ProofTree
(mkUsableConsChecker (darwinExe b) (proverBinary b) () $ consCheck b)
Record for prover specific functions. This is used by both GUI and command
atpFun :: ProverBinary -- ^ the actual binary
-> String -- ^ theory name
-> ATPFunctions Sign Sentence SoftFOLMorphism ProofTree SoftFOLProverState
atpFun b thName = ATPFunctions
{ initialProverState = spassProverState
, atpTransSenName = transSenName
, atpInsertSentence = insertSentenceGen
, goalOutput = showTPTPProblem thName
, proverHelpText = "no help for darwin available"
, batchTimeEnv = "HETS_SPASS_BATCH_TIME_LIMIT"
, fileExtensions = FileExtensions
{ problemOutput = ".tptp"
, proverOutput = ".spass"
, theoryConfiguration = ".spcf" }
, runProver = runDarwin b
, createProverOptions = extraOpts }
Invokes the generic prover GUI. SPASS specific functions are omitted by
:: ProverBinary -- ^ the actual binary
-> String -- ^ theory name
-> Theory Sign Sentence ProofTree
-- ^ theory consisting of a signature and sentences
-> [FreeDefMorphism SPTerm SoftFOLMorphism] -- ^ freeness constraints
-> IO [ProofStatus ProofTree] -- ^ proof status for each goal
darwinGUI b thName th freedefs =
genericATPgui (atpFun b thName) True (proverBinary b) thName th
-- ** command line function
automatic command line interface to the Darwin prover.
Darwin specific functions are omitted by data type ATPFunctions.
:: Bool -- ^ True means include proved theorems
-> Bool -- ^ True means save problem file
-- ^ used to store the result of the batch run
-> String -- ^ theory name
-> TacticScript -- ^ default tactic script
-> Theory Sign Sentence ProofTree
-- ^ theory consisting of a signature and sentences
-> [FreeDefMorphism SPTerm SoftFOLMorphism] -- ^ freeness constraints
{- ^ fst: identifier of the batch thread for killing it
snd: MVar to wait for the end of the thread -}
darwinCMDLautomaticBatch = darwinCMDLautomaticBatchAux Darwin
darwinCMDLautomaticBatchAux
:: ProverBinary -- ^ the actual binary
-> Bool -- ^ True means include proved theorems
-> Bool -- ^ True means save problem file
-- ^ used to store the result of the batch run
-> String -- ^ theory name
-> TacticScript -- ^ default tactic script
-> Theory Sign Sentence ProofTree
-- ^ theory consisting of a signature and sentences
-> [FreeDefMorphism SPTerm SoftFOLMorphism] -- ^ freeness constraints
{- ^ fst: identifier of the batch thread for killing it
snd: MVar to wait for the end of the thread -}
darwinCMDLautomaticBatchAux b inclProvedThs saveProblem_batch resultMVar
thName defTS th freedefs =
genericCMDLautomaticBatch (atpFun b thName) inclProvedThs saveProblem_batch
resultMVar (proverBinary b) thName
(parseTacticScript batchTimeLimit [] defTS) th freedefs emptyProofTree
-- * Main prover functions
eproverOpts :: String -> String
eproverOpts verb = "-xAuto -tAuto --tptp3-format " ++ verb
++ " --memory-limit=2048 --soft-cpu-limit="
extras :: ProverBinary -> Bool -> String -> String
fdOpt = darOpt ++ (if cons then " -pmtptp true" else "") ++ " -fd true"
EProver -> eproverOpts (if cons then "-s" else "") ++ tl
DarwinFD -> fdOpt ++ tOut
EDarwin -> fdOpt ++ " -eq Axioms" ++ tOut
IProver -> "--time_out_real " ++ tl ++ " --sat_mode true"
{- | Runs the Darwin service. The tactic script only contains a string for the
-> TheoryMorphism Sign Sentence SoftFOLMorphism ProofTree
-> [FreeDefMorphism SPTerm SoftFOLMorphism] -- ^ freeness constraints
-> IO (CCStatus ProofTree)
consCheck b thName (TacticScript tl) tm freedefs = case tTarget tm of
let proverStateI = spassProverState sig (toNamedList nSens) freedefs
prob <- showTPTPProblemM thName proverStateI []
(exitCode, out, tUsed) <-
runDarwinProcess (darwinExe b) False (extras b True tl) thName prob
, ccProofTree = ProofTree $ unlines $ exitCode : out
, ccUsedTime = timeToTimeOfDay $ secondsToDiffTime
return $ if szsProved exitCode then outState else
{ ccResult = if szsDisproved exitCode then Just False
:: String -- ^ binary name
-> Bool -- ^ save problem
-> String -- ^ filename without extension
-> IO (String, [String], Int)
runDarwinProcess bin saveTPTP options tmpFileName prob = do
let tmpFile = basename tmpFileName ++ ".tptp"
when saveTPTP (writeFile tmpFile prob)
noProg <- missingExecutableInPath bin
return (bin ++ " not found. Check your $PATH", [], -1)
timeTmpFile <- getTempFile prob tmpFile
executeProcess bin (words options ++ [timeTmpFile]) ""
let l = lines $ pout ++ perr
(res, _, tUsed) = parseOutput l
mkGraph :: String -> IO ()
(_, cat, _) <- executeProcess "cat" [f] ""
(_, tac, _) <- executeProcess "tac" [f] ""
let ((p_set, (cs, axs)), res) =
processProof (zipF proofInfo $ zipF conjectures axioms)
(aliases, _) = processProof alias
Map.empty $ lines cat
same_rank = intercalate "; " $ map (\ (_, n) -> 'v' : n) $
"subgraph { rank = same; " ++ same_rank ++ " }",
(\ (_, _, d, _) -> d) . fst $ processProof (digraph p_set aliases)
:: Bool -- ^ save problem
-> String -- ^ filename without extension
-> IO (String, [String], Int)
runEProverBuffered saveTPTP graph fullgraph options tmpFileName prob = do
let tmpFile = basename tmpFileName ++ ".tptp"
useProofObject = s && not fullgraph
bin = if useProofObject then "eprover"
noProg <- missingExecutableInPath bin
when saveTPTP (writeFile tmpFile prob)
if noProg then return (bin ++ " not found. Check your $PATH", [], -1)
timeTmpFile <- getTempFile prob tmpFile
if graph || fullgraph || not s then do
bufferFile <- getTempFile "" "eprover-proof-buffer"
buff <- openFile bufferFile WriteMode
h <- runProcess bin (words options ++
["--proof-object" | useProofObject] ++ [timeTmpFile])
Nothing Nothing Nothing (Just buff) (Just buff)
(waitForProcess h >> removeFile timeTmpFile)
runInteractiveCommand $ unwords ["grep", "-e", "axiom",
"-e", "SZS", bufferFile, "&&", "rm", "-f", bufferFile]
else runInteractiveCommand $ unwords
[bin, "--proof-object", options, timeTmpFile,
"|", "grep", "-e", "axiom", "-e", "SZS",
let l = lines $ perr ++ pout
(res, _, tUsed) = parseOutput l
{- ^ logical part containing the input Sign and axioms and possibly
goals that have been proved earlier as additional axioms -}
-> GenericConfig ProofTree -- ^ configuration to use
-> Bool -- ^ True means save TPTP file
-> String -- ^ name of the theory in the DevGraph
-> IO (ATPRetval, GenericConfig ProofTree)
-- ^ (retval, configuration with proof status and complete output)
runDarwin b sps cfg saveTPTP thName nGoal = do
(options, graph, fullgraph) = case b of
in (filter (not . (\ e -> elem e ["--graph", "--full-graph"])) w,
elem "--graph" w, elem "--full-graph" w)
_ -> (extraOpts cfg, False, False)
tl = maybe "10" show $ timeLimit cfg
extraOptions = extras b False tl
prob <- showTPTPProblem thName sps nGoal
$ options ++ ["Requested prover: " ++ bin]
(exitCode, out, tUsed) <- case b of
EProver -> runEProverBuffered saveTPTP graph fullgraph
extraOptions tmpFileName prob
_ -> runDarwinProcess bin saveTPTP extraOptions tmpFileName prob
EProver | szsProved exitCode ||
case processProof axioms [] out of
(l, Nothing) -> return $ map fst l
_ -> return $ getAxioms sps
let ctime = timeToTimeOfDay $ secondsToDiffTime $ toInteger tUsed
(err, retval) = case () of
_ | szsProved exitCode -> (ATPSuccess, provedStatus)
_ | szsDisproved exitCode -> (ATPSuccess, disProvedStatus)
_ | szsTimeout exitCode ->
(ATPTLimitExceeded, defaultProofStatus)
_ | szsStopped exitCode ->
(ATPBatchStopped, defaultProofStatus)
_ -> (ATPError exitCode, defaultProofStatus)
, tacticScript = TacticScript $ show ATPTacticScript
{tsTimeLimit = configTimeLimit cfg,
disProvedStatus = defaultProofStatus {goalStatus = Disproved}
provedStatus = defaultProofStatus
, goalStatus = Proved True
, usedTime = timeToTimeOfDay $ secondsToDiffTime $ toInteger tUsed
return (err, cfg {proofStatus = retval,
getSZSStatusWord :: String -> Maybe String
getSZSStatusWord line = case words $ fromMaybe ""
$ stripPrefix "SZS status" $ dropWhile (`elem` "%# ") line of
parseOutput :: [String] -> (String, Bool, Int)
-- ^ (exit code, status found, used time)
parseOutput = foldl' checkLine ("could not determine SZS status", False, -1)
where checkLine (exCode, stateFound, to) line =
if isPrefixOf "Couldn't find eprover" line
|| isInfixOf "darwin -h for further information" line
-- error by running darwin.
then (line, stateFound, to)
else case getSZSStatusWord line of
Just szsState | not stateFound ->
_ -> if "CPU Time" `isPrefixOf` line -- get cpu time
then let time = case takeWhile isDigit $ last (words line) of
in (exCode, stateFound, time)
else (exCode, stateFound, to)