diff -r 3f3223b90239 -r e051eea34990 src/HOL/Data_Structures/Cmp.thy --- a/src/HOL/Data_Structures/Cmp.thy Thu Jul 07 09:24:03 2016 +0200 +++ b/src/HOL/Data_Structures/Cmp.thy Thu Jul 07 18:08:02 2016 +0200 @@ -1,4 +1,4 @@ -(* Author: Tobias Nipkow *) +(* Author: Tobias Nipkow, Daniel Stüwe *) section {* Three-Way Comparison *} @@ -6,16 +6,23 @@ imports Main begin -datatype cmp = LT | EQ | GT +datatype cmp_val = LT | EQ | GT -class cmp = linorder + -fixes cmp :: "'a \ 'a \ cmp" -assumes LT[simp]: "cmp x y = LT \ x < y" -assumes EQ[simp]: "cmp x y = EQ \ x = y" -assumes GT[simp]: "cmp x y = GT \ x > y" +function cmp :: "'a:: linorder \ 'a \ cmp_val" where +"x < y \ cmp x y = LT" | +"x = y \ cmp x y = EQ" | +"x > y \ cmp x y = GT" +by (auto, force) +termination by lexicographic_order + +lemma + LT[simp]: "cmp x y = LT \ x < y" +and EQ[simp]: "cmp x y = EQ \ x = y" +and GT[simp]: "cmp x y = GT \ x > y" +by (cases x y rule: linorder_cases, auto)+ lemma case_cmp_if[simp]: "(case c of EQ \ e | LT \ l | GT \ g) = (if c = LT then l else if c = GT then g else e)" -by(simp split: cmp.split) +by(simp split: cmp_val.split) end