4 Minimalization of theorem list for metis by using an external automated theorem prover |
4 Minimalization of theorem list for metis by using an external automated theorem prover |
5 *) |
5 *) |
6 |
6 |
7 signature ATP_MINIMAL = |
7 signature ATP_MINIMAL = |
8 sig |
8 sig |
9 val minimalize: AtpWrapper.prover -> string -> int -> Proof.state -> |
9 val minimalize: ATP_Wrapper.prover -> string -> int -> Proof.state -> |
10 (string * thm list) list -> ((string * thm list) list * int) option * string |
10 (string * thm list) list -> ((string * thm list) list * int) option * string |
11 end |
11 end |
12 |
12 |
13 structure AtpMinimal: ATP_MINIMAL = |
13 structure ATP_Minimal: ATP_MINIMAL = |
14 struct |
14 struct |
15 |
15 |
16 (* output control *) |
16 (* output control *) |
17 |
17 |
18 fun debug str = Output.debug (fn () => str) |
18 fun debug str = Output.debug (fn () => str) |
97 ("# Cannot determine problem status within resource limit", Timeout), |
97 ("# Cannot determine problem status within resource limit", Timeout), |
98 ("Error", Error)] |
98 ("Error", Error)] |
99 |
99 |
100 fun produce_answer result = |
100 fun produce_answer result = |
101 let |
101 let |
102 val AtpWrapper.Prover_Result {success, message, proof=result_string, |
102 val ATP_Wrapper.Prover_Result {success, message, proof=result_string, |
103 internal_thm_names=thm_name_vec, filtered_clauses=filtered, ...} = result |
103 internal_thm_names=thm_name_vec, filtered_clauses=filtered, ...} = result |
104 in |
104 in |
105 if success then |
105 if success then |
106 (Success (Vector.foldr op:: [] thm_name_vec, filtered), result_string) |
106 (Success (Vector.foldr op:: [] thm_name_vec, filtered), result_string) |
107 else |
107 else |
114 else |
114 else |
115 (Failure, result_string) |
115 (Failure, result_string) |
116 end |
116 end |
117 end |
117 end |
118 |
118 |
|
119 |
119 (* wrapper for calling external prover *) |
120 (* wrapper for calling external prover *) |
120 |
121 |
121 fun sh_test_thms prover time_limit subgoalno state filtered name_thms_pairs = |
122 fun sh_test_thms prover time_limit subgoalno state filtered name_thms_pairs = |
122 let |
123 let |
123 val _ = println ("Testing " ^ (length_string name_thms_pairs) ^ " theorems... ") |
124 val _ = println ("Testing " ^ (length_string name_thms_pairs) ^ " theorems... ") |
124 val name_thm_pairs = maps (fn (n, ths) => map (pair n) ths) name_thms_pairs |
125 val name_thm_pairs = maps (fn (n, ths) => map (pair n) ths) name_thms_pairs |
125 val _ = debug_fn (fn () => print_names name_thm_pairs) |
126 val _ = debug_fn (fn () => print_names name_thm_pairs) |
126 val axclauses = ResAxioms.cnf_rules_pairs (Proof.theory_of state) name_thm_pairs |
127 val axclauses = ResAxioms.cnf_rules_pairs (Proof.theory_of state) name_thm_pairs |
127 val problem = AtpWrapper.ATP_Problem { |
128 val problem = ATP_Wrapper.ATP_Problem { |
128 with_full_types = AtpManager.get_full_types (), |
129 with_full_types = ATP_Manager.get_full_types (), |
129 subgoal = subgoalno, |
130 subgoal = subgoalno, |
130 goal = Proof.get_goal state, |
131 goal = Proof.get_goal state, |
131 axiom_clauses = SOME axclauses, |
132 axiom_clauses = SOME axclauses, |
132 filtered_clauses = filtered } |
133 filtered_clauses = filtered } |
133 val (result, proof) = produce_answer (prover problem time_limit) |
134 val (result, proof) = produce_answer (prover problem time_limit) |
222 |
223 |
223 fun sh_min_command args thm_names state = |
224 fun sh_min_command args thm_names state = |
224 let |
225 let |
225 val (prover_name, time_limit) = get_options args |
226 val (prover_name, time_limit) = get_options args |
226 val prover = |
227 val prover = |
227 case AtpManager.get_prover prover_name (Proof.theory_of state) of |
228 case ATP_Manager.get_prover prover_name (Proof.theory_of state) of |
228 SOME prover => prover |
229 SOME prover => prover |
229 | NONE => error ("Unknown prover: " ^ quote prover_name) |
230 | NONE => error ("Unknown prover: " ^ quote prover_name) |
230 val name_thms_pairs = get_thms (Proof.context_of state) thm_names |
231 val name_thms_pairs = get_thms (Proof.context_of state) thm_names |
231 fun print_answer (_, msg) = answer msg |
232 fun print_answer (_, msg) = answer msg |
232 in |
233 in |