Theory Char_ord

Up to index of Isabelle/HOL/Library

theory Char_ord
imports Product_ord Char_nat
begin

(*  Title:      HOL/Library/Char_ord.thy
    ID:         $Id: Char_ord.thy,v 1.10 2007/06/14 21:04:39 wenzelm Exp $
    Author:     Norbert Voelker, Florian Haftmann
*)

header {* Order on characters *}

theory Char_ord
imports Product_ord Char_nat
begin

instance nibble :: linorder
  nibble_less_eq_def: "n ≤ m ≡ nat_of_nibble n ≤ nat_of_nibble m"
  nibble_less_def: "n < m ≡ nat_of_nibble n < nat_of_nibble m"
proof
  fix n :: nibble
  show "n ≤ n" unfolding nibble_less_eq_def nibble_less_def by auto
next
  fix n m q :: nibble
  assume "n ≤ m"
    and "m ≤ q"
  then show "n ≤ q" unfolding nibble_less_eq_def nibble_less_def by auto
next
  fix n m :: nibble
  assume "n ≤ m"
    and "m ≤ n"
  then show "n = m"
    unfolding nibble_less_eq_def nibble_less_def
    by (auto simp add: nat_of_nibble_eq)
next
  fix n m :: nibble
  show "n < m <-> n ≤ m ∧ n ≠ m"
    unfolding nibble_less_eq_def nibble_less_def less_le
    by (auto simp add: nat_of_nibble_eq)
next
  fix n m :: nibble
  show "n ≤ m ∨ m ≤ n"
    unfolding nibble_less_eq_def by auto
qed

instance nibble :: distrib_lattice
    "inf ≡ min"
    "sup ≡ max"
  by default (auto simp add:
    inf_nibble_def sup_nibble_def min_max.sup_inf_distrib1)

instance char :: linorder
  char_less_eq_def: "c1 ≤ c2 ≡ case c1 of Char n1 m1 => case c2 of Char n2 m2 =>
    n1 < n2 ∨ n1 = n2 ∧ m1 ≤ m2"
  char_less_def:    "c1 < c2 ≡ case c1 of Char n1 m1 => case c2 of Char n2 m2 =>
    n1 < n2 ∨ n1 = n2 ∧ m1 < m2"
  by default (auto simp: char_less_eq_def char_less_def split: char.splits)

lemmas [code func del] = char_less_eq_def char_less_def

instance char :: distrib_lattice
    "inf ≡ min"
    "sup ≡ max"
  by default (auto simp add:
    inf_char_def sup_char_def min_max.sup_inf_distrib1)

lemma [simp, code func]:
  shows char_less_eq_simp: "Char n1 m1 ≤ Char n2 m2 <-> n1 < n2 ∨ n1 = n2 ∧ m1 ≤ m2"
  and char_less_simp:      "Char n1 m1 < Char n2 m2 <-> n1 < n2 ∨ n1 = n2 ∧ m1 < m2"
  unfolding char_less_eq_def char_less_def by simp_all

end

lemma

  c1.0  c2.0 ==
  case c1.0 of
  Char n1 m1 => case c2.0 of Char n2 m2 => n1 < n2n1 = n2m1  m2
  c1.0 < c2.0 ==
  case c1.0 of
  Char n1 m1 => case c2.0 of Char n2 m2 => n1 < n2n1 = n2m1 < m2

lemma char_less_eq_simp:

  (Char n1.0 m1.0  Char n2.0 m2.0) = (n1.0 < n2.0n1.0 = n2.0m1.0  m2.0)

and char_less_simp:

  (Char n1.0 m1.0 < Char n2.0 m2.0) = (n1.0 < n2.0n1.0 = n2.0m1.0 < m2.0)