src/HOL/Tools/Function/function_common.ML
changeset 63004 f507e6fe1d77
parent 63002 56cf1249ee20
child 63005 d743bb1b6c23
equal deleted inserted replaced
63003:bf5fcc65586b 63004:f507e6fe1d77
     6 
     6 
     7 signature FUNCTION_DATA =
     7 signature FUNCTION_DATA =
     8 sig
     8 sig
     9   type info =
     9   type info =
    10    {is_partial : bool,
    10    {is_partial : bool,
    11     defname : string,
    11     defname : binding,
    12       (*contains no logical entities: invariant under morphisms:*)
    12       (*contains no logical entities: invariant under morphisms:*)
    13     add_simps : (binding -> binding) -> string -> (binding -> binding) ->
    13     add_simps : (binding -> binding) -> string -> (binding -> binding) ->
    14       Token.src list -> thm list -> local_theory -> thm list * local_theory,
    14       Token.src list -> thm list -> local_theory -> thm list * local_theory,
    15     fnames : string list,
    15     fnames : binding list,
    16     case_names : string list,
    16     case_names : string list,
    17     fs : term list,
    17     fs : term list,
    18     R : term,
    18     R : term,
    19     dom: term,
    19     dom: term,
    20     psimps: thm list,
    20     psimps: thm list,
    30 structure Function_Data : FUNCTION_DATA =
    30 structure Function_Data : FUNCTION_DATA =
    31 struct
    31 struct
    32 
    32 
    33 type info =
    33 type info =
    34  {is_partial : bool,
    34  {is_partial : bool,
    35   defname : string,
    35   defname : binding,
    36     (*contains no logical entities: invariant under morphisms:*)
    36     (*contains no logical entities: invariant under morphisms:*)
    37   add_simps : (binding -> binding) -> string -> (binding -> binding) ->
    37   add_simps : (binding -> binding) -> string -> (binding -> binding) ->
    38     Token.src list -> thm list -> local_theory -> thm list * local_theory,
    38     Token.src list -> thm list -> local_theory -> thm list * local_theory,
    39   fnames : string list,
    39   fnames : binding list,
    40   case_names : string list,
    40   case_names : string list,
    41   fs : term list,
    41   fs : term list,
    42   R : term,
    42   R : term,
    43   dom: term,
    43   dom: term,
    44   psimps: thm list,
    44   psimps: thm list,
    96     simple_pinducts : thm list,
    96     simple_pinducts : thm list,
    97     cases : thm list,
    97     cases : thm list,
    98     pelims : thm list list,
    98     pelims : thm list list,
    99     termination : thm,
    99     termination : thm,
   100     domintros : thm list option}
   100     domintros : thm list option}
   101   val transform_function_data : info -> morphism -> info
   101   val transform_function_data : morphism -> info -> info
   102   val import_function_data : term -> Proof.context -> info option
   102   val import_function_data : term -> Proof.context -> info option
   103   val import_last_function : Proof.context -> info option
   103   val import_last_function : Proof.context -> info option
   104   val default_config : function_config
   104   val default_config : function_config
   105   val function_parser : function_config ->
   105   val function_parser : function_config ->
   106     ((function_config * (binding * string option * mixfix) list) *
   106     ((function_config * (binding * string option * mixfix) list) *
   298   cases : thm list,
   298   cases : thm list,
   299   pelims : thm list list,
   299   pelims : thm list list,
   300   termination : thm,
   300   termination : thm,
   301   domintros : thm list option}
   301   domintros : thm list option}
   302 
   302 
   303 fun transform_function_data ({add_simps, case_names, fnames, fs, R, dom, psimps, pinducts,
   303 fun transform_function_data phi ({add_simps, case_names, fnames, fs, R, dom, psimps, pinducts,
   304   simps, inducts, termination, defname, is_partial, cases, pelims, elims} : info) phi =
   304   simps, inducts, termination, defname, is_partial, cases, pelims, elims} : info) =
   305     let
   305     let
   306       val term = Morphism.term phi
   306       val term = Morphism.term phi
   307       val thm = Morphism.thm phi
   307       val thm = Morphism.thm phi
   308       val fact = Morphism.fact phi
   308       val fact = Morphism.fact phi
   309       val name = Binding.name_of o Morphism.binding phi o Binding.name
       
   310     in
   309     in
   311       { add_simps = add_simps, case_names = case_names, fnames = fnames,
   310       { add_simps = add_simps, case_names = case_names, fnames = fnames,
   312         fs = map term fs, R = term R, dom = term dom, psimps = fact psimps,
   311         fs = map term fs, R = term R, dom = term dom, psimps = fact psimps,
   313         pinducts = fact pinducts, simps = Option.map fact simps,
   312         pinducts = fact pinducts, simps = Option.map fact simps,
   314         inducts = Option.map fact inducts, termination = thm termination,
   313         inducts = Option.map fact inducts, termination = thm termination,
   315         defname = name defname, is_partial=is_partial, cases = fact cases,
   314         defname = Morphism.binding phi defname, is_partial=is_partial, cases = fact cases,
   316         elims = Option.map (map fact) elims, pelims = map fact pelims }
   315         elims = Option.map (map fact) elims, pelims = map fact pelims }
   317     end
   316     end
   318 
   317 
   319 fun lift_morphism ctxt f =
   318 fun lift_morphism ctxt f =
   320   let
   319   let
   331   let
   330   let
   332     val ct = Thm.cterm_of ctxt t
   331     val ct = Thm.cterm_of ctxt t
   333     val inst_morph = lift_morphism ctxt o Thm.instantiate
   332     val inst_morph = lift_morphism ctxt o Thm.instantiate
   334 
   333 
   335     fun match (trm, data) =
   334     fun match (trm, data) =
   336       SOME (transform_function_data data (inst_morph (Thm.match (Thm.cterm_of ctxt trm, ct))))
   335       SOME (transform_function_data (inst_morph (Thm.match (Thm.cterm_of ctxt trm, ct))) data)
   337         handle Pattern.MATCH => NONE
   336         handle Pattern.MATCH => NONE
   338   in
   337   in
   339     get_first match (Item_Net.retrieve (get_functions ctxt) t)
   338     get_first match (Item_Net.retrieve (get_functions ctxt) t)
   340   end
   339   end
   341 
   340