| author | nipkow | 
| Wed, 26 Jun 2002 11:07:14 +0200 | |
| changeset 13249 | 4b3de6370184 | 
| parent 13110 | ca8cd110f769 | 
| child 13491 | ddf6ae639f21 | 
| permissions | -rw-r--r-- | 
| 6905 | 1 | (* Title: HOL/Tools/numeral_syntax.ML | 
| 2 | ID: $Id$ | |
| 3 | Author: Markus Wenzel, TU Muenchen | |
| 9230 | 4 | License: GPL (GNU GENERAL PUBLIC LICENSE) | 
| 6905 | 5 | |
| 6 | Concrete syntax for generic numerals. Assumes consts and syntax of | |
| 7 | theory HOL/Numeral. | |
| 8 | *) | |
| 9 | ||
| 10 | signature NUMERAL_SYNTAX = | |
| 11 | sig | |
| 10891 | 12 | val setup: (theory -> theory) list | 
| 6905 | 13 | end; | 
| 14 | ||
| 15 | structure NumeralSyntax: NUMERAL_SYNTAX = | |
| 16 | struct | |
| 17 | ||
| 18 | ||
| 19 | (* bits *) | |
| 20 | ||
| 21 | fun dest_bit (Const ("False", _)) = 0
 | |
| 22 |   | dest_bit (Const ("True", _)) = 1
 | |
| 23 | | dest_bit _ = raise Match; | |
| 24 | ||
| 25 | ||
| 26 | (* bit strings *) (*we try to handle superfluous leading digits nicely*) | |
| 27 | ||
| 28 | fun prefix_len _ [] = 0 | |
| 29 | | prefix_len pred (x :: xs) = | |
| 30 | if pred x then 1 + prefix_len pred xs else 0; | |
| 31 | ||
| 32 | (*we consider all "spellings"; Min is likely to be declared elsewhere*) | |
| 33 | fun bin_of (Const ("Pls", _)) = []
 | |
| 34 |   | bin_of (Const ("bin.Pls", _)) = []
 | |
| 35 |   | bin_of (Const ("Numeral.bin.Pls", _)) = []
 | |
| 36 |   | bin_of (Const ("Min", _)) = [~1]
 | |
| 37 |   | bin_of (Const ("bin.Min", _)) = [~1]
 | |
| 38 |   | bin_of (Const ("Numeral.bin.Min", _)) = [~1]
 | |
| 39 |   | bin_of (Const ("Bit", _) $ bs $ b) = dest_bit b :: bin_of bs
 | |
| 40 |   | bin_of (Const ("bin.Bit", _) $ bs $ b) = dest_bit b :: bin_of bs
 | |
| 41 |   | bin_of (Const ("Numeral.bin.Bit", _) $ bs $ b) = dest_bit b :: bin_of bs
 | |
| 42 | | bin_of _ = raise Match; | |
| 43 | ||
| 7550 | 44 | val dest_bin = HOLogic.int_of o bin_of; | 
| 6905 | 45 | |
| 46 | fun dest_bin_str tm = | |
| 47 | let | |
| 48 | val rev_digs = bin_of tm; | |
| 49 | val (sign, zs) = | |
| 50 | (case rev rev_digs of | |
| 51 |         ~1 :: bs => ("-", prefix_len (equal 1) bs)
 | |
| 52 |       | bs => ("", prefix_len (equal 0) bs));
 | |
| 11701 
3d51fbf81c17
sane numerals (stage 1): added generic 1, removed 1' and 2 on nat,
 wenzelm parents: 
11488diff
changeset | 53 | val i = HOLogic.int_of rev_digs; | 
| 
3d51fbf81c17
sane numerals (stage 1): added generic 1, removed 1' and 2 on nat,
 wenzelm parents: 
11488diff
changeset | 54 | val num = string_of_int (abs i); | 
| 
3d51fbf81c17
sane numerals (stage 1): added generic 1, removed 1' and 2 on nat,
 wenzelm parents: 
11488diff
changeset | 55 | in | 
| 
3d51fbf81c17
sane numerals (stage 1): added generic 1, removed 1' and 2 on nat,
 wenzelm parents: 
11488diff
changeset | 56 | if i = 0 orelse i = 1 then raise Match | 
| 
3d51fbf81c17
sane numerals (stage 1): added generic 1, removed 1' and 2 on nat,
 wenzelm parents: 
11488diff
changeset | 57 | 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 | 58 | end; | 
| 6905 | 59 | |
| 60 | ||
| 61 | (* translation of integer numeral tokens to and from bitstrings *) | |
| 62 | ||
| 11488 
4ff900551340
constify numeral tokens in order to allow translations;
 wenzelm parents: 
10891diff
changeset | 63 | fun numeral_tr (*"_Numeral"*) [t as Const (str, _)] = | 
| 10693 | 64 | (Syntax.const "Numeral.number_of" $ HOLogic.mk_bin (Syntax.read_xnum str)) | 
| 6905 | 65 |   | numeral_tr (*"_Numeral"*) ts = raise TERM ("numeral_tr", ts);
 | 
| 66 | ||
| 67 | 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 | 68 | let val t' = Syntax.const "_Numeral" $ Syntax.free (dest_bin_str t) in | 
| 7429 | 69 | if not (! show_types) andalso can Term.dest_Type T then t' | 
| 6905 | 70 | else Syntax.const Syntax.constrainC $ t' $ Syntax.term_of_typ show_sorts T | 
| 71 | end | |
| 13110 | 72 | | numeral_tr' _ (*"number_of"*) T (t :: ts) = | 
| 73 | if T = dummyT then Syntax.const "_Numeral" $ Syntax.free (dest_bin_str t) | |
| 74 | else raise Match | |
| 6905 | 75 | | numeral_tr' _ (*"number_of"*) _ _ = raise Match; | 
| 76 | ||
| 77 | ||
| 78 | (* theory setup *) | |
| 79 | ||
| 80 | val setup = | |
| 81 |  [Theory.add_trfuns ([], [("_Numeral", numeral_tr)], [], []),
 | |
| 82 |   Theory.add_trfunsT [("number_of", numeral_tr'), ("Numeral.number_of", numeral_tr')]];
 | |
| 83 | ||
| 84 | ||
| 85 | end; |