open Ctr_Sugar_Util open Ctr_Sugar_Tactics open BNF_Util open BNF_Def open BNF_FP_Util open BNF_FP_Def_Sugar open BNF_FP_Rec_Sugar_Util open BNF_LFP_Rec_Sugar
val transferN = "transfer";
val transfer_rule_attrs = @{attributes [transfer_rule]};
fun set_transfer_rule_attrs thms =
snd o Local_Theory.notes [(Binding.empty_atts, [(thms, transfer_rule_attrs)])];
fun mk_lfp_rec_sugar_transfer_tac ctxt def =
unfold_thms_tac ctxt [def] THEN HEADGOAL (Transfer.transfer_prover_tac ctxt);
fun mk_gfp_rec_sugar_transfer_tac ctxt f_def corec_def type_definitions dtor_corec_transfers
rel_pre_defs disc_eq_cases cases case_distribs case_congs = let fun instantiate_with_lambda thm = let val prop as \<^Const_>\<open>Trueprop for \<open>\<^Const_>\<open>HOL.eq _ for \<open>Var (_, fT) $ _\<close> _\<close>\<close>\<close> =
Thm.prop_of thm; val T = range_type fT; val j = Term.maxidx_of_term prop + 1; val cond = Var (("x", j), HOLogic.boolT); val then_branch = Var (("t", j), T); val else_branch = Var (("e", j), T); val lam = Term.lambda cond (mk_If cond then_branch else_branch); in
infer_instantiate' ctxt [SOME (Thm.cterm_of ctxt lam)] thm end;
val transfer_rules =
@{thm Abs_transfer[OF type_definition_id_bnf_UNIV type_definition_id_bnf_UNIV]} :: map (fn thm => @{thm Abs_transfer} OF [thm, thm]) type_definitions @ map (Local_Defs.unfold0 ctxt rel_pre_defs) dtor_corec_transfers; val add_transfer_rule = Thm.attribute_declaration Transfer.transfer_add; val ctxt' = Context.proof_map (fold add_transfer_rule transfer_rules) ctxt;
val case_distribs = map instantiate_with_lambda case_distribs; val simps = case_distribs @ disc_eq_cases @ cases @ @{thms if_True if_False}; val ctxt'' = put_simpset (simpset_of (ss_only simps ctxt)) ctxt'; in
unfold_thms_tac ctxt ([f_def, corec_def] @ @{thms split_beta if_conn}) THEN
HEADGOAL (simp_tac (fold Simplifier.add_cong case_congs ctxt'')) THEN
HEADGOAL (Transfer.transfer_prover_tac ctxt') end;
fun massage_simple_notes base =
filter_out (null o #2)
#> map (fn (thmN, thms, f_attrs) =>
((Binding.qualify true base (Binding.name thmN), []),
map_index (fn (kk, thm) => ([thm], f_attrs kk)) thms));
fun fp_sugar_of_bnf ctxt = fp_sugar_of ctxt o (fn Type (s, _) => s) o T_of_bnf;
fun bnf_depth_first_traverse ctxt f T =
(case T of Type (s, Ts) =>
(case bnf_of ctxt s of
NONE => I
| SOME bnf => fold (bnf_depth_first_traverse ctxt f) Ts o f bnf)
| _ => I);
fun mk_goal lthy f = let val skematic_Ts = Term.add_tvarsT (fastype_of f) [];
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.