src/HOL/Mirabelle/Tools/mirabelle_sledgehammer.ML
changeset 45514 973bb7846505
parent 45512 a6cce8032fff
child 45519 cd6e78cb6ee8
equal deleted inserted replaced
45513:25388cf06437 45514:973bb7846505
     9 val prover_timeoutK = "prover_timeout"
     9 val prover_timeoutK = "prover_timeout"
    10 val keepK = "keep"
    10 val keepK = "keep"
    11 val type_encK = "type_enc"
    11 val type_encK = "type_enc"
    12 val soundK = "sound"
    12 val soundK = "sound"
    13 val slicingK = "slicing"
    13 val slicingK = "slicing"
    14 val lambda_transK = "lambda_trans"
    14 val lam_transK = "lam_trans"
    15 val e_weight_methodK = "e_weight_method"
    15 val e_weight_methodK = "e_weight_method"
    16 val force_sosK = "force_sos"
    16 val force_sosK = "force_sos"
    17 val max_relevantK = "max_relevant"
    17 val max_relevantK = "max_relevant"
    18 val max_callsK = "max_calls"
    18 val max_callsK = "max_calls"
    19 val minimizeK = "minimize"
    19 val minimizeK = "minimize"
   353 datatype sh_result =
   353 datatype sh_result =
   354   SH_OK of int * int * (string * locality) list |
   354   SH_OK of int * int * (string * locality) list |
   355   SH_FAIL of int * int |
   355   SH_FAIL of int * int |
   356   SH_ERROR
   356   SH_ERROR
   357 
   357 
   358 fun run_sh prover_name prover type_enc sound max_relevant slicing lambda_trans
   358 fun run_sh prover_name prover type_enc sound max_relevant slicing lam_trans
   359         e_weight_method force_sos hard_timeout timeout dir pos st =
   359         e_weight_method force_sos hard_timeout timeout dir pos st =
   360   let
   360   let
   361     val {context = ctxt, facts = chained_ths, goal} = Proof.goal st
   361     val {context = ctxt, facts = chained_ths, goal} = Proof.goal st
   362     val i = 1
   362     val i = 1
   363     fun set_file_name (SOME dir) =
   363     fun set_file_name (SOME dir) =
   369           ^ serial_string ())
   369           ^ serial_string ())
   370       | set_file_name NONE = I
   370       | set_file_name NONE = I
   371     val st' =
   371     val st' =
   372       st |> Proof.map_context
   372       st |> Proof.map_context
   373                 (set_file_name dir
   373                 (set_file_name dir
   374                  #> (Option.map (Config.put
       
   375                        Sledgehammer_Provers.atp_lambda_trans)
       
   376                        lambda_trans |> the_default I)
       
   377                  #> (Option.map (Config.put ATP_Systems.e_weight_method)
   374                  #> (Option.map (Config.put ATP_Systems.e_weight_method)
   378                        e_weight_method |> the_default I)
   375                        e_weight_method |> the_default I)
   379                  #> (Option.map (Config.put ATP_Systems.force_sos)
   376                  #> (Option.map (Config.put ATP_Systems.force_sos)
   380                        force_sos |> the_default I))
   377                        force_sos |> the_default I))
   381     val params as {relevance_thresholds, max_relevant, slicing, ...} =
   378     val params as {relevance_thresholds, max_relevant, slicing, ...} =
   382       Sledgehammer_Isar.default_params ctxt
   379       Sledgehammer_Isar.default_params ctxt
   383           [("verbose", "true"),
   380           [("verbose", "true"),
   384            ("type_enc", type_enc),
   381            ("type_enc", type_enc),
   385            ("sound", sound),
   382            ("sound", sound),
       
   383            ("lam_trans", lam_trans |> the_default "smart"),
   386            ("preplay_timeout", preplay_timeout),
   384            ("preplay_timeout", preplay_timeout),
   387            ("max_relevant", max_relevant),
   385            ("max_relevant", max_relevant),
   388            ("slicing", slicing),
   386            ("slicing", slicing),
   389            ("timeout", string_of_int timeout),
   387            ("timeout", string_of_int timeout),
   390            ("preplay_timeout", preplay_timeout)]
   388            ("preplay_timeout", preplay_timeout)]
   463     val (prover_name, prover) = get_prover (Proof.context_of st) args
   461     val (prover_name, prover) = get_prover (Proof.context_of st) args
   464     val type_enc = AList.lookup (op =) args type_encK |> the_default "smart"
   462     val type_enc = AList.lookup (op =) args type_encK |> the_default "smart"
   465     val sound = AList.lookup (op =) args soundK |> the_default "false"
   463     val sound = AList.lookup (op =) args soundK |> the_default "false"
   466     val max_relevant = AList.lookup (op =) args max_relevantK |> the_default "smart"
   464     val max_relevant = AList.lookup (op =) args max_relevantK |> the_default "smart"
   467     val slicing = AList.lookup (op =) args slicingK |> the_default "true"
   465     val slicing = AList.lookup (op =) args slicingK |> the_default "true"
   468     val lambda_trans = AList.lookup (op =) args lambda_transK
   466     val lam_trans = AList.lookup (op =) args lam_transK
   469     val e_weight_method = AList.lookup (op =) args e_weight_methodK
   467     val e_weight_method = AList.lookup (op =) args e_weight_methodK
   470     val force_sos = AList.lookup (op =) args force_sosK
   468     val force_sos = AList.lookup (op =) args force_sosK
   471       |> Option.map (curry (op <>) "false")
   469       |> Option.map (curry (op <>) "false")
   472     val dir = AList.lookup (op =) args keepK
   470     val dir = AList.lookup (op =) args keepK
   473     val timeout = Mirabelle.get_int_setting args (prover_timeoutK, 30)
   471     val timeout = Mirabelle.get_int_setting args (prover_timeoutK, 30)
   474     (* always use a hard timeout, but give some slack so that the automatic
   472     (* always use a hard timeout, but give some slack so that the automatic
   475        minimizer has a chance to do its magic *)
   473        minimizer has a chance to do its magic *)
   476     val hard_timeout = SOME (2 * timeout)
   474     val hard_timeout = SOME (2 * timeout)
   477     val (msg, result) =
   475     val (msg, result) =
   478       run_sh prover_name prover type_enc sound max_relevant slicing lambda_trans
   476       run_sh prover_name prover type_enc sound max_relevant slicing lam_trans
   479         e_weight_method force_sos hard_timeout timeout dir pos st
   477         e_weight_method force_sos hard_timeout timeout dir pos st
   480   in
   478   in
   481     case result of
   479     case result of
   482       SH_OK (time_isa, time_prover, names) =>
   480       SH_OK (time_isa, time_prover, names) =>
   483         let
   481         let
   574         if !reconstructor = "sledgehammer_tac" then
   572         if !reconstructor = "sledgehammer_tac" then
   575           sledge_tac 0.2 ATP_Systems.z3_tptpN "mono_simple"
   573           sledge_tac 0.2 ATP_Systems.z3_tptpN "mono_simple"
   576           ORELSE' sledge_tac 0.2 ATP_Systems.eN "mono_guards??"
   574           ORELSE' sledge_tac 0.2 ATP_Systems.eN "mono_guards??"
   577           ORELSE' sledge_tac 0.2 ATP_Systems.vampireN "mono_guards??"
   575           ORELSE' sledge_tac 0.2 ATP_Systems.vampireN "mono_guards??"
   578           ORELSE' sledge_tac 0.2 ATP_Systems.spassN "poly_tags"
   576           ORELSE' sledge_tac 0.2 ATP_Systems.spassN "poly_tags"
   579           ORELSE' Metis_Tactic.metis_tac [] ctxt thms
   577           ORELSE' Metis_Tactic.metis_tac [] ATP_Translate.combinatorsN ctxt thms
   580         else if !reconstructor = "smt" then
   578         else if !reconstructor = "smt" then
   581           SMT_Solver.smt_tac ctxt thms
   579           SMT_Solver.smt_tac ctxt thms
   582         else if full orelse !reconstructor = "metis (full_types)" then
   580         else if full orelse !reconstructor = "metis (full_types)" then
   583           Metis_Tactic.metis_tac [Metis_Tactic.full_type_enc] ctxt thms
   581           Metis_Tactic.metis_tac [Metis_Tactic.full_type_enc]
       
   582                                  ATP_Translate.combinatorsN ctxt thms
   584         else if !reconstructor = "metis (no_types)" then
   583         else if !reconstructor = "metis (no_types)" then
   585           Metis_Tactic.metis_tac [Metis_Tactic.no_type_enc] ctxt thms
   584           Metis_Tactic.metis_tac [Metis_Tactic.no_type_enc]
       
   585                                  ATP_Translate.combinatorsN ctxt thms
   586         else if !reconstructor = "metis" then
   586         else if !reconstructor = "metis" then
   587           Metis_Tactic.metis_tac [] ctxt thms
   587           Metis_Tactic.metis_tac [] ATP_Translate.combinatorsN ctxt thms
   588         else
   588         else
   589           K all_tac
   589           K all_tac
   590       end
   590       end
   591     fun apply_reconstructor named_thms =
   591     fun apply_reconstructor named_thms =
   592       Mirabelle.can_apply timeout (do_reconstructor named_thms) st
   592       Mirabelle.can_apply timeout (do_reconstructor named_thms) st