# HG changeset patch # User wenzelm # Date 931288110 -7200 # Node ID 9bc05ec3497b0a8ce8a0e97968954ce9fc5af71e # Parent 4125d6b6d8f9f4e3ba12e23b028d052bedefd857 added Numeral.thy, Tools/numeral_syntax.ML; diff -r 4125d6b6d8f9 -r 9bc05ec3497b src/HOL/IsaMakefile --- a/src/HOL/IsaMakefile Tue Jul 06 21:06:51 1999 +0200 +++ b/src/HOL/IsaMakefile Tue Jul 06 21:08:30 1999 +0200 @@ -31,9 +31,9 @@ Pure: @cd $(SRC)/Pure; $(ISATOOL) make Pure -$(OUT)/HOL: $(OUT)/Pure $(SRC)/Provers/Arith/cancel_sums.ML \ - $(SRC)/Provers/Arith/fast_lin_arith.ML \ - $(SRC)/Provers/Arith/abel_cancel.ML $(SRC)/Provers/blast.ML \ +$(OUT)/HOL: $(OUT)/Pure $(SRC)/Provers/Arith/abel_cancel.ML \ + $(SRC)/Provers/Arith/cancel_sums.ML \ + $(SRC)/Provers/Arith/fast_lin_arith.ML $(SRC)/Provers/blast.ML \ $(SRC)/Provers/clasimp.ML $(SRC)/Provers/classical.ML \ $(SRC)/Provers/hypsubst.ML $(SRC)/Provers/simplifier.ML \ $(SRC)/Provers/split_paired_all.ML $(SRC)/Provers/splitter.ML \ @@ -49,18 +49,19 @@ Integ/Equiv.thy Integ/IntDef.ML Integ/IntDef.thy Integ/Int.ML \ Integ/Int.thy Integ/simproc.ML Lfp.ML Lfp.thy List.ML List.thy \ Main.thy Map.ML Map.thy Nat.ML Nat.thy NatDef.ML NatDef.thy \ - Option.ML Option.thy Ord.ML Ord.thy Power.ML Power.thy Prod.ML \ - Prod.thy ROOT.ML Recdef.thy Record.thy RelPow.ML RelPow.thy \ + Numeral.thy Option.ML Option.thy Ord.ML Ord.thy Power.ML Power.thy \ + Prod.ML Prod.thy ROOT.ML Recdef.thy Record.thy RelPow.ML RelPow.thy \ Relation.ML Relation.thy Set.ML Set.thy Sexp.ML Sexp.thy String.thy \ Sum.ML Sum.thy Tools/datatype_aux.ML Tools/datatype_abs_proofs.ML \ Tools/datatype_package.ML Tools/datatype_prop.ML \ Tools/datatype_rep_proofs.ML Tools/induct_method.ML \ - Tools/inductive_package.ML Tools/primrec_package.ML \ - Tools/recdef_package.ML Tools/record_package.ML \ - Tools/typedef_package.ML Trancl.ML Trancl.thy Univ.ML Univ.thy \ - Vimage.ML Vimage.thy WF.ML WF.thy WF_Rel.ML WF_Rel.thy cladata.ML \ - equalities.ML equalities.thy hologic.ML mono.ML mono.thy simpdata.ML \ - subset.ML subset.thy thy_syntax.ML + Tools/inductive_package.ML Tools/numeral_syntax.ML \ + Tools/primrec_package.ML Tools/recdef_package.ML \ + Tools/record_package.ML Tools/typedef_package.ML Trancl.ML \ + Trancl.thy Univ.ML Univ.thy Vimage.ML Vimage.thy WF.ML WF.thy \ + WF_Rel.ML WF_Rel.thy cladata.ML equalities.ML equalities.thy \ + hologic.ML mono.ML mono.thy simpdata.ML subset.ML subset.thy \ + thy_syntax.ML @$(ISATOOL) usedir -b $(OUT)/Pure HOL diff -r 4125d6b6d8f9 -r 9bc05ec3497b src/HOL/Numeral.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Numeral.thy Tue Jul 06 21:08:30 1999 +0200 @@ -0,0 +1,28 @@ +(* Title: HOL/Numeral.thy + ID: $Id$ + Author: Larry Paulson and Markus Wenzel + +Generic numerals represented as twos-complement bitstrings. +*) + +theory Numeral = Datatype +files "Tools/numeral_syntax.ML":; + +datatype + bin = Pls + | Min + | Bit bin bool (infixl "BIT" 90); + +axclass + numeral < "term"; + +consts + number_of :: "bin => 'a::numeral"; + +syntax + "_Numeral" :: "xnum => 'a" ("_"); + +setup NumeralSyntax.setup; + + +end; diff -r 4125d6b6d8f9 -r 9bc05ec3497b src/HOL/Tools/numeral_syntax.ML --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Tools/numeral_syntax.ML Tue Jul 06 21:08:30 1999 +0200 @@ -0,0 +1,103 @@ +(* Title: HOL/Tools/numeral_syntax.ML + ID: $Id$ + Author: Markus Wenzel, TU Muenchen + +Concrete syntax for generic numerals. Assumes consts and syntax of +theory HOL/Numeral. +*) + +signature NUMERAL_SYNTAX = +sig + val dest_bin: term -> int + val setup: (theory -> theory) list +end; + +structure NumeralSyntax: NUMERAL_SYNTAX = +struct + + +(* bits *) + +fun mk_bit 0 = Syntax.const "False" + | mk_bit 1 = Syntax.const "True" + | mk_bit _ = sys_error "mk_bit"; + +fun dest_bit (Const ("False", _)) = 0 + | dest_bit (Const ("True", _)) = 1 + | dest_bit _ = raise Match; + + +(* bit strings *) (*we try to handle superfluous leading digits nicely*) + +fun prefix_len _ [] = 0 + | prefix_len pred (x :: xs) = + if pred x then 1 + prefix_len pred xs else 0; + +fun mk_bin str = + let + val (sign, digs) = + (case Symbol.explode str of + "#" :: "-" :: cs => (~1, cs) + | "#" :: cs => (1, cs) + | _ => raise ERROR); + + fun bin_of 0 = [] + | bin_of ~1 = [~1] + | bin_of n = (n mod 2) :: bin_of (n div 2); + + fun term_of [] = Syntax.const "Numeral.bin.Pls" + | term_of [~1] = Syntax.const "Numeral.bin.Min" + | term_of (b :: bs) = Syntax.const "Numeral.bin.Bit" $ term_of bs $ mk_bit b; + in term_of (bin_of (sign * (#1 (Term.read_int digs)))) end; + +(*we consider all "spellings"; Min is likely to be declared elsewhere*) +fun bin_of (Const ("Pls", _)) = [] + | bin_of (Const ("bin.Pls", _)) = [] + | bin_of (Const ("Numeral.bin.Pls", _)) = [] + | bin_of (Const ("Min", _)) = [~1] + | bin_of (Const ("bin.Min", _)) = [~1] + | bin_of (Const ("Numeral.bin.Min", _)) = [~1] + | bin_of (Const ("Bit", _) $ bs $ b) = dest_bit b :: bin_of bs + | bin_of (Const ("bin.Bit", _) $ bs $ b) = dest_bit b :: bin_of bs + | bin_of (Const ("Numeral.bin.Bit", _) $ bs $ b) = dest_bit b :: bin_of bs + | bin_of _ = raise Match; + +fun int_of [] = 0 + | int_of (b :: bs) = b + 2 * int_of bs; + +val dest_bin = int_of o bin_of; + +fun dest_bin_str tm = + let + val rev_digs = bin_of tm; + val (sign, zs) = + (case rev rev_digs of + ~1 :: bs => ("-", prefix_len (equal 1) bs) + | bs => ("", prefix_len (equal 0) bs)); + val num = string_of_int (abs (int_of rev_digs)); + in "#" ^ sign ^ implode (replicate zs "0") ^ num end; + + +(* translation of integer numeral tokens to and from bitstrings *) + +fun numeral_tr (*"_Numeral"*) [t as Free (str, _)] = + (Syntax.const "Numeral.number_of" $ + (mk_bin str handle ERROR => raise TERM ("numeral_tr", [t]))) + | numeral_tr (*"_Numeral"*) ts = raise TERM ("numeral_tr", ts); + +fun numeral_tr' show_sorts (*"number_of"*) (Type ("fun", [_, T])) (t :: ts) = + let val t' = Syntax.const "_Numeral" $ (Syntax.const "_xnum" $ Syntax.free (dest_bin_str t)) in + if can Term.dest_Type T then t' + else Syntax.const Syntax.constrainC $ t' $ Syntax.term_of_typ show_sorts T + end + | numeral_tr' _ (*"number_of"*) _ _ = raise Match; + + +(* theory setup *) + +val setup = + [Theory.add_trfuns ([], [("_Numeral", numeral_tr)], [], []), + Theory.add_trfunsT [("number_of", numeral_tr'), ("Numeral.number_of", numeral_tr')]]; + + +end;