| author | haftmann | 
| Thu, 09 Aug 2007 15:52:42 +0200 | |
| changeset 24194 | 96013f81faef | 
| parent 24162 | 8dfd5dd65d82 | 
| child 24218 | fbf1646b267c | 
| permissions | -rw-r--r-- | 
| 19494 | 1  | 
(* Title: HOL/Nominal/nominal_atoms.ML  | 
2  | 
ID: $Id$  | 
|
3  | 
Author: Christian Urban and Stefan Berghofer, TU Muenchen  | 
|
4  | 
||
5  | 
Declaration of atom types to be used in nominal datatypes.  | 
|
6  | 
*)  | 
|
| 18068 | 7  | 
|
8  | 
signature NOMINAL_ATOMS =  | 
|
9  | 
sig  | 
|
10  | 
val create_nom_typedecls : string list -> theory -> theory  | 
|
| 
22418
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
11  | 
type atom_info  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
12  | 
val get_atom_infos : theory -> atom_info Symtab.table  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
13  | 
val get_atom_info : theory -> string -> atom_info option  | 
| 18068 | 14  | 
val atoms_of : theory -> string list  | 
15  | 
val mk_permT : typ -> typ  | 
|
16  | 
end  | 
|
17  | 
||
18  | 
structure NominalAtoms : NOMINAL_ATOMS =  | 
|
19  | 
struct  | 
|
20  | 
||
| 
23894
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
21  | 
val finite_emptyI = @{thm "finite.emptyI"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
22  | 
val Collect_const = @{thm "Collect_const"};
 | 
| 21669 | 23  | 
|
24  | 
||
| 22846 | 25  | 
(* theory data *)  | 
| 18068 | 26  | 
|
| 
22418
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
27  | 
type atom_info =  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
28  | 
  {pt_class : string,
 | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
29  | 
fs_class : string,  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
30  | 
cp_classes : (string * string) list};  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
31  | 
|
| 22846 | 32  | 
structure NominalData = TheoryDataFun  | 
33  | 
(  | 
|
| 
22418
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
34  | 
type T = atom_info Symtab.table;  | 
| 18068 | 35  | 
val empty = Symtab.empty;  | 
36  | 
val copy = I;  | 
|
37  | 
val extend = I;  | 
|
38  | 
fun merge _ x = Symtab.merge (K true) x;  | 
|
| 22846 | 39  | 
);  | 
| 18068 | 40  | 
|
| 
22418
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
41  | 
fun make_atom_info ((pt_class, fs_class), cp_classes) =  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
42  | 
  {pt_class = pt_class,
 | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
43  | 
fs_class = fs_class,  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
44  | 
cp_classes = cp_classes};  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
45  | 
|
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
46  | 
val get_atom_infos = NominalData.get;  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
47  | 
val get_atom_info = Symtab.lookup o NominalData.get;  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
48  | 
|
| 18068 | 49  | 
fun atoms_of thy = map fst (Symtab.dest (NominalData.get thy));  | 
50  | 
||
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
51  | 
fun mk_permT T = HOLogic.listT (HOLogic.mk_prodT (T, T));  | 
| 18068 | 52  | 
|
53  | 
fun mk_Cons x xs =  | 
|
54  | 
let val T = fastype_of x  | 
|
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
55  | 
  in Const ("List.list.Cons", T --> HOLogic.listT T --> HOLogic.listT T) $ x $ xs end;
 | 
| 18068 | 56  | 
|
57  | 
||
58  | 
(* this function sets up all matters related to atom- *)  | 
|
59  | 
(* kinds; the user specifies a list of atom-kind names *)  | 
|
60  | 
(* atom_decl <ak1> ... <akn> *)  | 
|
61  | 
fun create_nom_typedecls ak_names thy =  | 
|
62  | 
let  | 
|
| 
23894
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
63  | 
val cla_s = claset_of thy;  | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
64  | 
|
| 18068 | 65  | 
(* declares a type-decl for every atom-kind: *)  | 
66  | 
(* that is typedecl <ak> *)  | 
|
67  | 
val thy1 = TypedefPackage.add_typedecls (map (fn x => (x,[],NoSyn)) ak_names) thy;  | 
|
68  | 
||
69  | 
(* produces a list consisting of pairs: *)  | 
|
70  | 
(* fst component is the atom-kind name *)  | 
|
71  | 
(* snd component is its type *)  | 
|
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
72  | 
val full_ak_names = map (Sign.intern_type thy1) ak_names;  | 
| 18068 | 73  | 
val ak_names_types = ak_names ~~ map (Type o rpair []) full_ak_names;  | 
74  | 
||
75  | 
(* adds for every atom-kind an axiom *)  | 
|
76  | 
(* <ak>_infinite: infinite (UNIV::<ak_type> set) *)  | 
|
| 
18381
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
77  | 
val (inf_axs,thy2) = PureThy.add_axioms_i (map (fn (ak_name, T) =>  | 
| 18068 | 78  | 
let  | 
| 20179 | 79  | 
val name = ak_name ^ "_infinite"  | 
| 18068 | 80  | 
val axiom = HOLogic.mk_Trueprop (HOLogic.mk_not  | 
| 22274 | 81  | 
                    (Const ("Finite_Set.finite", HOLogic.mk_setT T --> HOLogic.boolT) $
 | 
82  | 
HOLogic.mk_UNIV T))  | 
|
| 18068 | 83  | 
in  | 
| 20179 | 84  | 
((name, axiom), [])  | 
| 18068 | 85  | 
end) ak_names_types) thy1;  | 
86  | 
||
87  | 
(* declares a swapping function for every atom-kind, it is *)  | 
|
88  | 
(* const swap_<ak> :: <akT> * <akT> => <akT> => <akT> *)  | 
|
89  | 
(* swap_<ak> (a,b) c = (if a=c then b (else if b=c then a else c)) *)  | 
|
90  | 
(* overloades then the general swap-function *)  | 
|
| 20179 | 91  | 
val (swap_eqs, thy3) = fold_map (fn (ak_name, T) => fn thy =>  | 
| 18068 | 92  | 
let  | 
93  | 
val swapT = HOLogic.mk_prodT (T, T) --> T --> T;  | 
|
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
94  | 
        val swap_name = Sign.full_name thy ("swap_" ^ ak_name);
 | 
| 18068 | 95  | 
        val a = Free ("a", T);
 | 
96  | 
        val b = Free ("b", T);
 | 
|
97  | 
        val c = Free ("c", T);
 | 
|
98  | 
        val ab = Free ("ab", HOLogic.mk_prodT (T, T))
 | 
|
99  | 
        val cif = Const ("HOL.If", HOLogic.boolT --> T --> T --> T);
 | 
|
100  | 
val cswap_akname = Const (swap_name, swapT);  | 
|
| 19494 | 101  | 
        val cswap = Const ("Nominal.swap", swapT)
 | 
| 18068 | 102  | 
|
103  | 
val name = "swap_"^ak_name^"_def";  | 
|
104  | 
val def1 = HOLogic.mk_Trueprop (HOLogic.mk_eq  | 
|
| 20179 | 105  | 
(cswap_akname $ HOLogic.mk_prod (a,b) $ c,  | 
| 18068 | 106  | 
cif $ HOLogic.mk_eq (a,c) $ b $ (cif $ HOLogic.mk_eq (b,c) $ a $ c)))  | 
107  | 
val def2 = Logic.mk_equals (cswap $ ab $ c, cswap_akname $ ab $ c)  | 
|
108  | 
in  | 
|
109  | 
        thy |> Theory.add_consts_i [("swap_" ^ ak_name, swapT, NoSyn)] 
 | 
|
| 20179 | 110  | 
|> PureThy.add_defs_unchecked_i true [((name, def2),[])]  | 
111  | 
|> snd  | 
|
112  | 
            |> PrimrecPackage.add_primrec_unchecked_i "" [(("", def1),[])]
 | 
|
113  | 
end) ak_names_types thy2;  | 
|
| 18068 | 114  | 
|
115  | 
(* declares a permutation function for every atom-kind acting *)  | 
|
116  | 
(* on such atoms *)  | 
|
117  | 
(* const <ak>_prm_<ak> :: (<akT> * <akT>)list => akT => akT *)  | 
|
118  | 
(* <ak>_prm_<ak> [] a = a *)  | 
|
119  | 
(* <ak>_prm_<ak> (x#xs) a = swap_<ak> x (perm xs a) *)  | 
|
| 20179 | 120  | 
val (prm_eqs, thy4) = fold_map (fn (ak_name, T) => fn thy =>  | 
| 18068 | 121  | 
let  | 
122  | 
val swapT = HOLogic.mk_prodT (T, T) --> T --> T;  | 
|
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
123  | 
        val swap_name = Sign.full_name thy ("swap_" ^ ak_name)
 | 
| 18068 | 124  | 
val prmT = mk_permT T --> T --> T;  | 
125  | 
val prm_name = ak_name ^ "_prm_" ^ ak_name;  | 
|
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
126  | 
val qu_prm_name = Sign.full_name thy prm_name;  | 
| 18068 | 127  | 
        val x  = Free ("x", HOLogic.mk_prodT (T, T));
 | 
128  | 
        val xs = Free ("xs", mk_permT T);
 | 
|
129  | 
        val a  = Free ("a", T) ;
 | 
|
130  | 
||
131  | 
        val cnil  = Const ("List.list.Nil", mk_permT T);
 | 
|
132  | 
||
133  | 
val def1 = HOLogic.mk_Trueprop (HOLogic.mk_eq (Const (qu_prm_name, prmT) $ cnil $ a, a));  | 
|
134  | 
||
135  | 
val def2 = HOLogic.mk_Trueprop (HOLogic.mk_eq  | 
|
136  | 
(Const (qu_prm_name, prmT) $ mk_Cons x xs $ a,  | 
|
137  | 
Const (swap_name, swapT) $ x $ (Const (qu_prm_name, prmT) $ xs $ a)));  | 
|
138  | 
in  | 
|
139  | 
thy |> Theory.add_consts_i [(prm_name, mk_permT T --> T --> T, NoSyn)]  | 
|
| 19635 | 140  | 
            |> PrimrecPackage.add_primrec_unchecked_i "" [(("", def1), []),(("", def2), [])]
 | 
| 20179 | 141  | 
end) ak_names_types thy3;  | 
| 18068 | 142  | 
|
143  | 
(* defines permutation functions for all combinations of atom-kinds; *)  | 
|
144  | 
(* there are a trivial cases and non-trivial cases *)  | 
|
145  | 
(* non-trivial case: *)  | 
|
146  | 
(* <ak>_prm_<ak>_def: perm pi a == <ak>_prm_<ak> pi a *)  | 
|
147  | 
(* trivial case with <ak> != <ak'> *)  | 
|
148  | 
(* <ak>_prm<ak'>_def[simp]: perm pi a == a *)  | 
|
149  | 
(* *)  | 
|
150  | 
(* the trivial cases are added to the simplifier, while the non- *)  | 
|
151  | 
(* have their own rules proved below *)  | 
|
| 18366 | 152  | 
val (perm_defs, thy5) = fold_map (fn (ak_name, T) => fn thy =>  | 
153  | 
fold_map (fn (ak_name', T') => fn thy' =>  | 
|
| 18068 | 154  | 
let  | 
155  | 
val perm_def_name = ak_name ^ "_prm_" ^ ak_name';  | 
|
156  | 
          val pi = Free ("pi", mk_permT T);
 | 
|
157  | 
          val a  = Free ("a", T');
 | 
|
| 19494 | 158  | 
          val cperm = Const ("Nominal.perm", mk_permT T --> T' --> T');
 | 
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
159  | 
val cperm_def = Const (Sign.full_name thy' perm_def_name, mk_permT T --> T' --> T');  | 
| 18068 | 160  | 
|
161  | 
val name = ak_name ^ "_prm_" ^ ak_name' ^ "_def";  | 
|
162  | 
val def = Logic.mk_equals  | 
|
163  | 
(cperm $ pi $ a, if ak_name = ak_name' then cperm_def $ pi $ a else a)  | 
|
164  | 
in  | 
|
| 19635 | 165  | 
PureThy.add_defs_unchecked_i true [((name, def),[])] thy'  | 
| 18366 | 166  | 
end) ak_names_types thy) ak_names_types thy4;  | 
| 18068 | 167  | 
|
168  | 
(* proves that every atom-kind is an instance of at *)  | 
|
169  | 
(* lemma at_<ak>_inst: *)  | 
|
170  | 
(* at TYPE(<ak>) *)  | 
|
| 
18381
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
171  | 
val (prm_cons_thms,thy6) =  | 
| 18068 | 172  | 
thy5 |> PureThy.add_thms (map (fn (ak_name, T) =>  | 
173  | 
let  | 
|
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
174  | 
val ak_name_qu = Sign.full_name thy5 (ak_name);  | 
| 18068 | 175  | 
val i_type = Type(ak_name_qu,[]);  | 
| 19494 | 176  | 
	val cat = Const ("Nominal.at",(Term.itselfT i_type)  --> HOLogic.boolT);
 | 
| 18068 | 177  | 
val at_type = Logic.mk_type i_type;  | 
178  | 
val simp_s = HOL_basic_ss addsimps PureThy.get_thmss thy5  | 
|
179  | 
[Name "at_def",  | 
|
180  | 
Name (ak_name ^ "_prm_" ^ ak_name ^ "_def"),  | 
|
181  | 
Name (ak_name ^ "_prm_" ^ ak_name ^ ".simps"),  | 
|
182  | 
                                   Name ("swap_" ^ ak_name ^ "_def"),
 | 
|
183  | 
                                   Name ("swap_" ^ ak_name ^ ".simps"),
 | 
|
184  | 
Name (ak_name ^ "_infinite")]  | 
|
185  | 
||
186  | 
val name = "at_"^ak_name^ "_inst";  | 
|
187  | 
val statement = HOLogic.mk_Trueprop (cat $ at_type);  | 
|
188  | 
||
| 
23894
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
189  | 
val proof = fn _ => auto_tac (cla_s,simp_s);  | 
| 18068 | 190  | 
|
191  | 
in  | 
|
| 20046 | 192  | 
((name, Goal.prove_global thy5 [] [] statement proof), [])  | 
| 18068 | 193  | 
end) ak_names_types);  | 
194  | 
||
195  | 
(* declares a perm-axclass for every atom-kind *)  | 
|
196  | 
(* axclass pt_<ak> *)  | 
|
197  | 
(* pt_<ak>1[simp]: perm [] x = x *)  | 
|
198  | 
(* pt_<ak>2: perm (pi1@pi2) x = perm pi1 (perm pi2 x) *)  | 
|
199  | 
(* pt_<ak>3: pi1 ~ pi2 ==> perm pi1 x = perm pi2 x *)  | 
|
| 
18438
 
b8d867177916
made the changes according to Florian's re-arranging of
 
urbanc 
parents: 
18437 
diff
changeset
 | 
200  | 
val (pt_ax_classes,thy7) = fold_map (fn (ak_name, T) => fn thy =>  | 
| 18068 | 201  | 
let  | 
202  | 
val cl_name = "pt_"^ak_name;  | 
|
203  | 
          val ty = TFree("'a",["HOL.type"]);
 | 
|
204  | 
          val x   = Free ("x", ty);
 | 
|
205  | 
          val pi1 = Free ("pi1", mk_permT T);
 | 
|
206  | 
          val pi2 = Free ("pi2", mk_permT T);
 | 
|
| 19494 | 207  | 
          val cperm = Const ("Nominal.perm", mk_permT T --> ty --> ty);
 | 
| 18068 | 208  | 
          val cnil  = Const ("List.list.Nil", mk_permT T);
 | 
| 23029 | 209  | 
          val cappend = Const ("List.append",mk_permT T --> mk_permT T --> mk_permT T);
 | 
| 19494 | 210  | 
          val cprm_eq = Const ("Nominal.prm_eq",mk_permT T --> mk_permT T --> HOLogic.boolT);
 | 
| 18068 | 211  | 
(* nil axiom *)  | 
212  | 
val axiom1 = HOLogic.mk_Trueprop (HOLogic.mk_eq  | 
|
213  | 
(cperm $ cnil $ x, x));  | 
|
214  | 
(* append axiom *)  | 
|
215  | 
val axiom2 = HOLogic.mk_Trueprop (HOLogic.mk_eq  | 
|
216  | 
(cperm $ (cappend $ pi1 $ pi2) $ x, cperm $ pi1 $ (cperm $ pi2 $ x)));  | 
|
217  | 
(* perm-eq axiom *)  | 
|
218  | 
val axiom3 = Logic.mk_implies  | 
|
219  | 
(HOLogic.mk_Trueprop (cprm_eq $ pi1 $ pi2),  | 
|
220  | 
HOLogic.mk_Trueprop (HOLogic.mk_eq (cperm $ pi1 $ x, cperm $ pi2 $ x)));  | 
|
221  | 
in  | 
|
| 22745 | 222  | 
AxClass.define_class (cl_name, ["HOL.type"]) []  | 
| 19488 | 223  | 
[((cl_name ^ "1", [Simplifier.simp_add]), [axiom1]),  | 
224  | 
((cl_name ^ "2", []), [axiom2]),  | 
|
225  | 
((cl_name ^ "3", []), [axiom3])] thy  | 
|
| 
18438
 
b8d867177916
made the changes according to Florian's re-arranging of
 
urbanc 
parents: 
18437 
diff
changeset
 | 
226  | 
end) ak_names_types thy6;  | 
| 18068 | 227  | 
|
228  | 
(* proves that every pt_<ak>-type together with <ak>-type *)  | 
|
229  | 
(* instance of pt *)  | 
|
230  | 
(* lemma pt_<ak>_inst: *)  | 
|
231  | 
    (* pt TYPE('x::pt_<ak>) TYPE(<ak>)                        *)
 | 
|
| 
18381
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
232  | 
val (prm_inst_thms,thy8) =  | 
| 18068 | 233  | 
thy7 |> PureThy.add_thms (map (fn (ak_name, T) =>  | 
234  | 
let  | 
|
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
235  | 
val ak_name_qu = Sign.full_name thy7 ak_name;  | 
| 
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
236  | 
        val pt_name_qu = Sign.full_name thy7 ("pt_"^ak_name);
 | 
| 18068 | 237  | 
        val i_type1 = TFree("'x",[pt_name_qu]);
 | 
238  | 
val i_type2 = Type(ak_name_qu,[]);  | 
|
| 19494 | 239  | 
	val cpt = Const ("Nominal.pt",(Term.itselfT i_type1)-->(Term.itselfT i_type2)-->HOLogic.boolT);
 | 
| 18068 | 240  | 
val pt_type = Logic.mk_type i_type1;  | 
241  | 
val at_type = Logic.mk_type i_type2;  | 
|
242  | 
val simp_s = HOL_basic_ss addsimps PureThy.get_thmss thy7  | 
|
243  | 
[Name "pt_def",  | 
|
244  | 
                                   Name ("pt_" ^ ak_name ^ "1"),
 | 
|
245  | 
                                   Name ("pt_" ^ ak_name ^ "2"),
 | 
|
246  | 
                                   Name ("pt_" ^ ak_name ^ "3")];
 | 
|
247  | 
||
248  | 
val name = "pt_"^ak_name^ "_inst";  | 
|
249  | 
val statement = HOLogic.mk_Trueprop (cpt $ pt_type $ at_type);  | 
|
250  | 
||
| 
23894
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
251  | 
val proof = fn _ => auto_tac (cla_s,simp_s);  | 
| 18068 | 252  | 
in  | 
| 20046 | 253  | 
((name, Goal.prove_global thy7 [] [] statement proof), [])  | 
| 18068 | 254  | 
end) ak_names_types);  | 
255  | 
||
256  | 
(* declares an fs-axclass for every atom-kind *)  | 
|
257  | 
(* axclass fs_<ak> *)  | 
|
258  | 
(* fs_<ak>1: finite ((supp x)::<ak> set) *)  | 
|
| 
18438
 
b8d867177916
made the changes according to Florian's re-arranging of
 
urbanc 
parents: 
18437 
diff
changeset
 | 
259  | 
val (fs_ax_classes,thy11) = fold_map (fn (ak_name, T) => fn thy =>  | 
| 18068 | 260  | 
let  | 
261  | 
val cl_name = "fs_"^ak_name;  | 
|
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
262  | 
	  val pt_name = Sign.full_name thy ("pt_"^ak_name);
 | 
| 18068 | 263  | 
          val ty = TFree("'a",["HOL.type"]);
 | 
264  | 
          val x   = Free ("x", ty);
 | 
|
| 19494 | 265  | 
          val csupp    = Const ("Nominal.supp", ty --> HOLogic.mk_setT T);
 | 
| 22274 | 266  | 
          val cfinite  = Const ("Finite_Set.finite", HOLogic.mk_setT T --> HOLogic.boolT)
 | 
| 18068 | 267  | 
|
| 22274 | 268  | 
val axiom1 = HOLogic.mk_Trueprop (cfinite $ (csupp $ x));  | 
| 18068 | 269  | 
|
270  | 
in  | 
|
| 22745 | 271  | 
AxClass.define_class (cl_name, [pt_name]) [] [((cl_name ^ "1", []), [axiom1])] thy  | 
| 
18438
 
b8d867177916
made the changes according to Florian's re-arranging of
 
urbanc 
parents: 
18437 
diff
changeset
 | 
272  | 
end) ak_names_types thy8;  | 
| 
22418
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
273  | 
|
| 18068 | 274  | 
(* proves that every fs_<ak>-type together with <ak>-type *)  | 
275  | 
(* instance of fs-type *)  | 
|
276  | 
(* lemma abst_<ak>_inst: *)  | 
|
277  | 
     (* fs TYPE('x::pt_<ak>) TYPE (<ak>)                         *)
 | 
|
| 
18381
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
278  | 
val (fs_inst_thms,thy12) =  | 
| 18068 | 279  | 
thy11 |> PureThy.add_thms (map (fn (ak_name, T) =>  | 
280  | 
let  | 
|
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
281  | 
val ak_name_qu = Sign.full_name thy11 ak_name;  | 
| 
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
282  | 
         val fs_name_qu = Sign.full_name thy11 ("fs_"^ak_name);
 | 
| 18068 | 283  | 
         val i_type1 = TFree("'x",[fs_name_qu]);
 | 
284  | 
val i_type2 = Type(ak_name_qu,[]);  | 
|
| 19494 | 285  | 
 	 val cfs = Const ("Nominal.fs", 
 | 
| 18068 | 286  | 
(Term.itselfT i_type1)-->(Term.itselfT i_type2)-->HOLogic.boolT);  | 
287  | 
val fs_type = Logic.mk_type i_type1;  | 
|
288  | 
val at_type = Logic.mk_type i_type2;  | 
|
289  | 
val simp_s = HOL_basic_ss addsimps PureThy.get_thmss thy11  | 
|
290  | 
[Name "fs_def",  | 
|
291  | 
                                    Name ("fs_" ^ ak_name ^ "1")];
 | 
|
292  | 
||
293  | 
val name = "fs_"^ak_name^ "_inst";  | 
|
294  | 
val statement = HOLogic.mk_Trueprop (cfs $ fs_type $ at_type);  | 
|
295  | 
||
| 
23894
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
296  | 
val proof = fn _ => auto_tac (cla_s,simp_s);  | 
| 18068 | 297  | 
in  | 
| 20046 | 298  | 
((name, Goal.prove_global thy11 [] [] statement proof), [])  | 
| 18068 | 299  | 
end) ak_names_types);  | 
300  | 
||
301  | 
(* declares for every atom-kind combination an axclass *)  | 
|
302  | 
(* cp_<ak1>_<ak2> giving a composition property *)  | 
|
303  | 
(* cp_<ak1>_<ak2>1: pi1 o pi2 o x = (pi1 o pi2) o (pi1 o x) *)  | 
|
| 
22418
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
304  | 
val (cp_ax_classes,thy12b) = fold_map (fn (ak_name, T) => fn thy =>  | 
| 
18438
 
b8d867177916
made the changes according to Florian's re-arranging of
 
urbanc 
parents: 
18437 
diff
changeset
 | 
305  | 
fold_map (fn (ak_name', T') => fn thy' =>  | 
| 18068 | 306  | 
let  | 
307  | 
val cl_name = "cp_"^ak_name^"_"^ak_name';  | 
|
308  | 
	       val ty = TFree("'a",["HOL.type"]);
 | 
|
309  | 
               val x   = Free ("x", ty);
 | 
|
310  | 
               val pi1 = Free ("pi1", mk_permT T);
 | 
|
311  | 
	       val pi2 = Free ("pi2", mk_permT T');                  
 | 
|
| 19494 | 312  | 
	       val cperm1 = Const ("Nominal.perm", mk_permT T  --> ty --> ty);
 | 
313  | 
               val cperm2 = Const ("Nominal.perm", mk_permT T' --> ty --> ty);
 | 
|
314  | 
               val cperm3 = Const ("Nominal.perm", mk_permT T  --> mk_permT T' --> mk_permT T');
 | 
|
| 18068 | 315  | 
|
316  | 
val ax1 = HOLogic.mk_Trueprop  | 
|
317  | 
(HOLogic.mk_eq (cperm1 $ pi1 $ (cperm2 $ pi2 $ x),  | 
|
318  | 
cperm2 $ (cperm3 $ pi1 $ pi2) $ (cperm1 $ pi1 $ x)));  | 
|
319  | 
in  | 
|
| 22745 | 320  | 
AxClass.define_class (cl_name, ["HOL.type"]) [] [((cl_name ^ "1", []), [ax1])] thy'  | 
| 
18438
 
b8d867177916
made the changes according to Florian's re-arranging of
 
urbanc 
parents: 
18437 
diff
changeset
 | 
321  | 
end) ak_names_types thy) ak_names_types thy12;  | 
| 18068 | 322  | 
|
323  | 
(* proves for every <ak>-combination a cp_<ak1>_<ak2>_inst theorem; *)  | 
|
324  | 
(* lemma cp_<ak1>_<ak2>_inst: *)  | 
|
325  | 
        (* cp TYPE('a::cp_<ak1>_<ak2>) TYPE(<ak1>) TYPE(<ak2>)                  *)
 | 
|
| 
18381
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
326  | 
val (cp_thms,thy12c) = fold_map (fn (ak_name, T) => fn thy =>  | 
| 
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
327  | 
fold_map (fn (ak_name', T') => fn thy' =>  | 
| 18068 | 328  | 
let  | 
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
329  | 
val ak_name_qu = Sign.full_name thy' (ak_name);  | 
| 
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
330  | 
val ak_name_qu' = Sign.full_name thy' (ak_name');  | 
| 
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
331  | 
             val cp_name_qu  = Sign.full_name thy' ("cp_"^ak_name^"_"^ak_name');
 | 
| 18068 | 332  | 
             val i_type0 = TFree("'a",[cp_name_qu]);
 | 
333  | 
val i_type1 = Type(ak_name_qu,[]);  | 
|
334  | 
val i_type2 = Type(ak_name_qu',[]);  | 
|
| 19494 | 335  | 
	     val ccp = Const ("Nominal.cp",
 | 
| 18068 | 336  | 
(Term.itselfT i_type0)-->(Term.itselfT i_type1)-->  | 
337  | 
(Term.itselfT i_type2)-->HOLogic.boolT);  | 
|
338  | 
val at_type = Logic.mk_type i_type1;  | 
|
339  | 
val at_type' = Logic.mk_type i_type2;  | 
|
340  | 
val cp_type = Logic.mk_type i_type0;  | 
|
341  | 
val simp_s = HOL_basic_ss addsimps PureThy.get_thmss thy' [(Name "cp_def")];  | 
|
342  | 
	     val cp1      = PureThy.get_thm thy' (Name ("cp_"^ak_name^"_"^ak_name'^"1"));
 | 
|
343  | 
||
344  | 
val name = "cp_"^ak_name^ "_"^ak_name'^"_inst";  | 
|
345  | 
val statement = HOLogic.mk_Trueprop (ccp $ cp_type $ at_type $ at_type');  | 
|
346  | 
||
| 
23894
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
347  | 
val proof = fn _ => EVERY [auto_tac (cla_s,simp_s), rtac cp1 1];  | 
| 18068 | 348  | 
in  | 
| 20046 | 349  | 
PureThy.add_thms [((name, Goal.prove_global thy' [] [] statement proof), [])] thy'  | 
| 18068 | 350  | 
end)  | 
| 
18381
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
351  | 
ak_names_types thy) ak_names_types thy12b;  | 
| 18068 | 352  | 
|
353  | 
(* proves for every non-trivial <ak>-combination a disjointness *)  | 
|
354  | 
(* theorem; i.e. <ak1> != <ak2> *)  | 
|
355  | 
(* lemma ds_<ak1>_<ak2>: *)  | 
|
356  | 
(* dj TYPE(<ak1>) TYPE(<ak2>) *)  | 
|
| 
18381
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
357  | 
val (dj_thms, thy12d) = fold_map (fn (ak_name,T) => fn thy =>  | 
| 
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
358  | 
fold_map (fn (ak_name',T') => fn thy' =>  | 
| 18068 | 359  | 
(if not (ak_name = ak_name')  | 
360  | 
then  | 
|
361  | 
let  | 
|
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
362  | 
val ak_name_qu = Sign.full_name thy' ak_name;  | 
| 
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
363  | 
val ak_name_qu' = Sign.full_name thy' ak_name';  | 
| 18068 | 364  | 
val i_type1 = Type(ak_name_qu,[]);  | 
365  | 
val i_type2 = Type(ak_name_qu',[]);  | 
|
| 19494 | 366  | 
	         val cdj = Const ("Nominal.disjoint",
 | 
| 18068 | 367  | 
(Term.itselfT i_type1)-->(Term.itselfT i_type2)-->HOLogic.boolT);  | 
368  | 
val at_type = Logic.mk_type i_type1;  | 
|
369  | 
val at_type' = Logic.mk_type i_type2;  | 
|
370  | 
val simp_s = HOL_basic_ss addsimps PureThy.get_thmss thy'  | 
|
371  | 
[Name "disjoint_def",  | 
|
372  | 
Name (ak_name^"_prm_"^ak_name'^"_def"),  | 
|
373  | 
Name (ak_name'^"_prm_"^ak_name^"_def")];  | 
|
374  | 
||
375  | 
val name = "dj_"^ak_name^"_"^ak_name';  | 
|
376  | 
val statement = HOLogic.mk_Trueprop (cdj $ at_type $ at_type');  | 
|
377  | 
||
| 
23894
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
378  | 
val proof = fn _ => auto_tac (cla_s,simp_s);  | 
| 18068 | 379  | 
in  | 
| 20046 | 380  | 
PureThy.add_thms [((name, Goal.prove_global thy' [] [] statement proof), [])] thy'  | 
| 18068 | 381  | 
end  | 
382  | 
else  | 
|
| 
18381
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
383  | 
([],thy'))) (* do nothing branch, if ak_name = ak_name' *)  | 
| 
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
384  | 
ak_names_types thy) ak_names_types thy12c;  | 
| 18068 | 385  | 
|
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
386  | 
(******** pt_<ak> class instances ********)  | 
| 18068 | 387  | 
(*=========================================*)  | 
| 
18279
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
388  | 
(* some abbreviations for theorems *)  | 
| 
23894
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
389  | 
      val pt1           = @{thm "pt1"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
390  | 
      val pt2           = @{thm "pt2"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
391  | 
      val pt3           = @{thm "pt3"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
392  | 
      val at_pt_inst    = @{thm "at_pt_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
393  | 
      val pt_set_inst   = @{thm "pt_set_inst"}; 
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
394  | 
      val pt_unit_inst  = @{thm "pt_unit_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
395  | 
      val pt_prod_inst  = @{thm "pt_prod_inst"}; 
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
396  | 
      val pt_nprod_inst = @{thm "pt_nprod_inst"}; 
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
397  | 
      val pt_list_inst  = @{thm "pt_list_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
398  | 
      val pt_optn_inst  = @{thm "pt_option_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
399  | 
      val pt_noptn_inst = @{thm "pt_noption_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
400  | 
      val pt_fun_inst   = @{thm "pt_fun_inst"};
 | 
| 18068 | 401  | 
|
| 18435 | 402  | 
(* for all atom-kind combinations <ak>/<ak'> show that *)  | 
403  | 
(* every <ak> is an instance of pt_<ak'>; the proof for *)  | 
|
404  | 
(* ak!=ak' is by definition; the case ak=ak' uses at_pt_inst. *)  | 
|
| 18431 | 405  | 
val thy13 = fold (fn ak_name => fn thy =>  | 
406  | 
fold (fn ak_name' => fn thy' =>  | 
|
407  | 
let  | 
|
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
408  | 
val qu_name = Sign.full_name thy' ak_name';  | 
| 
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
409  | 
           val cls_name = Sign.full_name thy' ("pt_"^ak_name);
 | 
| 18431 | 410  | 
           val at_inst  = PureThy.get_thm thy' (Name ("at_"^ak_name'^"_inst")); 
 | 
411  | 
||
| 
19133
 
7e84a1a3741c
Adapted to Florian's recent changes to the AxClass package.
 
berghofe 
parents: 
18759 
diff
changeset
 | 
412  | 
val proof1 = EVERY [ClassPackage.intro_classes_tac [],  | 
| 18068 | 413  | 
rtac ((at_inst RS at_pt_inst) RS pt1) 1,  | 
414  | 
rtac ((at_inst RS at_pt_inst) RS pt2) 1,  | 
|
415  | 
rtac ((at_inst RS at_pt_inst) RS pt3) 1,  | 
|
416  | 
atac 1];  | 
|
| 18431 | 417  | 
val simp_s = HOL_basic_ss addsimps  | 
418  | 
PureThy.get_thmss thy' [Name (ak_name^"_prm_"^ak_name'^"_def")];  | 
|
| 
19133
 
7e84a1a3741c
Adapted to Florian's recent changes to the AxClass package.
 
berghofe 
parents: 
18759 
diff
changeset
 | 
419  | 
val proof2 = EVERY [ClassPackage.intro_classes_tac [], REPEAT (asm_simp_tac simp_s 1)];  | 
| 18431 | 420  | 
|
421  | 
in  | 
|
422  | 
thy'  | 
|
| 19275 | 423  | 
|> AxClass.prove_arity (qu_name,[],[cls_name])  | 
| 18431 | 424  | 
(if ak_name = ak_name' then proof1 else proof2)  | 
425  | 
end) ak_names thy) ak_names thy12c;  | 
|
| 18068 | 426  | 
|
| 18430 | 427  | 
(* show that *)  | 
428  | 
(* fun(pt_<ak>,pt_<ak>) *)  | 
|
| 
18579
 
002d371401f5
changed the name of the type "nOption" to "noption".
 
urbanc 
parents: 
18438 
diff
changeset
 | 
429  | 
(* noption(pt_<ak>) *)  | 
| 18430 | 430  | 
(* option(pt_<ak>) *)  | 
431  | 
(* list(pt_<ak>) *)  | 
|
432  | 
(* *(pt_<ak>,pt_<ak>) *)  | 
|
| 18600 | 433  | 
(* nprod(pt_<ak>,pt_<ak>) *)  | 
| 18430 | 434  | 
(* unit *)  | 
435  | 
(* set(pt_<ak>) *)  | 
|
436  | 
(* are instances of pt_<ak> *)  | 
|
| 18431 | 437  | 
val thy18 = fold (fn ak_name => fn thy =>  | 
| 18068 | 438  | 
let  | 
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
439  | 
          val cls_name = Sign.full_name thy ("pt_"^ak_name);
 | 
| 18068 | 440  | 
          val at_thm   = PureThy.get_thm thy (Name ("at_"^ak_name^"_inst"));
 | 
441  | 
          val pt_inst  = PureThy.get_thm thy (Name ("pt_"^ak_name^"_inst"));
 | 
|
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
442  | 
|
| 18430 | 443  | 
fun pt_proof thm =  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
444  | 
EVERY [ClassPackage.intro_classes_tac [],  | 
| 18430 | 445  | 
rtac (thm RS pt1) 1, rtac (thm RS pt2) 1, rtac (thm RS pt3) 1, atac 1];  | 
446  | 
||
447  | 
val pt_thm_fun = at_thm RS (pt_inst RS (pt_inst RS pt_fun_inst));  | 
|
448  | 
val pt_thm_noptn = pt_inst RS pt_noptn_inst;  | 
|
449  | 
val pt_thm_optn = pt_inst RS pt_optn_inst;  | 
|
450  | 
val pt_thm_list = pt_inst RS pt_list_inst;  | 
|
451  | 
val pt_thm_prod = pt_inst RS (pt_inst RS pt_prod_inst);  | 
|
| 18600 | 452  | 
val pt_thm_nprod = pt_inst RS (pt_inst RS pt_nprod_inst);  | 
| 18430 | 453  | 
val pt_thm_unit = pt_unit_inst;  | 
454  | 
val pt_thm_set = pt_inst RS pt_set_inst  | 
|
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
455  | 
in  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
456  | 
thy  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
457  | 
        |> AxClass.prove_arity ("fun",[[cls_name],[cls_name]],[cls_name]) (pt_proof pt_thm_fun)
 | 
| 19494 | 458  | 
        |> AxClass.prove_arity ("Nominal.noption",[[cls_name]],[cls_name]) (pt_proof pt_thm_noptn) 
 | 
| 24194 | 459  | 
        |> AxClass.prove_arity ("Datatype.option",[[cls_name]],[cls_name]) (pt_proof pt_thm_optn)
 | 
| 19275 | 460  | 
        |> AxClass.prove_arity ("List.list",[[cls_name]],[cls_name]) (pt_proof pt_thm_list)
 | 
461  | 
        |> AxClass.prove_arity ("*",[[cls_name],[cls_name]],[cls_name]) (pt_proof pt_thm_prod)
 | 
|
| 19494 | 462  | 
        |> AxClass.prove_arity ("Nominal.nprod",[[cls_name],[cls_name]],[cls_name]) 
 | 
| 18600 | 463  | 
(pt_proof pt_thm_nprod)  | 
| 19275 | 464  | 
        |> AxClass.prove_arity ("Product_Type.unit",[],[cls_name]) (pt_proof pt_thm_unit)
 | 
465  | 
        |> AxClass.prove_arity ("set",[[cls_name]],[cls_name]) (pt_proof pt_thm_set)
 | 
|
| 18430 | 466  | 
end) ak_names thy13;  | 
| 18068 | 467  | 
|
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
468  | 
(******** fs_<ak> class instances ********)  | 
| 18068 | 469  | 
(*=========================================*)  | 
| 
18279
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
470  | 
(* abbreviations for some lemmas *)  | 
| 
23894
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
471  | 
       val fs1            = @{thm "fs1"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
472  | 
       val fs_at_inst     = @{thm "fs_at_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
473  | 
       val fs_unit_inst   = @{thm "fs_unit_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
474  | 
       val fs_prod_inst   = @{thm "fs_prod_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
475  | 
       val fs_nprod_inst  = @{thm "fs_nprod_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
476  | 
       val fs_list_inst   = @{thm "fs_list_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
477  | 
       val fs_option_inst = @{thm "fs_option_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
478  | 
       val dj_supp        = @{thm "dj_supp"};
 | 
| 18068 | 479  | 
|
480  | 
(* shows that <ak> is an instance of fs_<ak> *)  | 
|
481  | 
(* uses the theorem at_<ak>_inst *)  | 
|
| 18431 | 482  | 
val thy20 = fold (fn ak_name => fn thy =>  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
483  | 
fold (fn ak_name' => fn thy' =>  | 
| 
18437
 
ee0283e5dfe3
added proofs to show that every atom-kind combination
 
urbanc 
parents: 
18436 
diff
changeset
 | 
484  | 
let  | 
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
485  | 
val qu_name = Sign.full_name thy' ak_name';  | 
| 
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
486  | 
           val qu_class = Sign.full_name thy' ("fs_"^ak_name);
 | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
487  | 
val proof =  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
488  | 
(if ak_name = ak_name'  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
489  | 
then  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
490  | 
                  let val at_thm = PureThy.get_thm thy' (Name ("at_"^ak_name^"_inst"));
 | 
| 
19133
 
7e84a1a3741c
Adapted to Florian's recent changes to the AxClass package.
 
berghofe 
parents: 
18759 
diff
changeset
 | 
491  | 
in EVERY [ClassPackage.intro_classes_tac [],  | 
| 
18437
 
ee0283e5dfe3
added proofs to show that every atom-kind combination
 
urbanc 
parents: 
18436 
diff
changeset
 | 
492  | 
rtac ((at_thm RS fs_at_inst) RS fs1) 1] end  | 
| 
 
ee0283e5dfe3
added proofs to show that every atom-kind combination
 
urbanc 
parents: 
18436 
diff
changeset
 | 
493  | 
else  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
494  | 
                  let val dj_inst = PureThy.get_thm thy' (Name ("dj_"^ak_name'^"_"^ak_name));
 | 
| 22274 | 495  | 
val simp_s = HOL_basic_ss addsimps [dj_inst RS dj_supp, finite_emptyI];  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
496  | 
in EVERY [ClassPackage.intro_classes_tac [], asm_simp_tac simp_s 1] end)  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
497  | 
in  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
498  | 
AxClass.prove_arity (qu_name,[],[qu_class]) proof thy'  | 
| 
18437
 
ee0283e5dfe3
added proofs to show that every atom-kind combination
 
urbanc 
parents: 
18436 
diff
changeset
 | 
499  | 
end) ak_names thy) ak_names thy18;  | 
| 18068 | 500  | 
|
| 18431 | 501  | 
(* shows that *)  | 
502  | 
(* unit *)  | 
|
503  | 
(* *(fs_<ak>,fs_<ak>) *)  | 
|
| 18600 | 504  | 
(* nprod(fs_<ak>,fs_<ak>) *)  | 
| 18431 | 505  | 
(* list(fs_<ak>) *)  | 
506  | 
(* option(fs_<ak>) *)  | 
|
507  | 
(* are instances of fs_<ak> *)  | 
|
| 18068 | 508  | 
|
| 18431 | 509  | 
val thy24 = fold (fn ak_name => fn thy =>  | 
510  | 
let  | 
|
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
511  | 
          val cls_name = Sign.full_name thy ("fs_"^ak_name);
 | 
| 18068 | 512  | 
          val fs_inst  = PureThy.get_thm thy (Name ("fs_"^ak_name^"_inst"));
 | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
513  | 
fun fs_proof thm = EVERY [ClassPackage.intro_classes_tac [], rtac (thm RS fs1) 1];  | 
| 18068 | 514  | 
|
| 18600 | 515  | 
val fs_thm_unit = fs_unit_inst;  | 
516  | 
val fs_thm_prod = fs_inst RS (fs_inst RS fs_prod_inst);  | 
|
517  | 
val fs_thm_nprod = fs_inst RS (fs_inst RS fs_nprod_inst);  | 
|
518  | 
val fs_thm_list = fs_inst RS fs_list_inst;  | 
|
519  | 
val fs_thm_optn = fs_inst RS fs_option_inst;  | 
|
| 18431 | 520  | 
in  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
521  | 
thy  | 
| 19275 | 522  | 
         |> AxClass.prove_arity ("Product_Type.unit",[],[cls_name]) (fs_proof fs_thm_unit) 
 | 
523  | 
         |> AxClass.prove_arity ("*",[[cls_name],[cls_name]],[cls_name]) (fs_proof fs_thm_prod) 
 | 
|
| 19494 | 524  | 
         |> AxClass.prove_arity ("Nominal.nprod",[[cls_name],[cls_name]],[cls_name]) 
 | 
| 18600 | 525  | 
(fs_proof fs_thm_nprod)  | 
| 19275 | 526  | 
         |> AxClass.prove_arity ("List.list",[[cls_name]],[cls_name]) (fs_proof fs_thm_list)
 | 
| 24194 | 527  | 
         |> AxClass.prove_arity ("Datatype.option",[[cls_name]],[cls_name]) (fs_proof fs_thm_optn)
 | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
528  | 
end) ak_names thy20;  | 
| 18431 | 529  | 
|
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
530  | 
(******** cp_<ak>_<ai> class instances ********)  | 
| 18068 | 531  | 
(*==============================================*)  | 
| 
18279
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
532  | 
(* abbreviations for some lemmas *)  | 
| 
23894
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
533  | 
       val cp1             = @{thm "cp1"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
534  | 
       val cp_unit_inst    = @{thm "cp_unit_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
535  | 
       val cp_bool_inst    = @{thm "cp_bool_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
536  | 
       val cp_prod_inst    = @{thm "cp_prod_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
537  | 
       val cp_list_inst    = @{thm "cp_list_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
538  | 
       val cp_fun_inst     = @{thm "cp_fun_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
539  | 
       val cp_option_inst  = @{thm "cp_option_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
540  | 
       val cp_noption_inst = @{thm "cp_noption_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
541  | 
       val cp_set_inst     = @{thm "cp_set_inst"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
542  | 
       val pt_perm_compose = @{thm "pt_perm_compose"};
 | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
543  | 
|
| 
23894
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
544  | 
       val dj_pp_forget    = @{thm "dj_perm_perm_forget"};
 | 
| 18068 | 545  | 
|
546  | 
(* shows that <aj> is an instance of cp_<ak>_<ai> *)  | 
|
| 18432 | 547  | 
(* for every <ak>/<ai>-combination *)  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
548  | 
val thy25 = fold (fn ak_name => fn thy =>  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
549  | 
fold (fn ak_name' => fn thy' =>  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
550  | 
fold (fn ak_name'' => fn thy'' =>  | 
| 18068 | 551  | 
let  | 
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
552  | 
val name = Sign.full_name thy'' ak_name;  | 
| 
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
553  | 
              val cls_name = Sign.full_name thy'' ("cp_"^ak_name'^"_"^ak_name'');
 | 
| 18068 | 554  | 
val proof =  | 
555  | 
(if (ak_name'=ak_name'') then  | 
|
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
556  | 
(let  | 
| 18068 | 557  | 
                    val pt_inst  = PureThy.get_thm thy'' (Name ("pt_"^ak_name''^"_inst"));
 | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
558  | 
                    val at_inst  = PureThy.get_thm thy'' (Name ("at_"^ak_name''^"_inst"));
 | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
559  | 
in  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
560  | 
EVERY [ClassPackage.intro_classes_tac [],  | 
| 18068 | 561  | 
rtac (at_inst RS (pt_inst RS pt_perm_compose)) 1]  | 
562  | 
end)  | 
|
563  | 
else  | 
|
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
564  | 
(let  | 
| 18068 | 565  | 
                     val dj_inst  = PureThy.get_thm thy'' (Name ("dj_"^ak_name''^"_"^ak_name'));
 | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
566  | 
val simp_s = HOL_basic_ss addsimps  | 
| 18068 | 567  | 
((dj_inst RS dj_pp_forget)::  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
568  | 
(PureThy.get_thmss thy''  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
569  | 
[Name (ak_name' ^"_prm_"^ak_name^"_def"),  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
570  | 
Name (ak_name''^"_prm_"^ak_name^"_def")]));  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
571  | 
in  | 
| 
19133
 
7e84a1a3741c
Adapted to Florian's recent changes to the AxClass package.
 
berghofe 
parents: 
18759 
diff
changeset
 | 
572  | 
EVERY [ClassPackage.intro_classes_tac [], simp_tac simp_s 1]  | 
| 18068 | 573  | 
end))  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
574  | 
in  | 
| 19275 | 575  | 
AxClass.prove_arity (name,[],[cls_name]) proof thy''  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
576  | 
end) ak_names thy') ak_names thy) ak_names thy24;  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
577  | 
|
| 18432 | 578  | 
(* shows that *)  | 
579  | 
(* units *)  | 
|
580  | 
(* products *)  | 
|
581  | 
(* lists *)  | 
|
582  | 
(* functions *)  | 
|
583  | 
(* options *)  | 
|
584  | 
(* noptions *)  | 
|
| 
22536
 
35debf264656
made the type sets instance of the "cp" type-class
 
urbanc 
parents: 
22535 
diff
changeset
 | 
585  | 
(* sets *)  | 
| 18432 | 586  | 
(* are instances of cp_<ak>_<ai> for every <ak>/<ai>-combination *)  | 
587  | 
val thy26 = fold (fn ak_name => fn thy =>  | 
|
588  | 
fold (fn ak_name' => fn thy' =>  | 
|
589  | 
let  | 
|
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
590  | 
            val cls_name = Sign.full_name thy' ("cp_"^ak_name^"_"^ak_name');
 | 
| 18068 | 591  | 
            val cp_inst  = PureThy.get_thm thy' (Name ("cp_"^ak_name^"_"^ak_name'^"_inst"));
 | 
592  | 
            val pt_inst  = PureThy.get_thm thy' (Name ("pt_"^ak_name^"_inst"));
 | 
|
593  | 
            val at_inst  = PureThy.get_thm thy' (Name ("at_"^ak_name^"_inst"));
 | 
|
| 18432 | 594  | 
|
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
595  | 
fun cp_proof thm = EVERY [ClassPackage.intro_classes_tac [],rtac (thm RS cp1) 1];  | 
| 18432 | 596  | 
|
597  | 
val cp_thm_unit = cp_unit_inst;  | 
|
598  | 
val cp_thm_prod = cp_inst RS (cp_inst RS cp_prod_inst);  | 
|
599  | 
val cp_thm_list = cp_inst RS cp_list_inst;  | 
|
600  | 
val cp_thm_fun = at_inst RS (pt_inst RS (cp_inst RS (cp_inst RS cp_fun_inst)));  | 
|
601  | 
val cp_thm_optn = cp_inst RS cp_option_inst;  | 
|
602  | 
val cp_thm_noptn = cp_inst RS cp_noption_inst;  | 
|
| 
22536
 
35debf264656
made the type sets instance of the "cp" type-class
 
urbanc 
parents: 
22535 
diff
changeset
 | 
603  | 
val cp_thm_set = cp_inst RS cp_set_inst;  | 
| 18432 | 604  | 
in  | 
605  | 
thy'  | 
|
| 19275 | 606  | 
         |> AxClass.prove_arity ("Product_Type.unit",[],[cls_name]) (cp_proof cp_thm_unit)
 | 
607  | 
	 |> AxClass.prove_arity ("*",[[cls_name],[cls_name]],[cls_name]) (cp_proof cp_thm_prod)
 | 
|
608  | 
         |> AxClass.prove_arity ("List.list",[[cls_name]],[cls_name]) (cp_proof cp_thm_list)
 | 
|
609  | 
         |> AxClass.prove_arity ("fun",[[cls_name],[cls_name]],[cls_name]) (cp_proof cp_thm_fun)
 | 
|
| 24194 | 610  | 
         |> AxClass.prove_arity ("Datatype.option",[[cls_name]],[cls_name]) (cp_proof cp_thm_optn)
 | 
| 19494 | 611  | 
         |> AxClass.prove_arity ("Nominal.noption",[[cls_name]],[cls_name]) (cp_proof cp_thm_noptn)
 | 
| 
22536
 
35debf264656
made the type sets instance of the "cp" type-class
 
urbanc 
parents: 
22535 
diff
changeset
 | 
612  | 
         |> AxClass.prove_arity ("set",[[cls_name]],[cls_name]) (cp_proof cp_thm_set)
 | 
| 18432 | 613  | 
end) ak_names thy) ak_names thy25;  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
614  | 
|
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
615  | 
(* show that discrete nominal types are permutation types, finitely *)  | 
| 18432 | 616  | 
(* supported and have the commutation property *)  | 
617  | 
(* discrete types have a permutation operation defined as pi o x = x; *)  | 
|
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
618  | 
(* which renders the proofs to be simple "simp_all"-proofs. *)  | 
| 18432 | 619  | 
val thy32 =  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
620  | 
let  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
621  | 
fun discrete_pt_inst discrete_ty defn =  | 
| 18432 | 622  | 
fold (fn ak_name => fn thy =>  | 
623  | 
let  | 
|
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
624  | 
	       val qu_class = Sign.full_name thy ("pt_"^ak_name);
 | 
| 18432 | 625  | 
val simp_s = HOL_basic_ss addsimps [defn];  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
626  | 
val proof = EVERY [ClassPackage.intro_classes_tac [], REPEAT (asm_simp_tac simp_s 1)];  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
627  | 
in  | 
| 19275 | 628  | 
AxClass.prove_arity (discrete_ty,[],[qu_class]) proof thy  | 
| 18432 | 629  | 
end) ak_names;  | 
| 18068 | 630  | 
|
| 18432 | 631  | 
fun discrete_fs_inst discrete_ty defn =  | 
632  | 
fold (fn ak_name => fn thy =>  | 
|
633  | 
let  | 
|
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
634  | 
	       val qu_class = Sign.full_name thy ("fs_"^ak_name);
 | 
| 
23894
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
635  | 
	       val supp_def = @{thm "Nominal.supp_def"};
 | 
| 22274 | 636  | 
val simp_s = HOL_ss addsimps [supp_def,Collect_const,finite_emptyI,defn];  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
637  | 
val proof = EVERY [ClassPackage.intro_classes_tac [], asm_simp_tac simp_s 1];  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
638  | 
in  | 
| 19275 | 639  | 
AxClass.prove_arity (discrete_ty,[],[qu_class]) proof thy  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
640  | 
end) ak_names;  | 
| 18068 | 641  | 
|
| 18432 | 642  | 
fun discrete_cp_inst discrete_ty defn =  | 
643  | 
fold (fn ak_name' => (fold (fn ak_name => fn thy =>  | 
|
644  | 
let  | 
|
| 
21289
 
920b7b893d9c
deleted all uses of sign_of as it's now the identity function
 
urbanc 
parents: 
20377 
diff
changeset
 | 
645  | 
	       val qu_class = Sign.full_name thy ("cp_"^ak_name^"_"^ak_name');
 | 
| 
23894
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
646  | 
	       val supp_def = @{thm "Nominal.supp_def"};
 | 
| 18432 | 647  | 
val simp_s = HOL_ss addsimps [defn];  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
648  | 
val proof = EVERY [ClassPackage.intro_classes_tac [], asm_simp_tac simp_s 1];  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
649  | 
in  | 
| 19275 | 650  | 
AxClass.prove_arity (discrete_ty,[],[qu_class]) proof thy  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
651  | 
end) ak_names)) ak_names;  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
652  | 
|
| 18432 | 653  | 
in  | 
654  | 
thy26  | 
|
| 
23894
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
655  | 
         |> discrete_pt_inst "nat"  @{thm "perm_nat_def"}
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
656  | 
         |> discrete_fs_inst "nat"  @{thm "perm_nat_def"}
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
657  | 
         |> discrete_cp_inst "nat"  @{thm "perm_nat_def"}
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
658  | 
         |> discrete_pt_inst "bool" @{thm "perm_bool"}
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
659  | 
         |> discrete_fs_inst "bool" @{thm "perm_bool"}
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
660  | 
         |> discrete_cp_inst "bool" @{thm "perm_bool"}
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
661  | 
         |> discrete_pt_inst "IntDef.int" @{thm "perm_int_def"}
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
662  | 
         |> discrete_fs_inst "IntDef.int" @{thm "perm_int_def"}
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
663  | 
         |> discrete_cp_inst "IntDef.int" @{thm "perm_int_def"}
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
664  | 
         |> discrete_pt_inst "List.char" @{thm "perm_char_def"}
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
665  | 
         |> discrete_fs_inst "List.char" @{thm "perm_char_def"}
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
666  | 
         |> discrete_cp_inst "List.char" @{thm "perm_char_def"}
 | 
| 18432 | 667  | 
end;  | 
668  | 
||
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
669  | 
|
| 18262 | 670  | 
(* abbreviations for some lemmas *)  | 
671  | 
(*===============================*)  | 
|
| 
23894
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
672  | 
       val abs_fun_pi          = @{thm "Nominal.abs_fun_pi"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
673  | 
       val abs_fun_pi_ineq     = @{thm "Nominal.abs_fun_pi_ineq"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
674  | 
       val abs_fun_eq          = @{thm "Nominal.abs_fun_eq"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
675  | 
       val abs_fun_eq'         = @{thm "Nominal.abs_fun_eq'"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
676  | 
       val abs_fun_fresh       = @{thm "Nominal.abs_fun_fresh"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
677  | 
       val abs_fun_fresh'      = @{thm "Nominal.abs_fun_fresh'"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
678  | 
       val dj_perm_forget      = @{thm "Nominal.dj_perm_forget"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
679  | 
       val dj_pp_forget        = @{thm "Nominal.dj_perm_perm_forget"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
680  | 
       val fresh_iff           = @{thm "Nominal.fresh_abs_fun_iff"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
681  | 
       val fresh_iff_ineq      = @{thm "Nominal.fresh_abs_fun_iff_ineq"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
682  | 
       val abs_fun_supp        = @{thm "Nominal.abs_fun_supp"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
683  | 
       val abs_fun_supp_ineq   = @{thm "Nominal.abs_fun_supp_ineq"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
684  | 
       val pt_swap_bij         = @{thm "Nominal.pt_swap_bij"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
685  | 
       val pt_swap_bij'        = @{thm "Nominal.pt_swap_bij'"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
686  | 
       val pt_fresh_fresh      = @{thm "Nominal.pt_fresh_fresh"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
687  | 
       val pt_bij              = @{thm "Nominal.pt_bij"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
688  | 
       val pt_perm_compose     = @{thm "Nominal.pt_perm_compose"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
689  | 
       val pt_perm_compose'    = @{thm "Nominal.pt_perm_compose'"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
690  | 
       val perm_app            = @{thm "Nominal.pt_fun_app_eq"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
691  | 
       val at_fresh            = @{thm "Nominal.at_fresh"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
692  | 
       val at_fresh_ineq       = @{thm "Nominal.at_fresh_ineq"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
693  | 
       val at_calc             = @{thms "Nominal.at_calc"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
694  | 
       val at_swap_simps       = @{thms "Nominal.at_swap_simps"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
695  | 
       val at_supp             = @{thm "Nominal.at_supp"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
696  | 
       val dj_supp             = @{thm "Nominal.dj_supp"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
697  | 
       val fresh_left_ineq     = @{thm "Nominal.pt_fresh_left_ineq"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
698  | 
       val fresh_left          = @{thm "Nominal.pt_fresh_left"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
699  | 
       val fresh_right_ineq    = @{thm "Nominal.pt_fresh_right_ineq"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
700  | 
       val fresh_right         = @{thm "Nominal.pt_fresh_right"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
701  | 
       val fresh_bij_ineq      = @{thm "Nominal.pt_fresh_bij_ineq"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
702  | 
       val fresh_bij           = @{thm "Nominal.pt_fresh_bij"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
703  | 
       val fresh_eqvt          = @{thm "Nominal.pt_fresh_eqvt"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
704  | 
       val fresh_eqvt_ineq     = @{thm "Nominal.pt_fresh_eqvt_ineq"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
705  | 
       val set_diff_eqvt       = @{thm "Nominal.pt_set_diff_eqvt"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
706  | 
       val in_eqvt             = @{thm "Nominal.pt_in_eqvt"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
707  | 
       val eq_eqvt             = @{thm "Nominal.pt_eq_eqvt"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
708  | 
       val all_eqvt            = @{thm "Nominal.pt_all_eqvt"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
709  | 
       val ex_eqvt             = @{thm "Nominal.pt_ex_eqvt"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
710  | 
       val pt_pi_rev           = @{thm "Nominal.pt_pi_rev"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
711  | 
       val pt_rev_pi           = @{thm "Nominal.pt_rev_pi"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
712  | 
       val at_exists_fresh     = @{thm "Nominal.at_exists_fresh"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
713  | 
       val at_exists_fresh'    = @{thm "Nominal.at_exists_fresh'"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
714  | 
       val fresh_perm_app_ineq = @{thm "Nominal.pt_fresh_perm_app_ineq"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
715  | 
       val fresh_perm_app      = @{thm "Nominal.pt_fresh_perm_app"};	
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
716  | 
       val fresh_aux           = @{thm "Nominal.pt_fresh_aux"};  
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
717  | 
       val pt_perm_supp_ineq   = @{thm "Nominal.pt_perm_supp_ineq"};
 | 
| 
 
1a4167d761ac
tactics: avoid dynamic reference to accidental theory context (via ML_Context.the_context etc.);
 
wenzelm 
parents: 
23158 
diff
changeset
 | 
718  | 
       val pt_perm_supp        = @{thm "Nominal.pt_perm_supp"};
 | 
| 22786 | 719  | 
|
| 18262 | 720  | 
(* Now we collect and instantiate some lemmas w.r.t. all atom *)  | 
721  | 
(* types; this allows for example to use abs_perm (which is a *)  | 
|
722  | 
(* collection of theorems) instead of thm abs_fun_pi with explicit *)  | 
|
723  | 
(* instantiations. *)  | 
|
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
724  | 
val (_, thy33) =  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
725  | 
let  | 
| 
18651
 
0cb5a8f501aa
added the thms-collection "pt_id" (collection of all pt_<ak>1 lemmas)
 
urbanc 
parents: 
18626 
diff
changeset
 | 
726  | 
|
| 
18279
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
727  | 
(* takes a theorem thm and a list of theorems [t1,..,tn] *)  | 
| 
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
728  | 
(* produces a list of theorems of the form [t1 RS thm,..,tn RS thm] *)  | 
| 18262 | 729  | 
fun instR thm thms = map (fn ti => ti RS thm) thms;  | 
| 18068 | 730  | 
|
| 18262 | 731  | 
(* takes two theorem lists (hopefully of the same length ;o) *)  | 
732  | 
(* produces a list of theorems of the form *)  | 
|
733  | 
(* [t1 RS m1,..,tn RS mn] where [t1,..,tn] is thms1 and [m1,..,mn] is thms2 *)  | 
|
| 
18279
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
734  | 
fun inst_zip thms1 thms2 = map (fn (t1,t2) => t1 RS t2) (thms1 ~~ thms2);  | 
| 18068 | 735  | 
|
| 18262 | 736  | 
(* takes a theorem list of the form [l1,...,ln] *)  | 
737  | 
(* and a list of theorem lists of the form *)  | 
|
738  | 
(* [[h11,...,h1m],....,[hk1,....,hkm] *)  | 
|
739  | 
(* produces the list of theorem lists *)  | 
|
740  | 
(* [[l1 RS h11,...,l1 RS h1m],...,[ln RS hk1,...,ln RS hkm]] *)  | 
|
| 
18279
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
741  | 
fun inst_mult thms thmss = map (fn (t,ts) => instR t ts) (thms ~~ thmss);  | 
| 
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
742  | 
|
| 
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
743  | 
(* FIXME: these lists do not need to be created dynamically again *)  | 
| 18262 | 744  | 
|
| 
22418
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
745  | 
|
| 18068 | 746  | 
(* list of all at_inst-theorems *)  | 
| 18262 | 747  | 
             val ats = map (fn ak => PureThy.get_thm thy32 (Name ("at_"^ak^"_inst"))) ak_names
 | 
| 18068 | 748  | 
(* list of all pt_inst-theorems *)  | 
| 18262 | 749  | 
             val pts = map (fn ak => PureThy.get_thm thy32 (Name ("pt_"^ak^"_inst"))) ak_names
 | 
750  | 
(* list of all cp_inst-theorems as a collection of lists*)  | 
|
| 18068 | 751  | 
val cps =  | 
| 18262 | 752  | 
		 let fun cps_fun ak1 ak2 = PureThy.get_thm thy32 (Name ("cp_"^ak1^"_"^ak2^"_inst"))
 | 
753  | 
in map (fn aki => (map (cps_fun aki) ak_names)) ak_names end;  | 
|
754  | 
(* list of all cp_inst-theorems that have different atom types *)  | 
|
755  | 
val cps' =  | 
|
756  | 
let fun cps'_fun ak1 ak2 =  | 
|
757  | 
		if ak1=ak2 then NONE else SOME(PureThy.get_thm thy32 (Name ("cp_"^ak1^"_"^ak2^"_inst")))
 | 
|
758  | 
in map (fn aki => (List.mapPartial I (map (cps'_fun aki) ak_names))) ak_names end;  | 
|
| 18068 | 759  | 
(* list of all dj_inst-theorems *)  | 
760  | 
val djs =  | 
|
761  | 
let fun djs_fun (ak1,ak2) =  | 
|
| 18262 | 762  | 
		     if ak1=ak2 then NONE else SOME(PureThy.get_thm thy32 (Name ("dj_"^ak2^"_"^ak1)))
 | 
763  | 
in List.mapPartial I (map djs_fun (Library.product ak_names ak_names)) end;  | 
|
764  | 
(* list of all fs_inst-theorems *)  | 
|
765  | 
             val fss = map (fn ak => PureThy.get_thm thy32 (Name ("fs_"^ak^"_inst"))) ak_names
 | 
|
| 
22418
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
766  | 
(* list of all at_inst-theorems *)  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
767  | 
             val fs_axs = map (fn ak => PureThy.get_thm thy32 (Name ("fs_"^ak^"1"))) ak_names
 | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
768  | 
|
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
769  | 
fun inst_pt thms = Library.flat (map (fn ti => instR ti pts) thms);  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
770  | 
fun inst_at thms = Library.flat (map (fn ti => instR ti ats) thms);  | 
| 18262 | 771  | 
fun inst_fs thms = Library.flat (map (fn ti => instR ti fss) thms);  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
772  | 
fun inst_cp thms cps = Library.flat (inst_mult thms cps);  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
773  | 
fun inst_pt_at thms = inst_zip ats (inst_pt thms);  | 
| 
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
774  | 
fun inst_dj thms = Library.flat (map (fn ti => instR ti djs) thms);  | 
| 
18436
 
9649e24bc10e
added thms to perm_compose (so far only composition
 
urbanc 
parents: 
18435 
diff
changeset
 | 
775  | 
fun inst_pt_pt_at_cp thms = inst_cp (inst_zip ats (inst_zip pts (inst_pt thms))) cps;  | 
| 18262 | 776  | 
fun inst_pt_at_fs thms = inst_zip (inst_fs [fs1]) (inst_zip ats (inst_pt thms));  | 
| 
20097
 
be2d96bbf39c
replaced mk_listT by HOLogic.listT; trivial whitespace/comment changes
 
webertj 
parents: 
20046 
diff
changeset
 | 
777  | 
fun inst_pt_pt_at_cp thms =  | 
| 
18279
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
778  | 
let val i_pt_pt_at = inst_zip ats (inst_zip pts (inst_pt thms));  | 
| 
18436
 
9649e24bc10e
added thms to perm_compose (so far only composition
 
urbanc 
parents: 
18435 
diff
changeset
 | 
779  | 
val i_pt_pt_at_cp = inst_cp i_pt_pt_at cps';  | 
| 
18396
 
b3e7da94b51f
added a fresh_left lemma that contains all instantiation
 
urbanc 
parents: 
18381 
diff
changeset
 | 
780  | 
in i_pt_pt_at_cp end;  | 
| 
 
b3e7da94b51f
added a fresh_left lemma that contains all instantiation
 
urbanc 
parents: 
18381 
diff
changeset
 | 
781  | 
fun inst_pt_pt_at_cp_dj thms = inst_zip djs (inst_pt_pt_at_cp thms);  | 
| 18068 | 782  | 
in  | 
| 18262 | 783  | 
thy32  | 
| 
18652
 
3930a060d71b
rolled back the last addition since these lemmas were already
 
urbanc 
parents: 
18651 
diff
changeset
 | 
784  | 
	    |>   PureThy.add_thmss [(("alpha", inst_pt_at [abs_fun_eq]),[])]
 | 
| 
19562
 
e56b3c967ae8
added the lemma abs_fun_eq' to the nominal theory,
 
urbanc 
parents: 
19548 
diff
changeset
 | 
785  | 
            ||>> PureThy.add_thmss [(("alpha'", inst_pt_at [abs_fun_eq']),[])]
 | 
| 
23158
 
749b6870b1a1
introduced symmetric variants of the lemmas for alpha-equivalence
 
urbanc 
parents: 
23029 
diff
changeset
 | 
786  | 
            ||>> PureThy.add_thmss [(("alpha_fresh", inst_pt_at [abs_fun_fresh]),[])]
 | 
| 
 
749b6870b1a1
introduced symmetric variants of the lemmas for alpha-equivalence
 
urbanc 
parents: 
23029 
diff
changeset
 | 
787  | 
            ||>> PureThy.add_thmss [(("alpha_fresh'", inst_pt_at [abs_fun_fresh']),[])]
 | 
| 
22557
 
6775c71f1da0
added pt_bij' to the collection perm_swap and also added abs_perm to the collection of equivariance lemmas
 
urbanc 
parents: 
22536 
diff
changeset
 | 
788  | 
            ||>> PureThy.add_thmss [(("perm_swap", inst_pt_at [pt_swap_bij] @ inst_pt_at [pt_swap_bij']),[])]
 | 
| 22610 | 789  | 
            ||>> PureThy.add_thmss [(("swap_simps", inst_at at_swap_simps),[])]	 
 | 
| 19139 | 790  | 
||>> PureThy.add_thmss  | 
791  | 
let val thms1 = inst_pt_at [pt_pi_rev];  | 
|
792  | 
val thms2 = inst_pt_at [pt_rev_pi];  | 
|
793  | 
              in [(("perm_pi_simp",thms1 @ thms2),[])] end
 | 
|
| 
18381
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
794  | 
            ||>> PureThy.add_thmss [(("perm_fresh_fresh", inst_pt_at [pt_fresh_fresh]),[])]
 | 
| 
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
795  | 
            ||>> PureThy.add_thmss [(("perm_bij", inst_pt_at [pt_bij]),[])]
 | 
| 
18436
 
9649e24bc10e
added thms to perm_compose (so far only composition
 
urbanc 
parents: 
18435 
diff
changeset
 | 
796  | 
||>> PureThy.add_thmss  | 
| 
 
9649e24bc10e
added thms to perm_compose (so far only composition
 
urbanc 
parents: 
18435 
diff
changeset
 | 
797  | 
let val thms1 = inst_pt_at [pt_perm_compose];  | 
| 
 
9649e24bc10e
added thms to perm_compose (so far only composition
 
urbanc 
parents: 
18435 
diff
changeset
 | 
798  | 
val thms2 = instR cp1 (Library.flat cps');  | 
| 
 
9649e24bc10e
added thms to perm_compose (so far only composition
 
urbanc 
parents: 
18435 
diff
changeset
 | 
799  | 
              in [(("perm_compose",thms1 @ thms2),[])] end
 | 
| 19139 | 800  | 
            ||>> PureThy.add_thmss [(("perm_compose'",inst_pt_at [pt_perm_compose']),[])] 
 | 
801  | 
            ||>> PureThy.add_thmss [(("perm_app", inst_pt_at [perm_app]),[])]
 | 
|
| 
18381
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
802  | 
            ||>> PureThy.add_thmss [(("supp_atm", (inst_at [at_supp]) @ (inst_dj [dj_supp])),[])]
 | 
| 
19972
 
89c5afe4139a
added more infrastructure for the recursion combinator
 
urbanc 
parents: 
19638 
diff
changeset
 | 
803  | 
            ||>> PureThy.add_thmss [(("exists_fresh", inst_at [at_exists_fresh]),[])]
 | 
| 
21377
 
c29146dc14f1
replaced exists_fresh lemma with a version formulated with obtains;
 
urbanc 
parents: 
21289 
diff
changeset
 | 
804  | 
            ||>> PureThy.add_thmss [(("exists_fresh'", inst_at [at_exists_fresh']),[])]
 | 
| 
22715
 
381e6c45f13b
improved the equivariance lemmas for the quantifiers; had to export the lemma eqvt_force_add and eqvt_force_del in the thmdecls
 
urbanc 
parents: 
22611 
diff
changeset
 | 
805  | 
            ||>> PureThy.add_thmss [(("all_eqvt", inst_pt_at [all_eqvt]),[NominalThmDecls.eqvt_force_add])] 
 | 
| 
 
381e6c45f13b
improved the equivariance lemmas for the quantifiers; had to export the lemma eqvt_force_add and eqvt_force_del in the thmdecls
 
urbanc 
parents: 
22611 
diff
changeset
 | 
806  | 
            ||>> PureThy.add_thmss [(("ex_eqvt", inst_pt_at [ex_eqvt]),[NominalThmDecls.eqvt_force_add])]
 | 
| 
19972
 
89c5afe4139a
added more infrastructure for the recursion combinator
 
urbanc 
parents: 
19638 
diff
changeset
 | 
807  | 
||>> PureThy.add_thmss  | 
| 
 
89c5afe4139a
added more infrastructure for the recursion combinator
 
urbanc 
parents: 
19638 
diff
changeset
 | 
808  | 
let val thms1 = inst_at [at_fresh]  | 
| 
 
89c5afe4139a
added more infrastructure for the recursion combinator
 
urbanc 
parents: 
19638 
diff
changeset
 | 
809  | 
val thms2 = inst_dj [at_fresh_ineq]  | 
| 
 
89c5afe4139a
added more infrastructure for the recursion combinator
 
urbanc 
parents: 
19638 
diff
changeset
 | 
810  | 
	      in [(("fresh_atm", thms1 @ thms2),[])] end
 | 
| 19992 | 811  | 
||>> PureThy.add_thmss  | 
| 
20377
 
3baf326b2b5f
Removed non-trivial definitions from calc_atm theorem list.
 
berghofe 
parents: 
20179 
diff
changeset
 | 
812  | 
let val thms1 = filter  | 
| 
 
3baf326b2b5f
Removed non-trivial definitions from calc_atm theorem list.
 
berghofe 
parents: 
20179 
diff
changeset
 | 
813  | 
(fn th => case prop_of th of _ $ _ $ Var _ => true | _ => false)  | 
| 
 
3baf326b2b5f
Removed non-trivial definitions from calc_atm theorem list.
 
berghofe 
parents: 
20179 
diff
changeset
 | 
814  | 
(List.concat (List.concat perm_defs))  | 
| 
19993
 
e0a5783d708f
added simplification rules to the fresh_guess tactic
 
urbanc 
parents: 
19992 
diff
changeset
 | 
815  | 
              in [(("calc_atm", (inst_at at_calc) @ thms1),[])] end
 | 
| 
18381
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
816  | 
||>> PureThy.add_thmss  | 
| 
18279
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
817  | 
let val thms1 = inst_pt_at [abs_fun_pi]  | 
| 
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
818  | 
and thms2 = inst_pt_pt_at_cp [abs_fun_pi_ineq]  | 
| 
22557
 
6775c71f1da0
added pt_bij' to the collection perm_swap and also added abs_perm to the collection of equivariance lemmas
 
urbanc 
parents: 
22536 
diff
changeset
 | 
819  | 
	      in [(("abs_perm", thms1 @ thms2),[NominalThmDecls.eqvt_add])] end
 | 
| 
18381
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
820  | 
||>> PureThy.add_thmss  | 
| 
18279
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
821  | 
let val thms1 = inst_dj [dj_perm_forget]  | 
| 
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
822  | 
and thms2 = inst_dj [dj_pp_forget]  | 
| 
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
823  | 
              in [(("perm_dj", thms1 @ thms2),[])] end
 | 
| 
18381
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
824  | 
||>> PureThy.add_thmss  | 
| 
18279
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
825  | 
let val thms1 = inst_pt_at_fs [fresh_iff]  | 
| 18626 | 826  | 
and thms2 = inst_pt_at [fresh_iff]  | 
827  | 
and thms3 = inst_pt_pt_at_cp_dj [fresh_iff_ineq]  | 
|
828  | 
	    in [(("abs_fresh", thms1 @ thms2 @ thms3),[])] end
 | 
|
| 
18381
 
246807ef6dfb
changed the types in accordance with Florian's changes
 
urbanc 
parents: 
18366 
diff
changeset
 | 
829  | 
||>> PureThy.add_thmss  | 
| 
18279
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
830  | 
let val thms1 = inst_pt_at [abs_fun_supp]  | 
| 
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
831  | 
and thms2 = inst_pt_at_fs [abs_fun_supp]  | 
| 
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
832  | 
and thms3 = inst_pt_pt_at_cp_dj [abs_fun_supp_ineq]  | 
| 
 
f7a18e2b10fc
made some of the theorem look-ups static (by using
 
urbanc 
parents: 
18262 
diff
changeset
 | 
833  | 
	      in [(("abs_supp", thms1 @ thms2 @ thms3),[])] end
 | 
| 
18396
 
b3e7da94b51f
added a fresh_left lemma that contains all instantiation
 
urbanc 
parents: 
18381 
diff
changeset
 | 
834  | 
||>> PureThy.add_thmss  | 
| 
 
b3e7da94b51f
added a fresh_left lemma that contains all instantiation
 
urbanc 
parents: 
18381 
diff
changeset
 | 
835  | 
let val thms1 = inst_pt_at [fresh_left]  | 
| 
 
b3e7da94b51f
added a fresh_left lemma that contains all instantiation
 
urbanc 
parents: 
18381 
diff
changeset
 | 
836  | 
and thms2 = inst_pt_pt_at_cp [fresh_left_ineq]  | 
| 
 
b3e7da94b51f
added a fresh_left lemma that contains all instantiation
 
urbanc 
parents: 
18381 
diff
changeset
 | 
837  | 
	      in [(("fresh_left", thms1 @ thms2),[])] end
 | 
| 18426 | 838  | 
||>> PureThy.add_thmss  | 
| 19548 | 839  | 
let val thms1 = inst_pt_at [fresh_right]  | 
840  | 
and thms2 = inst_pt_pt_at_cp [fresh_right_ineq]  | 
|
841  | 
	      in [(("fresh_right", thms1 @ thms2),[])] end
 | 
|
842  | 
||>> PureThy.add_thmss  | 
|
| 18426 | 843  | 
let val thms1 = inst_pt_at [fresh_bij]  | 
| 
22418
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
844  | 
and thms2 = inst_pt_pt_at_cp [fresh_bij_ineq]  | 
| 
19972
 
89c5afe4139a
added more infrastructure for the recursion combinator
 
urbanc 
parents: 
19638 
diff
changeset
 | 
845  | 
	      in [(("fresh_bij", thms1 @ thms2),[])] end
 | 
| 
 
89c5afe4139a
added more infrastructure for the recursion combinator
 
urbanc 
parents: 
19638 
diff
changeset
 | 
846  | 
||>> PureThy.add_thmss  | 
| 
 
89c5afe4139a
added more infrastructure for the recursion combinator
 
urbanc 
parents: 
19638 
diff
changeset
 | 
847  | 
let val thms1 = inst_pt_at [fresh_eqvt]  | 
| 
22535
 
cbee450f88a6
added extended the lemma for equivariance of freshness
 
urbanc 
parents: 
22418 
diff
changeset
 | 
848  | 
and thms2 = inst_pt_pt_at_cp_dj [fresh_eqvt_ineq]  | 
| 
 
cbee450f88a6
added extended the lemma for equivariance of freshness
 
urbanc 
parents: 
22418 
diff
changeset
 | 
849  | 
	      in [(("fresh_eqvt", thms1 @ thms2),[NominalThmDecls.eqvt_add])] end
 | 
| 
22418
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
850  | 
||>> PureThy.add_thmss  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
851  | 
let val thms1 = inst_pt_at [in_eqvt]  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
852  | 
	      in [(("in_eqvt", thms1),[NominalThmDecls.eqvt_add])] end
 | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
853  | 
||>> PureThy.add_thmss  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
854  | 
let val thms1 = inst_pt_at [eq_eqvt]  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
855  | 
	      in [(("eq_eqvt", thms1),[NominalThmDecls.eqvt_add])] end
 | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
856  | 
||>> PureThy.add_thmss  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
857  | 
let val thms1 = inst_pt_at [set_diff_eqvt]  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
858  | 
	      in [(("set_diff_eqvt", thms1),[NominalThmDecls.eqvt_add])] end
 | 
| 
19638
 
4358b88a9d12
added the lemmas pt_fresh_aux and pt_fresh_aux_ineq
 
urbanc 
parents: 
19635 
diff
changeset
 | 
859  | 
||>> PureThy.add_thmss  | 
| 
 
4358b88a9d12
added the lemmas pt_fresh_aux and pt_fresh_aux_ineq
 
urbanc 
parents: 
19635 
diff
changeset
 | 
860  | 
let val thms1 = inst_pt_at [fresh_aux]  | 
| 22786 | 861  | 
and thms2 = inst_pt_pt_at_cp_dj [fresh_perm_app_ineq]  | 
862  | 
	      in  [(("fresh_aux", thms1 @ thms2),[])] end  
 | 
|
| 
22785
 
fab155c8ce46
add two lemmas dealing with freshness on permutations.
 
narboux 
parents: 
22768 
diff
changeset
 | 
863  | 
||>> PureThy.add_thmss  | 
| 
 
fab155c8ce46
add two lemmas dealing with freshness on permutations.
 
narboux 
parents: 
22768 
diff
changeset
 | 
864  | 
let val thms1 = inst_pt_at [fresh_perm_app]  | 
| 22786 | 865  | 
and thms2 = inst_pt_pt_at_cp_dj [fresh_perm_app_ineq]  | 
| 
22794
 
d0f483fd57dd
add the lemma supp_eqvt and put the right attribute
 
narboux 
parents: 
22786 
diff
changeset
 | 
866  | 
	      in  [(("fresh_perm_app", thms1 @ thms2),[])] end 
 | 
| 
 
d0f483fd57dd
add the lemma supp_eqvt and put the right attribute
 
narboux 
parents: 
22786 
diff
changeset
 | 
867  | 
||>> PureThy.add_thmss  | 
| 
 
d0f483fd57dd
add the lemma supp_eqvt and put the right attribute
 
narboux 
parents: 
22786 
diff
changeset
 | 
868  | 
let val thms1 = inst_pt_at [pt_perm_supp]  | 
| 
 
d0f483fd57dd
add the lemma supp_eqvt and put the right attribute
 
narboux 
parents: 
22786 
diff
changeset
 | 
869  | 
and thms2 = inst_pt_pt_at_cp [pt_perm_supp_ineq]  | 
| 
 
d0f483fd57dd
add the lemma supp_eqvt and put the right attribute
 
narboux 
parents: 
22786 
diff
changeset
 | 
870  | 
	      in  [(("supp_eqvt", thms1 @ thms2),[NominalThmDecls.eqvt_add])] end  
 | 
| 
22418
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
871  | 
            ||>> PureThy.add_thmss [(("fin_supp",fs_axs),[])]
 | 
| 18068 | 872  | 
end;  | 
873  | 
||
| 
22418
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
874  | 
in  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
875  | 
NominalData.map (fold Symtab.update (full_ak_names ~~ map make_atom_info  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
876  | 
(pt_ax_classes ~~  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
877  | 
fs_ax_classes ~~  | 
| 
 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 
urbanc 
parents: 
22274 
diff
changeset
 | 
878  | 
map (fn cls => full_ak_names ~~ cls) cp_ax_classes))) thy33  | 
| 18068 | 879  | 
end;  | 
880  | 
||
881  | 
||
882  | 
(* syntax und parsing *)  | 
|
883  | 
structure P = OuterParse and K = OuterKeyword;  | 
|
884  | 
||
885  | 
val atom_declP =  | 
|
886  | 
OuterSyntax.command "atom_decl" "Declare new kinds of atoms" K.thy_decl  | 
|
887  | 
(Scan.repeat1 P.name >> (Toplevel.theory o create_nom_typedecls));  | 
|
888  | 
||
889  | 
val _ = OuterSyntax.add_parsers [atom_declP];  | 
|
890  | 
||
891  | 
end;  |