| author | wenzelm | 
| Mon, 10 Jan 2011 15:45:46 +0100 | |
| changeset 41491 | a2ad5b824051 | 
| parent 41363 | 57ebe94c7fbf | 
| child 44241 | 7943b69f0188 | 
| permissions | -rw-r--r-- | 
| 37744 | 1  | 
(* Title: HOL/Tools/hologic.ML  | 
| 923 | 2  | 
Author: Lawrence C Paulson and Markus Wenzel  | 
3  | 
||
4  | 
Abstract syntax operations for HOL.  | 
|
5  | 
*)  | 
|
6  | 
||
7  | 
signature HOLOGIC =  | 
|
8  | 
sig  | 
|
| 
12338
 
de0f4a63baa5
renamed class "term" to "type" (actually "HOL.type");
 
wenzelm 
parents: 
11818 
diff
changeset
 | 
9  | 
val typeS: sort  | 
| 
 
de0f4a63baa5
renamed class "term" to "type" (actually "HOL.type");
 
wenzelm 
parents: 
11818 
diff
changeset
 | 
10  | 
val typeT: typ  | 
| 41363 | 11  | 
val id_const: typ -> term  | 
| 40845 | 12  | 
val mk_comp: term * term -> term  | 
| 8275 | 13  | 
val boolN: string  | 
| 923 | 14  | 
val boolT: typ  | 
| 30450 | 15  | 
val Trueprop: term  | 
16  | 
val mk_Trueprop: term -> term  | 
|
17  | 
val dest_Trueprop: term -> term  | 
|
| 
21829
 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 
wenzelm 
parents: 
21820 
diff
changeset
 | 
18  | 
val true_const: term  | 
| 7073 | 19  | 
val false_const: term  | 
| 923 | 20  | 
val mk_setT: typ -> typ  | 
21  | 
val dest_setT: typ -> typ  | 
|
| 30450 | 22  | 
val Collect_const: typ -> term  | 
23  | 
val mk_Collect: string * typ * term -> term  | 
|
24  | 
val mk_mem: term * term -> term  | 
|
25  | 
val dest_mem: term -> term * term  | 
|
26  | 
val mk_set: typ -> term list -> term  | 
|
27  | 
val dest_set: term -> term list  | 
|
28  | 
val mk_UNIV: typ -> term  | 
|
| 
23555
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
29  | 
val conj_intr: thm -> thm -> thm  | 
| 
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
30  | 
val conj_elim: thm -> thm * thm  | 
| 
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
31  | 
val conj_elims: thm -> thm list  | 
| 923 | 32  | 
val conj: term  | 
33  | 
val disj: term  | 
|
34  | 
val imp: term  | 
|
| 8429 | 35  | 
val Not: term  | 
| 7690 | 36  | 
val mk_conj: term * term -> term  | 
37  | 
val mk_disj: term * term -> term  | 
|
38  | 
val mk_imp: term * term -> term  | 
|
| 16835 | 39  | 
val mk_not: term -> term  | 
| 15151 | 40  | 
val dest_conj: term -> term list  | 
| 15945 | 41  | 
val dest_disj: term -> term list  | 
| 24958 | 42  | 
val disjuncts: term -> term list  | 
| 4571 | 43  | 
val dest_imp: term -> term * term  | 
| 15151 | 44  | 
val dest_not: term -> term  | 
| 923 | 45  | 
val eq_const: typ -> term  | 
| 
21829
 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 
wenzelm 
parents: 
21820 
diff
changeset
 | 
46  | 
val mk_eq: term * term -> term  | 
| 
 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 
wenzelm 
parents: 
21820 
diff
changeset
 | 
47  | 
val dest_eq: term -> term * term  | 
| 923 | 48  | 
val all_const: typ -> term  | 
| 
21829
 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 
wenzelm 
parents: 
21820 
diff
changeset
 | 
49  | 
val mk_all: string * typ * term -> term  | 
| 
 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 
wenzelm 
parents: 
21820 
diff
changeset
 | 
50  | 
val list_all: (string * typ) list * term -> term  | 
| 923 | 51  | 
val exists_const: typ -> term  | 
| 
21829
 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 
wenzelm 
parents: 
21820 
diff
changeset
 | 
52  | 
val mk_exists: string * typ * term -> term  | 
| 15945 | 53  | 
val choice_const: typ -> term  | 
| 
38857
 
97775f3e8722
renamed class/constant eq to equal; tuned some instantiations
 
haftmann 
parents: 
38795 
diff
changeset
 | 
54  | 
val class_equal: string  | 
| 2510 | 55  | 
val mk_binop: string -> term * term -> term  | 
56  | 
val mk_binrel: string -> term * term -> term  | 
|
57  | 
val dest_bin: string -> typ -> term -> term * term  | 
|
| 4571 | 58  | 
val unitT: typ  | 
| 9362 | 59  | 
val is_unitT: typ -> bool  | 
| 4571 | 60  | 
val unit: term  | 
61  | 
val is_unit: term -> bool  | 
|
62  | 
val mk_prodT: typ * typ -> typ  | 
|
63  | 
val dest_prodT: typ -> typ * typ  | 
|
| 14048 | 64  | 
val pair_const: typ -> typ -> term  | 
| 4571 | 65  | 
val mk_prod: term * term -> term  | 
66  | 
val dest_prod: term -> term * term  | 
|
67  | 
val mk_fst: term -> term  | 
|
68  | 
val mk_snd: term -> term  | 
|
| 
21829
 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 
wenzelm 
parents: 
21820 
diff
changeset
 | 
69  | 
val split_const: typ * typ * typ -> term  | 
| 18285 | 70  | 
val mk_split: term -> term  | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
71  | 
val flatten_tupleT: typ -> typ list  | 
| 
39756
 
6c8e83d94536
consolidated tupled_lambda; moved to structure HOLogic
 
krauss 
parents: 
39250 
diff
changeset
 | 
72  | 
val tupled_lambda: term -> term -> term  | 
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
73  | 
val mk_tupleT: typ list -> typ  | 
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
74  | 
val strip_tupleT: typ -> typ list  | 
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
75  | 
val mk_tuple: term list -> term  | 
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
76  | 
val strip_tuple: term -> term list  | 
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
77  | 
val mk_ptupleT: int list list -> typ list -> typ  | 
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
78  | 
val strip_ptupleT: int list list -> typ -> typ list  | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
79  | 
val flat_tupleT_paths: typ -> int list list  | 
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
80  | 
val mk_ptuple: int list list -> typ -> term list -> term  | 
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
81  | 
val strip_ptuple: int list list -> term -> term list  | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
82  | 
val flat_tuple_paths: term -> int list list  | 
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
83  | 
val mk_psplits: int list list -> typ -> typ -> term -> term  | 
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
84  | 
val strip_psplits: term -> term * typ list * int list list  | 
| 5207 | 85  | 
val natT: typ  | 
86  | 
val zero: term  | 
|
87  | 
val is_zero: term -> bool  | 
|
88  | 
val mk_Suc: term -> term  | 
|
89  | 
val dest_Suc: term -> term  | 
|
| 21621 | 90  | 
val Suc_zero: term  | 
| 
24630
 
351a308ab58d
simplified type int (eliminated IntInf.int, integer);
 
wenzelm 
parents: 
23745 
diff
changeset
 | 
91  | 
val mk_nat: int -> term  | 
| 
 
351a308ab58d
simplified type int (eliminated IntInf.int, integer);
 
wenzelm 
parents: 
23745 
diff
changeset
 | 
92  | 
val dest_nat: term -> int  | 
| 22994 | 93  | 
val class_size: string  | 
94  | 
val size_const: typ -> term  | 
|
| 
31205
 
98370b26c2ce
String.literal replaces message_string, code_numeral replaces (code_)index
 
haftmann 
parents: 
31183 
diff
changeset
 | 
95  | 
val code_numeralT: typ  | 
| 
21829
 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 
wenzelm 
parents: 
21820 
diff
changeset
 | 
96  | 
val intT: typ  | 
| 7073 | 97  | 
val pls_const: term  | 
98  | 
val min_const: term  | 
|
| 
26086
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26036 
diff
changeset
 | 
99  | 
val bit0_const: term  | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26036 
diff
changeset
 | 
100  | 
val bit1_const: term  | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26036 
diff
changeset
 | 
101  | 
val mk_bit: int -> term  | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26036 
diff
changeset
 | 
102  | 
val dest_bit: term -> int  | 
| 
24630
 
351a308ab58d
simplified type int (eliminated IntInf.int, integer);
 
wenzelm 
parents: 
23745 
diff
changeset
 | 
103  | 
val mk_numeral: int -> term  | 
| 
 
351a308ab58d
simplified type int (eliminated IntInf.int, integer);
 
wenzelm 
parents: 
23745 
diff
changeset
 | 
104  | 
val dest_numeral: term -> int  | 
| 
21829
 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 
wenzelm 
parents: 
21820 
diff
changeset
 | 
105  | 
val number_of_const: typ -> term  | 
| 23269 | 106  | 
val add_numerals: term -> (term * typ) list -> (term * typ) list  | 
| 
24630
 
351a308ab58d
simplified type int (eliminated IntInf.int, integer);
 
wenzelm 
parents: 
23745 
diff
changeset
 | 
107  | 
val mk_number: typ -> int -> term  | 
| 
 
351a308ab58d
simplified type int (eliminated IntInf.int, integer);
 
wenzelm 
parents: 
23745 
diff
changeset
 | 
108  | 
val dest_number: term -> typ * int  | 
| 
21778
 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 
wenzelm 
parents: 
21755 
diff
changeset
 | 
109  | 
val realT: typ  | 
| 21755 | 110  | 
val nibbleT: typ  | 
111  | 
val mk_nibble: int -> term  | 
|
112  | 
val dest_nibble: term -> int  | 
|
113  | 
val charT: typ  | 
|
114  | 
val mk_char: int -> term  | 
|
115  | 
val dest_char: term -> int  | 
|
| 
21829
 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 
wenzelm 
parents: 
21820 
diff
changeset
 | 
116  | 
val listT: typ -> typ  | 
| 25887 | 117  | 
val nil_const: typ -> term  | 
118  | 
val cons_const: typ -> term  | 
|
| 
21829
 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 
wenzelm 
parents: 
21820 
diff
changeset
 | 
119  | 
val mk_list: typ -> term list -> term  | 
| 
 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 
wenzelm 
parents: 
21820 
diff
changeset
 | 
120  | 
val dest_list: term -> term list  | 
| 
21778
 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 
wenzelm 
parents: 
21755 
diff
changeset
 | 
121  | 
val stringT: typ  | 
| 
21820
 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 
haftmann 
parents: 
21788 
diff
changeset
 | 
122  | 
val mk_string: string -> term  | 
| 
 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 
haftmann 
parents: 
21788 
diff
changeset
 | 
123  | 
val dest_string: term -> string  | 
| 
31205
 
98370b26c2ce
String.literal replaces message_string, code_numeral replaces (code_)index
 
haftmann 
parents: 
31183 
diff
changeset
 | 
124  | 
val literalT: typ  | 
| 
 
98370b26c2ce
String.literal replaces message_string, code_numeral replaces (code_)index
 
haftmann 
parents: 
31183 
diff
changeset
 | 
125  | 
val mk_literal: string -> term  | 
| 
 
98370b26c2ce
String.literal replaces message_string, code_numeral replaces (code_)index
 
haftmann 
parents: 
31183 
diff
changeset
 | 
126  | 
val dest_literal: term -> string  | 
| 31135 | 127  | 
val mk_typerep: typ -> term  | 
| 32339 | 128  | 
val termT: typ  | 
129  | 
val term_of_const: typ -> term  | 
|
| 31135 | 130  | 
val mk_term_of: typ -> term -> term  | 
131  | 
val reflect_term: term -> term  | 
|
| 31463 | 132  | 
val mk_valtermify_app: string -> (string * typ) list -> typ -> term  | 
| 31183 | 133  | 
val mk_return: typ -> typ -> term -> term  | 
134  | 
val mk_ST: ((term * typ) * (string * typ) option) list -> term -> typ -> typ option * typ -> term  | 
|
| 31463 | 135  | 
val mk_random: typ -> term -> term  | 
| 923 | 136  | 
end;  | 
137  | 
||
138  | 
structure HOLogic: HOLOGIC =  | 
|
139  | 
struct  | 
|
140  | 
||
| 
12338
 
de0f4a63baa5
renamed class "term" to "type" (actually "HOL.type");
 
wenzelm 
parents: 
11818 
diff
changeset
 | 
141  | 
(* HOL syntax *)  | 
| 923 | 142  | 
|
| 
12338
 
de0f4a63baa5
renamed class "term" to "type" (actually "HOL.type");
 
wenzelm 
parents: 
11818 
diff
changeset
 | 
143  | 
val typeS: sort = ["HOL.type"];  | 
| 
37145
 
01aa36932739
renamed structure TypeInfer to Type_Infer, keeping the old name as legacy alias for some time;
 
wenzelm 
parents: 
36692 
diff
changeset
 | 
144  | 
val typeT = Type_Infer.anyT typeS;  | 
| 
12338
 
de0f4a63baa5
renamed class "term" to "type" (actually "HOL.type");
 
wenzelm 
parents: 
11818 
diff
changeset
 | 
145  | 
|
| 923 | 146  | 
|
| 40845 | 147  | 
(* functions *)  | 
148  | 
||
| 41363 | 149  | 
fun id_const T = Const ("Fun.id", T --> T);
 | 
| 41339 | 150  | 
|
| 40845 | 151  | 
fun mk_comp (f, g) =  | 
152  | 
let  | 
|
153  | 
val fT = fastype_of f;  | 
|
154  | 
val gT = fastype_of g;  | 
|
155  | 
val compT = fT --> gT --> domain_type gT --> range_type fT;  | 
|
156  | 
  in Const ("Fun.comp", compT) $ f $ g end;
 | 
|
157  | 
||
158  | 
||
| 2510 | 159  | 
(* bool and set *)  | 
| 923 | 160  | 
|
| 38555 | 161  | 
val boolN = "HOL.bool";  | 
| 8275 | 162  | 
val boolT = Type (boolN, []);  | 
| 923 | 163  | 
|
| 38555 | 164  | 
val true_const =  Const ("HOL.True", boolT);
 | 
165  | 
val false_const = Const ("HOL.False", boolT);
 | 
|
| 7073 | 166  | 
|
| 
26804
 
e2b1e6868c2f
Adapted functions mk_setT and dest_setT to encoding of sets as predicates.
 
berghofe 
parents: 
26086 
diff
changeset
 | 
167  | 
fun mk_setT T = T --> boolT;  | 
| 923 | 168  | 
|
| 38555 | 169  | 
fun dest_setT (Type ("fun", [T, Type ("HOL.bool", [])])) = T
 | 
| 3794 | 170  | 
  | dest_setT T = raise TYPE ("dest_setT: set type expected", [T], []);
 | 
| 923 | 171  | 
|
| 30450 | 172  | 
fun mk_set T ts =  | 
173  | 
let  | 
|
174  | 
val sT = mk_setT T;  | 
|
| 
32264
 
0be31453f698
Set.UNIV and Set.empty are mere abbreviations for top and bot
 
haftmann 
parents: 
31736 
diff
changeset
 | 
175  | 
    val empty = Const ("Orderings.bot_class.bot", sT);
 | 
| 31456 | 176  | 
    fun insert t u = Const ("Set.insert", T --> sT --> sT) $ t $ u;
 | 
| 30450 | 177  | 
in fold_rev insert ts empty end;  | 
178  | 
||
| 
32264
 
0be31453f698
Set.UNIV and Set.empty are mere abbreviations for top and bot
 
haftmann 
parents: 
31736 
diff
changeset
 | 
179  | 
fun mk_UNIV T = Const ("Orderings.top_class.top", mk_setT T);
 | 
| 30450 | 180  | 
|
| 
32264
 
0be31453f698
Set.UNIV and Set.empty are mere abbreviations for top and bot
 
haftmann 
parents: 
31736 
diff
changeset
 | 
181  | 
fun dest_set (Const ("Orderings.bot_class.bot", _)) = []
 | 
| 31456 | 182  | 
  | dest_set (Const ("Set.insert", _) $ t $ u) = t :: dest_set u
 | 
| 30450 | 183  | 
  | dest_set t = raise TERM ("dest_set", [t]);
 | 
184  | 
||
| 
37676
 
f433cb9caea4
"prod" and "sum" replace "*" and "+" respectively; qualified constants Set.member and Set.Collect
 
haftmann 
parents: 
37591 
diff
changeset
 | 
185  | 
fun Collect_const T = Const ("Set.Collect", (T --> boolT) --> mk_setT T);
 | 
| 30450 | 186  | 
fun mk_Collect (a, T, t) = Collect_const T $ absfree (a, T, t);  | 
187  | 
||
188  | 
fun mk_mem (x, A) =  | 
|
189  | 
let val setT = fastype_of A in  | 
|
| 
37676
 
f433cb9caea4
"prod" and "sum" replace "*" and "+" respectively; qualified constants Set.member and Set.Collect
 
haftmann 
parents: 
37591 
diff
changeset
 | 
190  | 
    Const ("Set.member", dest_setT setT --> setT --> boolT) $ x $ A
 | 
| 30450 | 191  | 
end;  | 
192  | 
||
| 
37676
 
f433cb9caea4
"prod" and "sum" replace "*" and "+" respectively; qualified constants Set.member and Set.Collect
 
haftmann 
parents: 
37591 
diff
changeset
 | 
193  | 
fun dest_mem (Const ("Set.member", _) $ x $ A) = (x, A)
 | 
| 30450 | 194  | 
  | dest_mem t = raise TERM ("dest_mem", [t]);
 | 
195  | 
||
| 8275 | 196  | 
|
| 7073 | 197  | 
(* logic *)  | 
| 923 | 198  | 
|
| 38555 | 199  | 
val Trueprop = Const ("HOL.Trueprop", boolT --> propT);
 | 
| 923 | 200  | 
|
201  | 
fun mk_Trueprop P = Trueprop $ P;  | 
|
202  | 
||
| 38555 | 203  | 
fun dest_Trueprop (Const ("HOL.Trueprop", _) $ P) = P
 | 
| 3794 | 204  | 
  | dest_Trueprop t = raise TERM ("dest_Trueprop", [t]);
 | 
| 923 | 205  | 
|
| 
23555
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
206  | 
fun conj_intr thP thQ =  | 
| 
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
207  | 
let  | 
| 35625 | 208  | 
val (P, Q) = pairself (Object_Logic.dest_judgment o Thm.cprop_of) (thP, thQ)  | 
| 
23555
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
209  | 
handle CTERM (msg, _) => raise THM (msg, 0, [thP, thQ]);  | 
| 
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
210  | 
    val inst = Thm.instantiate ([], [(@{cpat "?P::bool"}, P), (@{cpat "?Q::bool"}, Q)]);
 | 
| 
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
211  | 
  in Drule.implies_elim_list (inst @{thm conjI}) [thP, thQ] end;
 | 
| 923 | 212  | 
|
| 
23555
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
213  | 
fun conj_elim thPQ =  | 
| 
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
214  | 
let  | 
| 35625 | 215  | 
val (P, Q) = Thm.dest_binop (Object_Logic.dest_judgment (Thm.cprop_of thPQ))  | 
| 
23555
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
216  | 
handle CTERM (msg, _) => raise THM (msg, 0, [thPQ]);  | 
| 
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
217  | 
    val inst = Thm.instantiate ([], [(@{cpat "?P::bool"}, P), (@{cpat "?Q::bool"}, Q)]);
 | 
| 
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
218  | 
    val thP = Thm.implies_elim (inst @{thm conjunct1}) thPQ;
 | 
| 
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
219  | 
    val thQ = Thm.implies_elim (inst @{thm conjunct2}) thPQ;
 | 
| 
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
220  | 
in (thP, thQ) end;  | 
| 
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
221  | 
|
| 
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
222  | 
fun conj_elims th =  | 
| 
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
223  | 
let val (th1, th2) = conj_elim th  | 
| 
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
224  | 
in conj_elims th1 @ conj_elims th2 end handle THM _ => [th];  | 
| 
 
16e5fd18905c
assume basic HOL context for compilation (antiquotations);
 
wenzelm 
parents: 
23297 
diff
changeset
 | 
225  | 
|
| 
38795
 
848be46708dc
formerly unnamed infix conjunction and disjunction now named HOL.conj and HOL.disj
 
haftmann 
parents: 
38786 
diff
changeset
 | 
226  | 
val conj = @{term HOL.conj}
 | 
| 
 
848be46708dc
formerly unnamed infix conjunction and disjunction now named HOL.conj and HOL.disj
 
haftmann 
parents: 
38786 
diff
changeset
 | 
227  | 
and disj = @{term HOL.disj}
 | 
| 
38786
 
e46e7a9cb622
formerly unnamed infix impliciation now named HOL.implies
 
haftmann 
parents: 
38555 
diff
changeset
 | 
228  | 
and imp = @{term implies}
 | 
| 
 
e46e7a9cb622
formerly unnamed infix impliciation now named HOL.implies
 
haftmann 
parents: 
38555 
diff
changeset
 | 
229  | 
and Not = @{term Not};
 | 
| 923 | 230  | 
|
| 7690 | 231  | 
fun mk_conj (t1, t2) = conj $ t1 $ t2  | 
232  | 
and mk_disj (t1, t2) = disj $ t1 $ t2  | 
|
| 16835 | 233  | 
and mk_imp (t1, t2) = imp $ t1 $ t2  | 
234  | 
and mk_not t = Not $ t;  | 
|
| 7690 | 235  | 
|
| 
38795
 
848be46708dc
formerly unnamed infix conjunction and disjunction now named HOL.conj and HOL.disj
 
haftmann 
parents: 
38786 
diff
changeset
 | 
236  | 
fun dest_conj (Const ("HOL.conj", _) $ t $ t') = t :: dest_conj t'
 | 
| 15151 | 237  | 
| dest_conj t = [t];  | 
238  | 
||
| 
38795
 
848be46708dc
formerly unnamed infix conjunction and disjunction now named HOL.conj and HOL.disj
 
haftmann 
parents: 
38786 
diff
changeset
 | 
239  | 
fun dest_disj (Const ("HOL.disj", _) $ t $ t') = t :: dest_disj t'
 | 
| 15945 | 240  | 
| dest_disj t = [t];  | 
241  | 
||
| 24958 | 242  | 
(*Like dest_disj, but flattens disjunctions however nested*)  | 
| 
38795
 
848be46708dc
formerly unnamed infix conjunction and disjunction now named HOL.conj and HOL.disj
 
haftmann 
parents: 
38786 
diff
changeset
 | 
243  | 
fun disjuncts_aux (Const ("HOL.disj", _) $ t $ t') disjs = disjuncts_aux t (disjuncts_aux t' disjs)
 | 
| 24958 | 244  | 
| disjuncts_aux t disjs = t::disjs;  | 
245  | 
||
246  | 
fun disjuncts t = disjuncts_aux t [];  | 
|
247  | 
||
| 
38786
 
e46e7a9cb622
formerly unnamed infix impliciation now named HOL.implies
 
haftmann 
parents: 
38555 
diff
changeset
 | 
248  | 
fun dest_imp (Const ("HOL.implies", _) $ A $ B) = (A, B)
 | 
| 
4466
 
305390f23734
Better equality handling in Blast_tac, usingd a new variant of hyp_subst_tac
 
paulson 
parents: 
4294 
diff
changeset
 | 
249  | 
  | dest_imp  t = raise TERM ("dest_imp", [t]);
 | 
| 
 
305390f23734
Better equality handling in Blast_tac, usingd a new variant of hyp_subst_tac
 
paulson 
parents: 
4294 
diff
changeset
 | 
250  | 
|
| 38555 | 251  | 
fun dest_not (Const ("HOL.Not", _) $ t) = t
 | 
| 15151 | 252  | 
  | dest_not t = raise TERM ("dest_not", [t]);
 | 
| 8302 | 253  | 
|
| 
38864
 
4abe644fcea5
formerly unnamed infix equality now named HOL.eq
 
haftmann 
parents: 
38857 
diff
changeset
 | 
254  | 
fun eq_const T = Const ("HOL.eq", T --> T --> boolT);
 | 
| 923 | 255  | 
fun mk_eq (t, u) = eq_const (fastype_of t) $ t $ u;  | 
256  | 
||
| 
38864
 
4abe644fcea5
formerly unnamed infix equality now named HOL.eq
 
haftmann 
parents: 
38857 
diff
changeset
 | 
257  | 
fun dest_eq (Const ("HOL.eq", _) $ lhs $ rhs) = (lhs, rhs)
 | 
| 6031 | 258  | 
  | dest_eq t = raise TERM ("dest_eq", [t])
 | 
259  | 
||
| 38555 | 260  | 
fun all_const T = Const ("HOL.All", [T --> boolT] ---> boolT);
 | 
| 923 | 261  | 
fun mk_all (x, T, P) = all_const T $ absfree (x, T, P);  | 
| 
21173
 
663a7b39894c
removed is_Trueprop (use can dest_Trueprop'' instead);
 
wenzelm 
parents: 
21078 
diff
changeset
 | 
262  | 
fun list_all (xs, t) = fold_rev (fn (x, T) => fn P => all_const T $ Abs (x, T, P)) xs t;  | 
| 923 | 263  | 
|
| 38555 | 264  | 
fun exists_const T = Const ("HOL.Ex", [T --> boolT] ---> boolT);
 | 
| 923 | 265  | 
fun mk_exists (x, T, P) = exists_const T $ absfree (x, T, P);  | 
266  | 
||
| 21755 | 267  | 
fun choice_const T = Const("Hilbert_Choice.Eps", (T --> boolT) --> T);
 | 
| 15945 | 268  | 
|
| 
38857
 
97775f3e8722
renamed class/constant eq to equal; tuned some instantiations
 
haftmann 
parents: 
38795 
diff
changeset
 | 
269  | 
val class_equal = "HOL.equal";  | 
| 21045 | 270  | 
|
| 923 | 271  | 
|
| 
13743
 
f8f9393be64c
Fixed bug in simpdata.ML that prevented the use of congruence rules from a
 
ballarin 
parents: 
13640 
diff
changeset
 | 
272  | 
(* binary operations and relations *)  | 
| 2510 | 273  | 
|
274  | 
fun mk_binop c (t, u) =  | 
|
275  | 
let val T = fastype_of t in  | 
|
276  | 
Const (c, [T, T] ---> T) $ t $ u  | 
|
277  | 
end;  | 
|
278  | 
||
279  | 
fun mk_binrel c (t, u) =  | 
|
280  | 
let val T = fastype_of t in  | 
|
281  | 
Const (c, [T, T] ---> boolT) $ t $ u  | 
|
282  | 
end;  | 
|
283  | 
||
| 
14387
 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 
paulson 
parents: 
14103 
diff
changeset
 | 
284  | 
(*destruct the application of a binary operator. The dummyT case is a crude  | 
| 
 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 
paulson 
parents: 
14103 
diff
changeset
 | 
285  | 
way of handling polymorphic operators.*)  | 
| 2510 | 286  | 
fun dest_bin c T (tm as Const (c', Type ("fun", [T', _])) $ t $ u) =
 | 
| 
14387
 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 
paulson 
parents: 
14103 
diff
changeset
 | 
287  | 
if c = c' andalso (T=T' orelse T=dummyT) then (t, u)  | 
| 3794 | 288  | 
      else raise TERM ("dest_bin " ^ c, [tm])
 | 
289  | 
  | dest_bin c _ tm = raise TERM ("dest_bin " ^ c, [tm]);
 | 
|
| 2510 | 290  | 
|
291  | 
||
| 4571 | 292  | 
(* unit *)  | 
293  | 
||
| 11604 | 294  | 
val unitT = Type ("Product_Type.unit", []);
 | 
| 4571 | 295  | 
|
| 11604 | 296  | 
fun is_unitT (Type ("Product_Type.unit", [])) = true
 | 
| 9362 | 297  | 
| is_unitT _ = false;  | 
298  | 
||
| 11604 | 299  | 
val unit = Const ("Product_Type.Unity", unitT);
 | 
| 4571 | 300  | 
|
| 11604 | 301  | 
fun is_unit (Const ("Product_Type.Unity", _)) = true
 | 
| 4571 | 302  | 
| is_unit _ = false;  | 
303  | 
||
304  | 
||
305  | 
(* prod *)  | 
|
306  | 
||
| 
37676
 
f433cb9caea4
"prod" and "sum" replace "*" and "+" respectively; qualified constants Set.member and Set.Collect
 
haftmann 
parents: 
37591 
diff
changeset
 | 
307  | 
fun mk_prodT (T1, T2) = Type ("Product_Type.prod", [T1, T2]);
 | 
| 4571 | 308  | 
|
| 
37676
 
f433cb9caea4
"prod" and "sum" replace "*" and "+" respectively; qualified constants Set.member and Set.Collect
 
haftmann 
parents: 
37591 
diff
changeset
 | 
309  | 
fun dest_prodT (Type ("Product_Type.prod", [T1, T2])) = (T1, T2)
 | 
| 4571 | 310  | 
  | dest_prodT T = raise TYPE ("dest_prodT", [T], []);
 | 
311  | 
||
| 
37389
 
09467cdfa198
qualified type "*"; qualified constants Pair, fst, snd, split
 
haftmann 
parents: 
37387 
diff
changeset
 | 
312  | 
fun pair_const T1 T2 = Const ("Product_Type.Pair", [T1, T2] ---> mk_prodT (T1, T2));
 | 
| 14048 | 313  | 
|
| 4571 | 314  | 
fun mk_prod (t1, t2) =  | 
315  | 
let val T1 = fastype_of t1 and T2 = fastype_of t2 in  | 
|
| 14048 | 316  | 
pair_const T1 T2 $ t1 $ t2  | 
| 4571 | 317  | 
end;  | 
318  | 
||
| 
37389
 
09467cdfa198
qualified type "*"; qualified constants Pair, fst, snd, split
 
haftmann 
parents: 
37387 
diff
changeset
 | 
319  | 
fun dest_prod (Const ("Product_Type.Pair", _) $ t1 $ t2) = (t1, t2)
 | 
| 4571 | 320  | 
  | dest_prod t = raise TERM ("dest_prod", [t]);
 | 
321  | 
||
322  | 
fun mk_fst p =  | 
|
323  | 
let val pT = fastype_of p in  | 
|
| 
37389
 
09467cdfa198
qualified type "*"; qualified constants Pair, fst, snd, split
 
haftmann 
parents: 
37387 
diff
changeset
 | 
324  | 
    Const ("Product_Type.fst", pT --> fst (dest_prodT pT)) $ p
 | 
| 4571 | 325  | 
end;  | 
326  | 
||
327  | 
fun mk_snd p =  | 
|
328  | 
let val pT = fastype_of p in  | 
|
| 
37389
 
09467cdfa198
qualified type "*"; qualified constants Pair, fst, snd, split
 
haftmann 
parents: 
37387 
diff
changeset
 | 
329  | 
    Const ("Product_Type.snd", pT --> snd (dest_prodT pT)) $ p
 | 
| 4571 | 330  | 
end;  | 
331  | 
||
| 18285 | 332  | 
fun split_const (A, B, C) =  | 
| 37591 | 333  | 
  Const ("Product_Type.prod.prod_case", (A --> B --> C) --> mk_prodT (A, B) --> C);
 | 
| 18285 | 334  | 
|
335  | 
fun mk_split t =  | 
|
336  | 
(case Term.fastype_of t of  | 
|
337  | 
    T as (Type ("fun", [A, Type ("fun", [B, C])])) =>
 | 
|
| 37591 | 338  | 
      Const ("Product_Type.prod.prod_case", T --> mk_prodT (A, B) --> C) $ t
 | 
| 18285 | 339  | 
  | _ => raise TERM ("mk_split: bad body type", [t]));
 | 
340  | 
||
| 
5096
 
84b00be693b4
Moved most of the Prod_Syntax - stuff to HOLogic.
 
berghofe 
parents: 
4571 
diff
changeset
 | 
341  | 
(*Maps the type T1 * ... * Tn to [T1, ..., Tn], however nested*)  | 
| 
37676
 
f433cb9caea4
"prod" and "sum" replace "*" and "+" respectively; qualified constants Set.member and Set.Collect
 
haftmann 
parents: 
37591 
diff
changeset
 | 
342  | 
fun flatten_tupleT (Type ("Product_Type.prod", [T1, T2])) = flatten_tupleT T1 @ flatten_tupleT T2
 | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
343  | 
| flatten_tupleT T = [T];  | 
| 23745 | 344  | 
|
| 
39756
 
6c8e83d94536
consolidated tupled_lambda; moved to structure HOLogic
 
krauss 
parents: 
39250 
diff
changeset
 | 
345  | 
(*abstraction over nested tuples*)  | 
| 
 
6c8e83d94536
consolidated tupled_lambda; moved to structure HOLogic
 
krauss 
parents: 
39250 
diff
changeset
 | 
346  | 
fun tupled_lambda (x as Free _) b = lambda x b  | 
| 
 
6c8e83d94536
consolidated tupled_lambda; moved to structure HOLogic
 
krauss 
parents: 
39250 
diff
changeset
 | 
347  | 
| tupled_lambda (x as Var _) b = lambda x b  | 
| 
 
6c8e83d94536
consolidated tupled_lambda; moved to structure HOLogic
 
krauss 
parents: 
39250 
diff
changeset
 | 
348  | 
  | tupled_lambda (Const ("Product_Type.Pair", _) $ u $ v) b =
 | 
| 
 
6c8e83d94536
consolidated tupled_lambda; moved to structure HOLogic
 
krauss 
parents: 
39250 
diff
changeset
 | 
349  | 
mk_split (tupled_lambda u (tupled_lambda v b))  | 
| 
 
6c8e83d94536
consolidated tupled_lambda; moved to structure HOLogic
 
krauss 
parents: 
39250 
diff
changeset
 | 
350  | 
  | tupled_lambda (Const ("Product_Type.Unity", _)) b =
 | 
| 
 
6c8e83d94536
consolidated tupled_lambda; moved to structure HOLogic
 
krauss 
parents: 
39250 
diff
changeset
 | 
351  | 
      Abs ("x", unitT, b)
 | 
| 
 
6c8e83d94536
consolidated tupled_lambda; moved to structure HOLogic
 
krauss 
parents: 
39250 
diff
changeset
 | 
352  | 
  | tupled_lambda t _ = raise TERM ("tupled_lambda: bad tuple", [t]);
 | 
| 
 
6c8e83d94536
consolidated tupled_lambda; moved to structure HOLogic
 
krauss 
parents: 
39250 
diff
changeset
 | 
353  | 
|
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
354  | 
|
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
355  | 
(* tuples with right-fold structure *)  | 
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
356  | 
|
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
357  | 
fun mk_tupleT [] = unitT  | 
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
358  | 
| mk_tupleT Ts = foldr1 mk_prodT Ts;  | 
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
359  | 
|
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
360  | 
fun strip_tupleT (Type ("Product_Type.unit", [])) = []
 | 
| 
37676
 
f433cb9caea4
"prod" and "sum" replace "*" and "+" respectively; qualified constants Set.member and Set.Collect
 
haftmann 
parents: 
37591 
diff
changeset
 | 
361  | 
  | strip_tupleT (Type ("Product_Type.prod", [T1, T2])) = T1 :: strip_tupleT T2
 | 
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
362  | 
| strip_tupleT T = [T];  | 
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
363  | 
|
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
364  | 
fun mk_tuple [] = unit  | 
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
365  | 
| mk_tuple ts = foldr1 mk_prod ts;  | 
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
366  | 
|
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
367  | 
fun strip_tuple (Const ("Product_Type.Unity", _)) = []
 | 
| 
37389
 
09467cdfa198
qualified type "*"; qualified constants Pair, fst, snd, split
 
haftmann 
parents: 
37387 
diff
changeset
 | 
368  | 
  | strip_tuple (Const ("Product_Type.Pair", _) $ t1 $ t2) = t1 :: strip_tuple t2
 | 
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
369  | 
| strip_tuple t = [t];  | 
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
370  | 
|
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
371  | 
|
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
372  | 
(* tuples with specific arities  | 
| 23745 | 373  | 
|
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
374  | 
an "arity" of a tuple is a list of lists of integers,  | 
| 
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
375  | 
denoting paths to subterms that are pairs  | 
| 25172 | 376  | 
*)  | 
| 23745 | 377  | 
|
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
378  | 
fun ptuple_err s = raise TERM (s ^ ": inconsistent use of nested products", []);  | 
| 23745 | 379  | 
|
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
380  | 
fun mk_ptupleT ps =  | 
| 23745 | 381  | 
let  | 
382  | 
fun mk p Ts =  | 
|
| 
36692
 
54b64d4ad524
farewell to old-style mem infixes -- type inference in situations with mem_int and mem_string should provide enough information to resolve the type of (op =)
 
haftmann 
parents: 
35625 
diff
changeset
 | 
383  | 
if member (op =) ps p then  | 
| 23745 | 384  | 
let  | 
385  | 
val (T, Ts') = mk (1::p) Ts;  | 
|
386  | 
val (U, Ts'') = mk (2::p) Ts'  | 
|
387  | 
in (mk_prodT (T, U), Ts'') end  | 
|
388  | 
else (hd Ts, tl Ts)  | 
|
389  | 
in fst o mk [] end;  | 
|
390  | 
||
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
391  | 
fun strip_ptupleT ps =  | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
392  | 
let  | 
| 
36692
 
54b64d4ad524
farewell to old-style mem infixes -- type inference in situations with mem_int and mem_string should provide enough information to resolve the type of (op =)
 
haftmann 
parents: 
35625 
diff
changeset
 | 
393  | 
fun factors p T = if member (op =) ps p then (case T of  | 
| 
37676
 
f433cb9caea4
"prod" and "sum" replace "*" and "+" respectively; qualified constants Set.member and Set.Collect
 
haftmann 
parents: 
37591 
diff
changeset
 | 
394  | 
        Type ("Product_Type.prod", [T1, T2]) =>
 | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
395  | 
factors (1::p) T1 @ factors (2::p) T2  | 
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
396  | 
| _ => ptuple_err "strip_ptupleT") else [T]  | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
397  | 
in factors [] end;  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
398  | 
|
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
399  | 
val flat_tupleT_paths =  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
400  | 
let  | 
| 
37676
 
f433cb9caea4
"prod" and "sum" replace "*" and "+" respectively; qualified constants Set.member and Set.Collect
 
haftmann 
parents: 
37591 
diff
changeset
 | 
401  | 
    fun factors p (Type ("Product_Type.prod", [T1, T2])) =
 | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
402  | 
p :: factors (1::p) T1 @ factors (2::p) T2  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
403  | 
| factors p _ = []  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
404  | 
in factors [] end;  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
405  | 
|
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
406  | 
fun mk_ptuple ps =  | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
407  | 
let  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
408  | 
fun mk p T ts =  | 
| 
36692
 
54b64d4ad524
farewell to old-style mem infixes -- type inference in situations with mem_int and mem_string should provide enough information to resolve the type of (op =)
 
haftmann 
parents: 
35625 
diff
changeset
 | 
409  | 
if member (op =) ps p then (case T of  | 
| 
37676
 
f433cb9caea4
"prod" and "sum" replace "*" and "+" respectively; qualified constants Set.member and Set.Collect
 
haftmann 
parents: 
37591 
diff
changeset
 | 
410  | 
          Type ("Product_Type.prod", [T1, T2]) =>
 | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
411  | 
let  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
412  | 
val (t, ts') = mk (1::p) T1 ts;  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
413  | 
val (u, ts'') = mk (2::p) T2 ts'  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
414  | 
in (pair_const T1 T2 $ t $ u, ts'') end  | 
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
415  | 
| _ => ptuple_err "mk_ptuple")  | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
416  | 
else (hd ts, tl ts)  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
417  | 
in fst oo mk [] end;  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
418  | 
|
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
419  | 
fun strip_ptuple ps =  | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
420  | 
let  | 
| 
36692
 
54b64d4ad524
farewell to old-style mem infixes -- type inference in situations with mem_int and mem_string should provide enough information to resolve the type of (op =)
 
haftmann 
parents: 
35625 
diff
changeset
 | 
421  | 
fun dest p t = if member (op =) ps p then (case t of  | 
| 
37389
 
09467cdfa198
qualified type "*"; qualified constants Pair, fst, snd, split
 
haftmann 
parents: 
37387 
diff
changeset
 | 
422  | 
        Const ("Product_Type.Pair", _) $ t $ u =>
 | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
423  | 
dest (1::p) t @ dest (2::p) u  | 
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
424  | 
| _ => ptuple_err "strip_ptuple") else [t]  | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
425  | 
in dest [] end;  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
426  | 
|
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
427  | 
val flat_tuple_paths =  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
428  | 
let  | 
| 
37389
 
09467cdfa198
qualified type "*"; qualified constants Pair, fst, snd, split
 
haftmann 
parents: 
37387 
diff
changeset
 | 
429  | 
    fun factors p (Const ("Product_Type.Pair", _) $ t $ u) =
 | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
430  | 
p :: factors (1::p) t @ factors (2::p) u  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
431  | 
| factors p _ = []  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
432  | 
in factors [] end;  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
433  | 
|
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
434  | 
(*In mk_psplits ps S T u, term u expects separate arguments for the factors of S,  | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
435  | 
with result type T. The call creates a new term expecting one argument  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
436  | 
of type S.*)  | 
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
437  | 
fun mk_psplits ps T T3 u =  | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
438  | 
let  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
439  | 
fun ap ((p, T) :: pTs) =  | 
| 
36692
 
54b64d4ad524
farewell to old-style mem infixes -- type inference in situations with mem_int and mem_string should provide enough information to resolve the type of (op =)
 
haftmann 
parents: 
35625 
diff
changeset
 | 
440  | 
if member (op =) ps p then (case T of  | 
| 
37676
 
f433cb9caea4
"prod" and "sum" replace "*" and "+" respectively; qualified constants Set.member and Set.Collect
 
haftmann 
parents: 
37591 
diff
changeset
 | 
441  | 
              Type ("Product_Type.prod", [T1, T2]) =>
 | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
442  | 
split_const (T1, T2, map snd pTs ---> T3) $  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
443  | 
ap ((1::p, T1) :: (2::p, T2) :: pTs)  | 
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
444  | 
| _ => ptuple_err "mk_psplits")  | 
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
445  | 
          else Abs ("x", T, ap pTs)
 | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
446  | 
| ap [] =  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
447  | 
let val k = length ps  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
448  | 
in list_comb (incr_boundvars (k + 1) u, map Bound (k downto 0)) end  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
449  | 
in ap [([], T)] end;  | 
| 
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
450  | 
|
| 
32342
 
3fabf5b5fc83
path-sensitive tuple combinators carry a "p"(ath) prefix; combinators for standard right-fold tuples
 
haftmann 
parents: 
32339 
diff
changeset
 | 
451  | 
val strip_psplits =  | 
| 23745 | 452  | 
let  | 
| 
34962
 
807f6ce0273d
HOLogic.strip_psplits: types are ordered after syntactic appearance, not after corresponding de-Bruin index (closer correspondence to similar strip operations)
 
haftmann 
parents: 
33245 
diff
changeset
 | 
453  | 
fun strip [] qs Ts t = (t, rev Ts, qs)  | 
| 37591 | 454  | 
      | strip (p :: ps) qs Ts (Const ("Product_Type.prod.prod_case", _) $ t) =
 | 
| 23745 | 455  | 
strip ((1 :: p) :: (2 :: p) :: ps) (p :: qs) Ts t  | 
456  | 
| strip (p :: ps) qs Ts (Abs (s, T, t)) = strip ps qs (T :: Ts) t  | 
|
457  | 
| strip (p :: ps) qs Ts t = strip ps qs  | 
|
458  | 
(hd (binder_types (fastype_of1 (Ts, t))) :: Ts)  | 
|
459  | 
(incr_boundvars 1 t $ Bound 0)  | 
|
| 
32287
 
65d5c5b30747
cleaned up abstract tuple operations and named them consistently
 
haftmann 
parents: 
32264 
diff
changeset
 | 
460  | 
in strip [[]] [] [] end;  | 
| 23745 | 461  | 
|
| 5207 | 462  | 
|
463  | 
(* nat *)  | 
|
464  | 
||
| 
37387
 
3581483cca6c
qualified types "+" and nat; qualified constants Ball, Bex, Suc, curry; modernized some specifications
 
haftmann 
parents: 
37145 
diff
changeset
 | 
465  | 
val natT = Type ("Nat.nat", []);
 | 
| 5207 | 466  | 
|
| 
35267
 
8dfd816713c6
moved remaning class operations from Algebras.thy to Groups.thy
 
haftmann 
parents: 
34974 
diff
changeset
 | 
467  | 
val zero = Const ("Groups.zero_class.zero", natT);
 | 
| 5207 | 468  | 
|
| 
35267
 
8dfd816713c6
moved remaning class operations from Algebras.thy to Groups.thy
 
haftmann 
parents: 
34974 
diff
changeset
 | 
469  | 
fun is_zero (Const ("Groups.zero_class.zero", _)) = true
 | 
| 5207 | 470  | 
| is_zero _ = false;  | 
471  | 
||
| 
37387
 
3581483cca6c
qualified types "+" and nat; qualified constants Ball, Bex, Suc, curry; modernized some specifications
 
haftmann 
parents: 
37145 
diff
changeset
 | 
472  | 
fun mk_Suc t = Const ("Nat.Suc", natT --> natT) $ t;
 | 
| 5207 | 473  | 
|
| 
37387
 
3581483cca6c
qualified types "+" and nat; qualified constants Ball, Bex, Suc, curry; modernized some specifications
 
haftmann 
parents: 
37145 
diff
changeset
 | 
474  | 
fun dest_Suc (Const ("Nat.Suc", _) $ t) = t
 | 
| 5207 | 475  | 
  | dest_Suc t = raise TERM ("dest_Suc", [t]);
 | 
476  | 
||
| 21621 | 477  | 
val Suc_zero = mk_Suc zero;  | 
478  | 
||
| 
24630
 
351a308ab58d
simplified type int (eliminated IntInf.int, integer);
 
wenzelm 
parents: 
23745 
diff
changeset
 | 
479  | 
fun mk_nat n =  | 
| 22994 | 480  | 
let  | 
481  | 
fun mk 0 = zero  | 
|
| 23297 | 482  | 
| mk n = mk_Suc (mk (n - 1));  | 
| 
23576
 
1ffe739e5ee0
removed dest_cTrueprop (cf. ObjectLogic.dest_judgment);
 
wenzelm 
parents: 
23566 
diff
changeset
 | 
483  | 
  in if n < 0 then raise TERM ("mk_nat: negative number", []) else mk n end;
 | 
| 5207 | 484  | 
|
| 
35267
 
8dfd816713c6
moved remaning class operations from Algebras.thy to Groups.thy
 
haftmann 
parents: 
34974 
diff
changeset
 | 
485  | 
fun dest_nat (Const ("Groups.zero_class.zero", _)) = 0
 | 
| 
37387
 
3581483cca6c
qualified types "+" and nat; qualified constants Ball, Bex, Suc, curry; modernized some specifications
 
haftmann 
parents: 
37145 
diff
changeset
 | 
486  | 
  | dest_nat (Const ("Nat.Suc", _) $ t) = dest_nat t + 1
 | 
| 5207 | 487  | 
  | dest_nat t = raise TERM ("dest_nat", [t]);
 | 
488  | 
||
| 22994 | 489  | 
val class_size = "Nat.size";  | 
490  | 
||
491  | 
fun size_const T = Const ("Nat.size_class.size", T --> natT);
 | 
|
492  | 
||
| 5207 | 493  | 
|
| 
31205
 
98370b26c2ce
String.literal replaces message_string, code_numeral replaces (code_)index
 
haftmann 
parents: 
31183 
diff
changeset
 | 
494  | 
(* code numeral *)  | 
| 26036 | 495  | 
|
| 
31205
 
98370b26c2ce
String.literal replaces message_string, code_numeral replaces (code_)index
 
haftmann 
parents: 
31183 
diff
changeset
 | 
496  | 
val code_numeralT = Type ("Code_Numeral.code_numeral", []);
 | 
| 26036 | 497  | 
|
498  | 
||
| 
21778
 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 
wenzelm 
parents: 
21755 
diff
changeset
 | 
499  | 
(* binary numerals and int -- non-unique representation due to leading zeros/ones! *)  | 
| 
 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 
wenzelm 
parents: 
21755 
diff
changeset
 | 
500  | 
|
| 
25919
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
25887 
diff
changeset
 | 
501  | 
val intT = Type ("Int.int", []);
 | 
| 
21778
 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 
wenzelm 
parents: 
21755 
diff
changeset
 | 
502  | 
|
| 
25919
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
25887 
diff
changeset
 | 
503  | 
val pls_const = Const ("Int.Pls", intT)
 | 
| 
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
25887 
diff
changeset
 | 
504  | 
and min_const = Const ("Int.Min", intT)
 | 
| 
26086
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26036 
diff
changeset
 | 
505  | 
and bit0_const = Const ("Int.Bit0", intT --> intT)
 | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26036 
diff
changeset
 | 
506  | 
and bit1_const = Const ("Int.Bit1", intT --> intT);
 | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26036 
diff
changeset
 | 
507  | 
|
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26036 
diff
changeset
 | 
508  | 
fun mk_bit 0 = bit0_const  | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26036 
diff
changeset
 | 
509  | 
| mk_bit 1 = bit1_const  | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26036 
diff
changeset
 | 
510  | 
  | mk_bit _ = raise TERM ("mk_bit", []);
 | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26036 
diff
changeset
 | 
511  | 
|
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26036 
diff
changeset
 | 
512  | 
fun dest_bit (Const ("Int.Bit0", _)) = 0
 | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26036 
diff
changeset
 | 
513  | 
  | dest_bit (Const ("Int.Bit1", _)) = 1
 | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26036 
diff
changeset
 | 
514  | 
  | dest_bit t = raise TERM ("dest_bit", [t]);
 | 
| 8768 | 515  | 
|
| 
21829
 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 
wenzelm 
parents: 
21820 
diff
changeset
 | 
516  | 
fun mk_numeral 0 = pls_const  | 
| 
 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 
wenzelm 
parents: 
21820 
diff
changeset
 | 
517  | 
| mk_numeral ~1 = min_const  | 
| 
 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 
wenzelm 
parents: 
21820 
diff
changeset
 | 
518  | 
| mk_numeral i =  | 
| 
24630
 
351a308ab58d
simplified type int (eliminated IntInf.int, integer);
 
wenzelm 
parents: 
23745 
diff
changeset
 | 
519  | 
let val (q, r) = Integer.div_mod i 2;  | 
| 
26086
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26036 
diff
changeset
 | 
520  | 
in mk_bit r $ mk_numeral q end;  | 
| 13755 | 521  | 
|
| 
25919
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
25887 
diff
changeset
 | 
522  | 
fun dest_numeral (Const ("Int.Pls", _)) = 0
 | 
| 
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
25887 
diff
changeset
 | 
523  | 
  | dest_numeral (Const ("Int.Min", _)) = ~1
 | 
| 
26086
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26036 
diff
changeset
 | 
524  | 
  | dest_numeral (Const ("Int.Bit0", _) $ bs) = 2 * dest_numeral bs
 | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26036 
diff
changeset
 | 
525  | 
  | dest_numeral (Const ("Int.Bit1", _) $ bs) = 2 * dest_numeral bs + 1
 | 
| 
21829
 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 
wenzelm 
parents: 
21820 
diff
changeset
 | 
526  | 
  | dest_numeral t = raise TERM ("dest_numeral", [t]);
 | 
| 13755 | 527  | 
|
| 
25919
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
25887 
diff
changeset
 | 
528  | 
fun number_of_const T = Const ("Int.number_class.number_of", intT --> T);
 | 
| 
21820
 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 
haftmann 
parents: 
21788 
diff
changeset
 | 
529  | 
|
| 
25919
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
25887 
diff
changeset
 | 
530  | 
fun add_numerals (Const ("Int.number_class.number_of", Type (_, [_, T])) $ t) = cons (t, T)
 | 
| 23269 | 531  | 
| add_numerals (t $ u) = add_numerals t #> add_numerals u  | 
532  | 
| add_numerals (Abs (_, _, t)) = add_numerals t  | 
|
533  | 
| add_numerals _ = I;  | 
|
| 22391 | 534  | 
|
| 
35267
 
8dfd816713c6
moved remaning class operations from Algebras.thy to Groups.thy
 
haftmann 
parents: 
34974 
diff
changeset
 | 
535  | 
fun mk_number T 0 = Const ("Groups.zero_class.zero", T)
 | 
| 
 
8dfd816713c6
moved remaning class operations from Algebras.thy to Groups.thy
 
haftmann 
parents: 
34974 
diff
changeset
 | 
536  | 
  | mk_number T 1 = Const ("Groups.one_class.one", T)
 | 
| 
21820
 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 
haftmann 
parents: 
21788 
diff
changeset
 | 
537  | 
| mk_number T i = number_of_const T $ mk_numeral i;  | 
| 
 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 
haftmann 
parents: 
21788 
diff
changeset
 | 
538  | 
|
| 
35267
 
8dfd816713c6
moved remaning class operations from Algebras.thy to Groups.thy
 
haftmann 
parents: 
34974 
diff
changeset
 | 
539  | 
fun dest_number (Const ("Groups.zero_class.zero", T)) = (T, 0)
 | 
| 
 
8dfd816713c6
moved remaning class operations from Algebras.thy to Groups.thy
 
haftmann 
parents: 
34974 
diff
changeset
 | 
540  | 
  | dest_number (Const ("Groups.one_class.one", T)) = (T, 1)
 | 
| 
25919
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
25887 
diff
changeset
 | 
541  | 
  | dest_number (Const ("Int.number_class.number_of", Type ("fun", [_, T])) $ t) =
 | 
| 22994 | 542  | 
(T, dest_numeral t)  | 
| 
21820
 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 
haftmann 
parents: 
21788 
diff
changeset
 | 
543  | 
  | dest_number t = raise TERM ("dest_number", [t]);
 | 
| 13755 | 544  | 
|
| 
21829
 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 
wenzelm 
parents: 
21820 
diff
changeset
 | 
545  | 
|
| 13755 | 546  | 
(* real *)  | 
547  | 
||
| 16971 | 548  | 
val realT = Type ("RealDef.real", []);
 | 
| 13755 | 549  | 
|
550  | 
||
| 21755 | 551  | 
(* list *)  | 
| 21455 | 552  | 
|
| 21755 | 553  | 
fun listT T = Type ("List.list", [T]);
 | 
| 21455 | 554  | 
|
| 25887 | 555  | 
fun nil_const T = Const ("List.list.Nil", listT T);
 | 
556  | 
||
557  | 
fun cons_const T =  | 
|
558  | 
let val lT = listT T  | 
|
559  | 
  in Const ("List.list.Cons", T --> lT --> lT) end;
 | 
|
560  | 
||
| 21755 | 561  | 
fun mk_list T ts =  | 
| 21455 | 562  | 
let  | 
| 21755 | 563  | 
val lT = listT T;  | 
564  | 
    val Nil = Const ("List.list.Nil", lT);
 | 
|
565  | 
    fun Cons t u = Const ("List.list.Cons", T --> lT --> lT) $ t $ u;
 | 
|
566  | 
in fold_rev Cons ts Nil end;  | 
|
567  | 
||
568  | 
fun dest_list (Const ("List.list.Nil", _)) = []
 | 
|
569  | 
  | dest_list (Const ("List.list.Cons", _) $ t $ u) = t :: dest_list u
 | 
|
570  | 
  | dest_list t = raise TERM ("dest_list", [t]);
 | 
|
| 21455 | 571  | 
|
572  | 
||
| 
31048
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
573  | 
(* nibble *)  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
574  | 
|
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
575  | 
val nibbleT = Type ("String.nibble", []);
 | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
576  | 
|
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
577  | 
fun mk_nibble n =  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
578  | 
let val s =  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
579  | 
if 0 <= n andalso n <= 9 then chr (n + ord "0")  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
580  | 
else if 10 <= n andalso n <= 15 then chr (n + ord "A" - 10)  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
581  | 
    else raise TERM ("mk_nibble", [])
 | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
582  | 
  in Const ("String.nibble.Nibble" ^ s, nibbleT) end;
 | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
583  | 
|
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
584  | 
fun dest_nibble t =  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
585  | 
  let fun err () = raise TERM ("dest_nibble", [t]) in
 | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
586  | 
(case try (unprefix "String.nibble.Nibble" o fst o Term.dest_Const) t of  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
587  | 
NONE => err ()  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
588  | 
| SOME c =>  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
589  | 
if size c <> 1 then err ()  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
590  | 
else if "0" <= c andalso c <= "9" then ord c - ord "0"  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
591  | 
else if "A" <= c andalso c <= "F" then ord c - ord "A" + 10  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
592  | 
else err ())  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
593  | 
end;  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
594  | 
|
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
595  | 
|
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
596  | 
(* char *)  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
597  | 
|
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
598  | 
val charT = Type ("String.char", []);
 | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
599  | 
|
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
600  | 
fun mk_char n =  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
601  | 
if 0 <= n andalso n <= 255 then  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
602  | 
    Const ("String.char.Char", nibbleT --> nibbleT --> charT) $
 | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
603  | 
mk_nibble (n div 16) $ mk_nibble (n mod 16)  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
604  | 
  else raise TERM ("mk_char", []);
 | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
605  | 
|
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
606  | 
fun dest_char (Const ("String.char.Char", _) $ t $ u) =
 | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
607  | 
dest_nibble t * 16 + dest_nibble u  | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
608  | 
  | dest_char t = raise TERM ("dest_char", [t]);
 | 
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
609  | 
|
| 
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
610  | 
|
| 21455 | 611  | 
(* string *)  | 
612  | 
||
| 32446 | 613  | 
val stringT = listT charT;  | 
| 21455 | 614  | 
|
| 
40627
 
becf5d5187cc
renamed raw "explode" function to "raw_explode" to emphasize its meaning;
 
wenzelm 
parents: 
39756 
diff
changeset
 | 
615  | 
val mk_string = mk_list charT o map (mk_char o ord) o raw_explode;  | 
| 21755 | 616  | 
val dest_string = implode o map (chr o dest_char) o dest_list;  | 
| 21455 | 617  | 
|
| 
31048
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
618  | 
|
| 
31205
 
98370b26c2ce
String.literal replaces message_string, code_numeral replaces (code_)index
 
haftmann 
parents: 
31183 
diff
changeset
 | 
619  | 
(* literal *)  | 
| 
31048
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
620  | 
|
| 
31205
 
98370b26c2ce
String.literal replaces message_string, code_numeral replaces (code_)index
 
haftmann 
parents: 
31183 
diff
changeset
 | 
621  | 
val literalT = Type ("String.literal", []);
 | 
| 
31048
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
622  | 
|
| 
39250
 
548a3e5521ab
changing String.literal to a type instead of a datatype
 
bulwahn 
parents: 
38864 
diff
changeset
 | 
623  | 
fun mk_literal s = Const ("String.STR", stringT --> literalT)
 | 
| 
31048
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
624  | 
$ mk_string s;  | 
| 
39250
 
548a3e5521ab
changing String.literal to a type instead of a datatype
 
bulwahn 
parents: 
38864 
diff
changeset
 | 
625  | 
fun dest_literal (Const ("String.STR", _) $ t) =
 | 
| 
31048
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
626  | 
dest_string t  | 
| 
31205
 
98370b26c2ce
String.literal replaces message_string, code_numeral replaces (code_)index
 
haftmann 
parents: 
31183 
diff
changeset
 | 
627  | 
  | dest_literal t = raise TERM ("dest_literal", [t]);
 | 
| 
31048
 
ac146fc38b51
refined HOL string theories and corresponding ML fragments
 
haftmann 
parents: 
30453 
diff
changeset
 | 
628  | 
|
| 31135 | 629  | 
|
630  | 
(* typerep and term *)  | 
|
631  | 
||
632  | 
val typerepT = Type ("Typerep.typerep", []);
 | 
|
633  | 
||
| 31736 | 634  | 
fun mk_typerep (Type (tyco, Ts)) = Const ("Typerep.typerep.Typerep",
 | 
635  | 
literalT --> listT typerepT --> typerepT) $ mk_literal tyco  | 
|
636  | 
$ mk_list typerepT (map mk_typerep Ts)  | 
|
637  | 
  | mk_typerep (T as TFree _) = Const ("Typerep.typerep_class.typerep",
 | 
|
638  | 
Term.itselfT T --> typerepT) $ Logic.mk_type T;  | 
|
| 31135 | 639  | 
|
| 32657 | 640  | 
val termT = Type ("Code_Evaluation.term", []);
 | 
| 31135 | 641  | 
|
| 32657 | 642  | 
fun term_of_const T = Const ("Code_Evaluation.term_of_class.term_of", T --> termT);
 | 
| 32339 | 643  | 
|
644  | 
fun mk_term_of T t = term_of_const T $ t;  | 
|
| 31135 | 645  | 
|
646  | 
fun reflect_term (Const (c, T)) =  | 
|
| 32657 | 647  | 
      Const ("Code_Evaluation.Const", literalT --> typerepT --> termT)
 | 
| 
31205
 
98370b26c2ce
String.literal replaces message_string, code_numeral replaces (code_)index
 
haftmann 
parents: 
31183 
diff
changeset
 | 
648  | 
$ mk_literal c $ mk_typerep T  | 
| 31135 | 649  | 
| reflect_term (t1 $ t2) =  | 
| 32657 | 650  | 
      Const ("Code_Evaluation.App", termT --> termT --> termT)
 | 
| 31135 | 651  | 
$ reflect_term t1 $ reflect_term t2  | 
| 31183 | 652  | 
| reflect_term (Abs (v, _, t)) = Abs (v, termT, reflect_term t)  | 
653  | 
| reflect_term t = t;  | 
|
654  | 
||
| 31463 | 655  | 
fun mk_valtermify_app c vs T =  | 
656  | 
let  | 
|
657  | 
fun termifyT T = mk_prodT (T, unitT --> termT);  | 
|
| 32657 | 658  | 
    fun valapp T T' = Const ("Code_Evaluation.valapp",
 | 
| 31463 | 659  | 
termifyT (T --> T') --> termifyT T --> termifyT T');  | 
660  | 
fun mk_fTs [] _ = []  | 
|
661  | 
| mk_fTs (_ :: Ts) T = (Ts ---> T) :: mk_fTs Ts T;  | 
|
662  | 
val Ts = map snd vs;  | 
|
663  | 
val t = Const (c, Ts ---> T);  | 
|
664  | 
    val tt = mk_prod (t, Abs ("u", unitT, reflect_term t));
 | 
|
| 33245 | 665  | 
fun app (fT, (v, T)) t = valapp T fT $ t $ Free (v, termifyT T);  | 
666  | 
in fold app (mk_fTs Ts T ~~ vs) tt end;  | 
|
| 31463 | 667  | 
|
| 31183 | 668  | 
|
669  | 
(* open state monads *)  | 
|
670  | 
||
671  | 
fun mk_return T U x = pair_const T U $ x;  | 
|
672  | 
||
673  | 
fun mk_ST clauses t U (someT, V) =  | 
|
674  | 
let  | 
|
675  | 
val R = case someT of SOME T => mk_prodT (T, V) | NONE => V  | 
|
676  | 
fun mk_clause ((t, U), SOME (v, T)) (t', U') =  | 
|
677  | 
          (Const ("Product_Type.scomp", (U --> mk_prodT (T, U')) --> (T --> U' --> R) --> U --> R)
 | 
|
678  | 
$ t $ lambda (Free (v, T)) t', U)  | 
|
679  | 
| mk_clause ((t, U), NONE) (t', U') =  | 
|
680  | 
          (Const ("Product_Type.fcomp", (U --> U') --> (U' --> R) --> U --> R)
 | 
|
681  | 
$ t $ t', U)  | 
|
682  | 
in fold_rev mk_clause clauses (t, U) |> fst end;  | 
|
| 31135 | 683  | 
|
| 38550 | 684  | 
|
685  | 
(* random seeds *)  | 
|
686  | 
||
| 31463 | 687  | 
val random_seedT = mk_prodT (code_numeralT, code_numeralT);  | 
688  | 
||
689  | 
fun mk_random T t = Const ("Quickcheck.random_class.random", code_numeralT
 | 
|
690  | 
--> random_seedT --> mk_prodT (mk_prodT (T, unitT --> termT), random_seedT)) $ t;  | 
|
691  | 
||
| 923 | 692  | 
end;  |