| 26348 |      1 | (*  Title:      HOL/Library/Enum.thy
 | 
|  |      2 |     ID:         $Id$
 | 
|  |      3 |     Author:     Florian Haftmann, TU Muenchen
 | 
|  |      4 | *)
 | 
|  |      5 | 
 | 
|  |      6 | header {* Finite types as explicit enumerations *}
 | 
|  |      7 | 
 | 
|  |      8 | theory Enum
 | 
|  |      9 | imports Main
 | 
|  |     10 | begin
 | 
|  |     11 | 
 | 
|  |     12 | subsection {* Class @{text enum} *}
 | 
|  |     13 | 
 | 
| 26444 |     14 | class enum = itself +
 | 
| 26348 |     15 |   fixes enum :: "'a list"
 | 
| 26444 |     16 |   assumes UNIV_enum [code func]: "UNIV = set enum"
 | 
|  |     17 |     and enum_distinct: "distinct enum"
 | 
| 26348 |     18 | begin
 | 
|  |     19 | 
 | 
| 26444 |     20 | lemma finite_enum: "finite (UNIV \<Colon> 'a set)"
 | 
|  |     21 |   unfolding UNIV_enum ..
 | 
|  |     22 | 
 | 
|  |     23 | lemma enum_all: "set enum = UNIV" unfolding UNIV_enum ..
 | 
|  |     24 | 
 | 
| 26348 |     25 | lemma in_enum [intro]: "x \<in> set enum"
 | 
|  |     26 |   unfolding enum_all by auto
 | 
|  |     27 | 
 | 
|  |     28 | lemma enum_eq_I:
 | 
|  |     29 |   assumes "\<And>x. x \<in> set xs"
 | 
|  |     30 |   shows "set enum = set xs"
 | 
|  |     31 | proof -
 | 
|  |     32 |   from assms UNIV_eq_I have "UNIV = set xs" by auto
 | 
|  |     33 |   with enum_all show ?thesis by simp
 | 
|  |     34 | qed
 | 
|  |     35 | 
 | 
|  |     36 | end
 | 
|  |     37 | 
 | 
|  |     38 | 
 | 
|  |     39 | subsection {* Equality and order on functions *}
 | 
|  |     40 | 
 | 
| 26513 |     41 | instantiation "fun" :: (enum, eq) eq
 | 
|  |     42 | begin
 | 
| 26348 |     43 | 
 | 
| 26513 |     44 | definition
 | 
|  |     45 |   "eq f g \<longleftrightarrow> (\<forall>x \<in> set enum. f x = g x)"
 | 
|  |     46 | 
 | 
|  |     47 | instance by default
 | 
|  |     48 |   (simp_all add: eq_fun_def enum_all expand_fun_eq)
 | 
|  |     49 | 
 | 
|  |     50 | end
 | 
| 26348 |     51 | 
 | 
|  |     52 | lemma order_fun [code func]:
 | 
|  |     53 |   fixes f g :: "'a\<Colon>enum \<Rightarrow> 'b\<Colon>order"
 | 
|  |     54 |   shows "f \<le> g \<longleftrightarrow> (\<forall>x \<in> set enum. f x \<le> g x)"
 | 
|  |     55 |     and "f < g \<longleftrightarrow> f \<le> g \<and> (\<exists>x \<in> set enum. f x \<noteq> g x)"
 | 
|  |     56 |   by (simp_all add: enum_all expand_fun_eq le_fun_def less_fun_def order_less_le)
 | 
|  |     57 | 
 | 
|  |     58 | 
 | 
|  |     59 | subsection {* Default instances *}
 | 
|  |     60 | 
 | 
| 26444 |     61 | primrec n_lists :: "nat \<Rightarrow> 'a list \<Rightarrow> 'a list list" where
 | 
|  |     62 |   "n_lists 0 xs = [[]]"
 | 
|  |     63 |   | "n_lists (Suc n) xs = concat (map (\<lambda>ys. map (\<lambda>y. y # ys) xs) (n_lists n xs))"
 | 
|  |     64 | 
 | 
|  |     65 | lemma n_lists_Nil [simp]: "n_lists n [] = (if n = 0 then [[]] else [])"
 | 
|  |     66 |   by (induct n) simp_all
 | 
|  |     67 | 
 | 
|  |     68 | lemma length_n_lists: "length (n_lists n xs) = length xs ^ n"
 | 
|  |     69 |   by (induct n) (auto simp add: length_concat map_compose [symmetric] o_def listsum_triv)
 | 
|  |     70 | 
 | 
|  |     71 | lemma length_n_lists_elem: "ys \<in> set (n_lists n xs) \<Longrightarrow> length ys = n"
 | 
|  |     72 |   by (induct n arbitrary: ys) auto
 | 
|  |     73 | 
 | 
|  |     74 | lemma set_n_lists: "set (n_lists n xs) = {ys. length ys = n \<and> set ys \<subseteq> set xs}"
 | 
|  |     75 | proof (rule set_ext)
 | 
|  |     76 |   fix ys :: "'a list"
 | 
|  |     77 |   show "ys \<in> set (n_lists n xs) \<longleftrightarrow> ys \<in> {ys. length ys = n \<and> set ys \<subseteq> set xs}"
 | 
|  |     78 |   proof -
 | 
|  |     79 |     have "ys \<in> set (n_lists n xs) \<Longrightarrow> length ys = n"
 | 
|  |     80 |       by (induct n arbitrary: ys) auto
 | 
|  |     81 |     moreover have "\<And>x. ys \<in> set (n_lists n xs) \<Longrightarrow> x \<in> set ys \<Longrightarrow> x \<in> set xs"
 | 
|  |     82 |       by (induct n arbitrary: ys) auto
 | 
|  |     83 |     moreover have "set ys \<subseteq> set xs \<Longrightarrow> ys \<in> set (n_lists (length ys) xs)"
 | 
|  |     84 |       by (induct ys) auto
 | 
|  |     85 |     ultimately show ?thesis by auto
 | 
|  |     86 |   qed
 | 
|  |     87 | qed
 | 
|  |     88 | 
 | 
|  |     89 | lemma distinct_n_lists:
 | 
|  |     90 |   assumes "distinct xs"
 | 
|  |     91 |   shows "distinct (n_lists n xs)"
 | 
|  |     92 | proof (rule card_distinct)
 | 
|  |     93 |   from assms have card_length: "card (set xs) = length xs" by (rule distinct_card)
 | 
|  |     94 |   have "card (set (n_lists n xs)) = card (set xs) ^ n"
 | 
|  |     95 |   proof (induct n)
 | 
|  |     96 |     case 0 then show ?case by simp
 | 
|  |     97 |   next
 | 
|  |     98 |     case (Suc n)
 | 
|  |     99 |     moreover have "card (\<Union>ys\<in>set (n_lists n xs). (\<lambda>y. y # ys) ` set xs)
 | 
|  |    100 |       = (\<Sum>ys\<in>set (n_lists n xs). card ((\<lambda>y. y # ys) ` set xs))"
 | 
|  |    101 |       by (rule card_UN_disjoint) auto
 | 
|  |    102 |     moreover have "\<And>ys. card ((\<lambda>y. y # ys) ` set xs) = card (set xs)"
 | 
|  |    103 |       by (rule card_image) (simp add: inj_on_def)
 | 
|  |    104 |     ultimately show ?case by auto
 | 
|  |    105 |   qed
 | 
|  |    106 |   also have "\<dots> = length xs ^ n" by (simp add: card_length)
 | 
|  |    107 |   finally show "card (set (n_lists n xs)) = length (n_lists n xs)"
 | 
|  |    108 |     by (simp add: length_n_lists)
 | 
|  |    109 | qed
 | 
|  |    110 | 
 | 
|  |    111 | lemma map_of_zip_map:
 | 
|  |    112 |   fixes f :: "'a\<Colon>enum \<Rightarrow> 'b\<Colon>enum"
 | 
|  |    113 |   shows "map_of (zip xs (map f xs)) = (\<lambda>x. if x \<in> set xs then Some (f x) else None)"
 | 
|  |    114 |   by (induct xs) (simp_all add: expand_fun_eq)
 | 
|  |    115 | 
 | 
|  |    116 | lemma map_of_zip_enum_is_Some:
 | 
|  |    117 |   assumes "length ys = length (enum \<Colon> 'a\<Colon>enum list)"
 | 
|  |    118 |   shows "\<exists>y. map_of (zip (enum \<Colon> 'a\<Colon>enum list) ys) x = Some y"
 | 
|  |    119 | proof -
 | 
|  |    120 |   from assms have "x \<in> set (enum \<Colon> 'a\<Colon>enum list) \<longleftrightarrow>
 | 
|  |    121 |     (\<exists>y. map_of (zip (enum \<Colon> 'a\<Colon>enum list) ys) x = Some y)"
 | 
|  |    122 |     by (auto intro!: map_of_zip_is_Some)
 | 
|  |    123 |   then show ?thesis using enum_all by auto
 | 
|  |    124 | qed
 | 
|  |    125 | 
 | 
|  |    126 | lemma map_of_zip_enum_inject:
 | 
|  |    127 |   fixes xs ys :: "'b\<Colon>enum list"
 | 
|  |    128 |   assumes length: "length xs = length (enum \<Colon> 'a\<Colon>enum list)"
 | 
|  |    129 |       "length ys = length (enum \<Colon> 'a\<Colon>enum list)"
 | 
|  |    130 |     and map_of: "the \<circ> map_of (zip (enum \<Colon> 'a\<Colon>enum list) xs) = the \<circ> map_of (zip (enum \<Colon> 'a\<Colon>enum list) ys)"
 | 
|  |    131 |   shows "xs = ys"
 | 
|  |    132 | proof -
 | 
|  |    133 |   have "map_of (zip (enum \<Colon> 'a list) xs) = map_of (zip (enum \<Colon> 'a list) ys)"
 | 
|  |    134 |   proof
 | 
|  |    135 |     fix x :: 'a
 | 
|  |    136 |     from length map_of_zip_enum_is_Some obtain y1 y2
 | 
|  |    137 |       where "map_of (zip (enum \<Colon> 'a list) xs) x = Some y1"
 | 
|  |    138 |         and "map_of (zip (enum \<Colon> 'a list) ys) x = Some y2" by blast
 | 
|  |    139 |     moreover from map_of have "the (map_of (zip (enum \<Colon> 'a\<Colon>enum list) xs) x) = the (map_of (zip (enum \<Colon> 'a\<Colon>enum list) ys) x)"
 | 
|  |    140 |       by (auto dest: fun_cong)
 | 
|  |    141 |     ultimately show "map_of (zip (enum \<Colon> 'a\<Colon>enum list) xs) x = map_of (zip (enum \<Colon> 'a\<Colon>enum list) ys) x"
 | 
|  |    142 |       by simp
 | 
|  |    143 |   qed
 | 
|  |    144 |   with length enum_distinct show "xs = ys" by (rule map_of_zip_inject)
 | 
|  |    145 | qed
 | 
|  |    146 | 
 | 
|  |    147 | instantiation "fun" :: (enum, enum) enum
 | 
|  |    148 | begin
 | 
|  |    149 | 
 | 
|  |    150 | definition
 | 
|  |    151 |   [code func del]: "enum = map (\<lambda>ys. the o map_of (zip (enum\<Colon>'a list) ys)) (n_lists (length (enum\<Colon>'a\<Colon>enum list)) enum)"
 | 
|  |    152 | 
 | 
|  |    153 | instance proof
 | 
|  |    154 |   show "UNIV = set (enum \<Colon> ('a \<Rightarrow> 'b) list)"
 | 
|  |    155 |   proof (rule UNIV_eq_I)
 | 
|  |    156 |     fix f :: "'a \<Rightarrow> 'b"
 | 
|  |    157 |     have "f = the \<circ> map_of (zip (enum \<Colon> 'a\<Colon>enum list) (map f enum))"
 | 
|  |    158 |       by (auto simp add: map_of_zip_map expand_fun_eq)
 | 
|  |    159 |     then show "f \<in> set enum"
 | 
|  |    160 |       by (auto simp add: enum_fun_def set_n_lists)
 | 
|  |    161 |   qed
 | 
|  |    162 | next
 | 
|  |    163 |   from map_of_zip_enum_inject
 | 
|  |    164 |   show "distinct (enum \<Colon> ('a \<Rightarrow> 'b) list)"
 | 
|  |    165 |     by (auto intro!: inj_onI simp add: enum_fun_def
 | 
|  |    166 |       distinct_map distinct_n_lists enum_distinct set_n_lists enum_all)
 | 
|  |    167 | qed
 | 
|  |    168 | 
 | 
|  |    169 | end
 | 
|  |    170 | 
 | 
|  |    171 | lemma [code func]:
 | 
|  |    172 |   "enum = map (\<lambda>ys. the o map_of (zip (enum\<Colon>('a\<Colon>{enum, eq}) list) ys)) (n_lists (length (enum\<Colon>'a\<Colon>{enum, eq} list)) enum)"
 | 
|  |    173 |   unfolding enum_fun_def ..
 | 
|  |    174 | 
 | 
| 26348 |    175 | instantiation unit :: enum
 | 
|  |    176 | begin
 | 
|  |    177 | 
 | 
|  |    178 | definition
 | 
|  |    179 |   "enum = [()]"
 | 
|  |    180 | 
 | 
|  |    181 | instance by default
 | 
| 26444 |    182 |   (simp_all add: enum_unit_def UNIV_unit)
 | 
| 26348 |    183 | 
 | 
|  |    184 | end
 | 
|  |    185 | 
 | 
|  |    186 | instantiation bool :: enum
 | 
|  |    187 | begin
 | 
|  |    188 | 
 | 
|  |    189 | definition
 | 
|  |    190 |   "enum = [False, True]"
 | 
|  |    191 | 
 | 
|  |    192 | instance by default
 | 
| 26444 |    193 |   (simp_all add: enum_bool_def UNIV_bool)
 | 
| 26348 |    194 | 
 | 
|  |    195 | end
 | 
|  |    196 | 
 | 
|  |    197 | primrec product :: "'a list \<Rightarrow> 'b list \<Rightarrow> ('a \<times> 'b) list" where
 | 
|  |    198 |   "product [] _ = []"
 | 
|  |    199 |   | "product (x#xs) ys = map (Pair x) ys @ product xs ys"
 | 
|  |    200 | 
 | 
|  |    201 | lemma product_list_set:
 | 
|  |    202 |   "set (product xs ys) = set xs \<times> set ys"
 | 
|  |    203 |   by (induct xs) auto
 | 
|  |    204 | 
 | 
| 26444 |    205 | lemma distinct_product:
 | 
|  |    206 |   assumes "distinct xs" and "distinct ys"
 | 
|  |    207 |   shows "distinct (product xs ys)"
 | 
|  |    208 |   using assms by (induct xs)
 | 
|  |    209 |     (auto intro: inj_onI simp add: product_list_set distinct_map)
 | 
|  |    210 | 
 | 
| 26348 |    211 | instantiation * :: (enum, enum) enum
 | 
|  |    212 | begin
 | 
|  |    213 | 
 | 
|  |    214 | definition
 | 
|  |    215 |   "enum = product enum enum"
 | 
|  |    216 | 
 | 
|  |    217 | instance by default
 | 
| 26444 |    218 |   (simp_all add: enum_prod_def product_list_set distinct_product enum_all enum_distinct)
 | 
| 26348 |    219 | 
 | 
|  |    220 | end
 | 
|  |    221 | 
 | 
|  |    222 | instantiation "+" :: (enum, enum) enum
 | 
|  |    223 | begin
 | 
|  |    224 | 
 | 
|  |    225 | definition
 | 
|  |    226 |   "enum = map Inl enum @ map Inr enum"
 | 
|  |    227 | 
 | 
|  |    228 | instance by default
 | 
| 26444 |    229 |   (auto simp add: enum_all enum_sum_def, case_tac x, auto intro: inj_onI simp add: distinct_map enum_distinct)
 | 
| 26348 |    230 | 
 | 
|  |    231 | end
 | 
|  |    232 | 
 | 
|  |    233 | primrec sublists :: "'a list \<Rightarrow> 'a list list" where
 | 
|  |    234 |   "sublists [] = [[]]"
 | 
|  |    235 |   | "sublists (x#xs) = (let xss = sublists xs in map (Cons x) xss @ xss)"
 | 
|  |    236 | 
 | 
| 26444 |    237 | lemma length_sublists:
 | 
|  |    238 |   "length (sublists xs) = Suc (Suc (0\<Colon>nat)) ^ length xs"
 | 
|  |    239 |   by (induct xs) (simp_all add: Let_def)
 | 
|  |    240 | 
 | 
| 26348 |    241 | lemma sublists_powset:
 | 
| 26444 |    242 |   "set ` set (sublists xs) = Pow (set xs)"
 | 
| 26348 |    243 | proof -
 | 
|  |    244 |   have aux: "\<And>x A. set ` Cons x ` A = insert x ` set ` A"
 | 
|  |    245 |     by (auto simp add: image_def)
 | 
| 26444 |    246 |   have "set (map set (sublists xs)) = Pow (set xs)"
 | 
| 26348 |    247 |     by (induct xs)
 | 
| 26444 |    248 |       (simp_all add: aux Let_def Pow_insert Un_commute)
 | 
|  |    249 |   then show ?thesis by simp
 | 
|  |    250 | qed
 | 
|  |    251 | 
 | 
|  |    252 | lemma distinct_set_sublists:
 | 
|  |    253 |   assumes "distinct xs"
 | 
|  |    254 |   shows "distinct (map set (sublists xs))"
 | 
|  |    255 | proof (rule card_distinct)
 | 
|  |    256 |   have "finite (set xs)" by rule
 | 
|  |    257 |   then have "card (Pow (set xs)) = Suc (Suc 0) ^ card (set xs)" by (rule card_Pow)
 | 
|  |    258 |   with assms distinct_card [of xs]
 | 
|  |    259 |     have "card (Pow (set xs)) = Suc (Suc 0) ^ length xs" by simp
 | 
|  |    260 |   then show "card (set (map set (sublists xs))) = length (map set (sublists xs))"
 | 
|  |    261 |     by (simp add: sublists_powset length_sublists)
 | 
| 26348 |    262 | qed
 | 
|  |    263 | 
 | 
|  |    264 | instantiation set :: (enum) enum
 | 
|  |    265 | begin
 | 
|  |    266 | 
 | 
|  |    267 | definition
 | 
|  |    268 |   "enum = map set (sublists enum)"
 | 
|  |    269 | 
 | 
|  |    270 | instance by default
 | 
| 26444 |    271 |   (simp_all add: enum_set_def enum_all sublists_powset distinct_set_sublists enum_distinct)
 | 
| 26348 |    272 | 
 | 
|  |    273 | end
 | 
|  |    274 | 
 | 
|  |    275 | instantiation nibble :: enum
 | 
|  |    276 | begin
 | 
|  |    277 | 
 | 
|  |    278 | definition
 | 
|  |    279 |   "enum = [Nibble0, Nibble1, Nibble2, Nibble3, Nibble4, Nibble5, Nibble6, Nibble7,
 | 
|  |    280 |     Nibble8, Nibble9, NibbleA, NibbleB, NibbleC, NibbleD, NibbleE, NibbleF]"
 | 
|  |    281 | 
 | 
|  |    282 | instance by default
 | 
| 26444 |    283 |   (simp_all add: enum_nibble_def UNIV_nibble)
 | 
| 26348 |    284 | 
 | 
|  |    285 | end
 | 
|  |    286 | 
 | 
|  |    287 | instantiation char :: enum
 | 
|  |    288 | begin
 | 
|  |    289 | 
 | 
|  |    290 | definition
 | 
| 26444 |    291 |   [code func del]: "enum = map (split Char) (product enum enum)"
 | 
|  |    292 | 
 | 
|  |    293 | lemma enum_char [code func]:
 | 
|  |    294 |   "enum = [Char Nibble0 Nibble0, Char Nibble0 Nibble1, Char Nibble0 Nibble2,
 | 
|  |    295 |   Char Nibble0 Nibble3, Char Nibble0 Nibble4, Char Nibble0 Nibble5,
 | 
|  |    296 |   Char Nibble0 Nibble6, Char Nibble0 Nibble7, Char Nibble0 Nibble8,
 | 
|  |    297 |   Char Nibble0 Nibble9, Char Nibble0 NibbleA, Char Nibble0 NibbleB,
 | 
|  |    298 |   Char Nibble0 NibbleC, Char Nibble0 NibbleD, Char Nibble0 NibbleE,
 | 
|  |    299 |   Char Nibble0 NibbleF, Char Nibble1 Nibble0, Char Nibble1 Nibble1,
 | 
|  |    300 |   Char Nibble1 Nibble2, Char Nibble1 Nibble3, Char Nibble1 Nibble4,
 | 
|  |    301 |   Char Nibble1 Nibble5, Char Nibble1 Nibble6, Char Nibble1 Nibble7,
 | 
|  |    302 |   Char Nibble1 Nibble8, Char Nibble1 Nibble9, Char Nibble1 NibbleA,
 | 
|  |    303 |   Char Nibble1 NibbleB, Char Nibble1 NibbleC, Char Nibble1 NibbleD,
 | 
|  |    304 |   Char Nibble1 NibbleE, Char Nibble1 NibbleF, CHR '' '', CHR ''!'',
 | 
|  |    305 |   Char Nibble2 Nibble2, CHR ''#'', CHR ''$'', CHR ''%'', CHR ''&'',
 | 
|  |    306 |   Char Nibble2 Nibble7, CHR ''('', CHR '')'', CHR ''*'', CHR ''+'', CHR '','',
 | 
|  |    307 |   CHR ''-'', CHR ''.'', CHR ''/'', CHR ''0'', CHR ''1'', CHR ''2'', CHR ''3'',
 | 
|  |    308 |   CHR ''4'', CHR ''5'', CHR ''6'', CHR ''7'', CHR ''8'', CHR ''9'', CHR '':'',
 | 
|  |    309 |   CHR '';'', CHR ''<'', CHR ''='', CHR ''>'', CHR ''?'', CHR ''@'', CHR ''A'',
 | 
|  |    310 |   CHR ''B'', CHR ''C'', CHR ''D'', CHR ''E'', CHR ''F'', CHR ''G'', CHR ''H'',
 | 
|  |    311 |   CHR ''I'', CHR ''J'', CHR ''K'', CHR ''L'', CHR ''M'', CHR ''N'', CHR ''O'',
 | 
|  |    312 |   CHR ''P'', CHR ''Q'', CHR ''R'', CHR ''S'', CHR ''T'', CHR ''U'', CHR ''V'',
 | 
|  |    313 |   CHR ''W'', CHR ''X'', CHR ''Y'', CHR ''Z'', CHR ''['', Char Nibble5 NibbleC,
 | 
|  |    314 |   CHR '']'', CHR ''^'', CHR ''_'', Char Nibble6 Nibble0, CHR ''a'', CHR ''b'',
 | 
|  |    315 |   CHR ''c'', CHR ''d'', CHR ''e'', CHR ''f'', CHR ''g'', CHR ''h'', CHR ''i'',
 | 
|  |    316 |   CHR ''j'', CHR ''k'', CHR ''l'', CHR ''m'', CHR ''n'', CHR ''o'', CHR ''p'',
 | 
|  |    317 |   CHR ''q'', CHR ''r'', CHR ''s'', CHR ''t'', CHR ''u'', CHR ''v'', CHR ''w'',
 | 
|  |    318 |   CHR ''x'', CHR ''y'', CHR ''z'', CHR ''{'', CHR ''|'', CHR ''}'', CHR ''~'',
 | 
|  |    319 |   Char Nibble7 NibbleF, Char Nibble8 Nibble0, Char Nibble8 Nibble1,
 | 
|  |    320 |   Char Nibble8 Nibble2, Char Nibble8 Nibble3, Char Nibble8 Nibble4,
 | 
|  |    321 |   Char Nibble8 Nibble5, Char Nibble8 Nibble6, Char Nibble8 Nibble7,
 | 
|  |    322 |   Char Nibble8 Nibble8, Char Nibble8 Nibble9, Char Nibble8 NibbleA,
 | 
|  |    323 |   Char Nibble8 NibbleB, Char Nibble8 NibbleC, Char Nibble8 NibbleD,
 | 
|  |    324 |   Char Nibble8 NibbleE, Char Nibble8 NibbleF, Char Nibble9 Nibble0,
 | 
|  |    325 |   Char Nibble9 Nibble1, Char Nibble9 Nibble2, Char Nibble9 Nibble3,
 | 
|  |    326 |   Char Nibble9 Nibble4, Char Nibble9 Nibble5, Char Nibble9 Nibble6,
 | 
|  |    327 |   Char Nibble9 Nibble7, Char Nibble9 Nibble8, Char Nibble9 Nibble9,
 | 
|  |    328 |   Char Nibble9 NibbleA, Char Nibble9 NibbleB, Char Nibble9 NibbleC,
 | 
|  |    329 |   Char Nibble9 NibbleD, Char Nibble9 NibbleE, Char Nibble9 NibbleF,
 | 
|  |    330 |   Char NibbleA Nibble0, Char NibbleA Nibble1, Char NibbleA Nibble2,
 | 
|  |    331 |   Char NibbleA Nibble3, Char NibbleA Nibble4, Char NibbleA Nibble5,
 | 
|  |    332 |   Char NibbleA Nibble6, Char NibbleA Nibble7, Char NibbleA Nibble8,
 | 
|  |    333 |   Char NibbleA Nibble9, Char NibbleA NibbleA, Char NibbleA NibbleB,
 | 
|  |    334 |   Char NibbleA NibbleC, Char NibbleA NibbleD, Char NibbleA NibbleE,
 | 
|  |    335 |   Char NibbleA NibbleF, Char NibbleB Nibble0, Char NibbleB Nibble1,
 | 
|  |    336 |   Char NibbleB Nibble2, Char NibbleB Nibble3, Char NibbleB Nibble4,
 | 
|  |    337 |   Char NibbleB Nibble5, Char NibbleB Nibble6, Char NibbleB Nibble7,
 | 
|  |    338 |   Char NibbleB Nibble8, Char NibbleB Nibble9, Char NibbleB NibbleA,
 | 
|  |    339 |   Char NibbleB NibbleB, Char NibbleB NibbleC, Char NibbleB NibbleD,
 | 
|  |    340 |   Char NibbleB NibbleE, Char NibbleB NibbleF, Char NibbleC Nibble0,
 | 
|  |    341 |   Char NibbleC Nibble1, Char NibbleC Nibble2, Char NibbleC Nibble3,
 | 
|  |    342 |   Char NibbleC Nibble4, Char NibbleC Nibble5, Char NibbleC Nibble6,
 | 
|  |    343 |   Char NibbleC Nibble7, Char NibbleC Nibble8, Char NibbleC Nibble9,
 | 
|  |    344 |   Char NibbleC NibbleA, Char NibbleC NibbleB, Char NibbleC NibbleC,
 | 
|  |    345 |   Char NibbleC NibbleD, Char NibbleC NibbleE, Char NibbleC NibbleF,
 | 
|  |    346 |   Char NibbleD Nibble0, Char NibbleD Nibble1, Char NibbleD Nibble2,
 | 
|  |    347 |   Char NibbleD Nibble3, Char NibbleD Nibble4, Char NibbleD Nibble5,
 | 
|  |    348 |   Char NibbleD Nibble6, Char NibbleD Nibble7, Char NibbleD Nibble8,
 | 
|  |    349 |   Char NibbleD Nibble9, Char NibbleD NibbleA, Char NibbleD NibbleB,
 | 
|  |    350 |   Char NibbleD NibbleC, Char NibbleD NibbleD, Char NibbleD NibbleE,
 | 
|  |    351 |   Char NibbleD NibbleF, Char NibbleE Nibble0, Char NibbleE Nibble1,
 | 
|  |    352 |   Char NibbleE Nibble2, Char NibbleE Nibble3, Char NibbleE Nibble4,
 | 
|  |    353 |   Char NibbleE Nibble5, Char NibbleE Nibble6, Char NibbleE Nibble7,
 | 
|  |    354 |   Char NibbleE Nibble8, Char NibbleE Nibble9, Char NibbleE NibbleA,
 | 
|  |    355 |   Char NibbleE NibbleB, Char NibbleE NibbleC, Char NibbleE NibbleD,
 | 
|  |    356 |   Char NibbleE NibbleE, Char NibbleE NibbleF, Char NibbleF Nibble0,
 | 
|  |    357 |   Char NibbleF Nibble1, Char NibbleF Nibble2, Char NibbleF Nibble3,
 | 
|  |    358 |   Char NibbleF Nibble4, Char NibbleF Nibble5, Char NibbleF Nibble6,
 | 
|  |    359 |   Char NibbleF Nibble7, Char NibbleF Nibble8, Char NibbleF Nibble9,
 | 
|  |    360 |   Char NibbleF NibbleA, Char NibbleF NibbleB, Char NibbleF NibbleC,
 | 
|  |    361 |   Char NibbleF NibbleD, Char NibbleF NibbleE, Char NibbleF NibbleF]"
 | 
|  |    362 |   unfolding enum_char_def enum_nibble_def by simp
 | 
| 26348 |    363 | 
 | 
|  |    364 | instance by default
 | 
| 26444 |    365 |   (auto intro: char.exhaust injI simp add: enum_char_def product_list_set enum_all full_SetCompr_eq [symmetric]
 | 
|  |    366 |     distinct_map distinct_product enum_distinct)
 | 
| 26348 |    367 | 
 | 
|  |    368 | end
 | 
|  |    369 | 
 | 
|  |    370 | end |