subsection\Value Lexorder\ text\This theory defines a lexicographical ordering on values such that we can build orderings for arithmetic expressions and guards. Here, numbers are defined as less than strings, else the natural ordering on the respective datatypes is used.\ theory Value_Lexorder imports Value begin instantiation "value" :: linorder begin text_raw\\snip{valueorder}{1}{2}{%\ fun less_value :: "value \ value \ bool" where "(Num n) < (Str s) = True" | "(Str s) < (Num n) = False" | "(Str s1) < (Str s2) = (s1 < s2)" | "(Num n1) < (Num n2) = (n1 < n2)" text_raw\}%endsnip\ definition less_eq_value :: "value \ value \ bool" where "less_eq_value v1 v2 = (v1 < v2 \ v1 = v2)" declare less_eq_value_def [simp] instance apply standard apply (simp, metis less_imp_not_less less_value.elims(2) less_value.simps(3) less_value.simps(4)) apply simp subgoal for x y z apply (induct x y rule: less_value.induct) apply (metis less_eq_value_def less_value.elims(3) less_value.simps(2) value.simps(4)) apply simp apply (metis dual_order.strict_trans less_eq_value_def less_value.elims(2) less_value.simps(3) value.distinct(1)) by (cases z, auto) apply (metis less_eq_value_def less_imp_not_less less_value.elims(2) less_value.simps(3) less_value.simps(4)) subgoal for x y by (induct x y rule: less_value.induct, auto) done end end