src/HOL/Tools/Sledgehammer/sledgehammer_isar.ML
changeset 36960 01594f816e3a
parent 36924 ff01d3ae9ad4
child 37171 fc1e20373e6a
equal deleted inserted replaced
36959:f5417836dbea 36960:01594f816e3a
    22 open Sledgehammer_Fact_Preprocessor
    22 open Sledgehammer_Fact_Preprocessor
    23 open ATP_Manager
    23 open ATP_Manager
    24 open ATP_Systems
    24 open ATP_Systems
    25 open Sledgehammer_Fact_Minimizer
    25 open Sledgehammer_Fact_Minimizer
    26 
    26 
    27 structure K = OuterKeyword and P = OuterParse
       
    28 
       
    29 (** Proof method used in Isar proofs **)
    27 (** Proof method used in Isar proofs **)
    30 
    28 
    31 val neg_clausify_setup =
    29 val neg_clausify_setup =
    32   Method.setup @{binding neg_clausify}
    30   Method.setup @{binding neg_clausify}
    33                (Scan.succeed (SIMPLE_METHOD' o neg_clausify_tac))
    31                (Scan.succeed (SIMPLE_METHOD' o neg_clausify_tac))
    34                "conversion of goal to negated conjecture clauses"
    32                "conversion of goal to negated conjecture clauses"
    35 
    33 
    36 (** Attribute for converting a theorem into clauses **)
    34 (** Attribute for converting a theorem into clauses **)
    37 
    35 
    38 val parse_clausify_attribute : attribute context_parser =
    36 val parse_clausify_attribute : attribute context_parser =
    39   Scan.lift OuterParse.nat
    37   Scan.lift Parse.nat
    40   >> (fn i => Thm.rule_attribute (fn context => fn th =>
    38   >> (fn i => Thm.rule_attribute (fn context => fn th =>
    41                   let val thy = Context.theory_of context in
    39                   let val thy = Context.theory_of context in
    42                     Meson.make_meta_clause (nth (cnf_axiom thy th) i)
    40                     Meson.make_meta_clause (nth (cnf_axiom thy th) i)
    43                   end))
    41                   end))
    44 
    42 
   319                             | params =>
   317                             | params =>
   320                               (map check_raw_param params;
   318                               (map check_raw_param params;
   321                                params |> map string_for_raw_param
   319                                params |> map string_for_raw_param
   322                                       |> sort_strings |> cat_lines)))))
   320                                       |> sort_strings |> cat_lines)))))
   323 
   321 
   324 val parse_key = Scan.repeat1 P.typ_group >> space_implode " "
   322 val parse_key = Scan.repeat1 Parse.typ_group >> space_implode " "
   325 val parse_value = Scan.repeat1 P.xname
   323 val parse_value = Scan.repeat1 Parse.xname
   326 val parse_param = parse_key -- Scan.optional (P.$$$ "=" |-- parse_value) []
   324 val parse_param = parse_key -- Scan.optional (Parse.$$$ "=" |-- parse_value) []
   327 val parse_params = Scan.optional (Args.bracks (P.list parse_param)) []
   325 val parse_params = Scan.optional (Args.bracks (Parse.list parse_param)) []
   328 val parse_fact_refs =
   326 val parse_fact_refs =
   329   Scan.repeat1 (Scan.unless (P.name -- Args.colon)
   327   Scan.repeat1 (Scan.unless (Parse.name -- Args.colon)
   330                             (P.xname -- Scan.option Attrib.thm_sel)
   328                             (Parse.xname -- Scan.option Attrib.thm_sel)
   331                 >> (fn (name, interval) =>
   329                 >> (fn (name, interval) =>
   332                        Facts.Named ((name, Position.none), interval)))
   330                        Facts.Named ((name, Position.none), interval)))
   333 val parse_relevance_chunk =
   331 val parse_relevance_chunk =
   334   (Args.add |-- Args.colon |-- parse_fact_refs >> add_to_relevance_override)
   332   (Args.add |-- Args.colon |-- parse_fact_refs >> add_to_relevance_override)
   335   || (Args.del |-- Args.colon |-- parse_fact_refs
   333   || (Args.del |-- Args.colon |-- parse_fact_refs
   338 val parse_relevance_override =
   336 val parse_relevance_override =
   339   Scan.optional (Args.parens (Scan.repeat parse_relevance_chunk
   337   Scan.optional (Args.parens (Scan.repeat parse_relevance_chunk
   340                               >> merge_relevance_overrides))
   338                               >> merge_relevance_overrides))
   341                 (add_to_relevance_override [])
   339                 (add_to_relevance_override [])
   342 val parse_sledgehammer_command =
   340 val parse_sledgehammer_command =
   343   (Scan.optional P.short_ident runN -- parse_params -- parse_relevance_override
   341   (Scan.optional Parse.short_ident runN -- parse_params -- parse_relevance_override
   344    -- Scan.option P.nat) #>> sledgehammer_trans
   342    -- Scan.option Parse.nat) #>> sledgehammer_trans
   345 val parse_sledgehammer_params_command =
   343 val parse_sledgehammer_params_command =
   346   parse_params #>> sledgehammer_params_trans
   344   parse_params #>> sledgehammer_params_trans
   347 
   345 
   348 val _ =
   346 val _ =
   349   OuterSyntax.improper_command sledgehammerN
   347   Outer_Syntax.improper_command sledgehammerN
   350       "search for first-order proof using automatic theorem provers" K.diag
   348       "search for first-order proof using automatic theorem provers" Keyword.diag
   351       parse_sledgehammer_command
   349       parse_sledgehammer_command
   352 val _ =
   350 val _ =
   353   OuterSyntax.command sledgehammer_paramsN
   351   Outer_Syntax.command sledgehammer_paramsN
   354       "set and display the default parameters for Sledgehammer" K.thy_decl
   352       "set and display the default parameters for Sledgehammer" Keyword.thy_decl
   355       parse_sledgehammer_params_command
   353       parse_sledgehammer_params_command
   356 
   354 
   357 val setup =
   355 val setup =
   358   neg_clausify_setup
   356   neg_clausify_setup
   359   #> clausify_setup
   357   #> clausify_setup