Theory List_Lexord_Alt

(******************************************************************************)
(* Project: Isabelle/UTP Toolkit                                              *)
(* File: List_Lexord_Alt.thy                                                  *)
(* Authors: Simon Foster and Frank Zeyda                                      *)
(* Emails: simon.foster@york.ac.uk and frank.zeyda@york.ac.uk                 *)
(******************************************************************************)

section ‹Alternative List Lexicographic Order›

theory List_Lexord_Alt
  imports Main
begin

text ‹ Since we can't instantiate the order class twice for lists, and we want prefix as
  the default order for the UTP we here add syntax for the lexicographic order relation. ›

definition list_lex_less :: "'a::linorder list ⇒ 'a list ⇒ bool" (infix ‹<l› 50)
where "xs <l ys ⟷ (xs, ys) ∈ lexord {(u, v). u < v}"

lemma list_lex_less_neq [simp]: "x <l y ⟹ x ≠ y"
  apply (simp add: list_lex_less_def)
  apply (meson case_prodD less_irrefl lexord_irreflexive mem_Collect_eq)
done

lemma not_less_Nil [simp]: "¬ x <l []"
  by (simp add: list_lex_less_def)

lemma Nil_less_Cons [simp]: "[] <l a # x"
  by (simp add: list_lex_less_def)

lemma Cons_less_Cons [simp]: "a # x <l b # y ⟷ a < b ∨ a = b ∧ x <l y"
  by (simp add: list_lex_less_def)
end