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" |