author | krauss |
Sun, 21 Aug 2011 22:13:04 +0200 | |
changeset 44374 | 0b217404522a |
parent 43272 | 878c0935a4a4 |
child 44717 | c9cf0780cd4f |
permissions | -rw-r--r-- |
43107 | 1 |
(* Title: HOL/Tools/monomorph.ML |
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
2 |
Author: Sascha Boehme, TU Muenchen |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
3 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
4 |
Monomorphization of theorems, i.e., computation of all (necessary) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
5 |
instances. This procedure is incomplete in general, but works well for |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
6 |
most practical problems. |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
7 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
8 |
For a list of universally closed theorems (without schematic term |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
9 |
variables), monomorphization computes a list of theorems with schematic |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
10 |
term variables: all polymorphic constants (i.e., constants occurring both |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
11 |
with ground types and schematic type variables) are instantiated with all |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
12 |
(necessary) ground types; thereby theorems containing these constants are |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
13 |
copied. To prevent nontermination, there is an upper limit for the number |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
14 |
of iterations involved in the fixpoint construction. |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
15 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
16 |
The search for instances is performed on the constants with schematic |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
17 |
types, which are extracted from the initial set of theorems. The search |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
18 |
constructs, for each theorem with those constants, a set of substitutions, |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
19 |
which, in the end, is applied to all corresponding theorems. Remaining |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
20 |
schematic type variables are substituted with fresh types. |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
21 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
22 |
Searching for necessary substitutions is an iterative fixpoint |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
23 |
construction: each iteration computes all required instances required by |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
24 |
the ground instances computed in the previous step and which haven't been |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
25 |
found before. Computed substitutions are always nontrivial: schematic type |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
26 |
variables are never mapped to schematic type variables. |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
27 |
*) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
28 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
29 |
signature MONOMORPH = |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
30 |
sig |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
31 |
(* utility function *) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
32 |
val typ_has_tvars: typ -> bool |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
33 |
val all_schematic_consts_of: term -> typ list Symtab.table |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
34 |
val add_schematic_consts_of: term -> typ list Symtab.table -> |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
35 |
typ list Symtab.table |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
36 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
37 |
(* configuration options *) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
38 |
val max_rounds: int Config.T |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
39 |
val max_new_instances: int Config.T |
43230
dabf6e311213
clarified meaning of monomorphization configuration option by renaming it
boehmes
parents:
43225
diff
changeset
|
40 |
val keep_partial_instances: bool Config.T |
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
41 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
42 |
(* monomorphization *) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
43 |
val monomorph: (term -> typ list Symtab.table) -> (int * thm) list -> |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
44 |
Proof.context -> (int * thm) list list * Proof.context |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
45 |
end |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
46 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
47 |
structure Monomorph: MONOMORPH = |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
48 |
struct |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
49 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
50 |
(* utility functions *) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
51 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
52 |
val typ_has_tvars = Term.exists_subtype (fn TVar _ => true | _ => false) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
53 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
54 |
fun add_schematic_const (c as (_, T)) = |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
55 |
if typ_has_tvars T then Symtab.insert_list (op =) c else I |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
56 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
57 |
fun add_schematic_consts_of t = |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
58 |
Term.fold_aterms (fn Const c => add_schematic_const c | _ => I) t |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
59 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
60 |
fun all_schematic_consts_of t = add_schematic_consts_of t Symtab.empty |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
61 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
62 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
63 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
64 |
(* configuration options *) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
65 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
66 |
val max_rounds = Attrib.setup_config_int @{binding monomorph_max_rounds} (K 5) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
67 |
val max_new_instances = |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
68 |
Attrib.setup_config_int @{binding monomorph_max_new_instances} (K 300) |
43230
dabf6e311213
clarified meaning of monomorphization configuration option by renaming it
boehmes
parents:
43225
diff
changeset
|
69 |
val keep_partial_instances = |
dabf6e311213
clarified meaning of monomorphization configuration option by renaming it
boehmes
parents:
43225
diff
changeset
|
70 |
Attrib.setup_config_bool @{binding monomorph_keep_partial_instances} (K true) |
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
71 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
72 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
73 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
74 |
(* monomorphization *) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
75 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
76 |
(** preparing the problem **) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
77 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
78 |
datatype thm_info = |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
79 |
Ground of thm | |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
80 |
Schematic of { |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
81 |
index: int, |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
82 |
theorem: thm, |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
83 |
tvars: (indexname * sort) list, |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
84 |
schematics: typ list Symtab.table, |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
85 |
initial_round: int } |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
86 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
87 |
fun prepare schematic_consts_of rthms = |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
88 |
let |
43117 | 89 |
val empty_sub = ((0, false, false), Vartab.empty) |
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
90 |
|
43117 | 91 |
fun prep (r, thm) ((i, idx), (consts, subs)) = |
43116 | 92 |
if not (Term.exists_type typ_has_tvars (Thm.prop_of thm)) then |
43117 | 93 |
(Ground thm, ((i+1, idx + Thm.maxidx_of thm + 1), (consts, subs))) |
43116 | 94 |
else |
95 |
let |
|
96 |
(* increase indices to avoid clashes of type variables *) |
|
97 |
val thm' = Thm.incr_indexes idx thm |
|
98 |
val idx' = Thm.maxidx_of thm' + 1 |
|
99 |
val schematics = schematic_consts_of (Thm.prop_of thm') |
|
100 |
val consts' = |
|
101 |
Symtab.fold (fn (n, _) => Symtab.update (n, [])) schematics consts |
|
43117 | 102 |
val subs' = Inttab.update (i, [empty_sub]) subs |
43116 | 103 |
val thm_info = Schematic { |
104 |
index = i, |
|
105 |
theorem = thm', |
|
106 |
tvars = Term.add_tvars (Thm.prop_of thm') [], |
|
107 |
schematics = schematics, |
|
108 |
initial_round = r } |
|
43117 | 109 |
in (thm_info, ((i+1, idx'), (consts', subs'))) end |
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
110 |
in fold_map prep rthms ((0, 0), (Symtab.empty, Inttab.empty)) ||> snd end |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
111 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
112 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
113 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
114 |
(** collecting substitutions **) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
115 |
|
43117 | 116 |
fun exceeded limit = (limit <= 0) |
117 |
fun exceeded_limit (limit, _, _) = exceeded limit |
|
118 |
||
119 |
||
43272
878c0935a4a4
only collect substituions neither seen before nor derived in the same refinement step
boehmes
parents:
43251
diff
changeset
|
120 |
fun derived_subst subst' subst = subst' |> Vartab.forall (fn (n, (_, T)) => |
878c0935a4a4
only collect substituions neither seen before nor derived in the same refinement step
boehmes
parents:
43251
diff
changeset
|
121 |
Vartab.lookup subst n |> Option.map (equal T o snd) |> the_default false) |
878c0935a4a4
only collect substituions neither seen before nor derived in the same refinement step
boehmes
parents:
43251
diff
changeset
|
122 |
|
878c0935a4a4
only collect substituions neither seen before nor derived in the same refinement step
boehmes
parents:
43251
diff
changeset
|
123 |
fun eq_subst (subst1, subst2) = |
878c0935a4a4
only collect substituions neither seen before nor derived in the same refinement step
boehmes
parents:
43251
diff
changeset
|
124 |
derived_subst subst1 subst2 andalso derived_subst subst2 subst1 |
878c0935a4a4
only collect substituions neither seen before nor derived in the same refinement step
boehmes
parents:
43251
diff
changeset
|
125 |
|
878c0935a4a4
only collect substituions neither seen before nor derived in the same refinement step
boehmes
parents:
43251
diff
changeset
|
126 |
|
43117 | 127 |
fun with_all_grounds cx grounds f = |
128 |
if exceeded_limit cx then I else Symtab.fold f grounds |
|
129 |
||
130 |
fun with_all_type_combinations cx schematics f (n, Ts) = |
|
131 |
if exceeded_limit cx then I |
|
132 |
else fold_product f (Symtab.lookup_list schematics n) Ts |
|
133 |
||
134 |
fun derive_new_substs thy cx new_grounds schematics subst = |
|
135 |
with_all_grounds cx new_grounds |
|
136 |
(with_all_type_combinations cx schematics (fn T => fn U => |
|
137 |
(case try (Sign.typ_match thy (T, U)) subst of |
|
138 |
NONE => I |
|
43272
878c0935a4a4
only collect substituions neither seen before nor derived in the same refinement step
boehmes
parents:
43251
diff
changeset
|
139 |
| SOME subst' => insert eq_subst subst'))) [] |
43117 | 140 |
|
141 |
||
43272
878c0935a4a4
only collect substituions neither seen before nor derived in the same refinement step
boehmes
parents:
43251
diff
changeset
|
142 |
fun known_subst sub subs1 subs2 subst' = |
878c0935a4a4
only collect substituions neither seen before nor derived in the same refinement step
boehmes
parents:
43251
diff
changeset
|
143 |
let fun derived (_, subst) = derived_subst subst' subst |
878c0935a4a4
only collect substituions neither seen before nor derived in the same refinement step
boehmes
parents:
43251
diff
changeset
|
144 |
in derived sub orelse exists derived subs1 orelse exists derived subs2 end |
43117 | 145 |
|
146 |
fun within_limit f cx = if exceeded_limit cx then cx else f cx |
|
147 |
||
148 |
fun fold_partial_substs derive add = within_limit ( |
|
149 |
let |
|
150 |
fun fold_partial [] cx = cx |
|
151 |
| fold_partial (sub :: subs) (limit, subs', next) = |
|
152 |
if exceeded limit then (limit, sub :: subs @ subs', next) |
|
153 |
else sub |> (fn ((generation, full, _), subst) => |
|
154 |
if full then fold_partial subs (limit, sub :: subs', next) |
|
155 |
else |
|
156 |
(case filter_out (known_subst sub subs subs') (derive subst) of |
|
157 |
[] => fold_partial subs (limit, sub :: subs', next) |
|
158 |
| substs => |
|
159 |
(limit, ((generation, full, true), subst) :: subs', next) |
|
160 |
|> fold (within_limit o add) substs |
|
161 |
|> fold_partial subs)) |
|
162 |
in (fn (limit, subs, next) => fold_partial subs (limit, [], next)) end) |
|
163 |
||
164 |
||
165 |
fun refine ctxt round known_grounds new_grounds (tvars, schematics) cx = |
|
166 |
let |
|
167 |
val thy = Proof_Context.theory_of ctxt |
|
43230
dabf6e311213
clarified meaning of monomorphization configuration option by renaming it
boehmes
parents:
43225
diff
changeset
|
168 |
val count_partial = Config.get ctxt keep_partial_instances |
43117 | 169 |
|
170 |
fun add_new_ground subst n T = |
|
171 |
let val T' = Envir.subst_type subst T |
|
172 |
in |
|
173 |
(* FIXME: maybe keep types in a table or net for known_grounds, |
|
174 |
that might improve efficiency here |
|
175 |
*) |
|
176 |
if typ_has_tvars T' then I |
|
177 |
else if member (op =) (Symtab.lookup_list known_grounds n) T' then I |
|
178 |
else Symtab.cons_list (n, T') |
|
179 |
end |
|
180 |
||
181 |
fun add_new_subst subst (limit, subs, next_grounds) = |
|
182 |
let |
|
183 |
val full = forall (Vartab.defined subst o fst) tvars |
|
184 |
val limit' = |
|
185 |
if full orelse count_partial then limit - 1 else limit |
|
186 |
val sub = ((round, full, false), subst) |
|
187 |
val next_grounds' = |
|
188 |
(schematics, next_grounds) |
|
189 |
|-> Symtab.fold (uncurry (fold o add_new_ground subst)) |
|
190 |
in (limit', sub :: subs, next_grounds') end |
|
191 |
in |
|
192 |
fold_partial_substs (derive_new_substs thy cx new_grounds schematics) |
|
193 |
add_new_subst cx |
|
194 |
end |
|
195 |
||
196 |
||
197 |
(* |
|
198 |
'known_grounds' are all constant names known to occur schematically |
|
199 |
associated with all ground instances considered so far |
|
200 |
*) |
|
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
201 |
fun add_relevant_instances known_grounds (Const (c as (n, T))) = |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
202 |
if typ_has_tvars T orelse not (Symtab.defined known_grounds n) then I |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
203 |
else if member (op =) (Symtab.lookup_list known_grounds n) T then I |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
204 |
else Symtab.insert_list (op =) c |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
205 |
| add_relevant_instances _ _ = I |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
206 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
207 |
fun collect_instances known_grounds thm = |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
208 |
Term.fold_aterms (add_relevant_instances known_grounds) (Thm.prop_of thm) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
209 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
210 |
|
43116 | 211 |
fun make_subst_ctxt ctxt thm_infos known_grounds substitutions = |
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
212 |
let |
43251
f4d15a58ed8b
clarified (and slightly modified) the semantics of max_new_instances
boehmes
parents:
43234
diff
changeset
|
213 |
(* The total limit of returned (ground) facts is the number of facts |
f4d15a58ed8b
clarified (and slightly modified) the semantics of max_new_instances
boehmes
parents:
43234
diff
changeset
|
214 |
given to the monomorphizer increased by max_new_instances. Since |
f4d15a58ed8b
clarified (and slightly modified) the semantics of max_new_instances
boehmes
parents:
43234
diff
changeset
|
215 |
initially ground facts are returned anyway, the limit here is not |
f4d15a58ed8b
clarified (and slightly modified) the semantics of max_new_instances
boehmes
parents:
43234
diff
changeset
|
216 |
counting them. *) |
f4d15a58ed8b
clarified (and slightly modified) the semantics of max_new_instances
boehmes
parents:
43234
diff
changeset
|
217 |
val limit = Config.get ctxt max_new_instances + |
f4d15a58ed8b
clarified (and slightly modified) the semantics of max_new_instances
boehmes
parents:
43234
diff
changeset
|
218 |
fold (fn Schematic _ => Integer.add 1 | _ => I) thm_infos 0 |
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
219 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
220 |
fun add_ground_consts (Ground thm) = collect_instances known_grounds thm |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
221 |
| add_ground_consts (Schematic _) = I |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
222 |
val initial_grounds = fold add_ground_consts thm_infos Symtab.empty |
43116 | 223 |
in (known_grounds, (limit, substitutions, initial_grounds)) end |
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
224 |
|
43117 | 225 |
fun is_new round initial_round = (round = initial_round) |
226 |
fun is_active round initial_round = (round > initial_round) |
|
227 |
||
228 |
fun fold_schematic pred f = fold (fn |
|
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
229 |
Schematic {index, theorem, tvars, schematics, initial_round} => |
43117 | 230 |
if pred initial_round then f theorem (index, tvars, schematics) else I |
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
231 |
| Ground _ => I) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
232 |
|
43117 | 233 |
fun focus f _ (index, tvars, schematics) (limit, subs, next_grounds) = |
234 |
let |
|
235 |
val (limit', isubs', next_grounds') = |
|
236 |
(limit, Inttab.lookup_list subs index, next_grounds) |
|
237 |
|> f (tvars, schematics) |
|
238 |
in (limit', Inttab.update (index, isubs') subs, next_grounds') end |
|
239 |
||
240 |
fun collect_substitutions thm_infos ctxt round subst_ctxt = |
|
241 |
let val (known_grounds, (limit, subs, next_grounds)) = subst_ctxt |
|
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
242 |
in |
43117 | 243 |
if exceeded limit then subst_ctxt |
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
244 |
else |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
245 |
let |
43117 | 246 |
fun collect thm _ = collect_instances known_grounds thm |
247 |
val new = fold_schematic (is_new round) collect thm_infos next_grounds |
|
248 |
||
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
249 |
val known' = Symtab.merge_list (op =) (known_grounds, new) |
43117 | 250 |
val step = focus o refine ctxt round known' |
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
251 |
in |
43117 | 252 |
(limit, subs, Symtab.empty) |
253 |
|> not (Symtab.is_empty new) ? |
|
254 |
fold_schematic (is_active round) (step new) thm_infos |
|
255 |
|> fold_schematic (is_new round) (step known') thm_infos |
|
256 |
|> pair known' |
|
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
257 |
end |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
258 |
end |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
259 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
260 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
261 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
262 |
(** instantiating schematic theorems **) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
263 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
264 |
fun super_sort (Ground _) S = S |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
265 |
| super_sort (Schematic {tvars, ...}) S = merge (op =) (S, maps snd tvars) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
266 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
267 |
fun new_super_type ctxt thm_infos = |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
268 |
let val S = fold super_sort thm_infos @{sort type} |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
269 |
in yield_singleton Variable.invent_types S ctxt |>> SOME o TFree end |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
270 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
271 |
fun add_missing_tvar T (ix, S) subst = |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
272 |
if Vartab.defined subst ix then subst |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
273 |
else Vartab.update (ix, (S, T)) subst |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
274 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
275 |
fun complete tvars subst T = |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
276 |
subst |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
277 |
|> Vartab.map (K (apsnd (Term.map_atyps (fn TVar _ => T | U => U)))) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
278 |
|> fold (add_missing_tvar T) tvars |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
279 |
|
43117 | 280 |
fun instantiate_all' (mT, ctxt) subs thm_infos = |
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
281 |
let |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
282 |
val thy = Proof_Context.theory_of ctxt |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
283 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
284 |
fun cert (ix, (S, T)) = pairself (Thm.ctyp_of thy) (TVar (ix, S), T) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
285 |
fun cert' subst = Vartab.fold (cons o cert) subst [] |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
286 |
fun instantiate thm subst = Thm.instantiate (cert' subst, []) thm |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
287 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
288 |
fun with_subst tvars f ((generation, full, _), subst) = |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
289 |
if full then SOME (generation, f subst) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
290 |
else Option.map (pair generation o f o complete tvars subst) mT |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
291 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
292 |
fun inst (Ground thm) = [(0, thm)] |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
293 |
| inst (Schematic {theorem, tvars, index, ...}) = |
43117 | 294 |
Inttab.lookup_list subs index |
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
295 |
|> map_filter (with_subst tvars (instantiate theorem)) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
296 |
in (map inst thm_infos, ctxt) end |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
297 |
|
43117 | 298 |
fun instantiate_all ctxt thm_infos (_, (_, subs, _)) = |
43230
dabf6e311213
clarified meaning of monomorphization configuration option by renaming it
boehmes
parents:
43225
diff
changeset
|
299 |
if Config.get ctxt keep_partial_instances then |
43117 | 300 |
let fun is_refined ((_, _, refined), _) = refined |
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
301 |
in |
43117 | 302 |
(Inttab.map (K (filter_out is_refined)) subs, thm_infos) |
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
303 |
|-> instantiate_all' (new_super_type ctxt thm_infos) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
304 |
end |
43117 | 305 |
else instantiate_all' (NONE, ctxt) subs thm_infos |
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
306 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
307 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
308 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
309 |
(** overall procedure **) |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
310 |
|
43116 | 311 |
fun limit_rounds ctxt f = |
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
312 |
let |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
313 |
val max = Config.get ctxt max_rounds |
43117 | 314 |
fun round i x = if i > max then x else round (i + 1) (f ctxt i x) |
315 |
in round 1 end |
|
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
316 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
317 |
fun monomorph schematic_consts_of rthms ctxt = |
43116 | 318 |
let |
43117 | 319 |
val (thm_infos, (known_grounds, subs)) = prepare schematic_consts_of rthms |
43116 | 320 |
in |
321 |
if Symtab.is_empty known_grounds then |
|
322 |
(map (single o pair 0 o snd) rthms, ctxt) |
|
323 |
else |
|
43117 | 324 |
make_subst_ctxt ctxt thm_infos known_grounds subs |
43116 | 325 |
|> limit_rounds ctxt (collect_substitutions thm_infos) |
326 |
|> instantiate_all ctxt thm_infos |
|
327 |
end |
|
328 |
||
43041
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
329 |
|
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
330 |
end |
218e3943d504
added re-implemented monomorphizer for types with better control for number of generated instances (strict as opposed to the SMT monomorphizer) and with fact annotations controlling in which round certain facts are considered for monomorphization
boehmes
parents:
diff
changeset
|
331 |