src/HOL/String.thy
author haftmann
Sat, 08 Sep 2018 08:09:07 +0000
changeset 68940 25b431feb2e9
parent 68224 1f7308050349
child 69272 15e9ed5b28fb
permissions -rw-r--r--
more appropriate conversion of HOL character literals to character codes: symbolic newline is interpreted as 0x10
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
     1
(* Author: Tobias Nipkow, Florian Haftmann, TU Muenchen *)
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
     2
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59631
diff changeset
     3
section \<open>Character and string types\<close>
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
     4
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
     5
theory String
55969
8820ddb8f9f4 use balanced tuples in 'primcorec'
blanchet
parents: 55642
diff changeset
     6
imports Enum
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
     7
begin
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
     8
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
     9
subsection \<open>Strings as list of bytes\<close>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    10
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    11
text \<open>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    12
  When modelling strings, we follow the approach given
68224
1f7308050349 prefer HTTPS;
wenzelm
parents: 68033
diff changeset
    13
  in @{url "https://utf8everywhere.org/"}:
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    14
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    15
  \<^item> Strings are a list of bytes (8 bit).
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    16
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    17
  \<^item> Byte values from 0 to 127 are US-ASCII.
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
    18
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    19
  \<^item> Byte values from 128 to 255 are uninterpreted blobs.
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    20
\<close>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    21
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    22
subsubsection \<open>Bytes as datatype\<close>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    23
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    24
datatype char =
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    25
  Char (digit0: bool) (digit1: bool) (digit2: bool) (digit3: bool)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    26
       (digit4: bool) (digit5: bool) (digit6: bool) (digit7: bool)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    27
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    28
context comm_semiring_1
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    29
begin
62364
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
    30
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    31
definition of_char :: "char \<Rightarrow> 'a"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    32
  where "of_char c = ((((((of_bool (digit7 c) * 2
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    33
    + of_bool (digit6 c)) * 2
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    34
    + of_bool (digit5 c)) * 2
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    35
    + of_bool (digit4 c)) * 2
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    36
    + of_bool (digit3 c)) * 2
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    37
    + of_bool (digit2 c)) * 2
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    38
    + of_bool (digit1 c)) * 2
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    39
    + of_bool (digit0 c)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    40
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    41
lemma of_char_Char [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    42
  "of_char (Char b0 b1 b2 b3 b4 b5 b6 b7) =
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    43
    foldr (\<lambda>b k. of_bool b + k * 2) [b0, b1, b2, b3, b4, b5, b6, b7] 0"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    44
  by (simp add: of_char_def ac_simps)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    45
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    46
end
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    47
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    48
context semiring_parity
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    49
begin
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    50
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    51
definition char_of :: "'a \<Rightarrow> char"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    52
  where "char_of n = Char (odd n) (odd (drop_bit 1 n))
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    53
    (odd (drop_bit 2 n)) (odd (drop_bit 3 n))
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    54
    (odd (drop_bit 4 n)) (odd (drop_bit 5 n))
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    55
    (odd (drop_bit 6 n)) (odd (drop_bit 7 n))"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    56
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    57
lemma char_of_char [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    58
  "char_of (of_char c) = c"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    59
proof (cases c)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    60
  have **: "drop_bit n (q * 2 + of_bool d) = drop_bit (n - 1) q + drop_bit n (of_bool d)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    61
    if "n > 0" for q :: 'a and n :: nat and d :: bool
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    62
    using that by (cases n) simp_all
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    63
  case (Char d0 d1 d2 d3 d4 d5 d6 d7)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    64
  then show ?thesis
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    65
    by (simp only: of_char_def char_of_def char.simps char.sel drop_bit_of_bool **) simp
62364
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
    66
qed
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
    67
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    68
lemma char_of_comp_of_char [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    69
  "char_of \<circ> of_char = id"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    70
  by (simp add: fun_eq_iff)
62364
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
    71
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    72
lemma inj_of_char:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    73
  "inj of_char"
62364
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
    74
proof (rule injI)
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
    75
  fix c d
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    76
  assume "of_char c = of_char d"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    77
  then have "char_of (of_char c) = char_of (of_char d)"
62364
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
    78
    by simp
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
    79
  then show "c = d"
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
    80
    by simp
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
    81
qed
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
    82
  
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    83
lemma of_char_eq_iff [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    84
  "of_char c = of_char d \<longleftrightarrow> c = d"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    85
  by (simp add: inj_eq inj_of_char)
62364
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
    86
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    87
lemma of_char_of [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    88
  "of_char (char_of a) = a mod 256"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    89
proof -
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    90
  have *: "{0::nat..<8} = {0, 1, 2, 3, 4, 5, 6, 7}"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    91
    by auto
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    92
  have "of_char (char_of (take_bit 8 a)) =
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    93
    (\<Sum>k\<in>{0, 1, 2, 3, 4, 5, 6, 7}. push_bit k (of_bool (odd (drop_bit k a))))"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    94
    by (simp add: of_char_def char_of_def push_bit_of_1 drop_bit_take_bit)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    95
  also have "\<dots> = take_bit 8 a"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    96
    using * take_bit_sum [of 8 a] by simp
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    97
  also have "char_of(take_bit 8 a) = char_of a"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    98
    by (simp add: char_of_def drop_bit_take_bit)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
    99
  finally show ?thesis
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   100
    by (simp add: take_bit_eq_mod)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   101
qed
62364
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
   102
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   103
lemma char_of_mod_256 [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   104
  "char_of (n mod 256) = char_of n"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   105
  by (metis char_of_char of_char_of)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   106
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   107
lemma of_char_mod_256 [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   108
  "of_char c mod 256 = of_char c"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   109
  by (metis char_of_char of_char_of)
62364
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
   110
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   111
lemma char_of_quasi_inj [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   112
  "char_of m = char_of n \<longleftrightarrow> m mod 256 = n mod 256"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   113
  by (metis char_of_mod_256 of_char_of)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   114
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   115
lemma char_of_nat_eq_iff:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   116
  "char_of n = c \<longleftrightarrow> take_bit 8 n = of_char c"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   117
  by (simp add: take_bit_eq_mod) (use of_char_eq_iff in fastforce)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   118
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   119
lemma char_of_nat [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   120
  "char_of (of_nat n) = char_of n"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   121
  by (simp add: char_of_def String.char_of_def drop_bit_of_nat)
68033
ad4b8b6892c3 uniform tagging for printable and non-printable literals
haftmann
parents: 68028
diff changeset
   122
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   123
end
62364
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
   124
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
   125
lemma inj_on_char_of_nat [simp]:
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   126
  "inj_on char_of {0::nat..<256}"
62364
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
   127
  by (rule inj_onI) simp
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
   128
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
   129
lemma nat_of_char_less_256 [simp]:
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   130
  "of_char c < (256 :: nat)"
62364
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
   131
proof -
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   132
  have "of_char c mod (256 :: nat) < 256"
62364
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
   133
    by arith
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
   134
  then show ?thesis by simp
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
   135
qed
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
   136
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   137
lemma range_nat_of_char:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   138
  "range of_char = {0::nat..<256}"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   139
proof (rule; rule)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   140
  fix n :: nat
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   141
  assume "n \<in> range of_char"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   142
  then show "n \<in> {0..<256}"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   143
    by auto
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   144
next
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   145
  fix n :: nat
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   146
  assume "n \<in> {0..<256}"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   147
  then have "n = of_char (char_of n)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   148
    by simp
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   149
  then show "n \<in> range of_char"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   150
    by (rule range_eqI)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   151
qed
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   152
62364
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
   153
lemma UNIV_char_of_nat:
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   154
  "UNIV = char_of ` {0::nat..<256}"
62364
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
   155
proof -
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   156
  have "range (of_char :: char \<Rightarrow> nat) = of_char ` char_of ` {0::nat..<256}"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   157
    by (auto simp add: range_nat_of_char intro!: image_eqI)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   158
  with inj_of_char [where ?'a = nat] show ?thesis 
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   159
    by (simp add: inj_image_eq_iff)
62364
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
   160
qed
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
   161
62597
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   162
lemma card_UNIV_char:
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   163
  "card (UNIV :: char set) = 256"
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   164
  by (auto simp add: UNIV_char_of_nat card_image)
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
   165
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   166
context
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   167
  includes lifting_syntax integer.lifting natural.lifting
49972
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   168
begin
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   169
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   170
lemma [transfer_rule]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   171
  "(pcr_integer ===> (=)) (char_of :: int \<Rightarrow> char) (char_of :: integer \<Rightarrow> char)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   172
  by (unfold char_of_def [abs_def]) transfer_prover
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   173
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   174
lemma [transfer_rule]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   175
  "((=) ===> pcr_integer) (of_char :: char \<Rightarrow> int) (of_char :: char \<Rightarrow> integer)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   176
  by (unfold of_char_def [abs_def]) transfer_prover
49972
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   177
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   178
lemma [transfer_rule]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   179
  "(pcr_natural ===> (=)) (char_of :: nat \<Rightarrow> char) (char_of :: natural \<Rightarrow> char)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   180
  by (unfold char_of_def [abs_def]) transfer_prover
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   181
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   182
lemma [transfer_rule]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   183
  "((=) ===> pcr_natural) (of_char :: char \<Rightarrow> nat) (of_char :: char \<Rightarrow> natural)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   184
  by (unfold of_char_def [abs_def]) transfer_prover
49972
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   185
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   186
end
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   187
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   188
lifting_update integer.lifting
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   189
lifting_forget integer.lifting
64630
96015aecfeba emphasize dedicated rewrite rules for congruences
haftmann
parents: 63950
diff changeset
   190
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   191
lifting_update natural.lifting
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   192
lifting_forget natural.lifting
62364
9209770bdcdf more direct bootstrap of char type, still retaining the nibble representation for syntax
haftmann
parents: 61799
diff changeset
   193
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
   194
syntax
62597
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   195
  "_Char" :: "str_position \<Rightarrow> char"    ("CHR _")
62678
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   196
  "_Char_ord" :: "num_const \<Rightarrow> char"   ("CHR _")
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
   197
42163
392fd6c4669c renewing specifications in HOL: replacing types by type_synonym
bulwahn
parents: 41750
diff changeset
   198
type_synonym string = "char list"
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
   199
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
   200
syntax
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   201
  "_String" :: "str_position \<Rightarrow> string"    ("_")
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
   202
48891
c0eafbd55de3 prefer ML_file over old uses;
wenzelm
parents: 46483
diff changeset
   203
ML_file "Tools/string_syntax.ML"
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
   204
49972
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   205
instantiation char :: enum
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   206
begin
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   207
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   208
definition
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   209
  "Enum.enum = [
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   210
    CHR 0x00, CHR 0x01, CHR 0x02, CHR 0x03,
62678
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   211
    CHR 0x04, CHR 0x05, CHR 0x06, CHR 0x07,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   212
    CHR 0x08, CHR 0x09, CHR ''\<newline>'', CHR 0x0B,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   213
    CHR 0x0C, CHR 0x0D, CHR 0x0E, CHR 0x0F,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   214
    CHR 0x10, CHR 0x11, CHR 0x12, CHR 0x13,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   215
    CHR 0x14, CHR 0x15, CHR 0x16, CHR 0x17,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   216
    CHR 0x18, CHR 0x19, CHR 0x1A, CHR 0x1B,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   217
    CHR 0x1C, CHR 0x1D, CHR 0x1E, CHR 0x1F,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   218
    CHR '' '', CHR ''!'', CHR 0x22, CHR ''#'',
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   219
    CHR ''$'', CHR ''%'', CHR ''&'', CHR 0x27,
62597
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   220
    CHR ''('', CHR '')'', CHR ''*'', CHR ''+'',
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   221
    CHR '','', CHR ''-'', CHR ''.'', CHR ''/'',
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   222
    CHR ''0'', CHR ''1'', CHR ''2'', CHR ''3'',
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   223
    CHR ''4'', CHR ''5'', CHR ''6'', CHR ''7'',
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   224
    CHR ''8'', CHR ''9'', CHR '':'', CHR '';'',
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   225
    CHR ''<'', CHR ''='', CHR ''>'', CHR ''?'',
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   226
    CHR ''@'', CHR ''A'', CHR ''B'', CHR ''C'',
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   227
    CHR ''D'', CHR ''E'', CHR ''F'', CHR ''G'',
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   228
    CHR ''H'', CHR ''I'', CHR ''J'', CHR ''K'',
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   229
    CHR ''L'', CHR ''M'', CHR ''N'', CHR ''O'',
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   230
    CHR ''P'', CHR ''Q'', CHR ''R'', CHR ''S'',
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   231
    CHR ''T'', CHR ''U'', CHR ''V'', CHR ''W'',
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   232
    CHR ''X'', CHR ''Y'', CHR ''Z'', CHR ''['',
62678
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   233
    CHR 0x5C, CHR '']'', CHR ''^'', CHR ''_'',
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   234
    CHR 0x60, CHR ''a'', CHR ''b'', CHR ''c'',
62597
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   235
    CHR ''d'', CHR ''e'', CHR ''f'', CHR ''g'',
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   236
    CHR ''h'', CHR ''i'', CHR ''j'', CHR ''k'',
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   237
    CHR ''l'', CHR ''m'', CHR ''n'', CHR ''o'',
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   238
    CHR ''p'', CHR ''q'', CHR ''r'', CHR ''s'',
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   239
    CHR ''t'', CHR ''u'', CHR ''v'', CHR ''w'',
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   240
    CHR ''x'', CHR ''y'', CHR ''z'', CHR ''{'',
62678
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   241
    CHR ''|'', CHR ''}'', CHR ''~'', CHR 0x7F,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   242
    CHR 0x80, CHR 0x81, CHR 0x82, CHR 0x83,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   243
    CHR 0x84, CHR 0x85, CHR 0x86, CHR 0x87,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   244
    CHR 0x88, CHR 0x89, CHR 0x8A, CHR 0x8B,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   245
    CHR 0x8C, CHR 0x8D, CHR 0x8E, CHR 0x8F,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   246
    CHR 0x90, CHR 0x91, CHR 0x92, CHR 0x93,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   247
    CHR 0x94, CHR 0x95, CHR 0x96, CHR 0x97,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   248
    CHR 0x98, CHR 0x99, CHR 0x9A, CHR 0x9B,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   249
    CHR 0x9C, CHR 0x9D, CHR 0x9E, CHR 0x9F,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   250
    CHR 0xA0, CHR 0xA1, CHR 0xA2, CHR 0xA3,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   251
    CHR 0xA4, CHR 0xA5, CHR 0xA6, CHR 0xA7,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   252
    CHR 0xA8, CHR 0xA9, CHR 0xAA, CHR 0xAB,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   253
    CHR 0xAC, CHR 0xAD, CHR 0xAE, CHR 0xAF,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   254
    CHR 0xB0, CHR 0xB1, CHR 0xB2, CHR 0xB3,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   255
    CHR 0xB4, CHR 0xB5, CHR 0xB6, CHR 0xB7,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   256
    CHR 0xB8, CHR 0xB9, CHR 0xBA, CHR 0xBB,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   257
    CHR 0xBC, CHR 0xBD, CHR 0xBE, CHR 0xBF,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   258
    CHR 0xC0, CHR 0xC1, CHR 0xC2, CHR 0xC3,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   259
    CHR 0xC4, CHR 0xC5, CHR 0xC6, CHR 0xC7,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   260
    CHR 0xC8, CHR 0xC9, CHR 0xCA, CHR 0xCB,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   261
    CHR 0xCC, CHR 0xCD, CHR 0xCE, CHR 0xCF,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   262
    CHR 0xD0, CHR 0xD1, CHR 0xD2, CHR 0xD3,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   263
    CHR 0xD4, CHR 0xD5, CHR 0xD6, CHR 0xD7,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   264
    CHR 0xD8, CHR 0xD9, CHR 0xDA, CHR 0xDB,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   265
    CHR 0xDC, CHR 0xDD, CHR 0xDE, CHR 0xDF,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   266
    CHR 0xE0, CHR 0xE1, CHR 0xE2, CHR 0xE3,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   267
    CHR 0xE4, CHR 0xE5, CHR 0xE6, CHR 0xE7,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   268
    CHR 0xE8, CHR 0xE9, CHR 0xEA, CHR 0xEB,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   269
    CHR 0xEC, CHR 0xED, CHR 0xEE, CHR 0xEF,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   270
    CHR 0xF0, CHR 0xF1, CHR 0xF2, CHR 0xF3,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   271
    CHR 0xF4, CHR 0xF5, CHR 0xF6, CHR 0xF7,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   272
    CHR 0xF8, CHR 0xF9, CHR 0xFA, CHR 0xFB,
843ff6f1de38 unified CHAR with CHR syntax
haftmann
parents: 62597
diff changeset
   273
    CHR 0xFC, CHR 0xFD, CHR 0xFE, CHR 0xFF]"
31484
cabcb95fde29 constant "chars" of all characters
haftmann
parents: 31205
diff changeset
   274
49972
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   275
definition
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   276
  "Enum.enum_all P \<longleftrightarrow> list_all P (Enum.enum :: char list)"
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   277
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   278
definition
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   279
  "Enum.enum_ex P \<longleftrightarrow> list_ex P (Enum.enum :: char list)"
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   280
62597
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   281
lemma enum_char_unfold:
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   282
  "Enum.enum = map char_of [0..<256]"
62597
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   283
proof -
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   284
  have "map (of_char :: char \<Rightarrow> nat) Enum.enum = [0..<256]"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   285
    by (simp add: enum_char_def of_char_def upt_conv_Cons_Cons numeral_2_eq_2 [symmetric])
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   286
  then have "map char_of (map (of_char :: char \<Rightarrow> nat) Enum.enum) =
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   287
    map char_of [0..<256]"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   288
    by simp
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   289
  then show ?thesis
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   290
    by simp
62597
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   291
qed
51160
599ff65b85e2 systematic conversions between nat and nibble/char;
haftmann
parents: 49972
diff changeset
   292
49972
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   293
instance proof
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   294
  show UNIV: "UNIV = set (Enum.enum :: char list)"
62597
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   295
    by (simp add: enum_char_unfold UNIV_char_of_nat atLeast0LessThan)
49972
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   296
  show "distinct (Enum.enum :: char list)"
62597
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   297
    by (auto simp add: enum_char_unfold distinct_map intro: inj_onI)
49972
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   298
  show "\<And>P. Enum.enum_all P \<longleftrightarrow> Ball (UNIV :: char set) P"
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   299
    by (simp add: UNIV enum_all_char_def list_all_iff)
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   300
  show "\<And>P. Enum.enum_ex P \<longleftrightarrow> Bex (UNIV :: char set) P"
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   301
    by (simp add: UNIV enum_ex_char_def list_ex_iff)
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   302
qed
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   303
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   304
end
f11f8905d9fd incorporated constant chars into instantiation proof for enum;
haftmann
parents: 49948
diff changeset
   305
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   306
lemma linorder_char:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   307
  "class.linorder (\<lambda>c d. of_char c \<le> (of_char d :: nat)) (\<lambda>c d. of_char c < (of_char d :: nat))"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   308
  by standard auto
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   309
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   310
text \<open>Optimized version for execution\<close>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   311
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   312
definition char_of_integer :: "integer \<Rightarrow> char"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   313
  where [code_abbrev]: "char_of_integer = char_of"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   314
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   315
definition integer_of_char :: "char \<Rightarrow> integer"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   316
  where [code_abbrev]: "integer_of_char = of_char"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   317
62597
b3f2b8c906a6 model characters directly as range 0..255
haftmann
parents: 62580
diff changeset
   318
lemma char_of_integer_code [code]:
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   319
  "char_of_integer k = (let
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   320
     (q0, b0) = bit_cut_integer k;
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   321
     (q1, b1) = bit_cut_integer q0;
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   322
     (q2, b2) = bit_cut_integer q1;
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   323
     (q3, b3) = bit_cut_integer q2;
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   324
     (q4, b4) = bit_cut_integer q3;
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   325
     (q5, b5) = bit_cut_integer q4;
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   326
     (q6, b6) = bit_cut_integer q5;
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   327
     (_, b7) = bit_cut_integer q6
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   328
    in Char b0 b1 b2 b3 b4 b5 b6 b7)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   329
  by (simp add: bit_cut_integer_def char_of_integer_def char_of_def div_mult2_numeral_eq odd_iff_mod_2_eq_one drop_bit_eq_div)
49948
744934b818c7 moved quite generic material from theory Enum to more appropriate places
haftmann
parents: 49834
diff changeset
   330
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   331
lemma integer_of_char_code [code]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   332
  "integer_of_char (Char b0 b1 b2 b3 b4 b5 b6 b7) =
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   333
    ((((((of_bool b7 * 2 + of_bool b6) * 2 +
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   334
      of_bool b5) * 2 + of_bool b4) * 2 +
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   335
        of_bool b3) * 2 + of_bool b2) * 2 +
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   336
          of_bool b1) * 2 + of_bool b0"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   337
  by (simp only: integer_of_char_def of_char_def char.sel)
66331
f773691617c0 lifting setup for char
haftmann
parents: 66251
diff changeset
   338
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
   339
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   340
subsection \<open>Strings as dedicated type for target language code generation\<close>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   341
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   342
subsubsection \<open>Logical specification\<close>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   343
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   344
context
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   345
begin
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   346
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   347
qualified definition ascii_of :: "char \<Rightarrow> char"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   348
  where "ascii_of c = Char (digit0 c) (digit1 c) (digit2 c) (digit3 c) (digit4 c) (digit5 c) (digit6 c) False"
39250
548a3e5521ab changing String.literal to a type instead of a datatype
bulwahn
parents: 39198
diff changeset
   349
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   350
qualified lemma ascii_of_Char [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   351
  "ascii_of (Char b0 b1 b2 b3 b4 b5 b6 b7) = Char b0 b1 b2 b3 b4 b5 b6 False"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   352
  by (simp add: ascii_of_def)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   353
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   354
qualified lemma not_digit7_ascii_of [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   355
  "\<not> digit7 (ascii_of c)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   356
  by (simp add: ascii_of_def)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   357
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   358
qualified lemma ascii_of_idem:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   359
  "ascii_of c = c" if "\<not> digit7 c"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   360
  using that by (cases c) simp
39250
548a3e5521ab changing String.literal to a type instead of a datatype
bulwahn
parents: 39198
diff changeset
   361
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   362
qualified lemma char_of_ascii_of [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   363
  "of_char (ascii_of c) = take_bit 7 (of_char c :: nat)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   364
  by (cases c)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   365
    (simp add: numeral_3_eq_3 [symmetric] numeral_2_eq_2 [symmetric])
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   366
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   367
qualified typedef literal = "{cs. \<forall>c\<in>set cs. \<not> digit7 c}"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   368
  morphisms explode Abs_literal
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   369
proof
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   370
  show "[] \<in> {cs. \<forall>c\<in>set cs. \<not> digit7 c}"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   371
    by simp
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   372
qed
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   373
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   374
qualified setup_lifting type_definition_literal
59484
a130ae7a9398 slightly more standard code setup for String.literal, with explicit special case in predicate compiler
haftmann
parents: 59483
diff changeset
   375
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   376
qualified lift_definition implode :: "string \<Rightarrow> literal"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   377
  is "map ascii_of"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   378
  by auto
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   379
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   380
qualified lemma implode_explode_eq [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   381
  "String.implode (String.explode s) = s"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   382
proof transfer
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   383
  fix cs
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   384
  show "map ascii_of cs = cs" if "\<forall>c\<in>set cs. \<not> digit7 c"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   385
    using that
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   386
      by (induction cs) (simp_all add: ascii_of_idem)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   387
qed
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   388
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   389
qualified lemma explode_implode_eq [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   390
  "String.explode (String.implode cs) = map ascii_of cs"
59484
a130ae7a9398 slightly more standard code setup for String.literal, with explicit special case in predicate compiler
haftmann
parents: 59483
diff changeset
   391
  by transfer rule
54594
a2d1522cdd54 setup lifting/transfer for String.literal
Andreas Lochbihler
parents: 54317
diff changeset
   392
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   393
end
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   394
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   395
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   396
subsubsection \<open>Syntactic representation\<close>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   397
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   398
text \<open>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   399
  Logical ground representations for literals are:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   400
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   401
  \<^enum> @{text 0} for the empty literal;
66251
cd935b7cb3fb proper concept of code declaration wrt. atomicity and Isar declarations
haftmann
parents: 66190
diff changeset
   402
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   403
  \<^enum> @{text "Literal b0 \<dots> b6 s"} for a literal starting with one
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   404
    character and continued by another literal.
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   405
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   406
  Syntactic representations for literals are:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   407
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   408
  \<^enum> Printable text as string prefixed with @{text STR};
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   409
68033
ad4b8b6892c3 uniform tagging for printable and non-printable literals
haftmann
parents: 68028
diff changeset
   410
  \<^enum> A single ascii value as numerical hexadecimal value prefixed with @{text STR}.
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   411
\<close>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   412
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   413
instantiation String.literal :: zero
39250
548a3e5521ab changing String.literal to a type instead of a datatype
bulwahn
parents: 39198
diff changeset
   414
begin
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
   415
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   416
context
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   417
begin
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   418
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   419
qualified lift_definition zero_literal :: String.literal
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   420
  is Nil
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   421
  by simp
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
   422
39250
548a3e5521ab changing String.literal to a type instead of a datatype
bulwahn
parents: 39198
diff changeset
   423
instance ..
548a3e5521ab changing String.literal to a type instead of a datatype
bulwahn
parents: 39198
diff changeset
   424
548a3e5521ab changing String.literal to a type instead of a datatype
bulwahn
parents: 39198
diff changeset
   425
end
548a3e5521ab changing String.literal to a type instead of a datatype
bulwahn
parents: 39198
diff changeset
   426
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   427
end
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   428
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   429
context
39250
548a3e5521ab changing String.literal to a type instead of a datatype
bulwahn
parents: 39198
diff changeset
   430
begin
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
   431
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   432
qualified abbreviation (output) empty_literal :: String.literal
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   433
  where "empty_literal \<equiv> 0"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   434
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   435
qualified lift_definition Literal :: "bool \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow> String.literal \<Rightarrow> String.literal"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   436
  is "\<lambda>b0 b1 b2 b3 b4 b5 b6 cs. Char b0 b1 b2 b3 b4 b5 b6 False # cs"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   437
  by auto
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
   438
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   439
qualified lemma Literal_eq_iff [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   440
  "Literal b0 b1 b2 b3 b4 b5 b6 s = Literal c0 c1 c2 c3 c4 c5 c6 t
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   441
     \<longleftrightarrow> (b0 \<longleftrightarrow> c0) \<and> (b1 \<longleftrightarrow> c1) \<and> (b2 \<longleftrightarrow> c2) \<and> (b3 \<longleftrightarrow> c3)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   442
         \<and> (b4 \<longleftrightarrow> c4) \<and> (b5 \<longleftrightarrow> c5) \<and> (b6 \<longleftrightarrow> c6) \<and> s = t"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   443
  by transfer simp
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   444
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   445
qualified lemma empty_neq_Literal [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   446
  "empty_literal \<noteq> Literal b0 b1 b2 b3 b4 b5 b6 s"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   447
  by transfer simp
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   448
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   449
qualified lemma Literal_neq_empty [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   450
  "Literal b0 b1 b2 b3 b4 b5 b6 s \<noteq> empty_literal"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   451
  by transfer simp
39250
548a3e5521ab changing String.literal to a type instead of a datatype
bulwahn
parents: 39198
diff changeset
   452
548a3e5521ab changing String.literal to a type instead of a datatype
bulwahn
parents: 39198
diff changeset
   453
end
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
   454
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   455
code_datatype "0 :: String.literal" String.Literal
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   456
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   457
syntax
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   458
  "_Literal" :: "str_position \<Rightarrow> String.literal"   ("STR _")
68033
ad4b8b6892c3 uniform tagging for printable and non-printable literals
haftmann
parents: 68028
diff changeset
   459
  "_Ascii" :: "num_const \<Rightarrow> String.literal"        ("STR _")
54594
a2d1522cdd54 setup lifting/transfer for String.literal
Andreas Lochbihler
parents: 54317
diff changeset
   460
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   461
ML_file "Tools/literal.ML"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   462
52365
95186e6e4bf4 reflexive nbe equation for equality on String.literal
haftmann
parents: 51717
diff changeset
   463
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   464
subsubsection \<open>Operations\<close>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   465
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   466
instantiation String.literal :: plus
67730
f91c437f6f68 new lemma
haftmann
parents: 67729
diff changeset
   467
begin
f91c437f6f68 new lemma
haftmann
parents: 67729
diff changeset
   468
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   469
context
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   470
begin
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   471
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   472
qualified lift_definition plus_literal :: "String.literal \<Rightarrow> String.literal \<Rightarrow> String.literal"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   473
  is "(@)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   474
  by auto
67730
f91c437f6f68 new lemma
haftmann
parents: 67729
diff changeset
   475
f91c437f6f68 new lemma
haftmann
parents: 67729
diff changeset
   476
instance ..
f91c437f6f68 new lemma
haftmann
parents: 67729
diff changeset
   477
f91c437f6f68 new lemma
haftmann
parents: 67729
diff changeset
   478
end
f91c437f6f68 new lemma
haftmann
parents: 67729
diff changeset
   479
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   480
end
67730
f91c437f6f68 new lemma
haftmann
parents: 67729
diff changeset
   481
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   482
instance String.literal :: monoid_add
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   483
  by (standard; transfer) simp_all
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   484
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   485
instantiation String.literal :: size
67729
5152afa6258f dedicated append function for string literals
haftmann
parents: 67399
diff changeset
   486
begin
5152afa6258f dedicated append function for string literals
haftmann
parents: 67399
diff changeset
   487
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   488
context
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   489
  includes literal.lifting
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   490
begin
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   491
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   492
lift_definition size_literal :: "String.literal \<Rightarrow> nat"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   493
  is length .
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   494
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   495
end
67729
5152afa6258f dedicated append function for string literals
haftmann
parents: 67399
diff changeset
   496
5152afa6258f dedicated append function for string literals
haftmann
parents: 67399
diff changeset
   497
instance ..
5152afa6258f dedicated append function for string literals
haftmann
parents: 67399
diff changeset
   498
5152afa6258f dedicated append function for string literals
haftmann
parents: 67399
diff changeset
   499
end
5152afa6258f dedicated append function for string literals
haftmann
parents: 67399
diff changeset
   500
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   501
instantiation String.literal :: equal
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   502
begin
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   503
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   504
context
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   505
begin
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   506
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   507
qualified lift_definition equal_literal :: "String.literal \<Rightarrow> String.literal \<Rightarrow> bool"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   508
  is HOL.equal .
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   509
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   510
instance
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   511
  by (standard; transfer) (simp add: equal)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   512
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   513
end
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   514
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   515
end
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   516
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   517
instantiation String.literal :: linorder
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   518
begin
67729
5152afa6258f dedicated append function for string literals
haftmann
parents: 67399
diff changeset
   519
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   520
context
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   521
begin
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   522
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   523
qualified lift_definition less_eq_literal :: "String.literal \<Rightarrow> String.literal \<Rightarrow> bool"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   524
  is "ord.lexordp_eq (\<lambda>c d. of_char c < (of_char d :: nat))"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   525
  .
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   526
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   527
qualified lift_definition less_literal :: "String.literal \<Rightarrow> String.literal \<Rightarrow> bool"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   528
  is "ord.lexordp (\<lambda>c d. of_char c < (of_char d :: nat))"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   529
  .
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   530
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   531
instance proof -
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   532
  from linorder_char interpret linorder "ord.lexordp_eq (\<lambda>c d. of_char c < (of_char d :: nat))"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   533
    "ord.lexordp (\<lambda>c d. of_char c < (of_char d :: nat)) :: string \<Rightarrow> string \<Rightarrow> bool"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   534
    by (rule linorder.lexordp_linorder)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   535
  show "PROP ?thesis"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   536
    by (standard; transfer) (simp_all add: less_le_not_le linear)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   537
qed
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   538
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   539
end
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   540
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   541
end
67730
f91c437f6f68 new lemma
haftmann
parents: 67729
diff changeset
   542
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   543
lemma infinite_literal:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   544
  "infinite (UNIV :: String.literal set)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   545
proof -
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   546
  define S where "S = range (\<lambda>n. replicate n CHR ''A'')"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   547
  have "inj_on String.implode S"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   548
  proof (rule inj_onI)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   549
    fix cs ds
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   550
    assume "String.implode cs = String.implode ds"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   551
    then have "String.explode (String.implode cs) = String.explode (String.implode ds)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   552
      by simp
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   553
    moreover assume "cs \<in> S" and "ds \<in> S"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   554
    ultimately show "cs = ds"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   555
      by (auto simp add: S_def)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   556
  qed
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   557
  moreover have "infinite S"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   558
    by (auto simp add: S_def dest: finite_range_imageI [of _ length])
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   559
  ultimately have "infinite (String.implode ` S)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   560
    by (simp add: finite_image_iff)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   561
  then show ?thesis
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   562
    by (auto intro: finite_subset)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   563
qed
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   564
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   565
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   566
subsubsection \<open>Executable conversions\<close>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   567
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   568
context
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   569
begin
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   570
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   571
qualified lift_definition asciis_of_literal :: "String.literal \<Rightarrow> integer list"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   572
  is "map of_char"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   573
  .
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   574
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   575
qualified lift_definition literal_of_asciis :: "integer list \<Rightarrow> String.literal"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   576
  is "map (String.ascii_of \<circ> char_of)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   577
  by auto
55426
90f2ceed2828 make lifting setup for String.literal local to prevent transfer from replacing STR ''...'' literals
Andreas Lochbihler
parents: 55015
diff changeset
   578
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   579
qualified lemma literal_of_asciis_of_literal [simp]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   580
  "literal_of_asciis (asciis_of_literal s) = s"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   581
proof transfer
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   582
  fix cs
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   583
  assume "\<forall>c\<in>set cs. \<not> digit7 c"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   584
  then show "map (String.ascii_of \<circ> char_of) (map of_char cs) = cs"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   585
    by (induction cs) (simp_all add: String.ascii_of_idem) 
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   586
qed
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   587
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   588
qualified lemma explode_code [code]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   589
  "String.explode s = map char_of (asciis_of_literal s)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   590
  by transfer simp
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   591
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   592
qualified lemma implode_code [code]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   593
  "String.implode cs = literal_of_asciis (map of_char cs)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   594
  by transfer simp
64994
6e4c05e8edbb computation preprocessing rules to allow literals as input for computations
haftmann
parents: 64630
diff changeset
   595
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   596
end
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   597
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   598
declare [[code drop: String.literal_of_asciis String.asciis_of_literal]]
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   599
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   600
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   601
subsubsection \<open>Technical code generation setup\<close>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   602
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   603
text \<open>Alternative constructor for generated computations\<close>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   604
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   605
context
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   606
begin  
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   607
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   608
qualified definition Literal' :: "bool \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow> bool \<Rightarrow> String.literal \<Rightarrow> String.literal"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   609
  where [simp]: "Literal' = String.Literal"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   610
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   611
lemma [code]:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   612
  "Literal' b0 b1 b2 b3 b4 b5 b6 s = String.literal_of_asciis
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   613
    [foldr (\<lambda>b k. of_bool b + k * 2) [b0, b1, b2, b3, b4, b5, b6] 0] + s" 
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   614
  unfolding Literal'_def by transfer (simp add: char_of_def)
64994
6e4c05e8edbb computation preprocessing rules to allow literals as input for computations
haftmann
parents: 64630
diff changeset
   615
6e4c05e8edbb computation preprocessing rules to allow literals as input for computations
haftmann
parents: 64630
diff changeset
   616
lemma [code_computation_unfold]:
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   617
  "String.Literal = Literal'"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   618
  by simp
64994
6e4c05e8edbb computation preprocessing rules to allow literals as input for computations
haftmann
parents: 64630
diff changeset
   619
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   620
end
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
   621
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   622
code_reserved SML string Char
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   623
code_reserved OCaml string String Char List
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   624
code_reserved Haskell Prelude
34886
873c31d9f10d some syntax setup for Scala
haftmann
parents: 33237
diff changeset
   625
code_reserved Scala string
33237
haftmann
parents: 33063
diff changeset
   626
52435
6646bb548c6b migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents: 52365
diff changeset
   627
code_printing
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   628
  type_constructor String.literal \<rightharpoonup>
52435
6646bb548c6b migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents: 52365
diff changeset
   629
    (SML) "string"
6646bb548c6b migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents: 52365
diff changeset
   630
    and (OCaml) "string"
6646bb548c6b migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents: 52365
diff changeset
   631
    and (Haskell) "String"
6646bb548c6b migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents: 52365
diff changeset
   632
    and (Scala) "String"
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   633
| constant "STR ''''" \<rightharpoonup>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   634
    (SML) "\"\""
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   635
    and (OCaml) "\"\""
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   636
    and (Haskell) "\"\""
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   637
    and (Scala) "\"\""
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
   638
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59631
diff changeset
   639
setup \<open>
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   640
  fold Literal.add_code ["SML", "OCaml", "Haskell", "Scala"]
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59631
diff changeset
   641
\<close>
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
   642
52435
6646bb548c6b migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents: 52365
diff changeset
   643
code_printing
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   644
  constant "(+) :: String.literal \<Rightarrow> String.literal \<Rightarrow> String.literal" \<rightharpoonup>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   645
    (SML) infixl 18 "^"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   646
    and (OCaml) infixr 6 "^"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   647
    and (Haskell) infixr 5 "++"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   648
    and (Scala) infixl 7 "+"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   649
| constant String.literal_of_asciis \<rightharpoonup>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   650
    (SML) "!(String.implode/ o map (fn k => if 0 <= k andalso k < 128 then (Char.chr o IntInf.toInt) k else raise Fail \"Non-ASCII character in literal\"))"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   651
    and (OCaml) "!(let ks = _ in let res = Bytes.create (List.length ks) in let rec imp i = function | [] -> res | k :: ks ->
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   652
      let l = Big'_int.int'_of'_big'_int k in if 0 <= l && l < 128 then Bytes.set res i (Char.chr l) else failwith \"Non-ASCII character in literal\"; imp (i + 1) ks in imp 0 ks)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   653
    and (Haskell) "map/ (let chr k | (0 <= k && k < 128) = Prelude.toEnum k :: Prelude.Char in chr . Prelude.fromInteger)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   654
    and (Scala) "\"\"/ ++/ _.map((k: BigInt) => if (BigInt(0) <= k && k < BigInt(128)) k.charValue else sys.error(\"Non-ASCII character in literal\"))"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   655
| constant String.asciis_of_literal \<rightharpoonup>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   656
    (SML) "!(map (fn c => let val k = Char.ord c in if k < 128 then IntInf.fromInt k else raise Fail \"Non-ASCII character in literal\" end) /o String.explode)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   657
    and (OCaml) "!(let s = _ in let rec exp i l = if i < 0 then l else exp (i - 1) (let k = Char.code (Bytes.get s i) in
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   658
      if k < 128 then Big'_int.big'_int'_of'_int k :: l else failwith \"Non-ASCII character in literal\") in exp (Bytes.length s - 1) [])"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   659
    and (Haskell) "map/ (let ord k | (k < 128) = Prelude.toInteger k in ord . (Prelude.fromEnum :: Prelude.Char -> Prelude.Int))"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   660
    and (Scala) "!(_.toList.map(c => { val k: Int = c.toInt; if (k < 128) BigInt(k) else sys.error(\"Non-ASCII character in literal\") }))"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   661
| class_instance String.literal :: equal \<rightharpoonup>
52435
6646bb548c6b migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents: 52365
diff changeset
   662
    (Haskell) -
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   663
| constant "HOL.equal :: String.literal \<Rightarrow> String.literal \<Rightarrow> bool" \<rightharpoonup>
52435
6646bb548c6b migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents: 52365
diff changeset
   664
    (SML) "!((_ : string) = _)"
6646bb548c6b migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents: 52365
diff changeset
   665
    and (OCaml) "!((_ : string) = _)"
6646bb548c6b migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents: 52365
diff changeset
   666
    and (Haskell) infix 4 "=="
6646bb548c6b migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents: 52365
diff changeset
   667
    and (Scala) infixl 5 "=="
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   668
| constant "(\<le>) :: String.literal \<Rightarrow> String.literal \<Rightarrow> bool" \<rightharpoonup>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   669
    (SML) "!((_ : string) <= _)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   670
    and (OCaml) "!((_ : string) <= _)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   671
    \<comment> \<open>Order operations for @{typ String.literal} work in Haskell only
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   672
          if no type class instance needs to be generated, because String = [Char] in Haskell
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   673
          and @{typ "char list"} need not have the same order as @{typ String.literal}.\<close>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   674
    and (Haskell) infix 4 "<="
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   675
    and (Scala) infixl 4 "<="
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   676
    and (Eval) infixl 6 "<="
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   677
| constant "(<) :: String.literal \<Rightarrow> String.literal \<Rightarrow> bool" \<rightharpoonup>
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   678
    (SML) "!((_ : string) < _)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   679
    and (OCaml) "!((_ : string) < _)"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   680
    and (Haskell) infix 4 "<"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   681
    and (Scala) infixl 4 "<"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   682
    and (Eval) infixl 6 "<"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   683
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   684
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   685
subsubsection \<open>Code generation utility\<close>
31051
4d9b52e0a48c refined HOL string theories and corresponding ML fragments
haftmann
parents:
diff changeset
   686
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59631
diff changeset
   687
setup \<open>Sign.map_naming (Name_Space.mandatory_path "Code")\<close>
52910
7bfe0df532a9 abort execution of generated code with explicit exception message
Andreas Lochbihler
parents: 52435
diff changeset
   688
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   689
definition abort :: "String.literal \<Rightarrow> (unit \<Rightarrow> 'a) \<Rightarrow> 'a"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   690
  where [simp]: "abort _ f = f ()"
52910
7bfe0df532a9 abort execution of generated code with explicit exception message
Andreas Lochbihler
parents: 52435
diff changeset
   691
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   692
declare [[code drop: Code.abort]]
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   693
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   694
lemma abort_cong:
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   695
  "msg = msg' \<Longrightarrow> Code.abort msg f = Code.abort msg' f"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   696
  by simp
54317
da932f511746 add congruence rule to prevent code_simp from looping
Andreas Lochbihler
parents: 52910
diff changeset
   697
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59631
diff changeset
   698
setup \<open>Sign.map_naming Name_Space.parent_path\<close>
52910
7bfe0df532a9 abort execution of generated code with explicit exception message
Andreas Lochbihler
parents: 52435
diff changeset
   699
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 59631
diff changeset
   700
setup \<open>Code_Simp.map_ss (Simplifier.add_cong @{thm Code.abort_cong})\<close>
54317
da932f511746 add congruence rule to prevent code_simp from looping
Andreas Lochbihler
parents: 52910
diff changeset
   701
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   702
code_printing
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   703
  constant Code.abort \<rightharpoonup>
52910
7bfe0df532a9 abort execution of generated code with explicit exception message
Andreas Lochbihler
parents: 52435
diff changeset
   704
    (SML) "!(raise/ Fail/ _)"
7bfe0df532a9 abort execution of generated code with explicit exception message
Andreas Lochbihler
parents: 52435
diff changeset
   705
    and (OCaml) "failwith"
59483
ddb73392356e explicit type annotation avoids problems with Haskell type inference
haftmann
parents: 58889
diff changeset
   706
    and (Haskell) "!(error/ ::/ forall a./ String -> (() -> a) -> a)"
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   707
    and (Scala) "!{/ sys.error((_));/ ((_)).apply(())/ }"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   708
52910
7bfe0df532a9 abort execution of generated code with explicit exception message
Andreas Lochbihler
parents: 52435
diff changeset
   709
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   710
subsubsection \<open>Finally\<close>
31205
98370b26c2ce String.literal replaces message_string, code_numeral replaces (code_)index
haftmann
parents: 31176
diff changeset
   711
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   712
lifting_update literal.lifting
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67730
diff changeset
   713
lifting_forget literal.lifting
57437
0baf08c075b9 qualified String.explode and String.implode
haftmann
parents: 57247
diff changeset
   714
39250
548a3e5521ab changing String.literal to a type instead of a datatype
bulwahn
parents: 39198
diff changeset
   715
end