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