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