src/HOL/Tools/ATP_Manager/atp_minimal.ML
changeset 32936 9491bec20595
parent 32864 a226f29d4bdc
child 32937 34f66c9dd8a2
equal deleted inserted replaced
32935:2218b970325a 32936:9491bec20595
     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