Prover.hs revision 74e513dd8ebc883d314d63ff3ca8eae52e5d0921
7abd0c58a5ce51db13f93de82407b2188d55d298Christian MaederModule : $Header$
2dc26996d32244796c48c71fe44413c8ebf8bbc9Christian MaederDescription : General datastructures for theorem prover interfaces
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian MaederCopyright : (c) Till Mossakowski, Klaus Luettich, Uni Bremen 2002-2005
97018cf5fa25b494adffd7e9b4e87320dae6bf47Christian MaederLicense : similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
7abd0c58a5ce51db13f93de82407b2188d55d298Christian MaederMaintainer : till@informatik.uni-bremen.de
3f69b6948966979163bdfe8331c38833d5d90ecdChristian MaederStability : provisional
7abd0c58a5ce51db13f93de82407b2188d55d298Christian MaederPortability : non-portable (deriving Typeable)
08faa81d4dd8409cd923b334064f64f802ecc33dChristian MaederGeneral datastructures for theorem prover interfaces
e8ffec0fa3d3061061bdc16e44247b9cf96b050fChristian Maederimport qualified Common.OrderedMap as OMap
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maederimport qualified Data.Map as Map
23a00c966f2aa8da525d7a7c51933c99964426c0Christian Maederimport Data.Time (TimeOfDay, midnight)
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maederimport qualified Control.Concurrent as Concurrent
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder-- * pack sentences with their proofs
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder{- | instead of the sentence name (that will be the key into the order map)
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maederthe theorem status will be stored as attribute. The theorem status will be a
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder(wrapped) list of pairs (AnyComorphism, BasicProof) in G_theory, but a wrapped
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maederlist of (ProofStatus proof_tree) in a logic specific 'Theory'. -}
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maedertype SenStatus a tStatus = SenAttr a (ThmStatus tStatus)
81946e2b3f6dde6167f48769bd02c7a634736856Christian MaederthmStatus :: SenStatus a tStatus -> [tStatus]
81946e2b3f6dde6167f48769bd02c7a634736856Christian MaederthmStatus = getThmStatus . senAttr
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder-- | the wrapped list of proof scripts or (AnyComorphism, BasicProof) pairs
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maederdata ThmStatus a = ThmStatus { getThmStatus :: [a] } deriving (Show, Eq, Ord)
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maederinstance (Show b, Pretty a) => Pretty (SenAttr a b) where
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder pretty = printSenStatus pretty
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian MaederprintSenStatus :: (a -> Doc) -> SenAttr a b -> Doc
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian MaederprintSenStatus = (. sentence)
35597678f1c9da703de8d0b6b66ea63247ebe884Christian MaederemptySenStatus :: SenStatus a b
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian MaederemptySenStatus = makeNamed (ThmStatus []) $ error "emptySenStatus"
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian Maederinstance Pretty a => Pretty (OMap.ElemWOrd a) where
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder pretty = printOMapElemWOrd pretty
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian MaederprintOMapElemWOrd :: (a -> Doc) -> OMap.ElemWOrd a -> Doc
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian MaederprintOMapElemWOrd = (. OMap.ele)
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian Maeder-- | the map from lables to the theorem plus status (and position)
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian Maedertype ThSens a b = OMap.OMap String (SenStatus a b)
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian MaedernoSens :: ThSens a b
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian MaedermapThSensValueM :: Monad m => (a -> m b) -> ThSens a c -> m (ThSens b c)
7feac39f792f587cffdc8b63b0e7c5a7d2de292eChristian MaedermapThSensValueM f = foldM (\ m (k, v) -> do
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder ns <- f $ sentence oe
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian Maeder let ne = oe { sentence = ns }
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian Maeder return $ Map.insert k v { OMap.ele = ne } m) Map.empty . Map.toList
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian MaedermapThSensStatus :: (b -> c) -> ThSens a b -> ThSens a c
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian MaedermapThSensStatus = OMap.map . mapStatus
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder-- | join and disambiguate
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder-- * separate Axioms from Theorems
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder-- * don't merge sentences with same key but different contents?
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian MaederjoinSensAux :: (Ord a, Eq b) => ThSens a b -> ThSens a b
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder -> (ThSens a b, [(String, String)])
81946e2b3f6dde6167f48769bd02c7a634736856Christian MaederjoinSensAux s1 s2 = let
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder updN n (_, e) = (n, e)
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder l2 = map (\ (x, e) -> (x, e {OMap.order = m + OMap.order e }))
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder sl2 = genericDisambigSens m fst updN (OMap.keysSet s1) l2
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder in (Map.fromList $ l1 ++ sl2,
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder zipWith (\ (n1, _) (n2, _) -> (n1, n2)) l2 sl2)
a0e24c863b78669b05797ff8ce635995a9bede44Christian MaederjoinSens :: (Ord a, Eq b) => ThSens a b -> ThSens a b -> ThSens a b
81946e2b3f6dde6167f48769bd02c7a634736856Christian MaederjoinSens s1 = fst . joinSensAux s1
81946e2b3f6dde6167f48769bd02c7a634736856Christian MaederreduceSens :: (Ord a, Eq b) => ThSens a b -> ThSens a b
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian Maeder . groupBy (\ (_, a) (_, b) -> let e = OMap.ele b in
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian Maeder sentence (OMap.ele a) == sentence e && isAxiom e)
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian Maeder . sortBy cmpSnd
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian MaedercmpSnd :: (Ord a1) => (String, OMap.ElemWOrd (SenStatus a1 b))
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian Maeder -> (String, OMap.ElemWOrd (SenStatus a1 b)) -> Ordering
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian MaedercmpSnd (_, a) (_, b) = cmpSenEle a b
32a7cc7177ecf70e35ec831ff86887b9acc40dcaChristian MaedercmpSenEle :: (Ord a1) => OMap.ElemWOrd (SenStatus a1 b)
32a7cc7177ecf70e35ec831ff86887b9acc40dcaChristian Maeder -> OMap.ElemWOrd (SenStatus a1 b) -> Ordering
32a7cc7177ecf70e35ec831ff86887b9acc40dcaChristian MaedercmpSenEle x y = case (OMap.ele x, OMap.ele y) of
32a7cc7177ecf70e35ec831ff86887b9acc40dcaChristian Maeder (d1, d2) -> compare
d5b008ac61f0f3d99f41ad3476f945e2b65bd3c0Christian Maeder (sentence d1, isAxiom d2, isDef d2) (sentence d2, isAxiom d1, isDef d1)
a0e24c863b78669b05797ff8ce635995a9bede44Christian MaedermapValue :: (a -> b) -> SenStatus a c -> SenStatus b c
a0e24c863b78669b05797ff8ce635995a9bede44Christian MaedermapValue f d = d { sentence = f $ sentence d }
36c6cc568751e4235502cfee00ba7b597dae78dcChristian MaedermapStatus :: (b -> c) -> SenStatus a b -> SenStatus a c
a0e24c863b78669b05797ff8ce635995a9bede44Christian MaedermapStatus f d = d { senAttr = ThmStatus $ map f $ thmStatus d }
32a7cc7177ecf70e35ec831ff86887b9acc40dcaChristian Maeder-- | sets the field isAxiom according to the boolean value;
32a7cc7177ecf70e35ec831ff86887b9acc40dcaChristian Maeder-- if isAxiom is False for a sentence and set to True,
32a7cc7177ecf70e35ec831ff86887b9acc40dcaChristian Maeder-- the field wasTheorem is set to True
32a7cc7177ecf70e35ec831ff86887b9acc40dcaChristian MaedermarkAsAxiom :: Ord a => Bool -> ThSens a b -> ThSens a b
a0e24c863b78669b05797ff8ce635995a9bede44Christian MaedermarkAsAxiom b = OMap.map $ \ d -> d
32a7cc7177ecf70e35ec831ff86887b9acc40dcaChristian Maeder { isAxiom = b
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder , wasTheorem = b && (not (isAxiom d) || wasTheorem d) }
36c6cc568751e4235502cfee00ba7b597dae78dcChristian MaedermarkAsGoal :: Ord a => ThSens a b -> ThSens a b
36c6cc568751e4235502cfee00ba7b597dae78dcChristian MaedermarkAsGoal = markAsAxiom False
36c6cc568751e4235502cfee00ba7b597dae78dcChristian MaedertoNamedList :: ThSens a b -> [AS_Anno.Named a]
c18e9c3c6d5039618f1f2c05526ece84c7794ea3Christian MaedertoNamedList = map (uncurry toNamed) . OMap.toList
afa6848d579d235c9677e1ab477916df8e5ae11aChristian MaedertoNamed :: String -> SenStatus a b -> AS_Anno.Named a
afa6848d579d235c9677e1ab477916df8e5ae11aChristian MaedertoNamed k s = s { AS_Anno.senAttr = k }
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder-- | putting Sentences from a list into a map
a0e24c863b78669b05797ff8ce635995a9bede44Christian MaedertoThSens :: Ord a => [AS_Anno.Named a] -> ThSens a b
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder ( \ v -> (AS_Anno.senAttr v, v { senAttr = ThmStatus [] }))
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder . nameAndDisambiguate
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder-- | theories with a signature and sentences with proof states
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maederdata Theory sign sen proof_tree =
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder Theory sign (ThSens sen (ProofStatus proof_tree))
afa6848d579d235c9677e1ab477916df8e5ae11aChristian MaedermapTheoryStatus :: (a -> b) -> Theory sign sentence a
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder -> Theory sign sentence b
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian MaedermapTheoryStatus f (Theory sig thSens) =
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder Theory sig (mapThSensStatus (mapProofStatus f) thSens)
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder-- e.g. the file name, or the script itself, or a configuration string
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maederdata TacticScript = TacticScript String deriving (Eq, Ord, Show)
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder-- | failure reason
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maederdata Reason = Reason [String]
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maederinstance Ord Reason where
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder compare _ _ = EQ
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maederinstance Eq Reason where
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder a == b = compare a b == EQ
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder-- | enumeration type representing the status of a goal
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maederdata GoalStatus =
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder Open Reason -- ^ failure reason
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder | Proved Bool -- ^ Just True means consistent; False inconsistent
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder deriving (Eq, Ord)
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder -- needed for automated theorem provers like SPASS;
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maeder -- provers like Isabelle set it to Nothing
f26a1fc3851297e6483cf3fb56e9c0967b8f8b13Christian Maederinstance Show GoalStatus where
, freeTheory :: [AS_Anno.Named sentence]
-> Concurrent.MVar (Result [ProofStatus proof_tree]) -- 3.