Nominal/nominal_function.ML
changeset 3245 017e33849f4d
parent 3244 a44479bde681
equal deleted inserted replaced
3244:a44479bde681 3245:017e33849f4d
    10 signature NOMINAL_FUNCTION =
    10 signature NOMINAL_FUNCTION =
    11 sig
    11 sig
    12   include NOMINAL_FUNCTION_DATA
    12   include NOMINAL_FUNCTION_DATA
    13 
    13 
    14   val add_nominal_function: (binding * typ option * mixfix) list ->
    14   val add_nominal_function: (binding * typ option * mixfix) list ->
    15     (Attrib.binding * term) list ->  Nominal_Function_Common.nominal_function_config ->
    15     Specification.multi_specs ->  Nominal_Function_Common.nominal_function_config ->
    16     (Proof.context -> tactic) -> local_theory -> nominal_info * local_theory
    16     (Proof.context -> tactic) -> local_theory -> nominal_info * local_theory
    17 
    17 
    18   val add_nominal_function_cmd: (binding * string option * mixfix) list ->
    18   val add_nominal_function_cmd: (binding * string option * mixfix) list ->
    19     (Attrib.binding * string) list ->  Nominal_Function_Common.nominal_function_config ->
    19     Specification.multi_specs_cmd ->  Nominal_Function_Common.nominal_function_config ->
    20     (Proof.context -> tactic) -> bool -> local_theory -> nominal_info * local_theory
    20     (Proof.context -> tactic) -> bool -> local_theory -> nominal_info * local_theory
    21 
    21 
    22   val nominal_function: (binding * typ option * mixfix) list ->
    22   val nominal_function: (binding * typ option * mixfix) list ->
    23     (Attrib.binding * term) list ->  Nominal_Function_Common.nominal_function_config ->
    23     Specification.multi_specs ->  Nominal_Function_Common.nominal_function_config ->
    24     local_theory -> Proof.state
    24     local_theory -> Proof.state
    25 
    25 
    26   val nominal_function_cmd: (binding * string option * mixfix) list ->
    26   val nominal_function_cmd: (binding * string option * mixfix) list ->
    27     (Attrib.binding * string) list ->  Nominal_Function_Common.nominal_function_config ->
    27     Specification.multi_specs_cmd ->  Nominal_Function_Common.nominal_function_config ->
    28     bool -> local_theory -> Proof.state
    28     bool -> local_theory -> Proof.state
    29 
    29 
    30   val get_info : Proof.context -> term -> nominal_info
    30   val get_info : Proof.context -> term -> nominal_info
    31 end
    31 end
    32 
    32 
   100 
   100 
   101 
   101 
   102 
   102 
   103 val simp_attribs = map (Attrib.internal o K)
   103 val simp_attribs = map (Attrib.internal o K)
   104   [Simplifier.simp_add,
   104   [Simplifier.simp_add,
   105    Code.add_default_eqn_attribute,
   105    Code.add_default_eqn_attribute Code.Equation,
   106    Named_Theorems.add @{named_theorems nitpick_simp}]
   106    Named_Theorems.add @{named_theorems nitpick_simp}]
   107 
   107 
   108 val psimp_attribs = map (Attrib.internal o K)
   108 val psimp_attribs = map (Attrib.internal o K)
   109   [Named_Theorems.add @{named_theorems nitpick_psimp}]
   109   [Named_Theorems.add @{named_theorems nitpick_psimp}]
   110 
   110 
   201     lthy'
   201     lthy'
   202     |> afterqed [[pattern_thm]]
   202     |> afterqed [[pattern_thm]]
   203   end
   203   end
   204 
   204 
   205 val add_nominal_function =
   205 val add_nominal_function =
   206   gen_add_nominal_function false Specification.check_spec (Type_Infer.anyT @{sort type})
   206   gen_add_nominal_function false Specification.check_multi_specs (Type_Infer.anyT @{sort type})
   207 fun add_nominal_function_cmd a b c d int = 
   207 fun add_nominal_function_cmd a b c d int = 
   208   gen_add_nominal_function int Specification.read_spec "_::type" a b c d
   208   gen_add_nominal_function int Specification.read_multi_specs "_::type" a b c d
   209 
   209 
   210 fun gen_nominal_function do_print prep default_constraint fixspec eqns config lthy =
   210 fun gen_nominal_function do_print prep default_constraint fixspec eqns config lthy =
   211   let
   211   let
   212     val ((goal_state, afterqed), lthy') =
   212     val ((goal_state, afterqed), lthy') =
   213       prepare_nominal_function do_print prep default_constraint fixspec eqns config lthy
   213       prepare_nominal_function do_print prep default_constraint fixspec eqns config lthy
   216     |> Proof.theorem NONE (snd oo afterqed) [[(Logic.unprotect (Thm.concl_of goal_state), [])]]
   216     |> Proof.theorem NONE (snd oo afterqed) [[(Logic.unprotect (Thm.concl_of goal_state), [])]]
   217     |> Proof.refine_singleton (Method.primitive_text (K (K goal_state)))
   217     |> Proof.refine_singleton (Method.primitive_text (K (K goal_state)))
   218   end
   218   end
   219 
   219 
   220 val nominal_function =
   220 val nominal_function =
   221   gen_nominal_function false Specification.check_spec (Type_Infer.anyT @{sort type})
   221   gen_nominal_function false Specification.check_multi_specs (Type_Infer.anyT @{sort type})
   222 fun nominal_function_cmd a b c int = 
   222 fun nominal_function_cmd a b c int = 
   223   gen_nominal_function int Specification.read_spec "_::type" a b c
   223   gen_nominal_function int Specification.read_multi_specs "_::type" a b c
   224 
   224 
   225 fun get_info ctxt t = Item_Net.retrieve (get_function ctxt) t
   225 fun get_info ctxt t = Item_Net.retrieve (get_function ctxt) t
   226   |> the_single |> snd
   226   |> the_single |> snd
   227 
   227 
   228 
   228 
   239   fun config_parser default =
   239   fun config_parser default =
   240     (Scan.optional (@{keyword "("} |-- Parse.!!! (Parse.list1 option_parser) --| @{keyword ")"}) [])
   240     (Scan.optional (@{keyword "("} |-- Parse.!!! (Parse.list1 option_parser) --| @{keyword ")"}) [])
   241      >> (fn opts => fold apply_opt opts default)
   241      >> (fn opts => fold apply_opt opts default)
   242 in
   242 in
   243   fun nominal_function_parser default_cfg =
   243   fun nominal_function_parser default_cfg =
   244       config_parser default_cfg -- Parse.fixes -- Parse_Spec.where_alt_specs
   244       config_parser default_cfg -- Parse_Spec.specification
   245 end
   245 end
   246 
   246 
   247 
       
   248 (* nominal *)
       
   249 val _ =
   247 val _ =
   250   Outer_Syntax.local_theory_to_proof' @{command_keyword nominal_function}
   248   Outer_Syntax.local_theory_to_proof' @{command_keyword nominal_function}
   251     "define general recursive nominal functions"
   249     "define general recursive nominal functions"
   252        (nominal_function_parser nominal_default_config
   250        (nominal_function_parser nominal_default_config
   253           >> (fn ((config, fixes), statements) => nominal_function_cmd fixes statements config))
   251           >> (fn (config, (fixes, specs)) => nominal_function_cmd fixes specs config))
   254 
       
   255 
   252 
   256 end
   253 end