monotonicity_theorems : thm list ref
# let LEX = define
`(LEX(<<) [] l <=> F) /\
(LEX(<<) l [] <=> F) /\
(LEX(<<) (CONS h1 t1) (CONS h2 t2) <=>
if h1 << h2 then LENGTH t1 = LENGTH t2
else (h1 = h2) /\ LEX(<<) t1 t2)`;;
# let LEX_LENGTH = prove
(`!l1 l2 R. LEX(R) l1 l2 ==> (LENGTH l1 = LENGTH l2)`,
REPEAT(LIST_INDUCT_TAC THEN SIMP_TAC[LEX]) THEN ASM_MESON_TAC[LENGTH]);;
# let MONO_LEX = prove
(`(!x:A y:A. R x y ==> S x y) ==> LEX R x y ==> LEX S x y`,
DISCH_TAC THEN
MAP_EVERY (fun t -> SPEC_TAC(t,t)) [`x:A list`; `y:A list`] THEN
REPEAT(LIST_INDUCT_TAC THEN REWRITE_TAC[LEX]) THEN
ASM_MESON_TAC[LEX_LENGTH]);;
# monotonicity_theorems := MONO_LEX::(!monotonicity_theorems);;