src/Pure/pure_thy.ML
changeset 27198 79e9bf691aed
parent 26959 f8f2df3e4d83
child 27683 add9a605d562
--- a/src/Pure/pure_thy.ML	Fri Jun 13 21:04:44 2008 +0200
+++ b/src/Pure/pure_thy.ML	Sat Jun 14 15:56:52 2008 +0200
@@ -24,16 +24,14 @@
   val kind_internal: attribute
   val has_internal: Markup.property list -> bool
   val is_internal: thm -> bool
+  val facts_of: theory -> Facts.T
   val intern_fact: theory -> xstring -> string
   val defined_fact: theory -> string -> bool
+  val hide_fact: bool -> string -> theory -> theory
   val get_fact: Context.generic -> theory -> Facts.ref -> thm list
   val get_thms: theory -> xstring -> thm list
   val get_thm: theory -> xstring -> thm
-  val theorems_of: theory -> thm list NameSpace.table
-  val facts_of: theory -> Facts.T
-  val thms_of: theory -> (string * thm) list
   val all_thms_of: theory -> (string * thm) list
-  val hide_fact: bool -> string -> theory -> theory
   val map_facts: ('a -> 'b) -> ('c * ('a list * 'd) list) list -> ('c * ('b list * 'd) list) list
   val burrow_fact: ('a list -> 'b list) -> ('a list * 'c) list -> ('b list * 'c) list
   val burrow_facts: ('a list -> 'b list) ->
@@ -121,98 +119,54 @@
 
 
 
-(*** theorem database ***)
-
-(** dataype theorems **)
+(*** stored facts ***)
 
-datatype thms = Thms of
- {theorems: thm list NameSpace.table,   (* FIXME legacy *)
-  all_facts: Facts.T};
-
-fun make_thms (theorems, all_facts) = Thms {theorems = theorems, all_facts = all_facts};
+(** theory data **)
 
-structure TheoremsData = TheoryDataFun
+structure FactsData = TheoryDataFun
 (
-  type T = thms;
-  val empty = make_thms (NameSpace.empty_table, Facts.empty);
+  type T = Facts.T;
+  val empty = Facts.empty;
   val copy = I;
-  fun extend (Thms {theorems = _, all_facts}) = make_thms (NameSpace.empty_table, all_facts);
-  fun merge _
-     (Thms {theorems = _, all_facts = all_facts1},
-      Thms {theorems = _, all_facts = all_facts2}) =
-    make_thms (NameSpace.empty_table, Facts.merge (all_facts1, all_facts2));
+  val extend = I;
+  fun merge _ = Facts.merge;
 );
 
-fun map_theorems f =
-  TheoremsData.map (fn Thms {theorems, all_facts} => make_thms (f (theorems, all_facts)));
-
-val get_theorems = (fn Thms args => args) o TheoremsData.get;
-val theorems_of = #theorems o get_theorems;
-val facts_of = #all_facts o get_theorems;
+val facts_of = FactsData.get;
 
 val intern_fact = Facts.intern o facts_of;
 val defined_fact = Facts.defined o facts_of;
 
+fun hide_fact fully name = FactsData.map (Facts.hide fully name);
+
 
 
 (** retrieve theorems **)
 
-local
-
-fun lookup_thms thy xname =
-  let
-    val (space, thms) = #theorems (get_theorems thy);
-    val name = NameSpace.intern space xname;
-  in Option.map (pair name) (Symtab.lookup thms name) end;
-
-fun lookup_fact context thy xname =
-  let val name = intern_fact thy xname
-  in Option.map (pair name) (Facts.lookup context (facts_of thy) name) end;
-
-in
-
-fun get_fact context theory xthmref =
+fun get_fact context thy xthmref =
   let
     val xname = Facts.name_of_ref xthmref;
     val pos = Facts.pos_of_ref xthmref;
-    val new_res = lookup_fact context theory xname;
-    val old_res = get_first (fn thy => lookup_thms thy xname) (theory :: Theory.ancestors_of theory);
-    val _ = Theory.check_thy theory;
+
+    val name = intern_fact thy xname;
+    val res = Facts.lookup context (facts_of thy) name;
+    val _ = Theory.check_thy thy;
   in
-    (case (new_res, old_res) of
-      (SOME (_, ths1), SOME (_, ths2)) => Thm.eq_thms (ths1, ths2) orelse
-        error ("Fact lookup differs from old-style thm database:\n" ^
-          fst (the new_res) ^ " vs " ^ fst (the old_res) ^ Position.str_of pos)
-    | _ => true);
-    (case new_res of
-      NONE => error ("Unknown fact " ^ quote xname ^ Position.str_of pos)
-    | SOME (_, ths) => Facts.select xthmref (map (Thm.transfer theory) ths))
+    (case res of
+      NONE => error ("Unknown fact " ^ quote name ^ Position.str_of pos)
+    | SOME ths => Facts.select xthmref (map (Thm.transfer thy) ths))
   end;
 
 fun get_thms thy = get_fact (Context.Theory thy) thy o Facts.named;
 fun get_thm thy name = Facts.the_single name (get_thms thy name);
 
-end;
-
-
-(* thms_of etc. *)
-
-fun thms_of thy =
-  let val thms = #2 (theorems_of thy)
-  in map (`(get_name_hint)) (maps snd (Symtab.dest thms)) end;
-
-fun all_thms_of thy = maps thms_of (thy :: Theory.ancestors_of thy);
+fun all_thms_of thy =
+  Facts.fold_static (fn (_, ths) => append (map (`(get_name_hint)) ths)) (facts_of thy) [];
 
 
 
 (** store theorems **)
 
-(* hide names *)
-
-fun hide_fact fully name =
-  map_theorems (fn (theorems, all_facts) => (theorems, Facts.hide fully name all_facts));
-
-
 (* fact specifications *)
 
 fun map_facts f = map (apsnd (map (apfst (map f))));
@@ -247,12 +201,7 @@
         val name = NameSpace.full naming bname;
         val (thy', thms') = apsnd (post_name name) (app_att (thy, pre_name name thms));
         val thms'' = map (Thm.transfer thy') thms';
-        val thy'' = thy' |> map_theorems (fn ((space, theorems), all_facts) =>
-          let
-            val space' = NameSpace.declare naming name space;
-            val theorems' = Symtab.update (name, thms'') theorems;
-            val all_facts' = Facts.add_global naming (name, thms'') all_facts;
-          in ((space', theorems'), all_facts') end);
+        val thy'' = thy' |> FactsData.map (Facts.add_global naming (name, thms''));
       in (thms'', thy'') end;
 
 
@@ -284,11 +233,8 @@
 (* add_thms_dynamic *)
 
 fun add_thms_dynamic (bname, f) thy =
-  let
-    val name = Sign.full_name thy bname;
-    val thy' = thy |> map_theorems (fn (theorems, all_facts) =>
-      (theorems, Facts.add_dynamic (Sign.naming_of thy) (name, f) all_facts));
-  in thy' end;
+  let val name = Sign.full_name thy bname
+  in thy |> FactsData.map (Facts.add_dynamic (Sign.naming_of thy) (name, f)) end;
 
 
 (* note_thmss(_i) *)