| author | haftmann | 
| Mon, 17 Dec 2007 17:57:50 +0100 | |
| changeset 25667 | a089038c1893 | 
| parent 25226 | 502d8676cdd6 | 
| child 25992 | 928594f50893 | 
| permissions | -rw-r--r-- | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 1 | (* Title: Pure/Isar/find_theorems.ML | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 2 | ID: $Id$ | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 3 | Author: Rafal Kolanski, NICTA and Tobias Nipkow, TU Muenchen | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 4 | |
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 5 | Retrieve theorems from proof context. | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 6 | *) | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 7 | |
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 8 | val thms_containing_limit = ref 40; | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 9 | |
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 10 | signature FIND_THEOREMS = | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 11 | sig | 
| 16036 | 12 | datatype 'term criterion = | 
| 16074 | 13 | Name of string | Intro | Elim | Dest | Simp of 'term | Pattern of 'term | 
| 22340 
275802767bf3
Remove duplicates from printed theorems in find_theorems
 kleing parents: 
19502diff
changeset | 14 | val print_theorems: Proof.context -> term option -> int option -> bool -> | 
| 16036 | 15 | (bool * string criterion) list -> unit | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 16 | end; | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 17 | |
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 18 | structure FindTheorems: FIND_THEOREMS = | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 19 | struct | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 20 | |
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 21 | (** search criteria **) | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 22 | |
| 16036 | 23 | datatype 'term criterion = | 
| 16074 | 24 | Name of string | Intro | Elim | Dest | Simp of 'term | Pattern of 'term; | 
| 16036 | 25 | |
| 26 | fun read_criterion _ (Name name) = Name name | |
| 27 | | read_criterion _ Intro = Intro | |
| 28 | | read_criterion _ Elim = Elim | |
| 29 | | read_criterion _ Dest = Dest | |
| 24683 | 30 | | read_criterion ctxt (Simp str) = Simp (ProofContext.read_term_pattern ctxt str) | 
| 31 | | read_criterion ctxt (Pattern str) = Pattern (ProofContext.read_term_pattern ctxt str); | |
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 32 | |
| 16036 | 33 | fun pretty_criterion ctxt (b, c) = | 
| 34 | let | |
| 35 | fun prfx s = if b then s else "-" ^ s; | |
| 36 | in | |
| 37 | (case c of | |
| 38 | Name name => Pretty.str (prfx "name: " ^ quote name) | |
| 39 | | Intro => Pretty.str (prfx "intro") | |
| 40 | | Elim => Pretty.str (prfx "elim") | |
| 41 | | Dest => Pretty.str (prfx "dest") | |
| 16088 | 42 | | Simp pat => Pretty.block [Pretty.str (prfx "simp:"), Pretty.brk 1, | 
| 24920 | 43 | Pretty.quote (Syntax.pretty_term ctxt (Term.show_dummy_patterns pat))] | 
| 16036 | 44 | | Pattern pat => Pretty.enclose (prfx " \"") "\"" | 
| 24920 | 45 | [Syntax.pretty_term ctxt (Term.show_dummy_patterns pat)]) | 
| 16036 | 46 | end; | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 47 | |
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 48 | |
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 49 | |
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 50 | (** search criterion filters **) | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 51 | |
| 16895 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 52 | (*generated filters are to be of the form | 
| 17205 | 53 | input: (thmref * thm) | 
| 17106 | 54 | output: (p:int, s:int) option, where | 
| 16895 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 55 | NONE indicates no match | 
| 17106 | 56 | p is the primary sorting criterion | 
| 16895 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 57 | (eg. number of assumptions in the theorem) | 
| 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 58 | s is the secondary sorting criterion | 
| 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 59 | (eg. size of the substitution for intro, elim and dest) | 
| 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 60 | when applying a set of filters to a thm, fold results in: | 
| 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 61 | (biggest p, sum of all s) | 
| 17106 | 62 | currently p and s only matter for intro, elim, dest and simp filters, | 
| 63 | otherwise the default ordering is used. | |
| 16895 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 64 | *) | 
| 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 65 | |
| 16088 | 66 | |
| 67 | (* matching theorems *) | |
| 17106 | 68 | |
| 17205 | 69 | fun is_nontrivial thy = Term.is_Const o Term.head_of o ObjectLogic.drop_judgment thy; | 
| 16088 | 70 | |
| 16964 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 71 | (*extract terms from term_src, refine them to the parts that concern us, | 
| 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 72 | if po try match them against obj else vice versa. | 
| 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 73 | trivial matches are ignored. | 
| 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 74 | returns: smallest substitution size*) | 
| 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 75 | fun is_matching_thm (extract_terms, refine_term) ctxt po obj term_src = | 
| 16088 | 76 | let | 
| 17106 | 77 | val thy = ProofContext.theory_of ctxt; | 
| 16088 | 78 | |
| 16486 | 79 | fun matches pat = | 
| 17106 | 80 | is_nontrivial thy pat andalso | 
| 17205 | 81 | Pattern.matches thy (if po then (pat, obj) else (obj, pat)); | 
| 16895 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 82 | |
| 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 83 | fun substsize pat = | 
| 18184 | 84 | let val (_, subst) = | 
| 85 | Pattern.match thy (if po then (pat, obj) else (obj, pat)) (Vartab.empty, Vartab.empty) | |
| 17205 | 86 | in Vartab.fold (fn (_, (_, t)) => fn n => size_of_term t + n) subst 0 end; | 
| 16088 | 87 | |
| 16895 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 88 | fun bestmatch [] = NONE | 
| 17205 | 89 | | bestmatch xs = SOME (foldr1 Int.min xs); | 
| 16895 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 90 | |
| 16964 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 91 | val match_thm = matches o refine_term; | 
| 16486 | 92 | in | 
| 17106 | 93 | map (substsize o refine_term) | 
| 19482 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 wenzelm parents: 
19476diff
changeset | 94 | (filter match_thm (extract_terms term_src)) |> bestmatch | 
| 16088 | 95 | end; | 
| 96 | ||
| 97 | ||
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 98 | (* filter_name *) | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 99 | |
| 17755 
b0cd55afead1
find_theorems: support * wildcard in name: criterion;
 wenzelm parents: 
17205diff
changeset | 100 | fun match_string pat str = | 
| 
b0cd55afead1
find_theorems: support * wildcard in name: criterion;
 wenzelm parents: 
17205diff
changeset | 101 | let | 
| 
b0cd55afead1
find_theorems: support * wildcard in name: criterion;
 wenzelm parents: 
17205diff
changeset | 102 | fun match [] _ = true | 
| 
b0cd55afead1
find_theorems: support * wildcard in name: criterion;
 wenzelm parents: 
17205diff
changeset | 103 | | match (p :: ps) s = | 
| 
b0cd55afead1
find_theorems: support * wildcard in name: criterion;
 wenzelm parents: 
17205diff
changeset | 104 | size p <= size s andalso | 
| 
b0cd55afead1
find_theorems: support * wildcard in name: criterion;
 wenzelm parents: 
17205diff
changeset | 105 | (case try (unprefix p) s of | 
| 
b0cd55afead1
find_theorems: support * wildcard in name: criterion;
 wenzelm parents: 
17205diff
changeset | 106 | SOME s' => match ps s' | 
| 
b0cd55afead1
find_theorems: support * wildcard in name: criterion;
 wenzelm parents: 
17205diff
changeset | 107 | | NONE => match (p :: ps) (String.substring (s, 1, size s - 1))); | 
| 
b0cd55afead1
find_theorems: support * wildcard in name: criterion;
 wenzelm parents: 
17205diff
changeset | 108 | in match (space_explode "*" pat) str end; | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 109 | |
| 17106 | 110 | fun filter_name str_pat (thmref, _) = | 
| 17755 
b0cd55afead1
find_theorems: support * wildcard in name: criterion;
 wenzelm parents: 
17205diff
changeset | 111 | if match_string str_pat (PureThy.name_of_thmref thmref) | 
| 17205 | 112 | then SOME (0, 0) else NONE; | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 113 | |
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 114 | |
| 16036 | 115 | (* filter intro/elim/dest rules *) | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 116 | |
| 17205 | 117 | fun filter_dest ctxt goal (_, thm) = | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 118 | let | 
| 16964 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 119 | val extract_dest = | 
| 17205 | 120 | (fn thm => if Thm.no_prems thm then [] else [Thm.full_prop_of thm], | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 121 | hd o Logic.strip_imp_prems); | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 122 | val prems = Logic.prems_of_goal goal 1; | 
| 16895 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 123 | |
| 16964 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 124 | fun try_subst prem = is_matching_thm extract_dest ctxt true prem thm; | 
| 19482 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 wenzelm parents: 
19476diff
changeset | 125 | val successful = prems |> map_filter try_subst; | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 126 | in | 
| 16895 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 127 | (*if possible, keep best substitution (one with smallest size)*) | 
| 17106 | 128 | (*dest rules always have assumptions, so a dest with one | 
| 16895 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 129 | assumption is as good as an intro rule with none*) | 
| 17205 | 130 | if not (null successful) | 
| 131 | then SOME (Thm.nprems_of thm - 1, foldr1 Int.min successful) else NONE | |
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 132 | end; | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 133 | |
| 17205 | 134 | fun filter_intro ctxt goal (_, thm) = | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 135 | let | 
| 17205 | 136 | val extract_intro = (single o Thm.full_prop_of, Logic.strip_imp_concl); | 
| 16036 | 137 | val concl = Logic.concl_of_goal goal 1; | 
| 16964 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 138 | val ss = is_matching_thm extract_intro ctxt true concl thm; | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 139 | in | 
| 18939 | 140 | if is_some ss then SOME (Thm.nprems_of thm, the ss) else NONE | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 141 | end; | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 142 | |
| 17205 | 143 | fun filter_elim ctxt goal (_, thm) = | 
| 16964 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 144 | if not (Thm.no_prems thm) then | 
| 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 145 | let | 
| 17205 | 146 | val rule = Thm.full_prop_of thm; | 
| 16964 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 147 | val prems = Logic.prems_of_goal goal 1; | 
| 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 148 | val goal_concl = Logic.concl_of_goal goal 1; | 
| 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 149 | val rule_mp = (hd o Logic.strip_imp_prems) rule; | 
| 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 150 | val rule_concl = Logic.strip_imp_concl rule; | 
| 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 151 |       fun combine t1 t2 = Const ("combine", dummyT --> dummyT) $ (t1 $ t2);
 | 
| 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 152 | val rule_tree = combine rule_mp rule_concl; | 
| 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 153 | fun goal_tree prem = (combine prem goal_concl); | 
| 17106 | 154 | fun try_subst prem = | 
| 16964 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 155 | is_matching_thm (single, I) ctxt true (goal_tree prem) rule_tree; | 
| 19482 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 wenzelm parents: 
19476diff
changeset | 156 | val successful = prems |> map_filter try_subst; | 
| 16964 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 157 | in | 
| 17106 | 158 | (*elim rules always have assumptions, so an elim with one | 
| 16964 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 159 | assumption is as good as an intro rule with none*) | 
| 17106 | 160 | if is_nontrivial (ProofContext.theory_of ctxt) (Thm.major_prem_of thm) | 
| 17205 | 161 | andalso not (null successful) | 
| 162 | then SOME (Thm.nprems_of thm - 1, foldr1 Int.min successful) else NONE | |
| 16964 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 163 | end | 
| 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 164 | else NONE | 
| 16036 | 165 | |
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 166 | |
| 16074 | 167 | (* filter_simp *) | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 168 | |
| 17205 | 169 | fun filter_simp ctxt t (_, thm) = | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 170 | let | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 171 |     val (_, {mk_rews = {mk, ...}, ...}) =
 | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 172 | MetaSimplifier.rep_ss (Simplifier.local_simpset_of ctxt); | 
| 17106 | 173 | val extract_simp = | 
| 17205 | 174 | (map Thm.full_prop_of o mk, #1 o Logic.dest_equals o Logic.strip_imp_concl); | 
| 16964 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 175 | val ss = is_matching_thm extract_simp ctxt false t thm | 
| 17106 | 176 | in | 
| 18939 | 177 | if is_some ss then SOME (Thm.nprems_of thm, the ss) else NONE | 
| 16964 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 178 | end; | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 179 | |
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 180 | |
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 181 | (* filter_pattern *) | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 182 | |
| 16088 | 183 | fun filter_pattern ctxt pat (_, thm) = | 
| 17205 | 184 | if Pattern.matches_subterm (ProofContext.theory_of ctxt) (pat, Thm.full_prop_of thm) | 
| 185 | then SOME (0, 0) else NONE; | |
| 186 | ||
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 187 | |
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 188 | (* interpret criteria as filters *) | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 189 | |
| 16036 | 190 | local | 
| 191 | ||
| 192 | fun err_no_goal c = | |
| 193 |   error ("Current goal required for " ^ c ^ " search criterion");
 | |
| 194 | ||
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 195 | fun filter_crit _ _ (Name name) = filter_name name | 
| 16036 | 196 | | filter_crit _ NONE Intro = err_no_goal "intro" | 
| 197 | | filter_crit _ NONE Elim = err_no_goal "elim" | |
| 198 | | filter_crit _ NONE Dest = err_no_goal "dest" | |
| 199 | | filter_crit ctxt (SOME goal) Intro = filter_intro ctxt goal | |
| 200 | | filter_crit ctxt (SOME goal) Elim = filter_elim ctxt goal | |
| 201 | | filter_crit ctxt (SOME goal) Dest = filter_dest ctxt goal | |
| 16088 | 202 | | filter_crit ctxt _ (Simp pat) = filter_simp ctxt pat | 
| 203 | | filter_crit ctxt _ (Pattern pat) = filter_pattern ctxt pat; | |
| 16036 | 204 | |
| 19502 | 205 | fun opt_not x = if is_some x then NONE else SOME (0, 0); | 
| 16895 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 206 | |
| 17756 | 207 | fun opt_add (SOME (a, x)) (SOME (b, y)) = SOME (Int.max (a, b), x + y : int) | 
| 17205 | 208 | | opt_add _ _ = NONE; | 
| 16895 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 209 | |
| 16036 | 210 | in | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 211 | |
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 212 | fun filter_criterion ctxt opt_goal (b, c) = | 
| 16895 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 213 | (if b then I else opt_not) o filter_crit ctxt opt_goal c; | 
| 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 214 | |
| 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 215 | fun all_filters filters thms = | 
| 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 216 | let | 
| 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 217 | fun eval_filters filters thm = | 
| 17205 | 218 | fold opt_add (map (fn f => f thm) filters) (SOME (0, 0)); | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 219 | |
| 16895 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 220 | (*filters return: (number of assumptions, substitution size) option, so | 
| 16964 
6a25e42eaff5
Ordering is now: first by number of assumptions, second by the substitution size.
 kleing parents: 
16895diff
changeset | 221 | sort (desc. in both cases) according to number of assumptions first, | 
| 16895 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 222 | then by the substitution size*) | 
| 17205 | 223 | fun thm_ord (((p0, s0), _), ((p1, s1), _)) = | 
| 224 | prod_ord int_ord int_ord ((p1, s1), (p0, s0)); | |
| 16895 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 225 | in | 
| 17205 | 226 | map (`(eval_filters filters)) thms | 
| 19482 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 wenzelm parents: 
19476diff
changeset | 227 | |> map_filter (fn (SOME x, y) => SOME (x, y) | (NONE, _) => NONE) | 
| 22360 
26ead7ed4f4b
moved eq_thm etc. to structure Thm in Pure/more_thm.ML;
 wenzelm parents: 
22343diff
changeset | 228 | |> sort thm_ord |> map #2 | 
| 16895 
df67fc190e06
Sort search results in order of relevance, where relevance =
 kleing parents: 
16486diff
changeset | 229 | end; | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 230 | |
| 16036 | 231 | end; | 
| 232 | ||
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 233 | |
| 22414 | 234 | (* removing duplicates, preferring nicer names, roughly n log n *) | 
| 22340 
275802767bf3
Remove duplicates from printed theorems in find_theorems
 kleing parents: 
19502diff
changeset | 235 | |
| 25226 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 236 | local | 
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 237 | |
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 238 | val hidden_ord = bool_ord o pairself NameSpace.is_hidden; | 
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 239 | val qual_ord = int_ord o pairself (length o NameSpace.explode); | 
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 240 | val txt_ord = int_ord o pairself size; | 
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 241 | |
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 242 | fun nicer_name x y = | 
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 243 | (case hidden_ord (x, y) of | 
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 244 | EQUAL => (case qual_ord (x, y) of EQUAL => txt_ord (x, y) | ord => ord) | 
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 245 | | ord => ord) <> GREATER; | 
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 246 | |
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 247 | in | 
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 248 | |
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 249 | fun nicer (Fact _) _ = true | 
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 250 | | nicer (PureThy.Name x) (PureThy.Name y) = nicer_name x y | 
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 251 | | nicer (PureThy.Name _) (Fact _) = false | 
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 252 | | nicer (PureThy.Name _) _ = true | 
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 253 | | nicer (NameSelection (x, _)) (NameSelection (y, _)) = nicer_name x y | 
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 254 | | nicer (NameSelection _) _ = false; | 
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 255 | |
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 256 | end; | 
| 
502d8676cdd6
improved notion of 'nicer' fact names (observe some name space properties);
 wenzelm parents: 
24920diff
changeset | 257 | |
| 22340 
275802767bf3
Remove duplicates from printed theorems in find_theorems
 kleing parents: 
19502diff
changeset | 258 | fun rem_thm_dups xs = | 
| 22360 
26ead7ed4f4b
moved eq_thm etc. to structure Thm in Pure/more_thm.ML;
 wenzelm parents: 
22343diff
changeset | 259 | let | 
| 22414 | 260 | fun rem_cdups xs = | 
| 261 | let | |
| 262 | fun rem_c rev_seen [] = rev rev_seen | |
| 263 | | rem_c rev_seen [x] = rem_c (x::rev_seen) [] | |
| 264 | | rem_c rev_seen ((x as ((n,t),_))::(y as ((n',t'),_))::xs) = | |
| 265 | if Thm.eq_thm_prop (t,t') | |
| 266 | then if nicer n n' | |
| 267 | then rem_c rev_seen (x::xs) | |
| 268 | else rem_c rev_seen (y::xs) | |
| 269 | else rem_c (x::rev_seen) (y::xs) | |
| 270 | in rem_c [] xs end; | |
| 22340 
275802767bf3
Remove duplicates from printed theorems in find_theorems
 kleing parents: 
19502diff
changeset | 271 | |
| 22414 | 272 | in ListPair.zip (xs, 1 upto length xs) | 
| 273 | |> sort (Term.fast_term_ord o pairself (prop_of o #2 o #1)) | |
| 274 | |> rem_cdups | |
| 275 | |> sort (int_ord o pairself #2) | |
| 276 | |> map #1 | |
| 277 | end; | |
| 22340 
275802767bf3
Remove duplicates from printed theorems in find_theorems
 kleing parents: 
19502diff
changeset | 278 | |
| 
275802767bf3
Remove duplicates from printed theorems in find_theorems
 kleing parents: 
19502diff
changeset | 279 | |
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 280 | (* print_theorems *) | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 281 | |
| 17972 | 282 | fun find_thms ctxt spec = | 
| 18325 
2d504ea54e5b
ProofContext.lthms_containing: suppress obvious duplicates;
 wenzelm parents: 
18184diff
changeset | 283 | (PureThy.thms_containing (ProofContext.theory_of ctxt) spec | 
| 19482 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 wenzelm parents: 
19476diff
changeset | 284 | |> maps PureThy.selections) @ | 
| 18325 
2d504ea54e5b
ProofContext.lthms_containing: suppress obvious duplicates;
 wenzelm parents: 
18184diff
changeset | 285 | (ProofContext.lthms_containing ctxt spec | 
| 19482 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 wenzelm parents: 
19476diff
changeset | 286 | |> maps PureThy.selections | 
| 19046 
bc5c6c9b114e
removed distinct, renamed gen_distinct to distinct;
 wenzelm parents: 
18939diff
changeset | 287 | |> distinct (fn ((r1, th1), (r2, th2)) => | 
| 22360 
26ead7ed4f4b
moved eq_thm etc. to structure Thm in Pure/more_thm.ML;
 wenzelm parents: 
22343diff
changeset | 288 | r1 = r2 andalso Thm.eq_thm_prop (th1, th2))); | 
| 17972 | 289 | |
| 22340 
275802767bf3
Remove duplicates from printed theorems in find_theorems
 kleing parents: 
19502diff
changeset | 290 | fun print_theorems ctxt opt_goal opt_limit rem_dups raw_criteria = | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 291 | let | 
| 16036 | 292 | val criteria = map (apsnd (read_criterion ctxt)) raw_criteria; | 
| 293 | val filters = map (filter_criterion ctxt opt_goal) criteria; | |
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 294 | |
| 22340 
275802767bf3
Remove duplicates from printed theorems in find_theorems
 kleing parents: 
19502diff
changeset | 295 | val raw_matches = all_filters filters (find_thms ctxt ([], [])); | 
| 22360 
26ead7ed4f4b
moved eq_thm etc. to structure Thm in Pure/more_thm.ML;
 wenzelm parents: 
22343diff
changeset | 296 | val matches = | 
| 22414 | 297 | if rem_dups | 
| 22360 
26ead7ed4f4b
moved eq_thm etc. to structure Thm in Pure/more_thm.ML;
 wenzelm parents: 
22343diff
changeset | 298 | then rem_thm_dups raw_matches | 
| 
26ead7ed4f4b
moved eq_thm etc. to structure Thm in Pure/more_thm.ML;
 wenzelm parents: 
22343diff
changeset | 299 | else raw_matches; | 
| 22340 
275802767bf3
Remove duplicates from printed theorems in find_theorems
 kleing parents: 
19502diff
changeset | 300 | |
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 301 | val len = length matches; | 
| 19476 | 302 | val limit = the_default (! thms_containing_limit) opt_limit; | 
| 22340 
275802767bf3
Remove duplicates from printed theorems in find_theorems
 kleing parents: 
19502diff
changeset | 303 | val thms = Library.drop (len - limit, matches); | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 304 | |
| 16036 | 305 | fun prt_fact (thmref, thm) = | 
| 306 | ProofContext.pretty_fact ctxt (PureThy.string_of_thmref thmref, [thm]); | |
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 307 | in | 
| 16036 | 308 | Pretty.big_list "searched for:" (map (pretty_criterion ctxt) criteria) :: Pretty.str "" :: | 
| 22340 
275802767bf3
Remove duplicates from printed theorems in find_theorems
 kleing parents: 
19502diff
changeset | 309 | (if null thms then [Pretty.str "nothing found"] | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 310 | else | 
| 16036 | 311 |         [Pretty.str ("found " ^ string_of_int len ^ " theorems" ^
 | 
| 312 |           (if len <= limit then "" else " (" ^ string_of_int limit ^ " displayed)") ^ ":"),
 | |
| 313 | Pretty.str ""] @ | |
| 22340 
275802767bf3
Remove duplicates from printed theorems in find_theorems
 kleing parents: 
19502diff
changeset | 314 | map prt_fact thms) | 
| 16033 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 315 | |> Pretty.chunks |> Pretty.writeln | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 316 | end; | 
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 317 | |
| 
f93ca3d4ffa7
Retrieve theorems from proof context -- improved version of
 wenzelm parents: diff
changeset | 318 | end; |