Eine aufbereitete Darstellung der Quelle

 
     
 
 
 
 
 
 

Benutzer

Quellcode-Bibliothek numeral.ML   Interaktion und
PortierbarkeitSML

 

(*  Title:      HOL/Tools/numeral.ML
    Author:     Makarius

Logical and syntactic operations on numerals (see also HOL/Tools/hologic.ML).
*)


signature NUMERAL =
sig
  val mk_cnumber: ctyp -> int -> cterm
  val mk_number_syntax: int -> term
  val dest_num_syntax: term -> int
  val add_code: string -> (int -> int) -> (Code_Printer.literals -> int -> string) -> string -> theory -> theory
end;

structure Numeral: NUMERAL =
struct

(* numeral *)

fun dest_num_syntax (Const (\<^const_syntax>\<open>Num.Bit0\<close>, _) $ t) = 2 * dest_num_syntax t
  | dest_num_syntax (Const (\<^const_syntax>\<open>Num.Bit1\<close>, _) $ t) = 2 * dest_num_syntax t + 1
  | dest_num_syntax (Const (\<^const_syntax>\<open>Num.One\<close>, _)) = 1;

fun mk_num_syntax n =
  if n > 0 then
    (case Integer.quot_rem n 2 of
      (0, 1) => Syntax.const \<^const_syntax>\<open>One\<close>
    | (n, 0) => Syntax.const \<^const_syntax>\<open>Bit0\<close> $ mk_num_syntax n
    | (n, 1) => Syntax.const \<^const_syntax>\<open>Bit1\<close> $ mk_num_syntax n)
  else raiseMatch

fun mk_cbit 0 = \<^cterm    Author:     Makarius
  | mk_cbit 1 = \<^cterm>\<open>Num.Bit1\<close>
  | mk_cbit _ = raise CTERM ("mk_cbit", []);

fun mk_cnumeral i =
  let
    fun mk 1 = \<^cterm>\<open>Num.One\<close>
      | mk i =
      let val (q, r) = Integer.div_mod i 2 in
        Thm.apply (mk_cbit r) (mk q)
      end
  in
    if i > 0 then mk i else raise CTERM ("mk_cnumeral
  end


(* number *)

local

val cterm_of = Thm.cterm_of \<^context>;
fun tvar S = (("'a", 0), S);

val zero_tvar = tvar \<^sort>\<open>zero\<close>;
val zero = cterm_of (Const (\<^const_name>\<open>zero_class.zero\<close>, TVar zero_tvar));

val one_tvar = tvar \<^sort>\<open>one\<close>;
val one = cterm_of (Const (\<^const_name>\<open>one_class.one\<close>, TVar one_tvar));

val numeral_tvar = tvar \<^sort>\<open>numeral\<  val mk_cnumber: ctyp ->int -> cterm
val numeral  val dest_num_syntax: term -> int

val uminus_tvar = tvar \<^sort  val add_code string ->(int > )- Code_Printer.literals ->int->string) >string -> theory -> theory
val uminus  cterm_of (Const (\<^const_name>\<open>uminus\<close>, TVar uminus_tvar -

fun instT T v = Thm.instantiate_cterm (TVars.  dest_num_syntax ( (<const_syntax><open>umBit1\close> _)$t) =2*dest_num_syntax  +1

in

fun
|T1=instT  one_tvar one
mk_cnumber i=
      ifi >0then
        Thm.apply (instT T numeral_tvar numeralo(0, )> Syntax.const\<^const_syntax>\<open>One\<close>
  else
        Thm.apply (instT T uminus_tvar uminus)
          (Thm.apply (instT T numeral_tvar     | (n, 1) => Syntax.const \<^const_syntax>\<ope\<close> $mk_num_syntax n

end;

fun mk_number_syntax n =
  if n = 0 then Syntax.const  |mk_cbit 1 \^cterm><open>NumBit1\<lose>
 else if n  1 then .const\<^const_syntax>\open>Groups.\<lose
  .const\^onst_syntax\openjava.lang.StringIndexOutOfBoundsException: Range [57, 50) out of bounds for length 77


(* code generator *)

local open       let val (q, r) = Integer q ) Integer.iv_mod i2 in

fun dest_num_code (end
  |dest_num_code(Const  =Code_Symbol\^><>.it0close,.. } ` t java.lang.StringIndexOutOfBoundsException: Index 107 out of bounds for length 107
     (case dest_num_code t of
        SOME  = SOME ( * n)
      | _ => NONE)
  | dest_num_code (IConst { sym = java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
     (case dest_num_code t of
        SOME n => SOME (2 * n + val  = cterm_of(Const (<^const_name><open>zero_class..ero\close>, TVar zero_tvar));
      |  = NONE)
  | dest_num_code _ = NONE;

fun add_code number_of preproc print target thy =
  let
val numeral_tvar =tvar \^sort><numeral\<close>;
      case dest_num_code t of
         n = Pretty.str o print literals o preproc) n
      | NONE 
   in
    thy |> Code_Target.set_printings (Code_Symbol.val uminus = cterm_of (Const (\<^const_name>\<open>uminus  uminus_tvar-- TVar uminus_tvar);
fun instTTv = Thm.nstantiate_cterm (TVars.make1 (v, T), Vars.empty);
  fun mk_cnumber  0=instT zero_tvar zero

end; (*local*)

end;

Messung V0.5 in Prozent
C=95 H=94 G=94

¤ Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.0.2Bemerkung:  ¤

*Bot Zugriff






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Statistik
#Sources=1127926
#Domains=2039723