| author | wenzelm | 
| Sun, 10 Dec 2006 15:30:44 +0100 | |
| changeset 21745 | a1d8806b5267 | 
| parent 20094 | 99f27df2b6d0 | 
| child 21763 | 12a2773e3608 | 
| permissions | -rw-r--r-- | 
| 6905 | 1 | (* Title: HOL/Tools/numeral_syntax.ML | 
| 2 | ID: $Id$ | |
| 20067 
26bac504ef90
hex and binary numerals (contributed by Rafal Kolanski)
 kleing parents: 
19481diff
changeset | 3 | Authors: Markus Wenzel, TU Muenchen | 
| 6905 | 4 | |
| 5 | Concrete syntax for generic numerals. Assumes consts and syntax of | |
| 6 | theory HOL/Numeral. | |
| 7 | *) | |
| 8 | ||
| 9 | signature NUMERAL_SYNTAX = | |
| 10 | sig | |
| 18708 | 11 | val setup: theory -> theory | 
| 6905 | 12 | end; | 
| 13 | ||
| 14 | structure NumeralSyntax: NUMERAL_SYNTAX = | |
| 15 | struct | |
| 16 | ||
| 17 | ||
| 18 | (* bit strings *) (*we try to handle superfluous leading digits nicely*) | |
| 19 | ||
| 20 | fun prefix_len _ [] = 0 | |
| 21 | | prefix_len pred (x :: xs) = | |
| 22 | if pred x then 1 + prefix_len pred xs else 0; | |
| 23 | ||
| 24 | fun dest_bin_str tm = | |
| 25 | let | |
| 15620 
8ccdc8bc66a2
replaced bool by a new datatype "bit" for binary numerals
 paulson parents: 
15595diff
changeset | 26 | val rev_digs = HOLogic.bin_of tm handle TERM _ => raise Match | 
| 6905 | 27 | val (sign, zs) = | 
| 28 | (case rev rev_digs of | |
| 29 |         ~1 :: bs => ("-", prefix_len (equal 1) bs)
 | |
| 30 |       | bs => ("", prefix_len (equal 0) bs));
 | |
| 15965 
f422f8283491
Use of IntInf.int instead of int in most numeric simprocs; avoids
 paulson parents: 
15620diff
changeset | 31 | val i = HOLogic.int_of rev_digs; | 
| 15595 | 32 | val num = IntInf.toString (IntInf.abs i); | 
| 11701 
3d51fbf81c17
sane numerals (stage 1): added generic 1, removed 1' and 2 on nat,
 wenzelm parents: 
11488diff
changeset | 33 | in | 
| 15595 | 34 | if i = IntInf.fromInt 0 orelse i = IntInf.fromInt 1 then raise Match | 
| 11701 
3d51fbf81c17
sane numerals (stage 1): added generic 1, removed 1' and 2 on nat,
 wenzelm parents: 
11488diff
changeset | 35 | else sign ^ implode (replicate zs "0") ^ num | 
| 
3d51fbf81c17
sane numerals (stage 1): added generic 1, removed 1' and 2 on nat,
 wenzelm parents: 
11488diff
changeset | 36 | end; | 
| 6905 | 37 | |
| 20094 
99f27df2b6d0
removed str_to_int in favour of general Syntax.read_xnum;
 wenzelm parents: 
20067diff
changeset | 38 | |
| 6905 | 39 | (* translation of integer numeral tokens to and from bitstrings *) | 
| 40 | ||
| 11488 
4ff900551340
constify numeral tokens in order to allow translations;
 wenzelm parents: 
10891diff
changeset | 41 | fun numeral_tr (*"_Numeral"*) [t as Const (str, _)] = | 
| 20094 
99f27df2b6d0
removed str_to_int in favour of general Syntax.read_xnum;
 wenzelm parents: 
20067diff
changeset | 42 | (Syntax.const "Numeral.number_of" $ (HOLogic.mk_binum (Syntax.read_xnum str))) | 
| 6905 | 43 |   | numeral_tr (*"_Numeral"*) ts = raise TERM ("numeral_tr", ts);
 | 
| 44 | ||
| 45 | fun numeral_tr' show_sorts (*"number_of"*) (Type ("fun", [_, T])) (t :: ts) =
 | |
| 11488 
4ff900551340
constify numeral tokens in order to allow translations;
 wenzelm parents: 
10891diff
changeset | 46 | let val t' = Syntax.const "_Numeral" $ Syntax.free (dest_bin_str t) in | 
| 7429 | 47 | if not (! show_types) andalso can Term.dest_Type T then t' | 
| 6905 | 48 | else Syntax.const Syntax.constrainC $ t' $ Syntax.term_of_typ show_sorts T | 
| 49 | end | |
| 13110 | 50 | | numeral_tr' _ (*"number_of"*) T (t :: ts) = | 
| 51 | if T = dummyT then Syntax.const "_Numeral" $ Syntax.free (dest_bin_str t) | |
| 52 | else raise Match | |
| 6905 | 53 | | numeral_tr' _ (*"number_of"*) _ _ = raise Match; | 
| 54 | ||
| 55 | ||
| 56 | (* theory setup *) | |
| 57 | ||
| 58 | val setup = | |
| 18708 | 59 |   Theory.add_trfuns ([], [("_Numeral", numeral_tr)], [], []) #>
 | 
| 60 |   Theory.add_trfunsT [("number_of", numeral_tr'), ("Numeral.number_of", numeral_tr')];
 | |
| 6905 | 61 | |
| 62 | end; |