Skip to content

Commit f115e10

Browse files
committed
Add more complex lambda calculus example with second source of frees
1 parent 87fe196 commit f115e10

File tree

8 files changed

+502
-286
lines changed

8 files changed

+502
-286
lines changed

Tools/bmv_monad_def.ML

Lines changed: 171 additions & 122 deletions
Large diffs are not rendered by default.

Tools/mrbnf_sugar.ML

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -836,27 +836,6 @@ fun create_binder_datatype (spec : spec) lthy =
836836
K (Local_Defs.unfold0_tac ctxt (@{thms sum.inject} @ [#Abs_inject (snd info) OF @{thms UNIV_I UNIV_I}])),
837837
assume_tac ctxt
838838
];
839-
fun eta_compl_free_tac ctxt = EVERY1 [
840-
K (Local_Defs.unfold0_tac ctxt (
841-
@{thms comp_def sum.set_map UN_empty2 Un_empty_right Un_empty_left UN_singleton}
842-
@ MRBNF_Def.set_defs_of_mrbnf pre_mrbnf
843-
)),
844-
Subgoal.FOCUS_PARAMS (fn {context=ctxt, params, ...} =>
845-
rtac ctxt (infer_instantiate' ctxt [SOME (snd (hd params))] (#Abs_cases (snd info))) 1
846-
) ctxt,
847-
hyp_subst_tac ctxt,
848-
K (Local_Defs.unfold0_tac ctxt (@{thms image_iff bex_UNIV}
849-
@ [#Abs_inverse (snd info) OF @{thms UNIV_I}, #Abs_inject (snd info) OF @{thms UNIV_I UNIV_I}]
850-
)),
851-
etac ctxt @{thm contrapos_np},
852-
dtac ctxt @{thm iffD2[OF ex_in_conv]},
853-
etac ctxt exE,
854-
REPEAT_DETERM o etac ctxt @{thm UN_E},
855-
REPEAT_DETERM o eresolve_tac ctxt @{thms setl.cases setr.cases},
856-
hyp_subst_tac ctxt,
857-
rtac ctxt exI,
858-
rtac ctxt refl
859-
];
860839
fun eta_natural_tac ctxt = EVERY1 [
861840
K (Local_Defs.unfold0_tac ctxt (@{thms comp_def map_sum.simps}
862841
@ [#Abs_inverse (snd info) OF @{thms UNIV_I}, MRBNF_Def.map_def_of_mrbnf pre_mrbnf]
@@ -867,7 +846,6 @@ fun create_binder_datatype (spec : spec) lthy =
867846
val tvsubst_axioms = {
868847
eta_free = eta_free_tac,
869848
eta_inj = eta_inj_tac,
870-
eta_compl_free = eta_compl_free_tac,
871849
eta_natural = eta_natural_tac
872850
};
873851
val tvsubst_model = {
@@ -967,7 +945,8 @@ fun create_binder_datatype (spec : spec) lthy =
967945
val gs = map mk_map tys;
968946
val ts = map2 (fn g => fn x => case g of
969947
Const ("Fun.id", _) => x
970-
| _ => g $ x
948+
| _ => let val T = body_type (fastype_of g)
949+
in if fastype_of x = T orelse T = qT then g $ x else x end
971950
) gs xs;
972951

973952
fun mk_sets vars recs FVars_opt =

Tools/mrbnf_tvsubst.ML

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ sig
33
type 'a eta_axioms = {
44
eta_free: 'a,
55
eta_inj: 'a,
6-
eta_compl_free: 'a,
76
eta_natural: 'a
87
};
98

@@ -39,7 +38,6 @@ open MRBNF_Recursor
3938
type 'a eta_axioms = {
4039
eta_free: 'a,
4140
eta_inj: 'a,
42-
eta_compl_free: 'a,
4341
eta_natural: 'a
4442
};
4543

@@ -134,15 +132,6 @@ fun prove_model_axioms qualify res (models : (Proof.context -> tactic) tvsubst_m
134132
(Logic.mk_implies (mk_Trueprop_eq (fst eta $ a, fst eta $ b), mk_Trueprop_eq (a, b)))
135133
(fn {context, ...} => unfold_thms_tac context [snd eta] THEN #eta_inj tacs context);
136134

137-
val eta_compl_free = Goal.prove_sorry lthy [] []
138-
(Logic.all x (Logic.mk_implies (
139-
HOLogic.mk_Trueprop (HOLogic.mk_not (HOLogic.mk_mem (
140-
x, mk_image (fst eta) $ HOLogic.mk_UNIV aT
141-
))),
142-
mk_Trueprop_eq (set' $ x, mk_bot aT)
143-
)))
144-
(fn {context, ...} => unfold_thms_tac context [snd eta] THEN #eta_compl_free tacs context);
145-
146135
val f_prems = map mk_supp_bound free_fs
147136
@ maps (fn f => [mk_bij f, mk_supp_bound f]) bound_fs
148137
@ map mk_supp_bound bfree_fs;
@@ -168,7 +157,6 @@ fun prove_model_axioms qualify res (models : (Proof.context -> tactic) tvsubst_m
168157
in ((eta, {
169158
eta_free = eta_free,
170159
eta_inj = eta_inj,
171-
eta_compl_free = eta_compl_free,
172160
eta_natural = eta_natural
173161
}), lthy) end
174162
) eta_opt in (Option.map fst eta_opt', (i + 1, the_default lthy (Option.map snd eta_opt'))) end)
@@ -1388,24 +1376,6 @@ fun create_tvsubst_of_mrbnf qualify fp_res models lthy =
13881376
]) end
13891377
) (0 upto length models - 1) (#pre_mrbnfs fp_res) (#quotient_fps fp_res) rec_ress setss preTs;
13901378

1391-
val not_isVVr_freess = @{map 4} (fn sets => fn quotient => fn preT => map2 (fn fset => Option.map (fn def =>
1392-
let
1393-
val x = Free ("x", preT);
1394-
val goal = Logic.mk_implies (
1395-
HOLogic.mk_Trueprop (HOLogic.mk_not (fst (#isVVr def) $ (#ctor quotient $ x))),
1396-
mk_Trueprop_eq (fset $ x, mk_bot (#aT def))
1397-
)
1398-
in Goal.prove_sorry lthy (names [x]) [] goal (fn {context=ctxt, ...} => EVERY1 [
1399-
rtac ctxt (#eta_compl_free (#axioms def)),
1400-
K (unfold_thms_tac ctxt (@{thms image_iff Set.bex_simps not_ex comp_def} @ [snd (#isVVr def), snd (#VVr def)])),
1401-
rtac ctxt allI,
1402-
etac ctxt allE,
1403-
etac ctxt @{thm contrapos_nn},
1404-
hyp_subst_tac ctxt,
1405-
rtac ctxt refl
1406-
]) end
1407-
)) (take nvars sets)) setss (#quotient_fps fp_res) preTs defss;
1408-
14091379
val in_IImsuppsss = map2 (fn quotient => map (Option.map (fn def => map2 (fn FVars => fn IImsupp =>
14101380
let
14111381
val a = Free ("a", #aT def);
@@ -1758,7 +1728,6 @@ fun create_tvsubst_of_mrbnf qualify fp_res models lthy =
17581728
("tvsubst_VVr", maps (map_filter I) tvsubst_VVrss),
17591729
("tvsubst_cctor_not_isVVr", tvsubst_not_isVVrs),
17601730
("tvsubst_permutes", tvsubst_permutes),
1761-
("not_isVVr_free", maps (map_filter I) not_isVVr_freess),
17621731
("IImsupp_Diff", maps (map_filter I) IImsupp_Diffss),
17631732
("IImsupp_natural", flat (maps (map_filter I) IImsupp_naturalsss))
17641733
(*("FFVars_tvsubst", map_filter I FFVars_tvsubsts)*)

Tools/mrsbnf_comp.ML

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,24 @@
11
signature MRSBNF_COMP = sig
22

33
val id_mrsbnf: MRSBNF_Def.mrsbnf
4+
5+
val mrsbnf_of_typ: bool -> BNF_Def.inline_policy -> (theory -> BNF_Def.fact_policy)
6+
-> (binding -> binding) -> ((string * sort) * MRBNF_Def.var_type) list -> typ
7+
-> (thm list * local_theory) -> MRSBNF_Def.mrsbnf option * (thm list * local_theory)
8+
49
end
510

611
structure MRSBNF_Comp : MRSBNF_COMP = struct
712

8-
val id_mrsbnf = the (MRSBNF_Def.mrsbnf_of @{context} "BMV_Monad.ID");
13+
val id_mrsbnf = the (MRSBNF_Def.mrsbnf_of @{context} "BNF_Composition.ID");
14+
15+
fun mrsbnf_of_typ _ _ _ _ var_types (TFree (x, _)) accum = (case AList.lookup ((op=) o apsnd fst) var_types x of
16+
SOME MRBNF_Def.Free_Var => (SOME id_mrsbnf, accum)
17+
| _ => (SOME id_mrsbnf, accum))
18+
| mrsbnf_of_typ _ _ _ _ _ (TVar _) _ = error "unexpected schematic variable"
19+
| mrsbnf_of_typ optim const_policy inline_policy qualify var_types (T as Type (n, Ts)) (accum, lthy) =
20+
let
21+
22+
in error "bar" end;
923

1024
end

Tools/mrsbnf_def.ML

Lines changed: 44 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ signature MRSBNF_DEF = sig
1616
map_Sb_strong: thm
1717
};
1818

19-
val id_bmv_monad: BMV_Monad_Def.bmv_monad
20-
val mk_id_bmv_monad: string * sort -> BMV_Monad_Def.bmv_monad
21-
2219
val bmv_monad_of_mrsbnf: mrsbnf -> BMV_Monad_Def.bmv_monad
2320
val mrbnfs_of_mrsbnf: mrsbnf -> MRBNF_Def.mrbnf list
2421
val axioms_of_mrsbnf: mrsbnf -> thm mrsbnf_axioms list
@@ -28,15 +25,13 @@ signature MRSBNF_DEF = sig
2825

2926
val mrsbnf_def: (theory -> BNF_Def.fact_policy) -> (binding -> binding) -> string option
3027
-> MRBNF_Def.mrbnf list -> BMV_Monad_Def.bmv_monad -> (Proof.context -> tactic) mrsbnf_axioms list
31-
-> local_theory -> mrsbnf * local_theory
28+
-> local_theory -> mrsbnf * local_theory;
29+
30+
val mrsbnf_of_bnf: BNF_Def.bnf -> local_theory -> mrsbnf * local_theory;
3231

3332
val register_mrsbnf: string -> mrsbnf -> local_theory -> local_theory;
3433
val mrsbnf_of_generic: Context.generic -> string -> mrsbnf option;
3534
val mrsbnf_of: Proof.context -> string -> mrsbnf option;
36-
37-
val pbmv_monad_of_typ: bool -> BNF_Def.inline_policy -> (theory -> BNF_Def.fact_policy)
38-
-> (string * sort) list -> (binding -> binding) -> typ -> (thm list * local_theory)
39-
-> BMV_Monad_Def.bmv_monad option * (thm list * local_theory)
4035
end
4136

4237
structure MRSBNF_Def : MRSBNF_DEF = struct
@@ -104,12 +99,6 @@ fun morph_mrsbnf phi (MRSBNF {
10499
facts = map (morph_mrsbnf_facts phi) facts
105100
}
106101

107-
val id_bmv_monad = the (BMV_Monad_Def.pbmv_monad_of @{context} "BMV_Monad.ID");
108-
109-
fun mk_id_bmv_monad free = BMV_Monad_Def.morph_bmv_monad (
110-
MRBNF_Util.subst_typ_morphism [(hd (hd (BMV_Monad_Def.frees_of_bmv_monad id_bmv_monad)), TFree free)]
111-
) id_bmv_monad;
112-
113102
fun Rep_mrsbnf (MRSBNF x) = x
114103

115104
val bmv_monad_of_mrsbnf = #pbmv_monad o Rep_mrsbnf
@@ -123,9 +112,9 @@ structure Data = Generic_Data (
123112
fun merge data : T = Symtab.merge (K true) data;
124113
);
125114

126-
fun register_mrsbnf name bmv =
115+
fun register_mrsbnf name mrsbnf =
127116
Local_Theory.declaration {syntax = false, pervasive = true, pos = Position.none}
128-
(fn phi => Data.map (Symtab.update (name, morph_mrsbnf phi bmv)));
117+
(fn phi => Data.map (Symtab.update (name, morph_mrsbnf phi mrsbnf)));
129118

130119
fun mrsbnf_of_generic context =
131120
Option.map (morph_mrsbnf (Morphism.transfer_morphism (Context.theory_of context)))
@@ -136,7 +125,7 @@ val mrsbnf_of = mrsbnf_of_generic o Context.Proof;
136125
fun note_mrsbnf_thms fact_policy qualify name_opt mrsbnf lthy =
137126
let
138127
val bmv = bmv_monad_of_mrsbnf mrsbnf;
139-
val name = case name_opt of
128+
fun name () = case name_opt of
140129
NONE => fst (dest_Type (nth (BMV_Monad_Def.ops_of_bmv_monad bmv) (BMV_Monad_Def.leader_of_bmv_monad bmv)))
141130
| SOME b => b;
142131
val axioms = axioms_of_mrsbnf mrsbnf;
@@ -155,7 +144,7 @@ fun note_mrsbnf_thms fact_policy qualify name_opt mrsbnf lthy =
155144
("map_Sb_strong", map #map_Sb_strong facts, [])
156145
]
157146
|> filter_out (null o #2)
158-
|> map (fn (thmN, thms, attrs) => ((qualify (Binding.qualify true (short_type_name name) (Binding.name thmN)), attrs), [(thms, [])]));
147+
|> map (fn (thmN, thms, attrs) => ((qualify (Binding.qualify true (short_type_name (name ())) (Binding.name thmN)), attrs), [(thms, [])]));
159148
in Local_Theory.notes notes lthy |>> append noted end
160149
val fact_policy = fact_policy (Proof_Context.theory_of lthy);
161150
in ([], lthy)
@@ -362,28 +351,33 @@ fun mk_mrsbnf fact_policy qualify (deads, As, As', Bs, Fs, fs) name_opt mrbnfs b
362351
REPEAT_DETERM o resolve_tac ctxt prems,
363352
rtac ctxt trans,
364353
rtac ctxt (#Sb_comp bmv_axioms),
365-
REPEAT_DETERM o resolve_tac ctxt (prems @ #SSupp_comp_bound bmv_facts @ #SSupp_Inj_bound bmv_facts),
366-
REPEAT_DETERM o EVERY' [
367-
EqSubst.eqsubst_tac ctxt [0] (map (fn ax => #map_is_Sb ax RS sym) axioms'),
368-
REPEAT_DETERM o resolve_tac ctxt prems
369-
],
370-
if count = 0 then K all_tac else rtac ctxt refl,
371-
rtac ctxt sym,
372-
rtac ctxt trans,
373-
rtac ctxt @{thm arg_cong2[OF _ refl, of _ _ "(\<circ>)"]},
374-
rtac ctxt (#Sb_comp_right facts),
375-
REPEAT_DETERM o resolve_tac ctxt (@{thms supp_inv_bound}
376-
@ maps (map_filter I o #SSupp_map_bound) facts' @ prems @ #SSupp_comp_bound bmv_facts
377-
),
378-
K (Local_Defs.unfold0_tac ctxt @{thms comp_assoc}),
379-
EqSubst.eqsubst_tac ctxt [0] [MRBNF_Def.map_comp0_of_mrbnf mrbnf RS sym],
380-
REPEAT_DETERM o resolve_tac ctxt (@{thms supp_id_bound bij_id supp_inv_bound bij_imp_bij_inv} @ prems),
381-
REPEAT_DETERM o EVERY' [
382-
EqSubst.eqsubst_tac ctxt [0] @{thms inv_o_simp1},
383-
resolve_tac ctxt prems
384-
],
385-
K (Local_Defs.unfold0_tac ctxt (MRBNF_Def.map_id0_of_mrbnf mrbnf :: @{thms id_o o_id})),
386-
rtac ctxt refl
354+
EVERY' [
355+
rtac ctxt refl,
356+
rtac ctxt refl
357+
] ORELSE' EVERY' [
358+
REPEAT_DETERM o resolve_tac ctxt (prems @ #SSupp_comp_bound bmv_facts @ #SSupp_Inj_bound bmv_facts),
359+
REPEAT_DETERM o EVERY' [
360+
EqSubst.eqsubst_tac ctxt [0] (map (fn ax => #map_is_Sb ax RS sym) axioms'),
361+
REPEAT_DETERM o resolve_tac ctxt prems
362+
],
363+
if count = 0 then K all_tac else rtac ctxt refl,
364+
rtac ctxt sym,
365+
rtac ctxt trans,
366+
rtac ctxt @{thm arg_cong2[OF _ refl, of _ _ "(\<circ>)"]},
367+
rtac ctxt (#Sb_comp_right facts),
368+
REPEAT_DETERM o resolve_tac ctxt (@{thms supp_inv_bound}
369+
@ maps (map_filter I o #SSupp_map_bound) facts' @ prems @ #SSupp_comp_bound bmv_facts
370+
),
371+
K (Local_Defs.unfold0_tac ctxt @{thms comp_assoc}),
372+
EqSubst.eqsubst_tac ctxt [0] [MRBNF_Def.map_comp0_of_mrbnf mrbnf RS sym],
373+
REPEAT_DETERM o resolve_tac ctxt (@{thms supp_id_bound bij_id supp_inv_bound bij_imp_bij_inv} @ prems),
374+
REPEAT_DETERM o EVERY' [
375+
EqSubst.eqsubst_tac ctxt [0] @{thms inv_o_simp1},
376+
resolve_tac ctxt prems
377+
],
378+
K (Local_Defs.unfold0_tac ctxt (MRBNF_Def.map_id0_of_mrbnf mrbnf :: @{thms id_o o_id})),
379+
rtac ctxt refl
380+
]
387381
]) end;
388382
in {
389383
SSupp_map_subset = #SSupp_map_subset facts,
@@ -552,51 +546,16 @@ fun mrsbnf_def fact_policy qualify name_opt mrbnfs bmv tacs lthy =
552546
val (axioms, vars, mrbnfs, bmv) = prove_axioms mrbnfs bmv tacs lthy;
553547
in mk_mrsbnf fact_policy qualify vars name_opt mrbnfs bmv axioms lthy end
554548

555-
fun pbmv_monad_of_typ _ _ _ xs _ (TFree x) accum = if member (op=) xs x
556-
then (NONE, accum) else (SOME (mk_id_bmv_monad x), accum)
557-
| pbmv_monad_of_typ _ _ _ _ _ (TVar _) _ = error "unexpected schematic variable"
558-
| pbmv_monad_of_typ optim const_policy inline_policy xs qualify' (T as Type (n, Ts)) (accum, lthy) =
559-
let val (bmv_opt, lthy) = case BMV_Monad_Def.pbmv_monad_of lthy n of
560-
SOME bmv => (SOME bmv, lthy)
561-
| NONE => case BNF_Def.bnf_of lthy n of
562-
SOME bnf =>
563-
let val (bmv, lthy) = BMV_Monad_Def.pbmv_monad_of_bnf bnf lthy
564-
in (SOME bmv, BMV_Monad_Def.register_pbmv_monad n bmv lthy) end
565-
| NONE => (NONE, lthy);
566-
in case bmv_opt of
567-
NONE => (NONE, (accum, lthy))
568-
| SOME bmv => if null (nth (BMV_Monad_Def.lives_of_bmv_monad bmv) (BMV_Monad_Def.leader_of_bmv_monad bmv)) then
569-
let val T = nth (BMV_Monad_Def.ops_of_bmv_monad bmv) (BMV_Monad_Def.leader_of_bmv_monad bmv)
570-
in (SOME (BMV_Monad_Def.morph_bmv_monad (MRBNF_Util.subst_typ_morphism (
571-
rev (map TFree (Term.add_tfreesT T []) @ map TVar (Term.add_tvarsT T [])) ~~ Ts
572-
)) bmv), (accum, lthy)) end
573-
else let
574-
val name = Long_Name.base_name n;
575-
576-
fun qualify i =
577-
let val namei = name ^ nonzero_string_of_int i;
578-
in qualify' o Binding.qualify true namei end;
579-
580-
val leader = BMV_Monad_Def.leader_of_bmv_monad bmv;
581-
val T = nth (BMV_Monad_Def.ops_of_bmv_monad bmv) leader;
582-
val bmv = BMV_Monad_Def.morph_bmv_monad (
583-
MRBNF_Util.subst_typ_morphism (snd (dest_Type T) ~~ Ts)
584-
) bmv;
585-
val bmv = BMV_Monad_Def.morph_bmv_monad (MRBNF_Util.subst_typ_morphism (
586-
nth (BMV_Monad_Def.lives'_of_bmv_monad bmv) leader ~~ nth (BMV_Monad_Def.lives_of_bmv_monad bmv) leader
587-
)) bmv;
588-
val live_Ts = nth (BMV_Monad_Def.lives_of_bmv_monad bmv) leader;
589-
590-
val qualifies = map qualify (1 upto length live_Ts);
591-
val (bmv_opts, (accum, lthy)) = @{fold_map 2} (pbmv_monad_of_typ optim const_policy inline_policy xs) qualifies live_Ts (accum, lthy)
592-
val bmvs = map2 (fn T => fn NONE => Inr T | SOME bmv => Inl bmv) live_Ts bmv_opts;
593-
in if exists Option.isSome bmv_opts then
594-
let val ((bmv, unfold_set), lthy) = BMV_Monad_Def.compose_bmv_monad (qualify 0) bmv bmvs lthy;
595-
in (SOME bmv, (unfold_set @ accum, lthy)) end
596-
else
597-
(NONE, (accum, lthy))
598-
end
599-
end;
549+
fun mrsbnf_of_bnf bnf lthy =
550+
let
551+
val (mrbnf, lthy) = MRBNF_Def.mrbnf_of_bnf bnf lthy;
552+
val (bmv, lthy) = BMV_Monad_Def.pbmv_monad_of_bnf bnf lthy;
553+
in mrsbnf_def (K BNF_Def.Dont_Note) I NONE [mrbnf] bmv [{
554+
map_Sb = SOME (fn ctxt => Local_Defs.unfold0_tac ctxt @{thms id_o o_id} THEN rtac ctxt refl 1),
555+
map_is_Sb = fn ctxt => rtac ctxt (BNF_Def.map_id0_of_bnf bnf) 1,
556+
set_Sb = replicate (BNF_Def.live_of_bnf bnf) (fn ctxt => Local_Defs.unfold0_tac ctxt @{thms id_apply} THEN rtac ctxt refl 1),
557+
set_Vrs = []
558+
}] lthy end;
600559

601560
fun mrsbnf_cmd (b, Ts) lthy =
602561
let

operations/BMV_Fixpoint.thy

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,42 @@ type_synonym ('tv, 'v, 'btv, 'bv, 'c, 'd) FTerm_pre' =
88
+ 'd * 'tv FType \<comment>\<open>TyApp \<open>('tv, 'v) FTerm\<close> \<open>'tv FType\<close>\<close>
99
+ 'bv * 'tv FType * 'c \<comment>\<open>Lam x::'v \<open>'tv FType\<close> t::\<open>('tv, 'v) FTerm\<close> binds x in t\<close>
1010
+ 'btv * 'c \<comment>\<open>TyLam a::'tv t::\<open>('tv, 'v) FTerm\<close> binds a in t\<close>"
11+
12+
ML_file \<open>../Tools/mrsbnf_comp.ML\<close>
13+
14+
15+
16+
17+
18+
19+
20+
21+
22+
23+
24+
25+
26+
27+
28+
29+
30+
31+
32+
33+
34+
35+
36+
37+
38+
39+
40+
41+
42+
43+
44+
45+
46+
1147

1248
local_setup \<open>fn lthy =>
1349
let
@@ -986,7 +1022,7 @@ val vars = map TVar (rev (Term.add_tvarsT (#T quot) []));
9861022
\<close>
9871023

9881024
ML \<open>
989-
val model = MRBNF_Recursor.mk_quotient_model quot (vars ~~ [@{typ "'tv::var"}, @{typ "'v::var"}]) {
1025+
val model = MRBNF_Recursor.mk_quotient_model quot (vars ~~ [@{typ "'tv::var"}, @{typ "'v::var"}]) [] {
9901026
binding = @{binding "tvsubst_FTerm"},
9911027
Uctor = @{term "Uctor :: _ \<Rightarrow> ('tv::var, 'v::var) P \<Rightarrow> _"},
9921028
validity = NONE,

0 commit comments

Comments
 (0)