| author | huffman | 
| Thu, 12 Apr 2007 03:37:30 +0200 | |
| changeset 22641 | a5dc96fad632 | 
| parent 22391 | 56861fe9c22c | 
| child 22994 | 02440636214f | 
| permissions | -rw-r--r-- | 
| 923 | 1 | (* Title: HOL/hologic.ML | 
| 2 | ID: $Id$ | |
| 3 | Author: Lawrence C Paulson and Markus Wenzel | |
| 4 | ||
| 5 | Abstract syntax operations for HOL. | |
| 6 | *) | |
| 7 | ||
| 8 | signature HOLOGIC = | |
| 9 | sig | |
| 12338 
de0f4a63baa5
renamed class "term" to "type" (actually "HOL.type");
 wenzelm parents: 
11818diff
changeset | 10 | val typeS: sort | 
| 
de0f4a63baa5
renamed class "term" to "type" (actually "HOL.type");
 wenzelm parents: 
11818diff
changeset | 11 | val typeT: typ | 
| 8275 | 12 | val boolN: string | 
| 923 | 13 | val boolT: typ | 
| 21829 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 14 | val true_const: term | 
| 7073 | 15 | val false_const: term | 
| 923 | 16 | val mk_setT: typ -> typ | 
| 17 | val dest_setT: typ -> typ | |
| 15965 
f422f8283491
Use of IntInf.int instead of int in most numeric simprocs; avoids
 paulson parents: 
15945diff
changeset | 18 | val Trueprop: term | 
| 923 | 19 | val mk_Trueprop: term -> term | 
| 20 | val dest_Trueprop: term -> term | |
| 21550 | 21 | val Trueprop_conv: (cterm -> thm) -> cterm -> thm | 
| 923 | 22 | val conj: term | 
| 23 | val disj: term | |
| 24 | val imp: term | |
| 8429 | 25 | val Not: term | 
| 7690 | 26 | val mk_conj: term * term -> term | 
| 27 | val mk_disj: term * term -> term | |
| 28 | val mk_imp: term * term -> term | |
| 16835 | 29 | val mk_not: term -> term | 
| 15151 | 30 | val dest_conj: term -> term list | 
| 15945 | 31 | val dest_disj: term -> term list | 
| 4571 | 32 | val dest_imp: term -> term * term | 
| 15151 | 33 | val dest_not: term -> term | 
| 11683 | 34 | val dest_concls: term -> term list | 
| 923 | 35 | val eq_const: typ -> term | 
| 21829 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 36 | val mk_eq: term * term -> term | 
| 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 37 | val dest_eq: term -> term * term | 
| 923 | 38 | val all_const: typ -> term | 
| 21829 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 39 | val mk_all: string * typ * term -> term | 
| 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 40 | val list_all: (string * typ) list * term -> term | 
| 923 | 41 | val exists_const: typ -> term | 
| 21829 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 42 | val mk_exists: string * typ * term -> term | 
| 15945 | 43 | val choice_const: typ -> term | 
| 923 | 44 | val Collect_const: typ -> term | 
| 45 | val mk_Collect: string * typ * term -> term | |
| 21829 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 46 | val class_eq: string | 
| 923 | 47 | val mk_mem: term * term -> term | 
| 6380 | 48 | val dest_mem: term -> term * term | 
| 11818 | 49 | val mk_UNIV: typ -> term | 
| 2510 | 50 | val mk_binop: string -> term * term -> term | 
| 51 | val mk_binrel: string -> term * term -> term | |
| 52 | val dest_bin: string -> typ -> term -> term * term | |
| 4571 | 53 | val unitT: typ | 
| 9362 | 54 | val is_unitT: typ -> bool | 
| 4571 | 55 | val unit: term | 
| 56 | val is_unit: term -> bool | |
| 57 | val mk_prodT: typ * typ -> typ | |
| 58 | val dest_prodT: typ -> typ * typ | |
| 14048 | 59 | val pair_const: typ -> typ -> term | 
| 4571 | 60 | val mk_prod: term * term -> term | 
| 61 | val dest_prod: term -> term * term | |
| 62 | val mk_fst: term -> term | |
| 63 | val mk_snd: term -> term | |
| 21829 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 64 | val split_const: typ * typ * typ -> term | 
| 18285 | 65 | val mk_split: term -> term | 
| 5096 
84b00be693b4
Moved most of the Prod_Syntax - stuff to HOLogic.
 berghofe parents: 
4571diff
changeset | 66 | val prodT_factors: typ -> typ list | 
| 
84b00be693b4
Moved most of the Prod_Syntax - stuff to HOLogic.
 berghofe parents: 
4571diff
changeset | 67 | val mk_tuple: typ -> term list -> term | 
| 5207 | 68 | val natT: typ | 
| 69 | val zero: term | |
| 70 | val is_zero: term -> bool | |
| 71 | val mk_Suc: term -> term | |
| 72 | val dest_Suc: term -> term | |
| 21621 | 73 | val Suc_zero: term | 
| 74 | val mk_nat: IntInf.int -> term | |
| 75 | val dest_nat: term -> IntInf.int | |
| 15620 
8ccdc8bc66a2
replaced bool by a new datatype "bit" for binary numerals
 paulson parents: 
15595diff
changeset | 76 | val bitT: typ | 
| 
8ccdc8bc66a2
replaced bool by a new datatype "bit" for binary numerals
 paulson parents: 
15595diff
changeset | 77 | val B0_const: term | 
| 
8ccdc8bc66a2
replaced bool by a new datatype "bit" for binary numerals
 paulson parents: 
15595diff
changeset | 78 | val B1_const: term | 
| 21778 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 79 | val mk_bit: int -> term | 
| 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 80 | val dest_bit: term -> int | 
| 21829 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 81 | val intT: typ | 
| 7073 | 82 | val pls_const: term | 
| 83 | val min_const: term | |
| 84 | val bit_const: term | |
| 21820 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 haftmann parents: 
21788diff
changeset | 85 | val mk_numeral: IntInf.int -> term | 
| 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 haftmann parents: 
21788diff
changeset | 86 | val dest_numeral: term -> IntInf.int | 
| 21829 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 87 | val number_of_const: typ -> term | 
| 22391 | 88 | val add_numerals_of: term -> (term * typ) list -> (term * typ) list | 
| 21820 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 haftmann parents: 
21788diff
changeset | 89 | val mk_number: typ -> IntInf.int -> term | 
| 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 haftmann parents: 
21788diff
changeset | 90 | val dest_number: term -> typ * IntInf.int | 
| 21778 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 91 | val realT: typ | 
| 21755 | 92 | val nibbleT: typ | 
| 93 | val mk_nibble: int -> term | |
| 94 | val dest_nibble: term -> int | |
| 95 | val charT: typ | |
| 96 | val mk_char: int -> term | |
| 97 | val dest_char: term -> int | |
| 21829 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 98 | val listT: typ -> typ | 
| 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 99 | val mk_list: typ -> term list -> term | 
| 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 100 | val dest_list: term -> term list | 
| 21778 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 101 | val stringT: typ | 
| 21820 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 haftmann parents: 
21788diff
changeset | 102 | val mk_string: string -> term | 
| 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 haftmann parents: 
21788diff
changeset | 103 | val dest_string: term -> string | 
| 923 | 104 | end; | 
| 105 | ||
| 106 | structure HOLogic: HOLOGIC = | |
| 107 | struct | |
| 108 | ||
| 12338 
de0f4a63baa5
renamed class "term" to "type" (actually "HOL.type");
 wenzelm parents: 
11818diff
changeset | 109 | (* HOL syntax *) | 
| 923 | 110 | |
| 12338 
de0f4a63baa5
renamed class "term" to "type" (actually "HOL.type");
 wenzelm parents: 
11818diff
changeset | 111 | val typeS: sort = ["HOL.type"]; | 
| 
de0f4a63baa5
renamed class "term" to "type" (actually "HOL.type");
 wenzelm parents: 
11818diff
changeset | 112 | val typeT = TypeInfer.anyT typeS; | 
| 
de0f4a63baa5
renamed class "term" to "type" (actually "HOL.type");
 wenzelm parents: 
11818diff
changeset | 113 | |
| 923 | 114 | |
| 2510 | 115 | (* bool and set *) | 
| 923 | 116 | |
| 8275 | 117 | val boolN = "bool"; | 
| 118 | val boolT = Type (boolN, []); | |
| 923 | 119 | |
| 9856 | 120 | val true_const =  Const ("True", boolT);
 | 
| 121 | val false_const = Const ("False", boolT);
 | |
| 7073 | 122 | |
| 923 | 123 | fun mk_setT T = Type ("set", [T]);
 | 
| 124 | ||
| 125 | fun dest_setT (Type ("set", [T])) = T
 | |
| 3794 | 126 |   | dest_setT T = raise TYPE ("dest_setT: set type expected", [T], []);
 | 
| 923 | 127 | |
| 8275 | 128 | |
| 7073 | 129 | (* logic *) | 
| 923 | 130 | |
| 131 | val Trueprop = Const ("Trueprop", boolT --> propT);
 | |
| 132 | ||
| 133 | fun mk_Trueprop P = Trueprop $ P; | |
| 134 | ||
| 135 | fun dest_Trueprop (Const ("Trueprop", _) $ P) = P
 | |
| 3794 | 136 |   | dest_Trueprop t = raise TERM ("dest_Trueprop", [t]);
 | 
| 923 | 137 | |
| 21550 | 138 | fun Trueprop_conv conv ct = (case term_of ct of | 
| 139 |     Const ("Trueprop", _) $ _ =>
 | |
| 140 | let val (ct1, ct2) = Thm.dest_comb ct | |
| 141 | in Thm.combination (Thm.reflexive ct1) (conv ct2) end | |
| 142 |   | _ => raise TERM ("Trueprop_conv", []));
 | |
| 923 | 143 | |
| 144 | val conj = Const ("op &", [boolT, boolT] ---> boolT)
 | |
| 145 | and disj = Const ("op |", [boolT, boolT] ---> boolT)
 | |
| 8429 | 146 | and imp = Const ("op -->", [boolT, boolT] ---> boolT)
 | 
| 147 | and Not = Const ("Not", boolT --> boolT);
 | |
| 923 | 148 | |
| 7690 | 149 | fun mk_conj (t1, t2) = conj $ t1 $ t2 | 
| 150 | and mk_disj (t1, t2) = disj $ t1 $ t2 | |
| 16835 | 151 | and mk_imp (t1, t2) = imp $ t1 $ t2 | 
| 152 | and mk_not t = Not $ t; | |
| 7690 | 153 | |
| 15151 | 154 | fun dest_conj (Const ("op &", _) $ t $ t') = t :: dest_conj t'
 | 
| 155 | | dest_conj t = [t]; | |
| 156 | ||
| 15945 | 157 | fun dest_disj (Const ("op |", _) $ t $ t') = t :: dest_disj t'
 | 
| 158 | | dest_disj t = [t]; | |
| 159 | ||
| 4466 
305390f23734
Better equality handling in Blast_tac, usingd a new variant of hyp_subst_tac
 paulson parents: 
4294diff
changeset | 160 | fun dest_imp (Const("op -->",_) $ A $ B) = (A, B)
 | 
| 
305390f23734
Better equality handling in Blast_tac, usingd a new variant of hyp_subst_tac
 paulson parents: 
4294diff
changeset | 161 |   | 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 | 162 | |
| 15151 | 163 | fun dest_not (Const ("Not", _) $ t) = t
 | 
| 164 |   | dest_not t = raise TERM ("dest_not", [t]);
 | |
| 8302 | 165 | |
| 11683 | 166 | fun imp_concl_of t = imp_concl_of (#2 (dest_imp t)) handle TERM _ => t; | 
| 167 | val dest_concls = map imp_concl_of o dest_conj o dest_Trueprop; | |
| 168 | ||
| 923 | 169 | fun eq_const T = Const ("op =", [T, T] ---> boolT);
 | 
| 170 | fun mk_eq (t, u) = eq_const (fastype_of t) $ t $ u; | |
| 171 | ||
| 6031 | 172 | fun dest_eq (Const ("op =", _) $ lhs $ rhs) = (lhs, rhs)
 | 
| 173 |   | dest_eq t = raise TERM ("dest_eq", [t])
 | |
| 174 | ||
| 923 | 175 | fun all_const T = Const ("All", [T --> boolT] ---> boolT);
 | 
| 176 | 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 | 177 | fun list_all (xs, t) = fold_rev (fn (x, T) => fn P => all_const T $ Abs (x, T, P)) xs t; | 
| 923 | 178 | |
| 179 | fun exists_const T = Const ("Ex", [T --> boolT] ---> boolT);
 | |
| 180 | fun mk_exists (x, T, P) = exists_const T $ absfree (x, T, P); | |
| 181 | ||
| 21755 | 182 | fun choice_const T = Const("Hilbert_Choice.Eps", (T --> boolT) --> T);
 | 
| 15945 | 183 | |
| 923 | 184 | fun Collect_const T = Const ("Collect", [T --> boolT] ---> mk_setT T);
 | 
| 185 | fun mk_Collect (a, T, t) = Collect_const T $ absfree (a, T, t); | |
| 186 | ||
| 21045 | 187 | val class_eq = "Code_Generator.eq"; | 
| 188 | ||
| 923 | 189 | fun mk_mem (x, A) = | 
| 190 | let val setT = fastype_of A in | |
| 191 |     Const ("op :", [dest_setT setT, setT] ---> boolT) $ x $ A
 | |
| 192 | end; | |
| 193 | ||
| 6380 | 194 | fun dest_mem (Const ("op :", _) $ x $ A) = (x, A)
 | 
| 195 |   | dest_mem t = raise TERM ("dest_mem", [t]);
 | |
| 196 | ||
| 11818 | 197 | fun mk_UNIV T = Const ("UNIV", mk_setT T);
 | 
| 198 | ||
| 923 | 199 | |
| 13743 
f8f9393be64c
Fixed bug in simpdata.ML that prevented the use of congruence rules from a
 ballarin parents: 
13640diff
changeset | 200 | (* binary operations and relations *) | 
| 2510 | 201 | |
| 202 | fun mk_binop c (t, u) = | |
| 203 | let val T = fastype_of t in | |
| 204 | Const (c, [T, T] ---> T) $ t $ u | |
| 205 | end; | |
| 206 | ||
| 207 | fun mk_binrel c (t, u) = | |
| 208 | let val T = fastype_of t in | |
| 209 | Const (c, [T, T] ---> boolT) $ t $ u | |
| 210 | end; | |
| 211 | ||
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
14103diff
changeset | 212 | (*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 | 213 | way of handling polymorphic operators.*) | 
| 2510 | 214 | 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 | 215 | if c = c' andalso (T=T' orelse T=dummyT) then (t, u) | 
| 3794 | 216 |       else raise TERM ("dest_bin " ^ c, [tm])
 | 
| 217 |   | dest_bin c _ tm = raise TERM ("dest_bin " ^ c, [tm]);
 | |
| 2510 | 218 | |
| 219 | ||
| 4571 | 220 | (* unit *) | 
| 221 | ||
| 11604 | 222 | val unitT = Type ("Product_Type.unit", []);
 | 
| 4571 | 223 | |
| 11604 | 224 | fun is_unitT (Type ("Product_Type.unit", [])) = true
 | 
| 9362 | 225 | | is_unitT _ = false; | 
| 226 | ||
| 11604 | 227 | val unit = Const ("Product_Type.Unity", unitT);
 | 
| 4571 | 228 | |
| 11604 | 229 | fun is_unit (Const ("Product_Type.Unity", _)) = true
 | 
| 4571 | 230 | | is_unit _ = false; | 
| 231 | ||
| 232 | ||
| 233 | (* prod *) | |
| 234 | ||
| 235 | fun mk_prodT (T1, T2) = Type ("*", [T1, T2]);
 | |
| 236 | ||
| 237 | fun dest_prodT (Type ("*", [T1, T2])) = (T1, T2)
 | |
| 238 |   | dest_prodT T = raise TYPE ("dest_prodT", [T], []);
 | |
| 239 | ||
| 14048 | 240 | fun pair_const T1 T2 = Const ("Pair", [T1, T2] ---> mk_prodT (T1, T2));
 | 
| 241 | ||
| 4571 | 242 | fun mk_prod (t1, t2) = | 
| 243 | let val T1 = fastype_of t1 and T2 = fastype_of t2 in | |
| 14048 | 244 | pair_const T1 T2 $ t1 $ t2 | 
| 4571 | 245 | end; | 
| 246 | ||
| 247 | fun dest_prod (Const ("Pair", _) $ t1 $ t2) = (t1, t2)
 | |
| 248 |   | dest_prod t = raise TERM ("dest_prod", [t]);
 | |
| 249 | ||
| 250 | fun mk_fst p = | |
| 251 | let val pT = fastype_of p in | |
| 252 |     Const ("fst", pT --> fst (dest_prodT pT)) $ p
 | |
| 253 | end; | |
| 254 | ||
| 255 | fun mk_snd p = | |
| 256 | let val pT = fastype_of p in | |
| 257 |     Const ("snd", pT --> snd (dest_prodT pT)) $ p
 | |
| 258 | end; | |
| 259 | ||
| 18285 | 260 | fun split_const (A, B, C) = | 
| 261 |   Const ("split", (A --> B --> C) --> mk_prodT (A, B) --> C);
 | |
| 262 | ||
| 263 | fun mk_split t = | |
| 264 | (case Term.fastype_of t of | |
| 265 |     T as (Type ("fun", [A, Type ("fun", [B, C])])) =>
 | |
| 266 |       Const ("split", T --> mk_prodT (A, B) --> C) $ t
 | |
| 267 |   | _ => raise TERM ("mk_split: bad body type", [t]));
 | |
| 268 | ||
| 5096 
84b00be693b4
Moved most of the Prod_Syntax - stuff to HOLogic.
 berghofe parents: 
4571diff
changeset | 269 | (*Maps the type T1 * ... * Tn to [T1, ..., Tn], however nested*) | 
| 
84b00be693b4
Moved most of the Prod_Syntax - stuff to HOLogic.
 berghofe parents: 
4571diff
changeset | 270 | fun prodT_factors (Type ("*", [T1, T2])) = prodT_factors T1 @ prodT_factors T2
 | 
| 
84b00be693b4
Moved most of the Prod_Syntax - stuff to HOLogic.
 berghofe parents: 
4571diff
changeset | 271 | | prodT_factors T = [T]; | 
| 
84b00be693b4
Moved most of the Prod_Syntax - stuff to HOLogic.
 berghofe parents: 
4571diff
changeset | 272 | |
| 
84b00be693b4
Moved most of the Prod_Syntax - stuff to HOLogic.
 berghofe parents: 
4571diff
changeset | 273 | (*Makes a nested tuple from a list, following the product type structure*) | 
| 16971 | 274 | fun mk_tuple (Type ("*", [T1, T2])) tms =
 | 
| 275 | mk_prod (mk_tuple T1 tms, | |
| 15570 | 276 | mk_tuple T2 (Library.drop (length (prodT_factors T1), tms))) | 
| 5096 
84b00be693b4
Moved most of the Prod_Syntax - stuff to HOLogic.
 berghofe parents: 
4571diff
changeset | 277 | | mk_tuple T (t::_) = t; | 
| 4571 | 278 | |
| 5207 | 279 | |
| 280 | (* nat *) | |
| 281 | ||
| 282 | val natT = Type ("nat", []);
 | |
| 283 | ||
| 20713 
823967ef47f1
renamed 0 and 1 to HOL.zero and HOL.one respectivly; introduced corresponding syntactic classes
 haftmann parents: 
20485diff
changeset | 284 | val zero = Const ("HOL.zero", natT);
 | 
| 5207 | 285 | |
| 20713 
823967ef47f1
renamed 0 and 1 to HOL.zero and HOL.one respectivly; introduced corresponding syntactic classes
 haftmann parents: 
20485diff
changeset | 286 | fun is_zero (Const ("HOL.zero", _)) = true
 | 
| 5207 | 287 | | is_zero _ = false; | 
| 288 | ||
| 289 | fun mk_Suc t = Const ("Suc", natT --> natT) $ t;
 | |
| 290 | ||
| 291 | fun dest_Suc (Const ("Suc", _) $ t) = t
 | |
| 292 |   | dest_Suc t = raise TERM ("dest_Suc", [t]);
 | |
| 293 | ||
| 21621 | 294 | val Suc_zero = mk_Suc zero; | 
| 295 | ||
| 5207 | 296 | fun mk_nat 0 = zero | 
| 21621 | 297 | | mk_nat n = mk_Suc (mk_nat (IntInf.- (n, 1))); | 
| 5207 | 298 | |
| 20713 
823967ef47f1
renamed 0 and 1 to HOL.zero and HOL.one respectivly; introduced corresponding syntactic classes
 haftmann parents: 
20485diff
changeset | 299 | fun dest_nat (Const ("HOL.zero", _)) = 0
 | 
| 21621 | 300 |   | dest_nat (Const ("Suc", _) $ t) = IntInf.+ (dest_nat t, 1)
 | 
| 5207 | 301 |   | dest_nat t = raise TERM ("dest_nat", [t]);
 | 
| 302 | ||
| 303 | ||
| 21778 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 304 | (* bit *) | 
| 7073 | 305 | |
| 15620 
8ccdc8bc66a2
replaced bool by a new datatype "bit" for binary numerals
 paulson parents: 
15595diff
changeset | 306 | val bitT = Type ("Numeral.bit", []);
 | 
| 
8ccdc8bc66a2
replaced bool by a new datatype "bit" for binary numerals
 paulson parents: 
15595diff
changeset | 307 | |
| 
8ccdc8bc66a2
replaced bool by a new datatype "bit" for binary numerals
 paulson parents: 
15595diff
changeset | 308 | val B0_const = Const ("Numeral.bit.B0", bitT);
 | 
| 
8ccdc8bc66a2
replaced bool by a new datatype "bit" for binary numerals
 paulson parents: 
15595diff
changeset | 309 | val B1_const =  Const ("Numeral.bit.B1", bitT);
 | 
| 
8ccdc8bc66a2
replaced bool by a new datatype "bit" for binary numerals
 paulson parents: 
15595diff
changeset | 310 | |
| 21778 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 311 | fun mk_bit 0 = B0_const | 
| 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 312 | | mk_bit 1 = B1_const | 
| 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 313 |   | mk_bit _ = raise TERM ("mk_bit", []);
 | 
| 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 314 | |
| 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 315 | fun dest_bit (Const ("Numeral.bit.B0", _)) = 0
 | 
| 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 316 |   | dest_bit (Const ("Numeral.bit.B1", _)) = 1
 | 
| 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 317 |   | dest_bit t = raise TERM ("dest_bit", [t]);
 | 
| 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 318 | |
| 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 319 | |
| 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 320 | (* binary numerals and int -- non-unique representation due to leading zeros/ones! *) | 
| 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 321 | |
| 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 322 | val intT = Type ("IntDef.int", []);
 | 
| 
66440bf72cdc
binary numerals: restricted to actual abstract syntax;
 wenzelm parents: 
21755diff
changeset | 323 | |
| 20485 | 324 | val pls_const = Const ("Numeral.Pls", intT)
 | 
| 325 | and min_const = Const ("Numeral.Min", intT)
 | |
| 326 | and bit_const = Const ("Numeral.Bit", [intT, bitT] ---> intT);
 | |
| 8768 | 327 | |
| 21829 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 328 | fun mk_numeral 0 = pls_const | 
| 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 329 | | mk_numeral ~1 = min_const | 
| 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 330 | | mk_numeral i = | 
| 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 331 | let val (q, r) = IntInf.divMod (i, 2) | 
| 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 332 | in bit_const $ mk_numeral q $ mk_bit (IntInf.toInt r) end; | 
| 13755 | 333 | |
| 21829 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 334 | fun dest_numeral (Const ("Numeral.Pls", _)) = 0
 | 
| 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 335 |   | dest_numeral (Const ("Numeral.Min", _)) = ~1
 | 
| 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 336 |   | dest_numeral (Const ("Numeral.Bit", _) $ bs $ b) =
 | 
| 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 337 | 2 * dest_numeral bs + IntInf.fromInt (dest_bit b) | 
| 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 338 |   | dest_numeral t = raise TERM ("dest_numeral", [t]);
 | 
| 13755 | 339 | |
| 21829 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 340 | fun number_of_const T = Const ("Numeral.number_of", intT --> T);
 | 
| 21820 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 haftmann parents: 
21788diff
changeset | 341 | |
| 22391 | 342 | fun add_numerals_of (Const _) = | 
| 343 | I | |
| 344 | | add_numerals_of (Var _) = | |
| 345 | I | |
| 346 | | add_numerals_of (Free _) = | |
| 347 | I | |
| 348 | | add_numerals_of (Bound _) = | |
| 349 | I | |
| 350 | | add_numerals_of (Abs (_, _, t)) = | |
| 351 | add_numerals_of t | |
| 352 | | add_numerals_of (t as _ $ _) = | |
| 353 | case strip_comb t | |
| 354 |        of (Const ("Numeral.number_of",
 | |
| 355 | Type (_, [_, T])), ts) => fold (cons o rpair T) ts | |
| 356 | | (t', ts) => add_numerals_of t' #> fold add_numerals_of ts; | |
| 357 | ||
| 21820 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 haftmann parents: 
21788diff
changeset | 358 | fun mk_number T 0 = Const ("HOL.zero", T)
 | 
| 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 haftmann parents: 
21788diff
changeset | 359 |   | mk_number T 1 = Const ("HOL.one", T)
 | 
| 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 haftmann parents: 
21788diff
changeset | 360 | | mk_number T i = number_of_const T $ mk_numeral i; | 
| 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 haftmann parents: 
21788diff
changeset | 361 | |
| 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 haftmann parents: 
21788diff
changeset | 362 | fun dest_number (Const ("HOL.zero", T)) = (T, 0)
 | 
| 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 haftmann parents: 
21788diff
changeset | 363 |   | dest_number (Const ("HOL.one", T)) = (T, 1)
 | 
| 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 haftmann parents: 
21788diff
changeset | 364 |   | dest_number (Const ("Numeral.number_of", Type ("fun", [_, T])) $ t) = (T, dest_numeral t)
 | 
| 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 haftmann parents: 
21788diff
changeset | 365 |   | dest_number t = raise TERM ("dest_number", [t]);
 | 
| 13755 | 366 | |
| 21829 
016eff9c5699
simplified mk/dest_numeral (cf. mk/dest_binum of 1.65);
 wenzelm parents: 
21820diff
changeset | 367 | |
| 13755 | 368 | (* real *) | 
| 369 | ||
| 16971 | 370 | val realT = Type ("RealDef.real", []);
 | 
| 13755 | 371 | |
| 372 | ||
| 21755 | 373 | (* nibble *) | 
| 374 | ||
| 375 | val nibbleT = Type ("List.nibble", []);
 | |
| 13755 | 376 | |
| 21755 | 377 | fun mk_nibble n = | 
| 378 | let val s = | |
| 379 | if 0 <= n andalso n <= 9 then chr (n + ord "0") | |
| 380 | else if 10 <= n andalso n <= 15 then chr (n + ord "A" - 10) | |
| 381 |     else raise TERM ("mk_nibble", [])
 | |
| 382 |   in Const ("List.nibble.Nibble" ^ s, nibbleT) end;
 | |
| 17083 | 383 | |
| 21755 | 384 | fun dest_nibble t = | 
| 385 |   let fun err () = raise TERM ("dest_nibble", [t]) in
 | |
| 386 | (case try (unprefix "List.nibble.Nibble" o fst o Term.dest_Const) t of | |
| 387 | NONE => err () | |
| 388 | | SOME c => | |
| 389 | if size c <> 1 then err () | |
| 390 | else if "0" <= c andalso c <= "9" then ord c - ord "0" | |
| 391 | else if "A" <= c andalso c <= "F" then ord c - ord "A" + 10 | |
| 392 | else err ()) | |
| 393 | end; | |
| 15062 | 394 | |
| 21455 | 395 | |
| 396 | (* char *) | |
| 397 | ||
| 398 | val charT = Type ("List.char", []);
 | |
| 399 | ||
| 21755 | 400 | fun mk_char n = | 
| 401 | if 0 <= n andalso n <= 255 then | |
| 402 |     Const ("List.char.Char", nibbleT --> nibbleT --> charT) $
 | |
| 403 | mk_nibble (n div 16) $ mk_nibble (n mod 16) | |
| 404 |   else raise TERM ("mk_char", []);
 | |
| 21455 | 405 | |
| 21755 | 406 | fun dest_char (Const ("List.char.Char", _) $ t $ u) =
 | 
| 407 | dest_nibble t * 16 + dest_nibble u | |
| 408 |   | dest_char t = raise TERM ("dest_char", [t]);
 | |
| 21455 | 409 | |
| 21755 | 410 | |
| 411 | (* list *) | |
| 21455 | 412 | |
| 21755 | 413 | fun listT T = Type ("List.list", [T]);
 | 
| 21455 | 414 | |
| 21755 | 415 | fun mk_list T ts = | 
| 21455 | 416 | let | 
| 21755 | 417 | val lT = listT T; | 
| 418 |     val Nil = Const ("List.list.Nil", lT);
 | |
| 419 |     fun Cons t u = Const ("List.list.Cons", T --> lT --> lT) $ t $ u;
 | |
| 420 | in fold_rev Cons ts Nil end; | |
| 421 | ||
| 422 | fun dest_list (Const ("List.list.Nil", _)) = []
 | |
| 423 |   | dest_list (Const ("List.list.Cons", _) $ t $ u) = t :: dest_list u
 | |
| 424 |   | dest_list t = raise TERM ("dest_list", [t]);
 | |
| 21455 | 425 | |
| 426 | ||
| 427 | (* string *) | |
| 428 | ||
| 21820 
2f2b6a965ccc
introduced mk/dest_numeral/number for mk/dest_binum etc.
 haftmann parents: 
21788diff
changeset | 429 | val stringT = Type ("List.string", []);
 | 
| 21455 | 430 | |
| 21755 | 431 | val mk_string = mk_list charT o map (mk_char o ord) o explode; | 
| 432 | val dest_string = implode o map (chr o dest_char) o dest_list; | |
| 21455 | 433 | |
| 923 | 434 | end; |