77 pset_ctors: thm list
88 };
99
10+ type vvsubst_bs = {
11+ vvsubst: binding option,
12+ rel: binding option,
13+ psets: binding option list
14+ };
15+
1016 val vvsubst_result_of: local_theory -> string -> vvsubst_result option
1117 val register_vvsubst_result: string -> vvsubst_result -> local_theory -> local_theory
1218
13- val mrbnf_of_quotient_fixpoint: binding list -> (binding -> binding) -> MRBNF_FP_Def_Sugar.fp_result
19+ val mrbnf_of_quotient_fixpoint: vvsubst_bs list -> (binding -> binding) -> MRBNF_FP_Def_Sugar.fp_result
1420 -> string -> local_theory -> (MRBNF_Def.mrbnf * vvsubst_result) list * local_theory
1521end
1622
@@ -29,6 +35,12 @@ type vvsubst_result = {
2935 pset_ctors: thm list
3036};
3137
38+ type vvsubst_bs = {
39+ vvsubst: binding option,
40+ rel: binding option,
41+ psets: binding option list
42+ };
43+
3244fun morph_vvsubst_result phi { vvsubst_ctor, vvsubst_permute, psets, pset_ctors } = {
3345 vvsubst_ctor = Morphism.thm phi vvsubst_ctor,
3446 vvsubst_permute = Morphism.thm phi vvsubst_permute,
@@ -55,7 +67,7 @@ val vvsubst_result_of = vvsubst_result_of_generic o Context.Proof;
5567fun mk_supp_bound f = mk_ordLess (mk_card_of (mk_supp f))
5668 (mk_card_of (HOLogic.mk_UNIV (fst (dest_funT (fastype_of f)))));
5769
58- fun define_vvsubst_consts qualify names (fp_res : MRBNF_FP_Def_Sugar.fp_result) vars deadss (plives, plives', pbounds, pfrees) old_lthy =
70+ fun define_vvsubst_consts qualify vvsubst_bss (fp_res : MRBNF_FP_Def_Sugar.fp_result) vars deadss (plives, plives', pbounds, pfrees) old_lthy =
5971 let
6072 val subst = Term.typ_subst_atomic (plives ~~ plives');
6173
@@ -78,9 +90,13 @@ fun define_vvsubst_consts qualify names (fp_res : MRBNF_FP_Def_Sugar.fp_result)
7890 val Ts = map #T (#quotient_fps fp_res);
7991 fun replicate_rec xs = flat (map2 replicate (#rec_vars fp_res) xs);
8092
81- fun mk_pset_names (fps:'a MRBNF_FP_Def_Sugar.fp_result_T list) = map (fn raw => map (fn i =>
82- " set" ^ string_of_int (i + nvars) ^ " _" ^ short_type_name (fst (dest_Type (#T raw)))
83- ) (1 upto npassive)) fps;
93+ fun mk_pset_names public (fps:'a MRBNF_FP_Def_Sugar.fp_result_T list) = map2 (fn raw => fn vvsubst_bs => map2 (fn i => fn b =>
94+ let val def = " set" ^ string_of_int (i + nvars) ^ " _" ^ short_type_name (fst (dest_Type (#T raw)));
95+ in if public then case b of
96+ SOME b => Binding.name_of b
97+ | NONE => def
98+ else def end
99+ ) (1 upto npassive) (#psets vvsubst_bs)) fps vvsubst_bss;
84100 val ms = map (fn mrbnf => MRBNF_Def.free_of_mrbnf mrbnf + MRBNF_Def.bound_of_mrbnf mrbnf + MRBNF_Def.live_of_mrbnf mrbnf) mrbnfs;
85101 val mrbnf_setss = @{map 3 } (fn m => fn deads =>
86102 MRBNF_Def.mk_sets_of_mrbnf (replicate m deads)
@@ -97,7 +113,7 @@ fun define_vvsubst_consts qualify names (fp_res : MRBNF_FP_Def_Sugar.fp_result)
97113
98114 val (raw_psetss, lthy) =
99115 let
100- val namess = mk_pset_names (#raw_fps fp_res);
116+ val namess = mk_pset_names false (#raw_fps fp_res);
101117 val setss = map2 (fn raw => map2 (fn var => fn n =>
102118 Free (n, #T raw --> HOLogic.mk_setT var)
103119 ) (pfrees @ plives @ pbounds)) (#raw_fps fp_res) namess;
@@ -137,7 +153,7 @@ fun define_vvsubst_consts qualify names (fp_res : MRBNF_FP_Def_Sugar.fp_result)
137153 mk_def_t false Binding.empty qualify name 1 (Term.absfree (dest_Free v) (
138154 fst raw_pset $ (#rep (#inner quot) $ v)
139155 ))
140- )) (#quotient_fps fp_res) vs (mk_pset_names (#quotient_fps fp_res)) raw_psetss lthy;
156+ )) (#quotient_fps fp_res) vs (mk_pset_names true (#quotient_fps fp_res)) raw_psetss lthy;
141157
142158 val (rels_opt, lthy) = if length plives = 0 then (NONE , lthy) else
143159 let
@@ -163,10 +179,12 @@ fun define_vvsubst_consts qualify names (fp_res : MRBNF_FP_Def_Sugar.fp_result)
163179 ||>> apply2 transpose o chop (length (#bfree_vars fp_res));
164180 val bfree_setss = if null bfree_setss then replicate (length mrbnfs) [] else bfree_setss;
165181
166- val rels = map (fn quot => Free (" rel_" ^ short_type_name (fst (dest_Type (#T quot))),
182+ val rels = map2 (fn quot => fn vvsubst_bs =>
183+ let val def = " rel_" ^ short_type_name (fst (dest_Type (#T quot)));
184+ in Free (the_default def (Option.map Binding.name_of (#rel vvsubst_bs)),
167185 fold_rev (curry (op -->)) (map2 (fn a => fn b => a --> b --> @{typ bool}) plives plives')
168- (#T quot --> subst (#T quot) --> @{typ bool})
169- )) (#quotient_fps fp_res);
186+ (#T quot --> subst (#T quot) --> @{typ bool})) end
187+ ) (#quotient_fps fp_res) vvsubst_bss ;
170188
171189 val f_premss = @{map 4 } (fn rec_sets => fn x => fn bfree_sets =>
172190 flat o @{map 5 } (fn i => fn FVarss => fn f => fn rel => fn bset =>
@@ -237,7 +255,7 @@ fun define_vvsubst_consts qualify names (fp_res : MRBNF_FP_Def_Sugar.fp_result)
237255 lthy
238256 ) end ;
239257
240- fun mrbnf_of_quotient_fixpoint vvsubst_bs qualify (fp_result : MRBNF_FP_Def_Sugar.fp_result) QREC_fixed_name lthy =
258+ fun mrbnf_of_quotient_fixpoint vvsubst_bss qualify (fp_result : MRBNF_FP_Def_Sugar.fp_result) QREC_fixed_name lthy =
241259 let
242260 val mrbnfs = #pre_mrbnfs fp_result;
243261
@@ -266,7 +284,7 @@ fun mrbnf_of_quotient_fixpoint vvsubst_bs qualify (fp_result : MRBNF_FP_Def_Suga
266284 in map (Envir.subst_type tyenv) (MRBNF_Def.deads_of_mrbnf mrbnf) end
267285 ) (#pre_mrbnfs fp_res) (#raw_fps fp_res);
268286
269- val ((raw_psetss, psetss, rels_opt), lthy) = define_vvsubst_consts qualify names fp_res vars deadss passives lthy;
287+ val ((raw_psetss, psetss, rels_opt), lthy) = define_vvsubst_consts qualify vvsubst_bss fp_res vars deadss passives lthy;
270288
271289 val live = MRBNF_Def.live_of_mrbnf (hd mrbnfs);
272290 val frees = vars @ pfrees;
@@ -405,9 +423,9 @@ fun mrbnf_of_quotient_fixpoint vvsubst_bs qualify (fp_result : MRBNF_FP_Def_Suga
405423 ])) ctxt
406424 ])), Position.no_range), NONE ) state;
407425
408- val (vvsubsts, lthy) = @{fold_map 2 } (fn b =>
409- mk_def_t true Binding.empty qualify (Binding.name_of b) 0
410- ) vvsubst_bs (MRBNF_Recursor.get_RECs true " vvsubst" lthy) lthy;
426+ val (vvsubsts, lthy) = @{fold_map 3 } (fn b => fn T =>
427+ mk_def_t true Binding.empty qualify (the_default ( " map_ " ^ short_type_name (fst (dest_Type T))) (Option.map Binding.name_of b) ) 0
428+ ) (map #vvsubst vvsubst_bss) (map #T (#quotient_fps fp_res)) (MRBNF_Recursor.get_RECs true " vvsubst" lthy) lthy;
411429
412430 val vvsubst_cctors = @{map 6 } (fn vvsubst => fn quot => fn bsets => fn mrbnf => fn x => fn deads =>
413431 let
@@ -451,7 +469,7 @@ fun mrbnf_of_quotient_fixpoint vvsubst_bs qualify (fp_result : MRBNF_FP_Def_Suga
451469 let
452470 val (_, lthy) = Local_Theory.begin_nested lthy;
453471 val (picks, lthy) =
454- @{fold_map 4 } (fn quot => fn psets => fn vvsubst => fn b => fn lthy =>
472+ @{fold_map 3 } (fn quot => fn psets => fn vvsubst => fn lthy =>
455473 let
456474 fun mk_Eps f =
457475 let val f_T = fastype_of f;
@@ -487,8 +505,8 @@ fun mrbnf_of_quotient_fixpoint vvsubst_bs qualify (fp_result : MRBNF_FP_Def_Suga
487505 ))
488506 )
489507 );
490- in mk_def_t false b qualify " pick" (length fs + 1 ) rhs lthy end
491- ) (#quotient_fps fp_res) psetss vvsubsts vvsubst_bs lthy;
508+ in mk_def_t false (Binding.name ( " vvsubst_ " ^ short_type_name (fst (dest_Type (#T quot))))) qualify " pick" (length fs + 1 ) rhs lthy end
509+ ) (#quotient_fps fp_res) psetss vvsubsts lthy;
492510
493511 val (lthy, old_lthy) = `Local_Theory.end_nested lthy;
494512 val phi = Proof_Context.export_morphism old_lthy lthy;
0 commit comments