src/HOL/Tools/Function/function_core.ML
changeset 63005 d743bb1b6c23
parent 63004 f507e6fe1d77
child 63011 301e631666a0
equal deleted inserted replaced
63004:f507e6fe1d77 63005:d743bb1b6c23
   490 
   490 
   491 fun define_function defname (fname, mixfix) domT ranT G default lthy =
   491 fun define_function defname (fname, mixfix) domT ranT G default lthy =
   492   let
   492   let
   493     val f_def_binding =
   493     val f_def_binding =
   494       Thm.make_def_binding (Config.get lthy function_internals)
   494       Thm.make_def_binding (Config.get lthy function_internals)
   495         (Binding.map_name (suffix "_sumC") defname)
   495         (derived_name_suffix defname "_sumC")
   496     val f_def =
   496     val f_def =
   497       Abs ("x", domT, Const (@{const_name Fun_Def.THE_default}, ranT --> (ranT --> boolT) --> ranT)
   497       Abs ("x", domT, Const (@{const_name Fun_Def.THE_default}, ranT --> (ranT --> boolT) --> ranT)
   498         $ (default $ Bound 0) $ Abs ("y", ranT, G $ Bound 1 $ Bound 0))
   498         $ (default $ Bound 0) $ Abs ("y", ranT, G $ Bound 1 $ Bound 0))
   499       |> Syntax.check_term lthy
   499       |> Syntax.check_term lthy
   500   in
   500   in
   501     Local_Theory.define
   501     lthy |> Local_Theory.define
   502       ((Binding.name (function_name fname), mixfix), ((f_def_binding, []), f_def)) lthy
   502       ((Binding.name (fname ^ "C") (* FIXME proper binding *), mixfix), ((f_def_binding, []), f_def))
   503   end
   503   end
   504 
   504 
   505 fun define_recursion_relation (R_binding, R_type) qglrs clauses RCss lthy =
   505 fun define_recursion_relation (R_binding, R_type) qglrs clauses RCss lthy =
   506   let
   506   let
   507     val R = Free (Binding.name_of R_binding, R_type)
   507     val R = Free (Binding.name_of R_binding, R_type)
   849     val RCss = map find_calls trees
   849     val RCss = map find_calls trees
   850 
   850 
   851     val ((G, GIntro_thms, G_elim, G_induct), lthy) =
   851     val ((G, GIntro_thms, G_elim, G_induct), lthy) =
   852       PROFILE "def_graph"
   852       PROFILE "def_graph"
   853         (define_graph
   853         (define_graph
   854           (Binding.map_name graph_name defname, domT --> ranT --> boolT) fvar clauses RCss) lthy
   854           (derived_name_suffix defname "_graph", domT --> ranT --> boolT) fvar clauses RCss) lthy
   855 
   855 
   856     val ((f, (_, f_defthm)), lthy) =
   856     val ((f, (_, f_defthm)), lthy) =
   857       PROFILE "def_fun" (define_function defname (fname, mixfix) domT ranT G default) lthy
   857       PROFILE "def_fun" (define_function defname (fname, mixfix) domT ranT G default) lthy
   858 
   858 
   859     val RCss = map (map (inst_RC lthy fvar f)) RCss
   859     val RCss = map (map (inst_RC lthy fvar f)) RCss
   860     val trees = map (Function_Context_Tree.inst_tree lthy fvar f) trees
   860     val trees = map (Function_Context_Tree.inst_tree lthy fvar f) trees
   861 
   861 
   862     val ((R, RIntro_thmss, R_elim), lthy) =
   862     val ((R, RIntro_thmss, R_elim), lthy) =
   863       PROFILE "def_rel"
   863       PROFILE "def_rel"
   864         (define_recursion_relation (Binding.map_name rel_name defname, domT --> domT --> boolT)
   864         (define_recursion_relation (derived_name_suffix defname "_rel", domT --> domT --> boolT)
   865           abstract_qglrs clauses RCss) lthy
   865           abstract_qglrs clauses RCss) lthy
   866 
   866 
   867     val dom = mk_acc domT R
   867     val dom = mk_acc domT R
   868     val (_, lthy) =
   868     val (_, lthy) =
   869       Local_Theory.abbrev Syntax.mode_default
   869       Local_Theory.abbrev Syntax.mode_default
   870         (((Binding.map_name dom_name defname), NoSyn), dom) lthy
   870         ((name_suffix defname "_dom", NoSyn), dom) lthy
   871 
   871 
   872     val newthy = Proof_Context.theory_of lthy
   872     val newthy = Proof_Context.theory_of lthy
   873     val clauses = map (transfer_clause_ctx newthy) clauses
   873     val clauses = map (transfer_clause_ctx newthy) clauses
   874 
   874 
   875     val xclauses = PROFILE "xclauses"
   875     val xclauses = PROFILE "xclauses"