memoing of forked proofs;
authorwenzelm
Sat, 26 Nov 2011 14:14:51 +0100
changeset 45643 9e49cfe7015d
parent 45642 65e4eeea09cd
child 45644 8634b4e61b88
memoing of forked proofs;
src/Pure/global_theory.ML
--- a/src/Pure/global_theory.ML	Sat Nov 26 13:10:12 2011 +0100
+++ b/src/Pure/global_theory.ML	Sat Nov 26 14:14:51 2011 +0100
@@ -49,12 +49,22 @@
 
 (** theory data **)
 
+type proofs = thm list * unit lazy;
+
+val empty_proofs: proofs = ([], Lazy.value ());
+
+fun add_proofs more_thms ((thms, _): proofs) =
+  let val thms' = fold cons more_thms thms
+  in (thms', Lazy.lazy (fn () => Thm.join_proofs (rev thms'))) end;
+
+fun force_proofs ((_, prfs): proofs) = Lazy.force prfs;
+
 structure Data = Theory_Data
 (
-  type T = Facts.T * (thm list * thm list);
-  val empty = (Facts.empty, ([], []));
-  fun extend (facts, _) = (facts, ([], []));
-  fun merge ((facts1, _), (facts2, _)) = (Facts.merge (facts1, facts2), ([], []));
+  type T = Facts.T * (proofs * proofs);
+  val empty = (Facts.empty, (empty_proofs, empty_proofs));
+  fun extend (facts, _) = (facts, snd empty);
+  fun merge ((facts1, _), (facts2, _)) = (Facts.merge (facts1, facts2), snd empty);
 );
 
 
@@ -68,13 +78,13 @@
 fun hide_fact fully name = Data.map (apfst (Facts.hide fully name));
 
 
-(* proofs *)
+(* forked proofs *)
 
-fun register_proofs (thy, thms) = (Data.map (apsnd (pairself (append thms))) thy, thms);
+fun register_proofs (thy, thms) = (Data.map (apsnd (pairself (add_proofs thms))) thy, thms);
 
-val begin_recent_proofs = Data.map (apsnd (fn (_, thms) => ([], thms)));
-val join_recent_proofs = Thm.join_proofs o rev o #1 o #2 o Data.get;
-val join_proofs = Thm.join_proofs o rev o #2 o #2 o Data.get;
+val begin_recent_proofs = Data.map (apsnd (apfst (K empty_proofs)));
+val join_recent_proofs = force_proofs o #1 o #2 o Data.get;
+val join_proofs = force_proofs o #2 o #2 o Data.get;
 
 
 (** retrieve theorems **)