src/HOL/Word/Tools/word_lib.ML
changeset 69597 ff784d5a5bfb
parent 59806 d3d4ec6c21ef
equal deleted inserted replaced
69596:c8a2755bf220 69597:ff784d5a5bfb
    15 structure Word_Lib: WORD_LIB =
    15 structure Word_Lib: WORD_LIB =
    16 struct
    16 struct
    17 
    17 
    18 fun dest_binT T =
    18 fun dest_binT T =
    19   (case T of
    19   (case T of
    20     Type (@{type_name "Numeral_Type.num0"}, _) => 0
    20     Type (\<^type_name>\<open>Numeral_Type.num0\<close>, _) => 0
    21   | Type (@{type_name "Numeral_Type.num1"}, _) => 1
    21   | Type (\<^type_name>\<open>Numeral_Type.num1\<close>, _) => 1
    22   | Type (@{type_name "Numeral_Type.bit0"}, [T]) => 2 * dest_binT T
    22   | Type (\<^type_name>\<open>Numeral_Type.bit0\<close>, [T]) => 2 * dest_binT T
    23   | Type (@{type_name "Numeral_Type.bit1"}, [T]) => 1 + 2 * dest_binT T
    23   | Type (\<^type_name>\<open>Numeral_Type.bit1\<close>, [T]) => 1 + 2 * dest_binT T
    24   | _ => raise TYPE ("dest_binT", [T], []))
    24   | _ => raise TYPE ("dest_binT", [T], []))
    25 
    25 
    26 fun is_wordT (Type (@{type_name word}, _)) = true
    26 fun is_wordT (Type (\<^type_name>\<open>word\<close>, _)) = true
    27   | is_wordT _ = false
    27   | is_wordT _ = false
    28 
    28 
    29 fun dest_wordT (Type (@{type_name word}, [T])) = dest_binT T
    29 fun dest_wordT (Type (\<^type_name>\<open>word\<close>, [T])) = dest_binT T
    30   | dest_wordT T = raise TYPE ("dest_wordT", [T], [])
    30   | dest_wordT T = raise TYPE ("dest_wordT", [T], [])
    31 
    31 
    32 
    32 
    33 fun mk_bitT i T =
    33 fun mk_bitT i T =
    34   if i = 0
    34   if i = 0
    35   then Type (@{type_name "Numeral_Type.bit0"}, [T])
    35   then Type (\<^type_name>\<open>Numeral_Type.bit0\<close>, [T])
    36   else Type (@{type_name "Numeral_Type.bit1"}, [T])
    36   else Type (\<^type_name>\<open>Numeral_Type.bit1\<close>, [T])
    37 
    37 
    38 fun mk_binT size = 
    38 fun mk_binT size = 
    39   if size = 0 then @{typ "Numeral_Type.num0"}
    39   if size = 0 then \<^typ>\<open>Numeral_Type.num0\<close>
    40   else if size = 1 then @{typ "Numeral_Type.num1"}
    40   else if size = 1 then \<^typ>\<open>Numeral_Type.num1\<close>
    41   else let val (q, r) = Integer.div_mod size 2 in mk_bitT r (mk_binT q) end
    41   else let val (q, r) = Integer.div_mod size 2 in mk_bitT r (mk_binT q) end
    42 
    42 
    43 fun mk_wordT size =
    43 fun mk_wordT size =
    44   if size >= 0 then Type (@{type_name "word"}, [mk_binT size])
    44   if size >= 0 then Type (\<^type_name>\<open>word\<close>, [mk_binT size])
    45   else raise TYPE ("mk_wordT: " ^ string_of_int size, [], [])
    45   else raise TYPE ("mk_wordT: " ^ string_of_int size, [], [])
    46 
    46 
    47 end
    47 end