Proofs.hs revision 797595aad6dfd626bc1c9df52616f1ac4235c669
bbae6e6ca0de7f2ffbb44d2c8da179f2b717237fChristian Maeder{-# OPTIONS -cpp #-}
97018cf5fa25b494adffd7e9b4e87320dae6bf47Christian MaederModule : $Header$
bbae6e6ca0de7f2ffbb44d2c8da179f2b717237fChristian MaederCopyright : (c) Jorina F. Gerken, Till Mossakowski, Uni Bremen 2002-2004
3f69b6948966979163bdfe8331c38833d5d90ecdChristian MaederLicence : similar to LGPL, see HetCATS/LICENCE.txt or LIZENZ.txt
fbb66ee3e170624835b99f7aa91980753cb5b472Christian MaederMaintainer : jfgerken@tzi.de
f3a94a197960e548ecd6520bb768cb0d547457bbChristian MaederStability : provisional
bbae6e6ca0de7f2ffbb44d2c8da179f2b717237fChristian MaederPortability : non-portable(Logic)
bbae6e6ca0de7f2ffbb44d2c8da179f2b717237fChristian Maeder Proofs in development graphs.
0ea85310d2beb8aa03cac481ad2a6564e6b8ddbcChristian Maeder Follows Sect. IV:4.4 of the CASL Reference Manual.
0ea85310d2beb8aa03cac481ad2a6564e6b8ddbcChristian Maeder T. Mossakowski, S. Autexier and D. Hutter:
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder Extending Development Graphs With Hiding.
722e8a91f69209ba0e99bf799c4989801d78cf16Christian Maeder H. Hussmann (ed.): Fundamental Approaches to Software Engineering 2001,
0ea85310d2beb8aa03cac481ad2a6564e6b8ddbcChristian Maeder Lecture Notes in Computer Science 2029, p. 269-283,
bbae6e6ca0de7f2ffbb44d2c8da179f2b717237fChristian Maeder Springer-Verlag 2001.
bbae6e6ca0de7f2ffbb44d2c8da179f2b717237fChristian Maedertodo in general:
5e26bfc8d7b18cf3a3fa7b919b4450fb669f37a5Christian MaederOrder of rule application: try to use local links induced by %implies
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maederfor subsumption proofs (such that the %implied formulas need not be
72b9099aeec0762bae4546db3bc4b48721027bf4Christian MaederIntegrate stuff from Saarbr�cken
72b9099aeec0762bae4546db3bc4b48721027bf4Christian MaederAdd proof status information
bbae6e6ca0de7f2ffbb44d2c8da179f2b717237fChristian Maeder what should be in proof status:
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder- proofs of thm links according to rules
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder- cons, def and mono annos, and their proofs
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maedertodo for Jorina:
62ecb1e7f8fd9573eea8369657de12c7bf9f4f25Christian Maeder - bei GlobDecomp hinzuf�gen:
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder zus�tzlich alle Pfade K<--theta-- M --sigma-->N in den aktuellen
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder Knoten N, die mit einem HidingDef anfangen, und danach nur GlobalDef
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder theta ist der Signaturmorphismus des HidingDef's (geht "falsch rum")
42c01284bba8d7c8d995c8dfb96ace57d28ed1bcTill Mossakowski sigma ist die Komposition der Signaturmorphismen auf dem restl. Pfad
2bf209888545860dc77b9c3f2198d00eeab30d20Christian Maeder f�r jeden solchen Pfad: einen HidingThm theta einf�gen. sigma ist
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder der normale Morphismus (wie bei jedem anderen Link)
715ffaf874309df081d1e1cd8e05073fc1227729Christian Maeder siehe auch Seite 302 des CASL Reference Manual
2bf209888545860dc77b9c3f2198d00eeab30d20Christian Maederimport Options
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maederimport Common.Lib.Set (fromList)
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maederimport qualified Common.Lib.Map as Map
60303deac79adb97a71e55a4d66f95f26688f05aChristian Maeder#ifdef UNI_PACKAGE
60303deac79adb97a71e55a4d66f95f26688f05aChristian Maeder proof status = (DG0,[(R1,DG1),...,(Rn,DGn)])
ccf3de3d66b521a260e5c22d335c64a48e3f0195Christian Maeder DG0 is the development graph resulting from the static analysis
2a598ff0c1b7b51c33aee7029b43bc5cfcbea6b8Christian Maeder Ri is a list of rules that transforms DGi-1 to DGi
60303deac79adb97a71e55a4d66f95f26688f05aChristian Maeder With the list of intermediate proof states, one can easily implement
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder an undo operation
bdce0d5f7e435df37670d3720929d97ab0043b6bChristian Maedertype ProofStatus = (GlobalContext,LibEnv,[([DGRule],[DGChange])],DGraph)
961fc5d08256957f68f245f2723085ced14a0a1fChristian Maeder TheoremHideShift
60303deac79adb97a71e55a4d66f95f26688f05aChristian Maeder | HideTheoremShift
bdce0d5f7e435df37670d3720929d97ab0043b6bChristian Maeder | Composition
bdce0d5f7e435df37670d3720929d97ab0043b6bChristian Maeder | GlobDecomp (LEdge DGLinkLab) -- edge in the conclusion
bdce0d5f7e435df37670d3720929d97ab0043b6bChristian Maeder | LocDecomp (LEdge DGLinkLab)
bdce0d5f7e435df37670d3720929d97ab0043b6bChristian Maeder | LocSubsumption (LEdge DGLinkLab)
bdce0d5f7e435df37670d3720929d97ab0043b6bChristian Maeder | GlobSubsumption (LEdge DGLinkLab)
bdce0d5f7e435df37670d3720929d97ab0043b6bChristian Maeder | LocalInference
bdce0d5f7e435df37670d3720929d97ab0043b6bChristian Maeder | BasicInferendge BasicProof
bdce0d5f7e435df37670d3720929d97ab0043b6bChristian Maeder | BasicConsInference Edge BasicConsProof
df2a122c5ecd7d995323c3f0754e1a2a4e3dc0a8Christian Maeder deriving (Eq, Show)
bdce0d5f7e435df37670d3720929d97ab0043b6bChristian Maederdata DGChange = InsertNode (LNode DGNodeLab)
0ea85310d2beb8aa03cac481ad2a6564e6b8ddbcChristian Maeder | DeleteNode (LNode DGNodeLab)
bdce0d5f7e435df37670d3720929d97ab0043b6bChristian Maeder | InsertEdge (LEdge DGLinkLab)
bdce0d5f7e435df37670d3720929d97ab0043b6bChristian Maeder | DeleteEdge (LEdge DGLinkLab)
715ffaf874309df081d1e1cd8e05073fc1227729Christian Maeder deriving (Eq,Show)
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maederdata BasicProof =
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder forall lid sublogics
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder basic_spec sentence symb_items symb_map_items
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder sign morphism symbol raw_symbol proof_tree .
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder Logic lid sublogics
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder basic_spec sentence symb_items symb_map_items
836e72a3c413366ba9801726f3b249c7791cb9caChristian Maeder sign morphism symbol raw_symbol proof_tree =>
836e72a3c413366ba9801726f3b249c7791cb9caChristian Maeder BasicProof lid (Proof_status proof_tree)
2bf209888545860dc77b9c3f2198d00eeab30d20Christian Maeder | Conjectured
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder | Handwritten
5964438458028e61fdabfa74ca3b4210206cdba6Christian Maederinstance Eq BasicProof where
5964438458028e61fdabfa74ca3b4210206cdba6Christian Maeder Guessed == Guessed = True
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder Conjectured == Conjectured = True
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder Handwritten == Handwritten = True
5e26bfc8d7b18cf3a3fa7b919b4450fb669f37a5Christian Maeder BasicProof lid1 p1 == BasicProof lid2 p2 =
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder coerce lid1 lid2 p1 == Just p2
5e26bfc8d7b18cf3a3fa7b919b4450fb669f37a5Christian Maederinstance Show BasicProof where
bbae6e6ca0de7f2ffbb44d2c8da179f2b717237fChristian Maeder show (BasicProof lid1 p1) = show p1
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder show Guessed = "Guessed"
2bf209888545860dc77b9c3f2198d00eeab30d20Christian Maeder show Conjectured = "Conjectured"
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder show Handwritten = "Handwritten"
d48085f765fca838c1d972d2123601997174583dChristian Maederdata BasicConsProof = BasicConsProof -- more detail to be added ...
797f811e57952d59e73b8cd03b667eef276db972Christian Maeder deriving (Eq, Show)
f6fc70956d64365527d77a521a96f54a1cc18f91Christian Maeder{- todo: implement apply for GlobDecomp and Subsumption
f6fc70956d64365527d77a521a96f54a1cc18f91Christian Maeder the list of DGChage must be constructed in parallel to the
f6fc70956d64365527d77a521a96f54a1cc18f91Christian Maeder new DGraph -}
f6fc70956d64365527d77a521a96f54a1cc18f91Christian MaederapplyRule :: DGRule -> DGraph -> Maybe ([DGChange],DGraph)
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian MaederapplyRule = error "Proofs.hs:applyRule"
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maederautomatic :: ProofStatus -> ProofStatus
3daa82a175c7cfabf22455aa77c4beda327404e4Christian Maederautomatic proofStatus =
f6fc70956d64365527d77a521a96f54a1cc18f91Christian Maeder (globalContext, libEnv, newHistory, dgraph)
3daa82a175c7cfabf22455aa77c4beda327404e4Christian Maeder (globalContext, libEnv, history, dgraph)
3daa82a175c7cfabf22455aa77c4beda327404e4Christian Maeder = automaticAux proofStatus
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder (newHistoryPart, oldHistory) = splitAt 4 history
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder (rules, changes) = concatHistoryElems (reverse newHistoryPart)
5e26bfc8d7b18cf3a3fa7b919b4450fb669f37a5Christian Maeder newHistoryElem = (rules, removeContraryChanges changes)
bbae6e6ca0de7f2ffbb44d2c8da179f2b717237fChristian Maeder newHistory = newHistoryElem:oldHistory
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian MaederremoveContraryChanges :: [DGChange] -> [DGChange]
149e43c4a2705a86a0e5fa301ba849fdf19db32eChristian MaederremoveContraryChanges [] = []
2bf209888545860dc77b9c3f2198d00eeab30d20Christian MaederremoveContraryChanges (change:changes) =
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder if elem contraryChange changes
bdce0d5f7e435df37670d3720929d97ab0043b6bChristian Maeder then removeContraryChanges (removeChange contraryChange changes)
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder else change:(removeContraryChanges changes)
2bf209888545860dc77b9c3f2198d00eeab30d20Christian Maeder contraryChange = getContraryChange change
304c84f22dd78f7979efd81b8fc38c8d2197ed39Christian MaedergetContraryChange :: DGChange -> DGChange
304c84f22dd78f7979efd81b8fc38c8d2197ed39Christian MaedergetContraryChange change =
304c84f22dd78f7979efd81b8fc38c8d2197ed39Christian Maeder case change of
304c84f22dd78f7979efd81b8fc38c8d2197ed39Christian Maeder InsertEdge edge -> DeleteEdge edge
304c84f22dd78f7979efd81b8fc38c8d2197ed39Christian Maeder DeleteEdge edge -> InsertEdge edge
1d589334ba6b4a4cbfb35307a7a732261e77b0cdChristian Maeder InsertNode node -> DeleteNode node
7de39d39bc1700cc8a9bb9df90b920aad9e18d4aChristian Maeder DeleteNode node -> InsertNode node
e215ca0377dc79c9bcfb105157ecc4b958bec67bChristian MaederremoveChange :: DGChange -> [DGChange] -> [DGChange]
e215ca0377dc79c9bcfb105157ecc4b958bec67bChristian MaederremoveChange change changes =
e215ca0377dc79c9bcfb105157ecc4b958bec67bChristian Maeder (takeWhile (change /=) changes)
1d589334ba6b4a4cbfb35307a7a732261e77b0cdChristian Maeder ++(tail (dropWhile (change /=) changes))
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian MaederautomaticAux :: ProofStatus -> ProofStatus
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian MaederautomaticAux = locDecomp.locSubsume.globDecomp.globSubsume
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian MaederconcatHistoryElems :: [([DGRule],[DGChange])] -> ([DGRule],[DGChange])
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian MaederconcatHistoryElems [] = ([],[])
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian MaederconcatHistoryElems ((rules,changes):elems) =
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder (rules++(fst (concatHistoryElems elems)),changes++(snd (concatHistoryElems elems)))
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder-- ---------------------
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder-- global decomposition
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder-- ---------------------
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder{- apply rule GlobDecomp to all global theorem links in the current DG
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder current DG = DGm
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder add to proof status the pair ([GlobDecomp e1,...,GlobDecomp en],DGm+1)
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian Maeder where e1...en are the global theorem links in DGm
7de39d39bc1700cc8a9bb9df90b920aad9e18d4aChristian Maeder DGm+1 results from DGm by application of GlobDecomp e1,...,GlobDecomp en -}
7de39d39bc1700cc8a9bb9df90b920aad9e18d4aChristian Maeder{- applies global decomposition to all unproven global theorem edges
2bf209888545860dc77b9c3f2198d00eeab30d20Christian Maeder if possible -}
1d589334ba6b4a4cbfb35307a7a732261e77b0cdChristian MaederglobDecomp :: ProofStatus -> ProofStatus
1d589334ba6b4a4cbfb35307a7a732261e77b0cdChristian MaederglobDecomp proofStatus@(globalContext,libEnv,history,dgraph) =
1d589334ba6b4a4cbfb35307a7a732261e77b0cdChristian Maeder (globalContext, libEnv, ((finalHistoryElem):history), finalDGraph)
bdce0d5f7e435df37670d3720929d97ab0043b6bChristian Maeder globalThmEdges = filter isUnprovenGlobalThm (labEdges dgraph)
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder (newDGraph, newHistoryElem) = globDecompAux dgraph globalThmEdges ([],[])
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder (finalDGraph, finalHistoryElem)
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder = removeSuperfluousInsertions newDGraph newHistoryElem
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder{- removes all superfluous insertions from the list of changes as well as
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder from the development graph (i.e. insertions of edges that are
bdce0d5f7e435df37670d3720929d97ab0043b6bChristian Maeder equivalent to edges or paths resulting from the other insertions) -}
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian MaederremoveSuperfluousInsertions :: DGraph -> ([DGRule],[DGChange])
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder -> (DGraph,([DGRule],[DGChange]))
bdce0d5f7e435df37670d3720929d97ab0043b6bChristian MaederremoveSuperfluousInsertions dgraph (rules,changes)
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder = (newDGraph,(rules,newChanges))
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder localThms = [edge | (InsertEdge edge)
bdce0d5f7e435df37670d3720929d97ab0043b6bChristian Maeder <- filter isLocalThmInsertion changes]
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder (newDGraph, localThmsToInsert)
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder = removeSuperfluousEdges dgraph localThms
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder newChanges = (filter (not.isLocalThmInsertion) changes)
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder ++ [InsertEdge edge | edge <- localThmsToInsert]
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder{- auxiliary function for globDecomp (above)
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder actual implementation -}
d4be42ac0e0c969e95f93bd858e3d14de35cc6aaChristian MaederglobDecompAux :: DGraph -> [LEdge DGLinkLab] -> ([DGRule],[DGChange])
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder -> (DGraph,([DGRule],[DGChange]))
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian MaederglobDecompAux dgraph [] historyElem = (dgraph, historyElem)
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian MaederglobDecompAux dgraph (edge:edges) historyElem =
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder globDecompAux newDGraph edges newHistoryElem
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder (newDGraph, newChanges) = globDecompForOneEdge dgraph edge
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder newHistoryElem = (((GlobDecomp edge):(fst historyElem)),
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder (newChanges++(snd historyElem)))
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder-- applies global decomposition to a single edge
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian MaederglobDecompForOneEdge :: DGraph -> LEdge DGLinkLab -> (DGraph,[DGChange])
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian MaederglobDecompForOneEdge dgraph edge =
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder globDecompForOneEdgeAux dgraph edge [] paths
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder pathsToSource
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder = getAllLocOrHideGlobDefPathsTo dgraph (getSourceNode edge) []
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder paths = [(node, path++(edge:[]))| (node,path) <- pathsToSource]
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder{- auxiliary funktion for globDecompForOneEdge (above)
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder actual implementation -}
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian MaederglobDecompForOneEdgeAux :: DGraph -> LEdge DGLinkLab -> [DGChange] ->
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder [(Node, [LEdge DGLinkLab])] -> (DGraph,[DGChange])
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder{- if the list of paths is empty from the beginning, nothing is done
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian Maeder otherwise the unprovenThm edge is replaced by a proven one -}
66b0bf1e3102c83f5728cf6cfecbd07444276a5fChristian MaederglobDecompForOneEdgeAux dgraph edge@(source,target,edgeLab) changes [] =
dgl_type = (HidingThm (dgl_morphism (getLabelOfEdge (head path))) (Static.DevGraph.Open)),
dgl_type = (LocalThm (Static.DevGraph.Open)
None (Static.DevGraph.Open)),
"("++(show src)++", "++(show tgt)++", dgl_type=<<"++(show (dgl_type label))++">>\ndgl_origin=<<"++(show (dgl_origin label))++">>\ndgl_morphism=<<"++(show (dgl_morphism label))++">>)\n\n"++(printEdges edges)
then case Map.lookup (dgn_libname nodeLab) libEnv of
then case Map.lookup (dgn_libname nodeLab) libEnv of
{- removes all paths from the given list of paths whose morphism does not translate the given sentence list to the same resulting sentence list as the given morphism-}
{- checks if the given morphism and the morphism of the given path translate the given sentence list to the same resulting sentence list -}
case (maybeResult (computeTheory libEnv dgraph target), maybeResult (translateG_theory morphism thSrc)) of
{- if the given node is a DGRef, the referenced node is returned (as a labeled node). Otherwise the node itself is returned (as a labeled node).-}
if isDGRef nodeLab then case Map.lookup (dgn_libname nodeLab) libEnv of
getAllGlobDefPathsBeginningWithTypesTo :: [LEdge DGLinkLab -> Bool] -> DGraph -> Node -> [LEdge DGLinkLab]
(GlobalThm Static.DevGraph.Open _ _) -> True
(LocalThm (Static.DevGraph.Open) _ _) -> True
case Map.lookup (dgn_libname nodeLab) libEnv of
else if src == tgt && (dgl_morphism edgeLab) == (ide Grothendieck (dgn_sign nodeLab)) then True else False
if this fails the same is done for the rest of the given paths, i.e.
i.e. the list of all DGLinkLabs the proofs of the edges contained in the path
(i.e. every edge that has as its source node the tgt node of the path)-}
(i.e. every edge that has as its source node the tgt node of the path)-}
equivalent edge or path (i.e. an edge or path with the same src, tgt and
(map (show.snd) provers)
_ -> resToIORes $ fatal_error "Proofs.Proofs: selection" nullPos