Prop2CNF.hs revision 4e9e95ba35a68f3c767bc0b23ebf9e904e442517
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder{- |
25cc5fbba63f84b47e389af749f55abbbde71c8cChristian MaederModule : $Header$
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederDescription : Helper functions for CNF translation
25cc5fbba63f84b47e389af749f55abbbde71c8cChristian MaederCopyright : (c) Dominik Luecke, Uni Bremen 2007
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederLicense : similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederMaintainer : luecke@informatik.uni-bremen.de
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederStability : experimental
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederPortability : non-portable (imports Logic.Logic)
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederHelper functions for the translation of propositional formulae to CNF. We are
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maederusing SPASS -Flotter=1 here
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maeder-}
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder{-
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder Ref.
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder http://en.wikipedia.org/wiki/Propositional_logic
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder Till Mossakowski, Joseph Goguen, Razvan Diaconescu, Andrzej Tarlecki.
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder What is a Logic?.
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder In Jean-Yves Beziau (Ed.), Logica Universalis, pp. 113-@133. Birkhaeuser.
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder 2005.
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder-}
ce8b15da31cd181b7e90593cbbca98f47eda29d6Till Mossakowski
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder{-
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder ToDo: clause formula relation to SPASS Parser + AS
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder add analysis for clause formula
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder put the stuff together
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder-}
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maedermodule Propositional.Prop2CNF
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder (
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder translateToCNF -- CNF conversion via SPASS
8410667510a76409aca9bb24ff0eda0420088274Christian Maeder )
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder where
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
8410667510a76409aca9bb24ff0eda0420088274Christian Maederimport Common.UniUtils as CP
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettich
eee4b2ee739f163e09d6af6e45c025681e6c01a0Christian Maederimport qualified Comorphisms.SuleCFOL2SoftFOL as C2S
eee4b2ee739f163e09d6af6e45c025681e6c01a0Christian Maeder
eee4b2ee739f163e09d6af6e45c025681e6c01a0Christian Maederimport qualified Logic.Coerce as LC
eee4b2ee739f163e09d6af6e45c025681e6c01a0Christian Maederimport qualified Logic.Comorphism as Com
eee4b2ee739f163e09d6af6e45c025681e6c01a0Christian Maeder
eee4b2ee739f163e09d6af6e45c025681e6c01a0Christian Maederimport Propositional.ChildMessage
eee4b2ee739f163e09d6af6e45c025681e6c01a0Christian Maederimport qualified Propositional.AS_BASIC_Propositional as PBasic
eee4b2ee739f163e09d6af6e45c025681e6c01a0Christian Maederimport qualified Propositional.Prop2CASLHelpers as P2C
eee4b2ee739f163e09d6af6e45c025681e6c01a0Christian Maederimport qualified Propositional.Sign as PSign
d4892fa7401ceef014ea59d2d900773eaf88fcbdChristian Maeder
eee4b2ee739f163e09d6af6e45c025681e6c01a0Christian Maederimport qualified SoftFOL.Conversions as Conv
eee4b2ee739f163e09d6af6e45c025681e6c01a0Christian Maederimport qualified SoftFOL.DFGParser as SParse
eee4b2ee739f163e09d6af6e45c025681e6c01a0Christian Maederimport qualified SoftFOL.ProverState as PState
eee4b2ee739f163e09d6af6e45c025681e6c01a0Christian Maederimport qualified SoftFOL.Sign as Sig
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettichimport qualified SoftFOL.Translate as Translate
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederimport qualified CASL.Logic_CASL as CLogic
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederimport Common.DocUtils
e593b89bfd4952698dc37feced21cefe869d87a2Christian Maederimport qualified Common.AS_Annotation as AS_Anno
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederimport qualified Common.Id as Id
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederimport qualified Common.Result as Result
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederimport Control.Monad (when)
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederimport qualified Common.Exception as Exception
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederimport qualified Data.Set as Set
a2d6702f18737cc5fff8e8631c08f221f8375c4bChristian Maederimport Data.List
c6fcd42c6d6d9dae8c7835c24fcb7ce8531a9050Christian Maederimport Data.Maybe
31c49f2fa23d4ac089f35145d80a224deb6ea7e4Till Mossakowskiimport Text.ParserCombinators.Parsec
c55a0f77be7e88d3620b419ec8961f4379a586e3Klaus Luettich
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaedersafeDFGFiles ::Bool
9e748851c150e1022fb952bab3315e869aaf0214Christian MaedersafeDFGFiles = False
8cacad2a09782249243b80985f28e9387019fe40Christian Maeder
8cacad2a09782249243b80985f28e9387019fe40Christian Maederprover_name :: String
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederprover_name = "SPASS"
d3ae0072823e2ef0d41d4431fcc768e66489c20eChristian Maeder
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder-- This hack is needed to break up a cicle in imports :(
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maedermap_theory :: (PSign.Sign, [AS_Anno.Named PBasic.FORMULA])
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder -> Result.Result (Sig.Sign, [AS_Anno.Named Sig.SPTerm])
9e748851c150e1022fb952bab3315e869aaf0214Christian Maedermap_theory =
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder \ti1 ->
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder do ti2 <- P2C.mapTheory ti1
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder ti2' <- LC.coerceBasicTheory (CLogic.CASL) (Com.sourceLogic C2S.SuleCFOL2SoftFOL)
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder "Mapping theory along comorphism" ti2
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder Com.wrapMapTheory C2S.SuleCFOL2SoftFOL ti2'
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder-- | Shortcut for the translation of the theory
9e748851c150e1022fb952bab3315e869aaf0214Christian MaedergetTheory :: (PSign.Sign, [AS_Anno.Named PBasic.FORMULA])
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian Maeder -> Result.Result (Sig.Sign, [AS_Anno.Named Sig.SPTerm])
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian MaedergetTheory = map_theory
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- | forget the internal settings for a while
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder-- this is no loss, since we have to restore them
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder-- anyways
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederdementia :: [AS_Anno.Named PBasic.FORMULA]
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder -> [AS_Anno.Named PBasic.FORMULA]
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederdementia frm = map (\xv ->
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder xv
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder {
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder AS_Anno.isAxiom = True
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder , AS_Anno.isDef = False
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder , AS_Anno.wasTheorem = False
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder }
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder ) frm
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder-- | Initial ProverState for Spass
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaedercreateInitProverState :: PSign.Sign
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder -> [AS_Anno.Named PBasic.FORMULA]
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder -> PState.SoftFOLProverState
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaedercreateInitProverState sign nForms =
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder let (osig, oth) =
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder case Result.maybeResult $ getTheory (sign, dementia nForms) of
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder Just (xs,ys) -> (xs,ys)
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder Nothing -> error "Should not happen... Error in Prop2CNF"
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder in
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder PState.spassProverState osig oth []
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder{- |
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder Runs SPASS. SPASS is assumed to reside in PATH.
a3c6d8e0670bf2aa71bc8e2a3b1f45d56dd65e4cChristian Maeder-}
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederrunSpass :: PState.SoftFOLProverState -- Spass Prover state... Theory + Sig
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder -> Bool -- ^ True means save DFG file
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder -> IO String -- Placeholder
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederrunSpass sps saveDFG =
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder do
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder spass <- newChildProcess prover_name [CP.arguments allOptions]
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder Exception.catch (runSpassReal spass)
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder (\ excep -> do
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder -- kill spass process
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder destroy spass
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder _ <- waitForChildProcess spass
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder return ("SPASS not found... Bailing out!!! Cause was: "
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder ++ show excep
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder )
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maeder )
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder where
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder runSpassReal spass = do
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder -- check if SPASS is running
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder e <- getToolStatus spass
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder if isJust e
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder then error "Something is wrong"
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder else do
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder prob <- showDFGProblem "Translation" sps (filteredOptions)
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder when saveDFG
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder (writeFile ("FlotterIn.dfg") prob)
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maeder sendMsg spass prob
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maeder flotterOut <- parseIt spass isEnd
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder when saveDFG
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian Maeder (writeFile ("FlotterOut.dfg") flotterOut)
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian Maeder return flotterOut
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian Maeder filteredOptions = ["-Auto=0","-Flotter=1","-Stdin=1", "-CNFOptSkolem=0",
afa6ceaf4359ae437aaa6830949583143ace2752Christian Maeder "-CNFStrSkolem=0"
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder ]
f4505a64a089693012a3f5c3b1f12a82cd7a2a5aKlaus Luettich allOptions = filteredOptions
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder{- |
f4505a64a089693012a3f5c3b1f12a82cd7a2a5aKlaus Luettich Pretty printing SPASS goal in DFG format.
f4505a64a089693012a3f5c3b1f12a82cd7a2a5aKlaus Luettich-}
f4505a64a089693012a3f5c3b1f12a82cd7a2a5aKlaus LuettichshowDFGProblem :: String -- ^ theory name
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder -> PState.SoftFOLProverState -- ^ prover state containing
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder -- initial logical part
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder -> [String] -- ^ extra options
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder -> IO String -- ^ formatted output of the goal
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaedershowDFGProblem thName pst opts = do
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder prob <- Conv.genSoftFOLProblem thName (PState.initialLogicalPart pst) $ Nothing
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder -- add SPASS command line settings and extra options
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder let prob' = prob { Sig.settings = (Sig.settings prob) ++
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder (PState.parseSPASSCommands opts) }
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder return $ showDoc prob' ""
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder-- | We are searching for Flotter needed to determine the end of input
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederisEnd :: String -> Bool
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederisEnd inS = isPrefixOf "FLOTTER needed" inS
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
b7e6a2daa94ea6370ad121a7b72495dc4d8e6749Christian Maeder-- | Main function for run SPASS and Parse
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederrunSPASSandParseDFG :: PState.SoftFOLProverState -- Spass Prover state... Theory + Sig
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder -> Bool -- True means save DFG file
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder -> IO Sig.SPProblem -- Output AS
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederrunSPASSandParseDFG pstate save =
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder fmap parseDFG $ runSpass pstate save
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- | run the DFG Parser
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederparseDFG :: String -> Sig.SPProblem
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederparseDFG input
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder = case (parse SParse.parseSPASS "" input) of
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder Left err -> error $ "parse error at " ++ show err
9df11f85fd7f8c4745d64464876e84ec4e263692Christian Maeder Right xv -> xv
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers
9df11f85fd7f8c4745d64464876e84ec4e263692Christian Maeder-- | Restore the values of the named fields in Formulae
5b818f10e11fc79def1fdd5c8a080d64a6438d87Christian MaederrestoreContext :: [AS_Anno.Named PBasic.FORMULA] -- Input Formulae
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers -> [AS_Anno.Named PBasic.FORMULA] -- Translated Formula
5d4038657f6a63e131f5804af2f7957b69e15a43Klaus Luettich -> [AS_Anno.Named PBasic.FORMULA] -- Output
5d4038657f6a63e131f5804af2f7957b69e15a43Klaus LuettichrestoreContext [] [] = []
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederrestoreContext [] _ = []
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederrestoreContext xs (yv:ys) =
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder let
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder trName = AS_Anno.senAttr yv
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder trNm = Translate.transSenName
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers frm = head $ filter (\xv -> (trNm $ AS_Anno.senAttr xv) == trName) xs
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder inName = AS_Anno.senAttr frm
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder isAx = AS_Anno.isAxiom frm
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder isDef = AS_Anno.isDef frm
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder wasTh = AS_Anno.wasTheorem frm
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder sent = AS_Anno.sentence yv
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder in
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder [(AS_Anno.makeNamed inName sent)
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder {
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder AS_Anno.isAxiom = isAx
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder , AS_Anno.isDef = isDef
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder , AS_Anno.wasTheorem = wasTh
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder }
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder ] ++ restoreContext xs ys
61fa0ac06ede811c7aad54ec4c4202346727368eChristian MaederrestoreContext _ _ = []
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- | Join different clauses to a single CNF-Formula
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederjoinClause :: Sig.SPClauseType
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder -> Sig.SPSettingBody
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder -> [AS_Anno.Named PBasic.FORMULA]
afa6ceaf4359ae437aaa6830949583143ace2752Christian Maeder -> [AS_Anno.Named PBasic.FORMULA]
61fa0ac06ede811c7aad54ec4c4202346727368eChristian MaederjoinClause inCt inSetting inFrm =
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder case inFrm of
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder []-> []
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers _ -> joinClauseHelper inCt (determineClauseNames inSetting) inSetting inFrm
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder-- | Join Clauses according to the Clause-Formula-Relation
9e748851c150e1022fb952bab3315e869aaf0214Christian MaederjoinClauseHelper :: Sig.SPClauseType
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder -> Set.Set String
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder -> Sig.SPSettingBody
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder -> [AS_Anno.Named PBasic.FORMULA]
fdb2d618144159395f7bf8ce3327b3c112a17dd3Till Mossakowski -> [AS_Anno.Named PBasic.FORMULA]
43b4c41fbb07705c9df321221ab9cb9832460407Christian MaederjoinClauseHelper inCt inSet inSetting inFrm =
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder case (Set.null inSet) of
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder True -> []
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder _ ->
fe37265aaad6667f65d979a6cebbe145ef8b512bChristian Maeder let
fe37265aaad6667f65d979a6cebbe145ef8b512bChristian Maeder smallestElem = Set.findMin inSet
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder newSet = Set.deleteMin inSet
e2d849b4152a234bc0afaa2ab3a7c17d28de7565Christian Maeder clauses = filterClauseNames smallestElem inSetting inFrm
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder nakedForms = map (AS_Anno.sentence) clauses
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder firstForm = head clauses
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder inName = smallestElem
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder isAx = AS_Anno.isAxiom firstForm
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder isDef = AS_Anno.isDef firstForm
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder wasTh = AS_Anno.wasTheorem firstForm
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder in
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder case inCt of
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder Sig.SPCNF -> [(AS_Anno.makeNamed inName (PBasic.Conjunction nakedForms Id.nullRange))
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder {
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder AS_Anno.isAxiom = isAx
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder , AS_Anno.isDef = isDef
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder , AS_Anno.wasTheorem = wasTh
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder }
dbe752ee940baae7f9f231f29c62284bb0f90a25Christian Maeder ]
53818ced114da21321063fff307aa41c1ab31dd3Achim Mahnke ++ (joinClauseHelper inCt newSet inSetting inFrm)
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder Sig.SPDNF -> [(AS_Anno.makeNamed inName (PBasic.Disjunction nakedForms Id.nullRange))
53818ced114da21321063fff307aa41c1ab31dd3Achim Mahnke {
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder AS_Anno.isAxiom = isAx
53818ced114da21321063fff307aa41c1ab31dd3Achim Mahnke , AS_Anno.isDef = isDef
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder , AS_Anno.wasTheorem = wasTh
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder }
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder ]
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder ++ (joinClauseHelper inCt newSet inSetting inFrm)
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- | get Clauses with a particular name
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederfilterClauseNames :: String -> Sig.SPSettingBody -> [AS_Anno.Named PBasic.FORMULA] -> [AS_Anno.Named PBasic.FORMULA]
857992065be4ed40a72c6296b6c0aec62ab4c5b9Christian MaederfilterClauseNames name setting frms =
fdb2d618144159395f7bf8ce3327b3c112a17dd3Till Mossakowski let clrel =
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder (\xy -> case xy of
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder -- sign of list_of_settings is changed, see
7c99e334446bb97120e30e967baeeddfdd1278deKlaus Luettich -- SoftFOL/Sign.hs
7c99e334446bb97120e30e967baeeddfdd1278deKlaus Luettich Sig.SPClauseRelation cls -> cls
7c99e334446bb97120e30e967baeeddfdd1278deKlaus Luettich _ -> error "Wrong type"
7c99e334446bb97120e30e967baeeddfdd1278deKlaus Luettich ) setting
7c99e334446bb97120e30e967baeeddfdd1278deKlaus Luettich thisNames = map (Sig.clauseSPR) $ filter (\xv -> Sig.formulaSPR xv == name) clrel
7c99e334446bb97120e30e967baeeddfdd1278deKlaus Luettich namesSet = foldl (\yv xv -> Set.insert xv yv) Set.empty thisNames
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder in
7c99e334446bb97120e30e967baeeddfdd1278deKlaus Luettich filter (\xv -> Set.member (AS_Anno.senAttr xv) namesSet) frms
b49276c9f50038e0bd499ad49f7bd6444566a834Christian Maeder
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder-- | determine all names for clauses that occur
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian MaederdetermineClauseNames :: Sig.SPSettingBody -> Set.Set String
33d042fe6a9eb27a4c48f840b80838f3e7d98e34Christian MaederdetermineClauseNames xs =
b10267ae0a6523b73113fc2dee9ea628266fce60Christian Maeder foldl (\yv xv -> Set.insert (Sig.formulaSPR xv) yv) Set.empty
fa21fba9ceb1ddf7b3efd54731a12ed8750191d8Christian Maeder (
fa21fba9ceb1ddf7b3efd54731a12ed8750191d8Christian Maeder (\xy -> case xy of
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder Sig.SPClauseRelation cls -> cls
7c99e334446bb97120e30e967baeeddfdd1278deKlaus Luettich _ -> error "Wrong type"
ed9207cf24e96b0d6f59985822054ae28cb69b2eChristian Maeder )
fa21fba9ceb1ddf7b3efd54731a12ed8750191d8Christian Maeder xs
b49276c9f50038e0bd499ad49f7bd6444566a834Christian Maeder )
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
b49276c9f50038e0bd499ad49f7bd6444566a834Christian Maeder-- | Translation of named clauses
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaedertranslateSPClause :: Sig.SPClauseType -- Clause Type is needed
b905126bab9454b89041f92b3c50bb9efc85e427Klaus Luettich -> Sig.SPClause
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder -> Result.Result (AS_Anno.Named PBasic.FORMULA)
9e748851c150e1022fb952bab3315e869aaf0214Christian MaedertranslateSPClause ct nspc = do
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder cla' <- case AS_Anno.sentence nspc of
5c69cef4668bbd959d721668313a779126014d1eKlaus Luettich Sig.SimpleClause sc -> return sc
b905126bab9454b89041f92b3c50bb9efc85e427Klaus Luettich Sig.QuanClause _ sc -> return sc
08e5741dd8b6bf9b7419e89298e384e18bc57f64Christian Maeder Sig.BriefClause _ (Sig.TWL l1 _) (Sig.TWL l2 _) -> do
08e5741dd8b6bf9b7419e89298e384e18bc57f64Christian Maeder s1 <- mapM Sig.toLiteral l1
53818ced114da21321063fff307aa41c1ab31dd3Achim Mahnke s2 <- mapM Sig.toLiteral l2
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder let s3 = map (\ (Sig.SPLiteral b s) -> Sig.SPLiteral (not b) s) s2
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder return $ Sig.NSPClauseBody Sig.SPCNF $ s1 ++ s3
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder transL <- translateNSPClause ct cla'
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder return nspc { AS_Anno.sentence = transL }
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder-- | the simple translation of Literals
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaedertranslateLiteral :: Sig.SPLiteral -> PBasic.FORMULA
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaedertranslateLiteral (Sig.SPLiteral b l) =
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder (if b then id else flip PBasic.Negation Id.nullRange)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder $ case l of
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder Sig.SPTrue -> PBasic.True_atom Id.nullRange
b905126bab9454b89041f92b3c50bb9efc85e427Klaus Luettich Sig.SPFalse -> PBasic.False_atom Id.nullRange
b905126bab9454b89041f92b3c50bb9efc85e427Klaus Luettich Sig.SPCustomSymbol idF -> PBasic.Predication idF
b905126bab9454b89041f92b3c50bb9efc85e427Klaus Luettich _ -> PBasic.Predication $ Id.mkSimpleId $ Sig.showSPSymbol l
b905126bab9454b89041f92b3c50bb9efc85e427Klaus Luettich
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder-- | translation of clauses
33d042fe6a9eb27a4c48f840b80838f3e7d98e34Christian MaedertranslateNSPClause :: Sig.SPClauseType -> Sig.NSPClauseBody
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder -> Result.Result PBasic.FORMULA
dbe752ee940baae7f9f231f29c62284bb0f90a25Christian MaedertranslateNSPClause ct frm =
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder case frm of
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder Sig.NSPClauseBody ct2 lits | ct == ct2 ->
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder Result.maybeToResult Id.nullRange "All fine" $ Just $ case lits of
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder [hd] -> translateLiteral hd
ef67402074be14deb95e4ff564737d5593144130Klaus Luettich _ -> (case ct of
dbe752ee940baae7f9f231f29c62284bb0f90a25Christian Maeder Sig.SPCNF -> PBasic.Disjunction
ef67402074be14deb95e4ff564737d5593144130Klaus Luettich Sig.SPDNF -> PBasic.Conjunction)
5958fabb264ec3f5b2125ac5602121bd34814a79Klaus Luettich (map translateLiteral lits) Id.nullRange
c9e197862d9d8ef2585270dd08f5194b3aed4a9dKlaus Luettich _ -> Result.fatal_error "Translation impossible" Id.nullRange
e7e1ab2ac3f1fded8611bb92ae00e8f3b8c693fbKlaus Luettich
ef67402074be14deb95e4ff564737d5593144130Klaus LuettichtranslateClauseList :: Sig.SPClauseList -> Sig.SPSettingBody -> Result.Result [AS_Anno.Named PBasic.FORMULA]
1323eba62fc519b068f5aaec4f9d2be05ffabea9Klaus LuettichtranslateClauseList clist inSetting =
a80c28bb8b7a23ccdf7e08d0fe216fc19cc97273Klaus Luettich let
d784803f9c752667b4fcf7393d698002bedf3f89Klaus Luettich clauseType = Sig.clauseType clist
1323eba62fc519b068f5aaec4f9d2be05ffabea9Klaus Luettich clauses = Sig.clauses clist
1323eba62fc519b068f5aaec4f9d2be05ffabea9Klaus Luettich tclauses = map (translateSPClause clauseType) clauses
725a68ec81cba9b8aa8647bebfb5baa449803e7eKlaus Luettich nclauses = map (Result.maybeResult) tclauses
d579f5b263e6c73d466c265f2fbfd45b0e69ca64Klaus Luettich hasErrors = foldl (\xh yh -> xh && (Result.hasErrors $ Result.diags yh)) True tclauses
33d042fe6a9eb27a4c48f840b80838f3e7d98e34Christian Maeder in
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder case hasErrors of
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder True ->
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder if clauses == []
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder then
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder do
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder Result.maybeToResult Id.nullRange "All fine" $ Just $
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettich joinClause clauseType inSetting []
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettich else
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder Result.fatal_error ("Cannot translate clause list" ++ show clist) Id.nullRange
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder False -> let theClauses =
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettich map (\xv -> case xv of
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder Just yv -> yv
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder _ -> error "Bailing out in translateClauseList..."
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder ) nclauses
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder in
340706b6c0c6e3dbacdd7003e20e9cab7f9aa765Christian Maeder do
e94af996596c87e8d835094ea6a186e69bf9c489Christian Maeder Result.maybeToResult Id.nullRange "All fine" $ Just $
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder joinClause clauseType inSetting theClauses
340706b6c0c6e3dbacdd7003e20e9cab7f9aa765Christian Maeder
fdb2d618144159395f7bf8ce3327b3c112a17dd3Till Mossakowski
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder-- | Translation of the logical part of SPASS to Propositional
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian MaedertranslateLogicalPart :: Sig.SPLogicalPart -> Sig.SPSettingBody -> IO [AS_Anno.Named PBasic.FORMULA]
9e748851c150e1022fb952bab3315e869aaf0214Christian MaedertranslateLogicalPart spLog inSetting =
9c3edf2b283c09d33b2820696886d1ed32fcadc8Christian Maeder let
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder clauseLists = filterSPCL $ Sig.clauseLists spLog
c22d75ec3ea1306219d1c09a5b3e8ff04f753ad6Christian Maeder outLists = map (\xv -> translateClauseList xv inSetting) clauseLists
9c3edf2b283c09d33b2820696886d1ed32fcadc8Christian Maeder outForm = map (Result.maybeResult) outLists
c22d75ec3ea1306219d1c09a5b3e8ff04f753ad6Christian Maeder hasErrors = foldl (\xh yh -> xh && (Result.hasErrors $ Result.diags yh)) True outLists
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder in
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder if clauseLists == []
3c09fa452664b01b1f5559f9ca8cc2ddd910688aChristian Maeder then
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder return []
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder else
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder case hasErrors of
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder True -> fail ("Cannot translate logical part" ++ show spLog)
94d3aa05411444596b44ede4531f05dd7ac20fdfChristian Maeder False ->
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder let theFormulae = concat $
8410667510a76409aca9bb24ff0eda0420088274Christian Maeder map (\xv -> case xv of
ddc9315cc0b1f5dd3d8f99a77f1c75064db33b48Christian Maeder Just yv -> yv
ddc9315cc0b1f5dd3d8f99a77f1c75064db33b48Christian Maeder _ -> error "Bailing out in translateLogicalPart..."
5d522dff4d0fabf57dd476d4c3de15d354a89f62Christian Maeder ) outForm
5d522dff4d0fabf57dd476d4c3de15d354a89f62Christian Maeder in
5d522dff4d0fabf57dd476d4c3de15d354a89f62Christian Maeder do
8410667510a76409aca9bb24ff0eda0420088274Christian Maeder return theFormulae
8410667510a76409aca9bb24ff0eda0420088274Christian Maeder
8410667510a76409aca9bb24ff0eda0420088274Christian Maeder-- | Determines the output signature
ac43fa22d2d3f91a17674ac164cba3cf39a17795Klaus LuettichgetOutputSign :: Sig.SPSymbolList -> PSign.Sign
ac43fa22d2d3f91a17674ac164cba3cf39a17795Klaus LuettichgetOutputSign inList =
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers let
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder preds = Sig.predicates inList
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers in
42aacf1f63419cbab63a88725e6a0b2c8776f101Christian Maeder PSign.emptySig
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder {
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder PSign.items =
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder foldl (\ xv yv -> Set.insert yv xv) Set.empty $
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder map translateSymbol preds
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder }
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder
61fa0ac06ede811c7aad54ec4c4202346727368eChristian MaedertranslateSymbol :: Sig.SPSignSym -> Id.Id
61fa0ac06ede811c7aad54ec4c4202346727368eChristian MaedertranslateSymbol inSym = case inSym of
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder Sig.SPSignSym name _ -> Id.simpleIdToId name
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder Sig.SPSimpleSignSym name -> Id.simpleIdToId name
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder-- | Translation of a SPASS Problem to propositional
61fa0ac06ede811c7aad54ec4c4202346727368eChristian MaedertranslateProblem :: Sig.SPProblem -> IO [AS_Anno.Named PBasic.FORMULA]
61fa0ac06ede811c7aad54ec4c4202346727368eChristian MaedertranslateProblem spProb =
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder let
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder logicalPart = Sig.logicalPart spProb
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder setting = head $ Sig.settings spProb
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder in
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder -- data of setting of list_of_setting is changed, see
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers -- SoftFOL/Sign.hs
afa6ceaf4359ae437aaa6830949583143ace2752Christian Maeder case setting of
afa6ceaf4359ae437aaa6830949583143ace2752Christian Maeder Sig.SPSettings _ sb ->
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder translateLogicalPart logicalPart (head sb)
afa6ceaf4359ae437aaa6830949583143ace2752Christian Maeder _ -> error "clause formula relation is not set."
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers-- | Translation of Propositional theories to CNF
9e748851c150e1022fb952bab3315e869aaf0214Christian MaedertranslateToCNF :: (PSign.Sign, [AS_Anno.Named PBasic.FORMULA])
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder -> IO (PSign.Sign, [AS_Anno.Named PBasic.FORMULA])
9e748851c150e1022fb952bab3315e869aaf0214Christian MaedertranslateToCNF (sig, forms) =
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder case forms of
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder [] -> return (sig, [])
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers _ ->
ba0ec5e897ef99d420c8c14c2374e0f32b7043dbKlaus Luettich let pState = createInitProverState sig forms
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder in
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers do
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder outProb <- runSPASSandParseDFG pState safeDFGFiles
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder let
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder mSymList = Sig.symbolList $ Sig.logicalPart outProb
a80c28bb8b7a23ccdf7e08d0fe216fc19cc97273Klaus Luettich outSymList =
a80c28bb8b7a23ccdf7e08d0fe216fc19cc97273Klaus Luettich case mSymList of
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder Just xsym -> getOutputSign xsym
a80c28bb8b7a23ccdf7e08d0fe216fc19cc97273Klaus Luettich _ -> sig
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder re <- translateProblem outProb
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder return $ (outSymList, restoreContext forms re)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
b9625461755578f3eed04676d42a63fd2caebd0cChristian Maeder-- | Filtering of empty ClauseLists
b9625461755578f3eed04676d42a63fd2caebd0cChristian MaederemptySPCL :: Sig.SPClauseList -> Bool
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederemptySPCL clist =
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers let
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder clauses = Sig.clauses clist
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder in
d67a33b40578beef2e255a274f89bb9c34aaf056Christian Maeder clauses == []
8b4c68db8b465107cabef8b9cd5b6bc216e1b156Till Mossakowski
d67a33b40578beef2e255a274f89bb9c34aaf056Christian MaederfilterSPCL :: [Sig.SPClauseList] -> [Sig.SPClauseList]
23ab8855c58adfbd03a0730584b917b24c603901Christian MaederfilterSPCL clist = filter (\xv -> not $ emptySPCL xv) clist
26f228bf3a3fea810223396e5794c217a79a8d5bChristian Maeder