use_thys: perform consolidate_thy on loaded theories, which removes failed nodes in post-hoc fashion;
authorwenzelm
Sat, 10 Jan 2009 00:25:31 +0100
changeset 29421 db532e37cda2
parent 29420 b28bf19d7ab9
child 29422 fdf396a24a9f
use_thys: perform consolidate_thy on loaded theories, which removes failed nodes in post-hoc fashion;
src/Pure/Thy/thy_info.ML
--- a/src/Pure/Thy/thy_info.ML	Sat Jan 10 00:24:07 2009 +0100
+++ b/src/Pure/Thy/thy_info.ML	Sat Jan 10 00:25:31 2009 +0100
@@ -1,5 +1,4 @@
 (*  Title:      Pure/Thy/thy_info.ML
-    ID:         $Id$
     Author:     Markus Wenzel, TU Muenchen
 
 Main part of theory loader database, including handling of theory and
@@ -24,6 +23,8 @@
   val get_parents: string -> string list
   val touch_thy: string -> unit
   val touch_child_thys: string -> unit
+  val remove_thy: string -> unit
+  val kill_thy: string -> unit
   val provide_file: Path.T -> string -> unit
   val load_file: bool -> Path.T -> unit
   val exec_file: bool -> Path.T -> Context.generic -> Context.generic
@@ -32,8 +33,6 @@
   val use_thys: string list -> unit
   val use_thy: string -> unit
   val time_use_thy: string -> unit
-  val remove_thy: string -> unit
-  val kill_thy: string -> unit
   val thy_ord: theory * theory -> order
   val begin_theory: string -> string list -> (Path.T * bool) list -> bool -> theory
   val end_theory: theory -> unit
@@ -232,6 +231,27 @@
 end;
 
 
+(* remove theory *)
+
+fun remove_thy name =
+  if is_finished name then error (loader_msg "cannot remove finished theory" [name])
+  else
+    let val succs = thy_graph Graph.all_succs [name] in
+      priority (loader_msg "removing" succs);
+      CRITICAL (fn () => (List.app (perform Remove) succs; change_thys (Graph.del_nodes succs)))
+    end;
+
+val kill_thy = if_known_thy remove_thy;
+
+fun consolidate_thy name =
+  (case lookup_theory name of
+    NONE => []
+  | SOME thy =>
+      (case PureThy.join_proofs thy of
+        [] => []
+      | exns => (kill_thy name; exns)));
+
+
 (* load_file *)
 
 local
@@ -342,7 +362,7 @@
       in (x, Symtab.update (name, x) tab) end;
 
     val thy_results = Future.join_results (#1 (fold_map future tasks Symtab.empty));
-    val proof_results = PureThy.join_proofs (map_filter (try get_theory o #1) tasks);
+    val proof_results = map Exn.Exn (maps (consolidate_thy o #1) tasks);
   in ignore (Exn.release_all (thy_results @ proof_results)) end;
 
 in
@@ -464,19 +484,6 @@
 end;
 
 
-(* remove theory *)
-
-fun remove_thy name =
-  if is_finished name then error (loader_msg "cannot remove finished theory" [name])
-  else
-    let val succs = thy_graph Graph.all_succs [name] in
-      priority (loader_msg "removing" succs);
-      CRITICAL (fn () => (List.app (perform Remove) succs; change_thys (Graph.del_nodes succs)))
-    end;
-
-val kill_thy = if_known_thy remove_thy;
-
-
 (* update_time *)
 
 structure UpdateTime = TheoryDataFun