@@ -72,6 +72,10 @@ signature BMV_MONAD_DEF = sig
7272
7373 val morph_bmv_monad: morphism -> bmv_monad -> bmv_monad;
7474
75+ val register_pbmv_monad: string -> bmv_monad -> local_theory -> local_theory;
76+ val pbmv_monad_of_generic: Context.generic -> string -> bmv_monad option;
77+ val pbmv_monad_of: Proof.context -> string -> bmv_monad option;
78+
7579 val pbmv_monad_of_bnf: BNF_Def.bnf -> local_theory -> bmv_monad * local_theory
7680 val bmv_monad_def: BNF_Def.inline_policy -> (Proof.context -> BNF_Def.fact_policy)
7781 -> (binding -> binding) -> bmv_monad_model -> local_theory -> (bmv_monad * thm list) * local_theory
@@ -255,6 +259,22 @@ fun morph_bmv_monad_model phi ({ ops, bd, var_class, frees, lives, lives', param
255259 bd_infinite_regular_card_order = bd_infinite_regular_card_order
256260} : bmv_monad_model;
257261
262+ structure Data = Generic_Data (
263+ type T = bmv_monad Symtab.table;
264+ val empty = Symtab.empty;
265+ fun merge data : T = Symtab.merge (K true ) data;
266+ );
267+
268+ fun register_pbmv_monad name bmv =
269+ Local_Theory.declaration {syntax = false , pervasive = true , pos = Position.none}
270+ (fn phi => Data.map (Symtab.update (name, morph_bmv_monad phi bmv)));
271+
272+ fun pbmv_monad_of_generic context =
273+ Option.map (morph_bmv_monad (Morphism.transfer_morphism (Context.theory_of context)))
274+ o Symtab.lookup (Data.get context);
275+
276+ val pbmv_monad_of = pbmv_monad_of_generic o Context.Proof;
277+
258278val mk_small_prems = map2 (fn rho => fn Inj => HOLogic.mk_Trueprop (mk_ordLess
259279 (mk_card_of (HOLogic.mk_Collect (" a" , fst (dest_funT (fastype_of Inj)),
260280 HOLogic.mk_not (HOLogic.mk_eq (rho $ Bound 0 , Inj $ Bound 0 ))
@@ -612,11 +632,13 @@ fun pbmv_monad_of_bnf bnf lthy =
612632 ||>> mk_TFrees' (map Type.sort_of_atyp (BNF_Def.deads_of_bnf bnf))
613633 val T = BNF_Def.mk_T_of_bnf deads lives bnf;
614634 val n = BNF_Def.live_of_bnf bnf;
615- val _ = @{print} ()
635+ val var_class = case BNF_Def.bd_of_bnf bnf of
636+ @{term natLeq} => @{class var}
637+ | _ => error " TODO: other var classes"
616638 in apfst fst (bmv_monad_def BNF_Def.Smart_Inline (K BNF_Def.Dont_Note) I {
617639 ops = [T],
618640 bd = BNF_Def.bd_of_bnf bnf,
619- var_class = @{class type } ,
641+ var_class = var_class ,
620642 leader = 0 ,
621643 frees = [],
622644 lives = lives,
@@ -905,7 +927,7 @@ fun compose_bmv_monad qualify (outer : bmv_monad) (inners : bmv_monad list) lthy
905927 Injs Vrs outer_Vrs
906928 } : bmv_monad_model;
907929
908- val (res, lthy) = bmv_monad_def BNF_Def.Smart_Inline (K BNF_Def.Dont_Note) I model lthy
930+ val (res, lthy) = bmv_monad_def BNF_Def.Smart_Inline (K BNF_Def.Dont_Note) qualify model lthy
909931 in (res, lthy) end ;
910932
911933end
0 commit comments