src/HOL/Tools/Sledgehammer/sledgehammer_isar.ML
changeset 35866 513074557e06
child 35960 0e2d57686b3c
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/HOL/Tools/Sledgehammer/sledgehammer_isar.ML	Fri Mar 19 15:07:44 2010 +0100
     1.3 @@ -0,0 +1,87 @@
     1.4 +(*  Title:      HOL/Sledgehammer/sledgehammer_isar.ML
     1.5 +    Author:     Jasmin Blanchette, TU Muenchen
     1.6 +
     1.7 +Adds "sledgehammer" and related commands to Isabelle/Isar's outer syntax.
     1.8 +*)
     1.9 +
    1.10 +structure Sledgehammer_Isar : sig end =
    1.11 +struct
    1.12 +
    1.13 +open ATP_Manager
    1.14 +open ATP_Minimal
    1.15 +
    1.16 +structure K = OuterKeyword and P = OuterParse
    1.17 +
    1.18 +val _ =
    1.19 +  OuterSyntax.improper_command "atp_kill" "kill all managed provers" K.diag
    1.20 +    (Scan.succeed (Toplevel.no_timing o Toplevel.imperative kill));
    1.21 +
    1.22 +val _ =
    1.23 +  OuterSyntax.improper_command "atp_info" "print information about managed provers" K.diag
    1.24 +    (Scan.succeed (Toplevel.no_timing o Toplevel.imperative info));
    1.25 +
    1.26 +val _ =
    1.27 +  OuterSyntax.improper_command "atp_messages" "print recent messages issued by managed provers" K.diag
    1.28 +    (Scan.option (P.$$$ "(" |-- P.nat --| P.$$$ ")") >>
    1.29 +      (fn limit => Toplevel.no_timing o Toplevel.imperative (fn () => messages limit)));
    1.30 +
    1.31 +val _ =
    1.32 +  OuterSyntax.improper_command "print_atps" "print external provers" K.diag
    1.33 +    (Scan.succeed (Toplevel.no_timing o Toplevel.unknown_theory o
    1.34 +      Toplevel.keep (print_provers o Toplevel.theory_of)));
    1.35 +
    1.36 +val _ =
    1.37 +  OuterSyntax.command "sledgehammer"
    1.38 +    "search for first-order proof using automatic theorem provers" K.diag
    1.39 +    (Scan.repeat P.xname >> (fn names => Toplevel.no_timing o Toplevel.unknown_proof o
    1.40 +      Toplevel.keep (sledgehammer names o Toplevel.proof_of)));
    1.41 +
    1.42 +val default_minimize_prover = "remote_vampire"
    1.43 +val default_minimize_time_limit = 5
    1.44 +
    1.45 +fun atp_minimize_command args thm_names state =
    1.46 +  let
    1.47 +    fun theorems_from_names ctxt =
    1.48 +      map (fn (name, interval) =>
    1.49 +              let
    1.50 +                val thmref = Facts.Named ((name, Position.none), interval)
    1.51 +                val ths = ProofContext.get_fact ctxt thmref
    1.52 +                val name' = Facts.string_of_ref thmref
    1.53 +              in (name', ths) end)
    1.54 +    fun get_time_limit_arg time_string =
    1.55 +      (case Int.fromString time_string of
    1.56 +        SOME t => t
    1.57 +      | NONE => error ("Invalid time limit: " ^ quote time_string))
    1.58 +    fun get_opt (name, a) (p, t) =
    1.59 +      (case name of
    1.60 +        "time" => (p, get_time_limit_arg a)
    1.61 +      | "atp" => (a, t)
    1.62 +      | n => error ("Invalid argument: " ^ n))
    1.63 +    fun get_options args =
    1.64 +      fold get_opt args (default_minimize_prover, default_minimize_time_limit)
    1.65 +    val (prover_name, time_limit) = get_options args
    1.66 +    val prover =
    1.67 +      (case ATP_Manager.get_prover (Proof.theory_of state) prover_name of
    1.68 +        SOME prover => prover
    1.69 +      | NONE => error ("Unknown prover: " ^ quote prover_name))
    1.70 +    val name_thms_pairs = theorems_from_names (Proof.context_of state) thm_names
    1.71 +  in
    1.72 +    writeln (#2 (minimize_theorems linear_minimize prover prover_name time_limit
    1.73 +                                   state name_thms_pairs))
    1.74 +  end
    1.75 +
    1.76 +local structure K = OuterKeyword and P = OuterParse in
    1.77 +
    1.78 +val parse_args =
    1.79 +  Scan.optional (Args.bracks (P.list (P.xname --| P.$$$ "=" -- P.xname))) []
    1.80 +val parse_thm_names = Scan.repeat (P.xname -- Scan.option Attrib.thm_sel)
    1.81 +
    1.82 +val _ =
    1.83 +  OuterSyntax.command "atp_minimize" "minimize theorem list with external prover" K.diag
    1.84 +    (parse_args -- parse_thm_names >> (fn (args, thm_names) =>
    1.85 +      Toplevel.no_timing o Toplevel.unknown_proof o
    1.86 +        Toplevel.keep (atp_minimize_command args thm_names o Toplevel.proof_of)))
    1.87 +
    1.88 +end
    1.89 +
    1.90 +end;