src/HOL/Library/Enum.thy
author haftmann
Thu, 20 Mar 2008 12:01:10 +0100
changeset 26348 0f8e23edd357
child 26444 6a5faa5bcf19
permissions -rw-r--r--
added theory Library/Enum.thy
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
26348
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
     1
(*  Title:      HOL/Library/Enum.thy
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
     2
    ID:         $Id$
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
     3
    Author:     Florian Haftmann, TU Muenchen
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
     4
*)
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
     5
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
     6
header {* Finite types as explicit enumerations *}
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
     7
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
     8
theory Enum
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
     9
imports Main
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    10
begin
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    11
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    12
subsection {* Class @{text enum} *}
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    13
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    14
class enum = finite + -- FIXME
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    15
  fixes enum :: "'a list"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    16
  assumes enum_all: "set enum = UNIV"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    17
begin
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    18
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    19
lemma in_enum [intro]: "x \<in> set enum"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    20
  unfolding enum_all by auto
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    21
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    22
lemma enum_eq_I:
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    23
  assumes "\<And>x. x \<in> set xs"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    24
  shows "set enum = set xs"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    25
proof -
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    26
  from assms UNIV_eq_I have "UNIV = set xs" by auto
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    27
  with enum_all show ?thesis by simp
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    28
qed
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    29
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    30
end
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    31
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    32
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    33
subsection {* Equality and order on functions *}
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    34
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    35
declare eq_fun [code func del] order_fun [code func del]
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    36
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    37
instance "fun" :: (enum, eq) eq ..
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    38
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    39
lemma eq_fun [code func]:
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    40
  fixes f g :: "'a\<Colon>enum \<Rightarrow> 'b\<Colon>eq"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    41
  shows "f = g \<longleftrightarrow> (\<forall>x \<in> set enum. f x = g x)"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    42
  by (simp add: enum_all expand_fun_eq)
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    43
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    44
lemma order_fun [code func]:
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    45
  fixes f g :: "'a\<Colon>enum \<Rightarrow> 'b\<Colon>order"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    46
  shows "f \<le> g \<longleftrightarrow> (\<forall>x \<in> set enum. f x \<le> g x)"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    47
    and "f < g \<longleftrightarrow> f \<le> g \<and> (\<exists>x \<in> set enum. f x \<noteq> g x)"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    48
  by (simp_all add: enum_all expand_fun_eq le_fun_def less_fun_def order_less_le)
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    49
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    50
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    51
subsection {* Default instances *}
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    52
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    53
instantiation unit :: enum
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    54
begin
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    55
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    56
definition
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    57
  "enum = [()]"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    58
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    59
instance by default
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    60
  (simp add: enum_unit_def UNIV_unit)
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    61
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    62
end
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    63
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    64
instantiation bool :: enum
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    65
begin
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    66
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    67
definition
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    68
  "enum = [False, True]"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    69
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    70
instance by default
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    71
  (simp add: enum_bool_def UNIV_bool)
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    72
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    73
end
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    74
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    75
primrec product :: "'a list \<Rightarrow> 'b list \<Rightarrow> ('a \<times> 'b) list" where
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    76
  "product [] _ = []"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    77
  | "product (x#xs) ys = map (Pair x) ys @ product xs ys"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    78
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    79
lemma product_list_set:
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    80
  "set (product xs ys) = set xs \<times> set ys"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    81
  by (induct xs) auto
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    82
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    83
instantiation * :: (enum, enum) enum
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    84
begin
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    85
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    86
definition
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    87
  "enum = product enum enum"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    88
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    89
instance by default
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    90
  (simp add: enum_prod_def product_list_set enum_all)
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    91
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    92
end
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    93
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    94
instantiation "+" :: (enum, enum) enum
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    95
begin
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    96
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    97
definition
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    98
  "enum = map Inl enum @ map Inr enum"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
    99
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   100
instance by default
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   101
  (auto simp add: enum_all enum_sum_def, case_tac x, auto)
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   102
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   103
end
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   104
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   105
primrec sublists :: "'a list \<Rightarrow> 'a list list" where
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   106
  "sublists [] = [[]]"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   107
  | "sublists (x#xs) = (let xss = sublists xs in map (Cons x) xss @ xss)"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   108
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   109
lemma sublists_powset:
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   110
  "set (map set (sublists xs)) = Pow (set xs)"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   111
proof -
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   112
  have aux: "\<And>x A. set ` Cons x ` A = insert x ` set ` A"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   113
    by (auto simp add: image_def)
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   114
  show ?thesis
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   115
    by (induct xs)
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   116
     (simp_all add: aux Let_def Pow_insert Un_commute)
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   117
qed
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   118
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   119
instantiation set :: (enum) enum
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   120
begin
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   121
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   122
definition
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   123
  "enum = map set (sublists enum)"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   124
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   125
instance by default
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   126
  (simp add: enum_set_def sublists_powset enum_all del: set_map)
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   127
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   128
end
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   129
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   130
instantiation nibble :: enum
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   131
begin
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   132
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   133
definition
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   134
  "enum = [Nibble0, Nibble1, Nibble2, Nibble3, Nibble4, Nibble5, Nibble6, Nibble7,
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   135
    Nibble8, Nibble9, NibbleA, NibbleB, NibbleC, NibbleD, NibbleE, NibbleF]"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   136
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   137
instance by default
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   138
  (simp add: enum_nibble_def UNIV_nibble)
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   139
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   140
end
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   141
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   142
instantiation char :: enum
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   143
begin
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   144
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   145
definition
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   146
  "enum = map (split Char) (product enum enum)"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   147
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   148
instance by default
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   149
  (auto intro: char.exhaust simp add: enum_char_def product_list_set enum_all full_SetCompr_eq [symmetric])
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   150
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   151
end
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   152
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   153
(*instantiation "fun" :: (enum, enum) enum
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   154
begin
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   155
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   156
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   157
definition
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   158
  "enum 
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   159
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   160
lemma inj_graph: "inj (%f. {(x, y). y = f x})"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   161
  by (rule inj_onI, auto simp add: expand_set_eq expand_fun_eq)
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   162
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   163
instance "fun" :: (finite, finite) finite
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   164
proof
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   165
  show "finite (UNIV :: ('a => 'b) set)"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   166
  proof (rule finite_imageD)
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   167
    let ?graph = "%f::'a => 'b. {(x, y). y = f x}"
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   168
    show "finite (range ?graph)" by (rule finite)
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   169
    show "inj ?graph" by (rule inj_graph)
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   170
  qed
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   171
qed*)
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   172
0f8e23edd357 added theory Library/Enum.thy
haftmann
parents:
diff changeset
   173
end