Skip to content

Commit 4f06b52

Browse files
committed
Allow to register pbmv monads
1 parent 49047f6 commit 4f06b52

File tree

1 file changed

+25
-3
lines changed

1 file changed

+25
-3
lines changed

Tools/bmv_monad_def.ML

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
258278
val 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

911933
end

0 commit comments

Comments
 (0)