Nicer names in FindTheorems.
authorTimothy Bourke
Mon, 09 Feb 2009 17:25:07 +1100
changeset 29848 a7c164e228e1
parent 29847 af32126ee729
child 29851 55ddff2ed906
Nicer names in FindTheorems. * Patch NameSpace.get_accesses, contributed by Timothy Bourke: NameSpace.get_accesses has been patched to fix the following bug: theory OverHOL imports Main begin lemma conjI: "a & b --> b" by blast ML {* val ns = PureThy.facts_of @{theory} |> Facts.space_of; val x1 = NameSpace.get_accesses ns "HOL.conjI"; val x2 = NameSpace.get_accesses ns "OverHOL.conjI"; *} end where x1 = ["conjI", "HOL.conjI"] and x2 = ["conjI", "OverHOL.conjI"], but x1 should be just ["HOL.conjI"]. NameSpace.get_accesses is only used within the NameSpace structure itself. The two uses have been modified to retain their original behaviour. Note that NameSpace.valid_accesses gives different results: get_accesses ns "HOL.eq_class.eq" gives ["eq", "eq_class.eq", "HOL.eq_class.eq"] but, valid_accesses ns "HOL.eq_class.eq" gives ["HOL.eq_class.eq", "eq_class.eq", "HOL.eq", "eq"] * Patch FindTheorems: Prefer names that are shorter to type in the current context. * Re-export space_of.
src/Pure/General/name_space.ML
src/Pure/Isar/find_theorems.ML
src/Pure/facts.ML
--- a/src/Pure/General/name_space.ML	Mon Feb 09 17:21:46 2009 +0000
+++ b/src/Pure/General/name_space.ML	Mon Feb 09 17:25:07 2009 +1100
@@ -133,10 +133,19 @@
   | SOME ((name :: _, _), _) => (name, false)
   | SOME (([], name' :: _), _) => (hidden name', true));
 
-fun get_accesses (NameSpace (_, tab)) name =
+fun ex_mapsto_in (NameSpace (tab, _)) name xname =
+    (case Symtab.lookup tab xname of
+      SOME ((name'::_, _), _) => name' = name
+    | _ => false);
+
+fun get_accesses' valid_only (ns as (NameSpace (_, tab))) name =
   (case Symtab.lookup tab name of
     NONE => [name]
-  | SOME (xnames, _) => xnames);
+  | SOME (xnames, _) => if valid_only
+                        then filter (ex_mapsto_in ns name) xnames
+                        else xnames);
+
+val get_accesses = get_accesses' true;
 
 fun put_accesses name xnames (NameSpace (tab, xtab)) =
   NameSpace (tab, Symtab.update (name, (xnames, stamp ())) xtab);
@@ -160,7 +169,7 @@
   in
     if ! long_names then name
     else if ! short_names then base name
-    else ext (get_accesses space name)
+    else ext (get_accesses' false space name)
   end;
 
 
@@ -194,7 +203,7 @@
       space
       |> add_name' name name
       |> fold (del_name name) (if fully then names else names inter_string [base name])
-      |> fold (del_name_extra name) (get_accesses space name)
+      |> fold (del_name_extra name) (get_accesses' false space name)
     end;
 
 
--- a/src/Pure/Isar/find_theorems.ML	Mon Feb 09 17:21:46 2009 +0000
+++ b/src/Pure/Isar/find_theorems.ML	Mon Feb 09 17:25:07 2009 +1100
@@ -267,12 +267,7 @@
     | ord => ord)
   | ord => ord) <> GREATER;
 
-fun nicer (Facts.Named ((x, _), i)) (Facts.Named ((y, _), j)) =
-      nicer_name (x, i) (y, j)
-  | nicer (Facts.Fact _) (Facts.Named _) = true
-  | nicer (Facts.Named _) (Facts.Fact _) = false;
-
-fun rem_cdups xs =
+fun rem_cdups nicer xs =
   let
     fun rem_c rev_seen [] = rev rev_seen
       | rem_c rev_seen [x] = rem_c (x :: rev_seen) []
@@ -284,10 +279,26 @@
 
 in
 
-fun rem_thm_dups xs =
+fun nicer_shortest ctxt = let
+    val ns = ProofContext.theory_of ctxt
+             |> PureThy.facts_of
+             |> Facts.space_of;
+
+    val len_sort = sort (int_ord o (pairself size));
+    fun shorten s = (case len_sort (NameSpace.get_accesses ns s) of
+                       [] => s
+                     | s'::_ => s');
+
+    fun nicer (Facts.Named ((x, _), i)) (Facts.Named ((y, _), j)) =
+          nicer_name (shorten x, i) (shorten y, j)
+      | nicer (Facts.Fact _) (Facts.Named _) = true
+      | nicer (Facts.Named _) (Facts.Fact _) = false;
+  in nicer end;
+
+fun rem_thm_dups nicer xs =
   xs ~~ (1 upto length xs)
   |> sort (TermOrd.fast_term_ord o pairself (Thm.prop_of o #2 o #1))
-  |> rem_cdups
+  |> rem_cdups nicer
   |> sort (int_ord o pairself #2)
   |> map #1;
 
@@ -313,7 +324,7 @@
 
     val matches =
       if rem_dups
-      then rem_thm_dups raw_matches
+      then rem_thm_dups (nicer_shortest ctxt) raw_matches
       else raw_matches;
 
     val len = length matches;
--- a/src/Pure/facts.ML	Mon Feb 09 17:21:46 2009 +0000
+++ b/src/Pure/facts.ML	Mon Feb 09 17:25:07 2009 +1100
@@ -20,6 +20,7 @@
   val selections: string * thm list -> (ref * thm) list
   type T
   val empty: T
+  val space_of: T -> NameSpace.T
   val intern: T -> xstring -> string
   val extern: T -> string -> xstring
   val lookup: Context.generic -> T -> string -> (bool * thm list) option