52 val thy1 = TypedefPackage.add_typedecls (map (fn x => (x,[],NoSyn)) ak_names) thy; |
52 val thy1 = TypedefPackage.add_typedecls (map (fn x => (x,[],NoSyn)) ak_names) thy; |
53 |
53 |
54 (* produces a list consisting of pairs: *) |
54 (* produces a list consisting of pairs: *) |
55 (* fst component is the atom-kind name *) |
55 (* fst component is the atom-kind name *) |
56 (* snd component is its type *) |
56 (* snd component is its type *) |
57 val full_ak_names = map (Sign.intern_type (sign_of thy1)) ak_names; |
57 val full_ak_names = map (Sign.intern_type thy1) ak_names; |
58 val ak_names_types = ak_names ~~ map (Type o rpair []) full_ak_names; |
58 val ak_names_types = ak_names ~~ map (Type o rpair []) full_ak_names; |
59 |
59 |
60 (* adds for every atom-kind an axiom *) |
60 (* adds for every atom-kind an axiom *) |
61 (* <ak>_infinite: infinite (UNIV::<ak_type> set) *) |
61 (* <ak>_infinite: infinite (UNIV::<ak_type> set) *) |
62 val (inf_axs,thy2) = PureThy.add_axioms_i (map (fn (ak_name, T) => |
62 val (inf_axs,thy2) = PureThy.add_axioms_i (map (fn (ak_name, T) => |
74 (* swap_<ak> (a,b) c = (if a=c then b (else if b=c then a else c)) *) |
74 (* swap_<ak> (a,b) c = (if a=c then b (else if b=c then a else c)) *) |
75 (* overloades then the general swap-function *) |
75 (* overloades then the general swap-function *) |
76 val (swap_eqs, thy3) = fold_map (fn (ak_name, T) => fn thy => |
76 val (swap_eqs, thy3) = fold_map (fn (ak_name, T) => fn thy => |
77 let |
77 let |
78 val swapT = HOLogic.mk_prodT (T, T) --> T --> T; |
78 val swapT = HOLogic.mk_prodT (T, T) --> T --> T; |
79 val swap_name = Sign.full_name (sign_of thy) ("swap_" ^ ak_name); |
79 val swap_name = Sign.full_name thy ("swap_" ^ ak_name); |
80 val a = Free ("a", T); |
80 val a = Free ("a", T); |
81 val b = Free ("b", T); |
81 val b = Free ("b", T); |
82 val c = Free ("c", T); |
82 val c = Free ("c", T); |
83 val ab = Free ("ab", HOLogic.mk_prodT (T, T)) |
83 val ab = Free ("ab", HOLogic.mk_prodT (T, T)) |
84 val cif = Const ("HOL.If", HOLogic.boolT --> T --> T --> T); |
84 val cif = Const ("HOL.If", HOLogic.boolT --> T --> T --> T); |
103 (* <ak>_prm_<ak> [] a = a *) |
103 (* <ak>_prm_<ak> [] a = a *) |
104 (* <ak>_prm_<ak> (x#xs) a = swap_<ak> x (perm xs a) *) |
104 (* <ak>_prm_<ak> (x#xs) a = swap_<ak> x (perm xs a) *) |
105 val (prm_eqs, thy4) = fold_map (fn (ak_name, T) => fn thy => |
105 val (prm_eqs, thy4) = fold_map (fn (ak_name, T) => fn thy => |
106 let |
106 let |
107 val swapT = HOLogic.mk_prodT (T, T) --> T --> T; |
107 val swapT = HOLogic.mk_prodT (T, T) --> T --> T; |
108 val swap_name = Sign.full_name (sign_of thy) ("swap_" ^ ak_name) |
108 val swap_name = Sign.full_name thy ("swap_" ^ ak_name) |
109 val prmT = mk_permT T --> T --> T; |
109 val prmT = mk_permT T --> T --> T; |
110 val prm_name = ak_name ^ "_prm_" ^ ak_name; |
110 val prm_name = ak_name ^ "_prm_" ^ ak_name; |
111 val qu_prm_name = Sign.full_name (sign_of thy) prm_name; |
111 val qu_prm_name = Sign.full_name thy prm_name; |
112 val x = Free ("x", HOLogic.mk_prodT (T, T)); |
112 val x = Free ("x", HOLogic.mk_prodT (T, T)); |
113 val xs = Free ("xs", mk_permT T); |
113 val xs = Free ("xs", mk_permT T); |
114 val a = Free ("a", T) ; |
114 val a = Free ("a", T) ; |
115 |
115 |
116 val cnil = Const ("List.list.Nil", mk_permT T); |
116 val cnil = Const ("List.list.Nil", mk_permT T); |
139 let |
139 let |
140 val perm_def_name = ak_name ^ "_prm_" ^ ak_name'; |
140 val perm_def_name = ak_name ^ "_prm_" ^ ak_name'; |
141 val pi = Free ("pi", mk_permT T); |
141 val pi = Free ("pi", mk_permT T); |
142 val a = Free ("a", T'); |
142 val a = Free ("a", T'); |
143 val cperm = Const ("Nominal.perm", mk_permT T --> T' --> T'); |
143 val cperm = Const ("Nominal.perm", mk_permT T --> T' --> T'); |
144 val cperm_def = Const (Sign.full_name (sign_of thy') perm_def_name, mk_permT T --> T' --> T'); |
144 val cperm_def = Const (Sign.full_name thy' perm_def_name, mk_permT T --> T' --> T'); |
145 |
145 |
146 val name = ak_name ^ "_prm_" ^ ak_name' ^ "_def"; |
146 val name = ak_name ^ "_prm_" ^ ak_name' ^ "_def"; |
147 val def = Logic.mk_equals |
147 val def = Logic.mk_equals |
148 (cperm $ pi $ a, if ak_name = ak_name' then cperm_def $ pi $ a else a) |
148 (cperm $ pi $ a, if ak_name = ak_name' then cperm_def $ pi $ a else a) |
149 in |
149 in |
154 (* lemma at_<ak>_inst: *) |
154 (* lemma at_<ak>_inst: *) |
155 (* at TYPE(<ak>) *) |
155 (* at TYPE(<ak>) *) |
156 val (prm_cons_thms,thy6) = |
156 val (prm_cons_thms,thy6) = |
157 thy5 |> PureThy.add_thms (map (fn (ak_name, T) => |
157 thy5 |> PureThy.add_thms (map (fn (ak_name, T) => |
158 let |
158 let |
159 val ak_name_qu = Sign.full_name (sign_of thy5) (ak_name); |
159 val ak_name_qu = Sign.full_name thy5 (ak_name); |
160 val i_type = Type(ak_name_qu,[]); |
160 val i_type = Type(ak_name_qu,[]); |
161 val cat = Const ("Nominal.at",(Term.itselfT i_type) --> HOLogic.boolT); |
161 val cat = Const ("Nominal.at",(Term.itselfT i_type) --> HOLogic.boolT); |
162 val at_type = Logic.mk_type i_type; |
162 val at_type = Logic.mk_type i_type; |
163 val simp_s = HOL_basic_ss addsimps PureThy.get_thmss thy5 |
163 val simp_s = HOL_basic_ss addsimps PureThy.get_thmss thy5 |
164 [Name "at_def", |
164 [Name "at_def", |
215 (* lemma pt_<ak>_inst: *) |
215 (* lemma pt_<ak>_inst: *) |
216 (* pt TYPE('x::pt_<ak>) TYPE(<ak>) *) |
216 (* pt TYPE('x::pt_<ak>) TYPE(<ak>) *) |
217 val (prm_inst_thms,thy8) = |
217 val (prm_inst_thms,thy8) = |
218 thy7 |> PureThy.add_thms (map (fn (ak_name, T) => |
218 thy7 |> PureThy.add_thms (map (fn (ak_name, T) => |
219 let |
219 let |
220 val ak_name_qu = Sign.full_name (sign_of thy7) (ak_name); |
220 val ak_name_qu = Sign.full_name thy7 ak_name; |
221 val pt_name_qu = Sign.full_name (sign_of thy7) ("pt_"^ak_name); |
221 val pt_name_qu = Sign.full_name thy7 ("pt_"^ak_name); |
222 val i_type1 = TFree("'x",[pt_name_qu]); |
222 val i_type1 = TFree("'x",[pt_name_qu]); |
223 val i_type2 = Type(ak_name_qu,[]); |
223 val i_type2 = Type(ak_name_qu,[]); |
224 val cpt = Const ("Nominal.pt",(Term.itselfT i_type1)-->(Term.itselfT i_type2)-->HOLogic.boolT); |
224 val cpt = Const ("Nominal.pt",(Term.itselfT i_type1)-->(Term.itselfT i_type2)-->HOLogic.boolT); |
225 val pt_type = Logic.mk_type i_type1; |
225 val pt_type = Logic.mk_type i_type1; |
226 val at_type = Logic.mk_type i_type2; |
226 val at_type = Logic.mk_type i_type2; |
242 (* axclass fs_<ak> *) |
242 (* axclass fs_<ak> *) |
243 (* fs_<ak>1: finite ((supp x)::<ak> set) *) |
243 (* fs_<ak>1: finite ((supp x)::<ak> set) *) |
244 val (fs_ax_classes,thy11) = fold_map (fn (ak_name, T) => fn thy => |
244 val (fs_ax_classes,thy11) = fold_map (fn (ak_name, T) => fn thy => |
245 let |
245 let |
246 val cl_name = "fs_"^ak_name; |
246 val cl_name = "fs_"^ak_name; |
247 val pt_name = Sign.full_name (sign_of thy) ("pt_"^ak_name); |
247 val pt_name = Sign.full_name thy ("pt_"^ak_name); |
248 val ty = TFree("'a",["HOL.type"]); |
248 val ty = TFree("'a",["HOL.type"]); |
249 val x = Free ("x", ty); |
249 val x = Free ("x", ty); |
250 val csupp = Const ("Nominal.supp", ty --> HOLogic.mk_setT T); |
250 val csupp = Const ("Nominal.supp", ty --> HOLogic.mk_setT T); |
251 val cfinites = Const ("Finite_Set.Finites", HOLogic.mk_setT (HOLogic.mk_setT T)) |
251 val cfinites = Const ("Finite_Set.Finites", HOLogic.mk_setT (HOLogic.mk_setT T)) |
252 |
252 |
261 (* lemma abst_<ak>_inst: *) |
261 (* lemma abst_<ak>_inst: *) |
262 (* fs TYPE('x::pt_<ak>) TYPE (<ak>) *) |
262 (* fs TYPE('x::pt_<ak>) TYPE (<ak>) *) |
263 val (fs_inst_thms,thy12) = |
263 val (fs_inst_thms,thy12) = |
264 thy11 |> PureThy.add_thms (map (fn (ak_name, T) => |
264 thy11 |> PureThy.add_thms (map (fn (ak_name, T) => |
265 let |
265 let |
266 val ak_name_qu = Sign.full_name (sign_of thy11) (ak_name); |
266 val ak_name_qu = Sign.full_name thy11 ak_name; |
267 val fs_name_qu = Sign.full_name (sign_of thy11) ("fs_"^ak_name); |
267 val fs_name_qu = Sign.full_name thy11 ("fs_"^ak_name); |
268 val i_type1 = TFree("'x",[fs_name_qu]); |
268 val i_type1 = TFree("'x",[fs_name_qu]); |
269 val i_type2 = Type(ak_name_qu,[]); |
269 val i_type2 = Type(ak_name_qu,[]); |
270 val cfs = Const ("Nominal.fs", |
270 val cfs = Const ("Nominal.fs", |
271 (Term.itselfT i_type1)-->(Term.itselfT i_type2)-->HOLogic.boolT); |
271 (Term.itselfT i_type1)-->(Term.itselfT i_type2)-->HOLogic.boolT); |
272 val fs_type = Logic.mk_type i_type1; |
272 val fs_type = Logic.mk_type i_type1; |
309 (* lemma cp_<ak1>_<ak2>_inst: *) |
309 (* lemma cp_<ak1>_<ak2>_inst: *) |
310 (* cp TYPE('a::cp_<ak1>_<ak2>) TYPE(<ak1>) TYPE(<ak2>) *) |
310 (* cp TYPE('a::cp_<ak1>_<ak2>) TYPE(<ak1>) TYPE(<ak2>) *) |
311 val (cp_thms,thy12c) = fold_map (fn (ak_name, T) => fn thy => |
311 val (cp_thms,thy12c) = fold_map (fn (ak_name, T) => fn thy => |
312 fold_map (fn (ak_name', T') => fn thy' => |
312 fold_map (fn (ak_name', T') => fn thy' => |
313 let |
313 let |
314 val ak_name_qu = Sign.full_name (sign_of thy') (ak_name); |
314 val ak_name_qu = Sign.full_name thy' (ak_name); |
315 val ak_name_qu' = Sign.full_name (sign_of thy') (ak_name'); |
315 val ak_name_qu' = Sign.full_name thy' (ak_name'); |
316 val cp_name_qu = Sign.full_name (sign_of thy') ("cp_"^ak_name^"_"^ak_name'); |
316 val cp_name_qu = Sign.full_name thy' ("cp_"^ak_name^"_"^ak_name'); |
317 val i_type0 = TFree("'a",[cp_name_qu]); |
317 val i_type0 = TFree("'a",[cp_name_qu]); |
318 val i_type1 = Type(ak_name_qu,[]); |
318 val i_type1 = Type(ak_name_qu,[]); |
319 val i_type2 = Type(ak_name_qu',[]); |
319 val i_type2 = Type(ak_name_qu',[]); |
320 val ccp = Const ("Nominal.cp", |
320 val ccp = Const ("Nominal.cp", |
321 (Term.itselfT i_type0)-->(Term.itselfT i_type1)--> |
321 (Term.itselfT i_type0)-->(Term.itselfT i_type1)--> |
342 val (dj_thms, thy12d) = fold_map (fn (ak_name,T) => fn thy => |
342 val (dj_thms, thy12d) = fold_map (fn (ak_name,T) => fn thy => |
343 fold_map (fn (ak_name',T') => fn thy' => |
343 fold_map (fn (ak_name',T') => fn thy' => |
344 (if not (ak_name = ak_name') |
344 (if not (ak_name = ak_name') |
345 then |
345 then |
346 let |
346 let |
347 val ak_name_qu = Sign.full_name (sign_of thy') (ak_name); |
347 val ak_name_qu = Sign.full_name thy' ak_name; |
348 val ak_name_qu' = Sign.full_name (sign_of thy') (ak_name'); |
348 val ak_name_qu' = Sign.full_name thy' ak_name'; |
349 val i_type1 = Type(ak_name_qu,[]); |
349 val i_type1 = Type(ak_name_qu,[]); |
350 val i_type2 = Type(ak_name_qu',[]); |
350 val i_type2 = Type(ak_name_qu',[]); |
351 val cdj = Const ("Nominal.disjoint", |
351 val cdj = Const ("Nominal.disjoint", |
352 (Term.itselfT i_type1)-->(Term.itselfT i_type2)-->HOLogic.boolT); |
352 (Term.itselfT i_type1)-->(Term.itselfT i_type2)-->HOLogic.boolT); |
353 val at_type = Logic.mk_type i_type1; |
353 val at_type = Logic.mk_type i_type1; |
388 (* every <ak> is an instance of pt_<ak'>; the proof for *) |
388 (* every <ak> is an instance of pt_<ak'>; the proof for *) |
389 (* ak!=ak' is by definition; the case ak=ak' uses at_pt_inst. *) |
389 (* ak!=ak' is by definition; the case ak=ak' uses at_pt_inst. *) |
390 val thy13 = fold (fn ak_name => fn thy => |
390 val thy13 = fold (fn ak_name => fn thy => |
391 fold (fn ak_name' => fn thy' => |
391 fold (fn ak_name' => fn thy' => |
392 let |
392 let |
393 val qu_name = Sign.full_name (sign_of thy') ak_name'; |
393 val qu_name = Sign.full_name thy' ak_name'; |
394 val cls_name = Sign.full_name (sign_of thy') ("pt_"^ak_name); |
394 val cls_name = Sign.full_name thy' ("pt_"^ak_name); |
395 val at_inst = PureThy.get_thm thy' (Name ("at_"^ak_name'^"_inst")); |
395 val at_inst = PureThy.get_thm thy' (Name ("at_"^ak_name'^"_inst")); |
396 |
396 |
397 val proof1 = EVERY [ClassPackage.intro_classes_tac [], |
397 val proof1 = EVERY [ClassPackage.intro_classes_tac [], |
398 rtac ((at_inst RS at_pt_inst) RS pt1) 1, |
398 rtac ((at_inst RS at_pt_inst) RS pt1) 1, |
399 rtac ((at_inst RS at_pt_inst) RS pt2) 1, |
399 rtac ((at_inst RS at_pt_inst) RS pt2) 1, |
419 (* unit *) |
419 (* unit *) |
420 (* set(pt_<ak>) *) |
420 (* set(pt_<ak>) *) |
421 (* are instances of pt_<ak> *) |
421 (* are instances of pt_<ak> *) |
422 val thy18 = fold (fn ak_name => fn thy => |
422 val thy18 = fold (fn ak_name => fn thy => |
423 let |
423 let |
424 val cls_name = Sign.full_name (sign_of thy) ("pt_"^ak_name); |
424 val cls_name = Sign.full_name thy ("pt_"^ak_name); |
425 val at_thm = PureThy.get_thm thy (Name ("at_"^ak_name^"_inst")); |
425 val at_thm = PureThy.get_thm thy (Name ("at_"^ak_name^"_inst")); |
426 val pt_inst = PureThy.get_thm thy (Name ("pt_"^ak_name^"_inst")); |
426 val pt_inst = PureThy.get_thm thy (Name ("pt_"^ak_name^"_inst")); |
427 |
427 |
428 fun pt_proof thm = |
428 fun pt_proof thm = |
429 EVERY [ClassPackage.intro_classes_tac [], |
429 EVERY [ClassPackage.intro_classes_tac [], |
465 (* shows that <ak> is an instance of fs_<ak> *) |
465 (* shows that <ak> is an instance of fs_<ak> *) |
466 (* uses the theorem at_<ak>_inst *) |
466 (* uses the theorem at_<ak>_inst *) |
467 val thy20 = fold (fn ak_name => fn thy => |
467 val thy20 = fold (fn ak_name => fn thy => |
468 fold (fn ak_name' => fn thy' => |
468 fold (fn ak_name' => fn thy' => |
469 let |
469 let |
470 val qu_name = Sign.full_name (sign_of thy') ak_name'; |
470 val qu_name = Sign.full_name thy' ak_name'; |
471 val qu_class = Sign.full_name (sign_of thy') ("fs_"^ak_name); |
471 val qu_class = Sign.full_name thy' ("fs_"^ak_name); |
472 val proof = |
472 val proof = |
473 (if ak_name = ak_name' |
473 (if ak_name = ak_name' |
474 then |
474 then |
475 let val at_thm = PureThy.get_thm thy' (Name ("at_"^ak_name^"_inst")); |
475 let val at_thm = PureThy.get_thm thy' (Name ("at_"^ak_name^"_inst")); |
476 in EVERY [ClassPackage.intro_classes_tac [], |
476 in EVERY [ClassPackage.intro_classes_tac [], |
491 (* option(fs_<ak>) *) |
491 (* option(fs_<ak>) *) |
492 (* are instances of fs_<ak> *) |
492 (* are instances of fs_<ak> *) |
493 |
493 |
494 val thy24 = fold (fn ak_name => fn thy => |
494 val thy24 = fold (fn ak_name => fn thy => |
495 let |
495 let |
496 val cls_name = Sign.full_name (sign_of thy) ("fs_"^ak_name); |
496 val cls_name = Sign.full_name thy ("fs_"^ak_name); |
497 val fs_inst = PureThy.get_thm thy (Name ("fs_"^ak_name^"_inst")); |
497 val fs_inst = PureThy.get_thm thy (Name ("fs_"^ak_name^"_inst")); |
498 fun fs_proof thm = EVERY [ClassPackage.intro_classes_tac [], rtac (thm RS fs1) 1]; |
498 fun fs_proof thm = EVERY [ClassPackage.intro_classes_tac [], rtac (thm RS fs1) 1]; |
499 |
499 |
500 val fs_thm_unit = fs_unit_inst; |
500 val fs_thm_unit = fs_unit_inst; |
501 val fs_thm_prod = fs_inst RS (fs_inst RS fs_prod_inst); |
501 val fs_thm_prod = fs_inst RS (fs_inst RS fs_prod_inst); |
531 (* for every <ak>/<ai>-combination *) |
531 (* for every <ak>/<ai>-combination *) |
532 val thy25 = fold (fn ak_name => fn thy => |
532 val thy25 = fold (fn ak_name => fn thy => |
533 fold (fn ak_name' => fn thy' => |
533 fold (fn ak_name' => fn thy' => |
534 fold (fn ak_name'' => fn thy'' => |
534 fold (fn ak_name'' => fn thy'' => |
535 let |
535 let |
536 val name = Sign.full_name (sign_of thy'') ak_name; |
536 val name = Sign.full_name thy'' ak_name; |
537 val cls_name = Sign.full_name (sign_of thy'') ("cp_"^ak_name'^"_"^ak_name''); |
537 val cls_name = Sign.full_name thy'' ("cp_"^ak_name'^"_"^ak_name''); |
538 val proof = |
538 val proof = |
539 (if (ak_name'=ak_name'') then |
539 (if (ak_name'=ak_name'') then |
540 (let |
540 (let |
541 val pt_inst = PureThy.get_thm thy'' (Name ("pt_"^ak_name''^"_inst")); |
541 val pt_inst = PureThy.get_thm thy'' (Name ("pt_"^ak_name''^"_inst")); |
542 val at_inst = PureThy.get_thm thy'' (Name ("at_"^ak_name''^"_inst")); |
542 val at_inst = PureThy.get_thm thy'' (Name ("at_"^ak_name''^"_inst")); |
568 (* noptions *) |
568 (* noptions *) |
569 (* are instances of cp_<ak>_<ai> for every <ak>/<ai>-combination *) |
569 (* are instances of cp_<ak>_<ai> for every <ak>/<ai>-combination *) |
570 val thy26 = fold (fn ak_name => fn thy => |
570 val thy26 = fold (fn ak_name => fn thy => |
571 fold (fn ak_name' => fn thy' => |
571 fold (fn ak_name' => fn thy' => |
572 let |
572 let |
573 val cls_name = Sign.full_name (sign_of thy') ("cp_"^ak_name^"_"^ak_name'); |
573 val cls_name = Sign.full_name thy' ("cp_"^ak_name^"_"^ak_name'); |
574 val cp_inst = PureThy.get_thm thy' (Name ("cp_"^ak_name^"_"^ak_name'^"_inst")); |
574 val cp_inst = PureThy.get_thm thy' (Name ("cp_"^ak_name^"_"^ak_name'^"_inst")); |
575 val pt_inst = PureThy.get_thm thy' (Name ("pt_"^ak_name^"_inst")); |
575 val pt_inst = PureThy.get_thm thy' (Name ("pt_"^ak_name^"_inst")); |
576 val at_inst = PureThy.get_thm thy' (Name ("at_"^ak_name^"_inst")); |
576 val at_inst = PureThy.get_thm thy' (Name ("at_"^ak_name^"_inst")); |
577 |
577 |
578 fun cp_proof thm = EVERY [ClassPackage.intro_classes_tac [],rtac (thm RS cp1) 1]; |
578 fun cp_proof thm = EVERY [ClassPackage.intro_classes_tac [],rtac (thm RS cp1) 1]; |
600 val thy32 = |
600 val thy32 = |
601 let |
601 let |
602 fun discrete_pt_inst discrete_ty defn = |
602 fun discrete_pt_inst discrete_ty defn = |
603 fold (fn ak_name => fn thy => |
603 fold (fn ak_name => fn thy => |
604 let |
604 let |
605 val qu_class = Sign.full_name (sign_of thy) ("pt_"^ak_name); |
605 val qu_class = Sign.full_name thy ("pt_"^ak_name); |
606 val simp_s = HOL_basic_ss addsimps [defn]; |
606 val simp_s = HOL_basic_ss addsimps [defn]; |
607 val proof = EVERY [ClassPackage.intro_classes_tac [], REPEAT (asm_simp_tac simp_s 1)]; |
607 val proof = EVERY [ClassPackage.intro_classes_tac [], REPEAT (asm_simp_tac simp_s 1)]; |
608 in |
608 in |
609 AxClass.prove_arity (discrete_ty,[],[qu_class]) proof thy |
609 AxClass.prove_arity (discrete_ty,[],[qu_class]) proof thy |
610 end) ak_names; |
610 end) ak_names; |
611 |
611 |
612 fun discrete_fs_inst discrete_ty defn = |
612 fun discrete_fs_inst discrete_ty defn = |
613 fold (fn ak_name => fn thy => |
613 fold (fn ak_name => fn thy => |
614 let |
614 let |
615 val qu_class = Sign.full_name (sign_of thy) ("fs_"^ak_name); |
615 val qu_class = Sign.full_name thy ("fs_"^ak_name); |
616 val supp_def = thm "Nominal.supp_def"; |
616 val supp_def = thm "Nominal.supp_def"; |
617 val simp_s = HOL_ss addsimps [supp_def,Collect_const,Finites.emptyI,defn]; |
617 val simp_s = HOL_ss addsimps [supp_def,Collect_const,Finites.emptyI,defn]; |
618 val proof = EVERY [ClassPackage.intro_classes_tac [], asm_simp_tac simp_s 1]; |
618 val proof = EVERY [ClassPackage.intro_classes_tac [], asm_simp_tac simp_s 1]; |
619 in |
619 in |
620 AxClass.prove_arity (discrete_ty,[],[qu_class]) proof thy |
620 AxClass.prove_arity (discrete_ty,[],[qu_class]) proof thy |
621 end) ak_names; |
621 end) ak_names; |
622 |
622 |
623 fun discrete_cp_inst discrete_ty defn = |
623 fun discrete_cp_inst discrete_ty defn = |
624 fold (fn ak_name' => (fold (fn ak_name => fn thy => |
624 fold (fn ak_name' => (fold (fn ak_name => fn thy => |
625 let |
625 let |
626 val qu_class = Sign.full_name (sign_of thy) ("cp_"^ak_name^"_"^ak_name'); |
626 val qu_class = Sign.full_name thy ("cp_"^ak_name^"_"^ak_name'); |
627 val supp_def = thm "Nominal.supp_def"; |
627 val supp_def = thm "Nominal.supp_def"; |
628 val simp_s = HOL_ss addsimps [defn]; |
628 val simp_s = HOL_ss addsimps [defn]; |
629 val proof = EVERY [ClassPackage.intro_classes_tac [], asm_simp_tac simp_s 1]; |
629 val proof = EVERY [ClassPackage.intro_classes_tac [], asm_simp_tac simp_s 1]; |
630 in |
630 in |
631 AxClass.prove_arity (discrete_ty,[],[qu_class]) proof thy |
631 AxClass.prove_arity (discrete_ty,[],[qu_class]) proof thy |