1 (* Title: HOL/Library/Char_ord.thy
2 Author: Norbert Voelker, Florian Haftmann
5 header {* Order on characters *}
11 instantiation nibble :: linorder
15 "n \<le> m \<longleftrightarrow> nat_of_nibble n \<le> nat_of_nibble m"
18 "n < m \<longleftrightarrow> nat_of_nibble n < nat_of_nibble m"
21 qed (auto simp add: less_eq_nibble_def less_nibble_def not_le nat_of_nibble_eq_iff)
25 instantiation nibble :: distrib_lattice
29 "(inf \<Colon> nibble \<Rightarrow> _) = min"
32 "(sup \<Colon> nibble \<Rightarrow> _) = max"
35 qed (auto simp add: inf_nibble_def sup_nibble_def min_max.sup_inf_distrib1)
39 instantiation char :: linorder
43 "c1 \<le> c2 \<longleftrightarrow> nat_of_char c1 \<le> nat_of_char c2"
46 "c1 < c2 \<longleftrightarrow> nat_of_char c1 < nat_of_char c2"
49 qed (auto simp add: less_eq_char_def less_char_def nat_of_char_eq_iff)
53 lemma less_eq_char_Char:
54 "Char n1 m1 \<le> Char n2 m2 \<longleftrightarrow> n1 < n2 \<or> n1 = n2 \<and> m1 \<le> m2"
57 assume "nat_of_nibble n1 * 16 + nat_of_nibble m1
58 \<le> nat_of_nibble n2 * 16 + nat_of_nibble m2"
59 then have "nat_of_nibble n1 \<le> nat_of_nibble n2"
60 using nat_of_nibble_less_16 [of m1] nat_of_nibble_less_16 [of m2] by auto
64 using nat_of_nibble_less_16 [of m1] nat_of_nibble_less_16 [of m2]
65 by (auto simp add: less_eq_char_def nat_of_char_Char less_eq_nibble_def less_nibble_def not_less nat_of_nibble_eq_iff dest: *)
69 "Char n1 m1 < Char n2 m2 \<longleftrightarrow> n1 < n2 \<or> n1 = n2 \<and> m1 < m2"
72 assume "nat_of_nibble n1 * 16 + nat_of_nibble m1
73 < nat_of_nibble n2 * 16 + nat_of_nibble m2"
74 then have "nat_of_nibble n1 \<le> nat_of_nibble n2"
75 using nat_of_nibble_less_16 [of m1] nat_of_nibble_less_16 [of m2] by auto
79 using nat_of_nibble_less_16 [of m1] nat_of_nibble_less_16 [of m2]
80 by (auto simp add: less_char_def nat_of_char_Char less_eq_nibble_def less_nibble_def not_less nat_of_nibble_eq_iff dest: *)
83 instantiation char :: distrib_lattice
87 "(inf \<Colon> char \<Rightarrow> _) = min"
90 "(sup \<Colon> char \<Rightarrow> _) = max"
93 qed (auto simp add: inf_char_def sup_char_def min_max.sup_inf_distrib1)
97 instantiation String.literal :: linorder
100 lift_definition less_literal :: "String.literal \<Rightarrow> String.literal \<Rightarrow> bool" is "ord.lexordp op <" .
101 lift_definition less_eq_literal :: "String.literal \<Rightarrow> String.literal \<Rightarrow> bool" is "ord.lexordp_eq op <" .
105 interpret linorder "ord.lexordp_eq op <" "ord.lexordp op < :: string \<Rightarrow> string \<Rightarrow> bool"
106 by(rule linorder.lexordp_linorder[where less_eq="op \<le>"])(unfold_locales)
108 by(intro_classes)(transfer, simp add: less_le_not_le linear)+
113 lemma less_literal_code [code]:
114 "op < = (\<lambda>xs ys. ord.lexordp op < (explode xs) (explode ys))"
115 by(simp add: less_literal.rep_eq fun_eq_iff)
117 lemma less_eq_literal_code [code]:
118 "op \<le> = (\<lambda>xs ys. ord.lexordp_eq op < (explode xs) (explode ys))"
119 by(simp add: less_eq_literal.rep_eq fun_eq_iff)
121 text {* Legacy aliasses *}
123 lemmas nibble_less_eq_def = less_eq_nibble_def
124 lemmas nibble_less_def = less_nibble_def
125 lemmas char_less_eq_def = less_eq_char_def
126 lemmas char_less_def = less_char_def
127 lemmas char_less_eq_simp = less_eq_char_Char
128 lemmas char_less_simp = less_char_Char