let le_lem = 
prove_by_refinement( `(!y. y <= Y ==> P y) ==> (!y. y < Y ==> P y) /\ (!y. (y = Y) ==> P y)`,
(* {{{ Proof *) [ REPEAT STRIP_TAC; FIRST_ASSUM MATCH_MP_TAC; POP_ASSUM MP_TAC THEN REAL_ARITH_TAC; FIRST_ASSUM MATCH_MP_TAC; POP_ASSUM MP_TAC THEN REAL_ARITH_TAC; ]);;
(* }}} *)
let lt_int_lem = 
prove_by_refinement( `(!y. y < Y ==> P y) ==> X < Y ==> (!y. X < y /\ y < Y ==> P y)`,
(* {{{ Proof *) [ REPEAT STRIP_TAC; FIRST_ASSUM MATCH_MP_TAC; FIRST_ASSUM MATCH_ACCEPT_TAC; ]);;
(* }}} *)
let ge_lem = 
prove_by_refinement( `(!y. Y <= y ==> P y) ==> (!y. Y < y ==> P y) /\ (!y. (y = Y) ==> P y)`,
(* {{{ Proof *) [ REPEAT STRIP_TAC; FIRST_ASSUM MATCH_MP_TAC; POP_ASSUM MP_TAC THEN REAL_ARITH_TAC; FIRST_ASSUM MATCH_MP_TAC; POP_ASSUM MP_TAC THEN REAL_ARITH_TAC; ]);;
(* }}} *)
let gt_int_lem = 
prove_by_refinement( `(!y. Y < y ==> P y) ==> Y < X ==> (!y. Y < y /\ y < X ==> P y)`,
(* {{{ Proof *) [ REPEAT STRIP_TAC; FIRST_ASSUM MATCH_MP_TAC; FIRST_ASSUM MATCH_ACCEPT_TAC; ]);;
(* }}} *)
let rest_lt_lem = 
prove_by_refinement( `Y < X ==> (!x. x < X ==> P x) ==> (!x. x < Y ==> P x)`,
(* {{{ Proof *) [ REPEAT STRIP_TAC; FIRST_ASSUM MATCH_MP_TAC; ASM_MESON_TAC[REAL_LT_TRANS;real_gt]; ]);;
(* }}} *)
let rest_gt_lem = 
prove_by_refinement( `X < Y ==> (!x. X < x ==> P x) ==> (!x. Y < x ==> P x)`,
(* {{{ Proof *) [ REPEAT STRIP_TAC; FIRST_ASSUM MATCH_MP_TAC; ASM_MESON_TAC[REAL_LT_TRANS;real_gt]; ]);;
(* }}} *)
let rest_eq_lt_lem = 
prove_by_refinement( `Y < X ==> (!x. x < X ==> P x) ==> (!x. (x = Y) ==> P x)`,
(* {{{ Proof *) [ REPEAT STRIP_TAC; FIRST_ASSUM MATCH_MP_TAC; ASM_MESON_TAC[REAL_LT_TRANS]; ]);;
(* }}} *)
let rest_eq_gt_lem = 
prove_by_refinement( `X < Y ==> (!x. X < x ==> P x) ==> (!x. (x = Y) ==> P x)`,
(* {{{ Proof *) [ REPEAT STRIP_TAC; FIRST_ASSUM MATCH_MP_TAC; ASM_MESON_TAC[REAL_LT_TRANS]; ]);;
(* }}} *)
let rest_int_lt_lem = 
prove_by_refinement( `Y < X ==> (!x. x < X ==> P x) ==> (!x. Y < x /\ x < X ==> P x)`,
(* {{{ Proof *) [ REPEAT STRIP_TAC; FIRST_ASSUM MATCH_MP_TAC; ASM_MESON_TAC[REAL_LT_TRANS]; ]);;
(* }}} *)
let rest_int_gt_lem = 
prove_by_refinement( `X < Y ==> (!x. X < x ==> P x) ==> (!x. X < x /\ x < Y ==> P x)`,
(* {{{ Proof *) [ REPEAT STRIP_TAC; FIRST_ASSUM MATCH_MP_TAC; ASM_MESON_TAC[REAL_LT_TRANS]; ]);;
(* }}} *)
let INTERPSIGN_SUBSET = 
prove_by_refinement( `!P Q p s. interpsign P p s /\ Q SUBSET P ==> interpsign Q p s`,
(* {{{ Proof *) [ REWRITE_TAC[SUBSET;IN]; REPEAT_N 4 STRIP_TAC; STRUCT_CASES_TAC (ISPEC `s:sign` SIGN_CASES) THEN REWRITE_TAC[interpsign] THEN MESON_TAC[]; ]);;
(* }}} *)
let INTERPSIGNS_SUBSET = 
prove_by_refinement( `!P Q ps ss. interpsigns ps P ss /\ Q SUBSET P ==> interpsigns ps Q ss`,
(* {{{ Proof *) [ REWRITE_TAC[SUBSET;IN]; REPEAT_N 2 STRIP_TAC; LIST_INDUCT_TAC; LIST_INDUCT_TAC; REWRITE_TAC[ALL2;interpsigns;interpsign]; REWRITE_TAC[ALL2;interpsigns;interpsign]; LIST_INDUCT_TAC; REWRITE_TAC[ALL2;interpsigns;interpsign]; REWRITE_TAC[ALL2;interpsigns;interpsign]; (* save *) REPEAT STRIP_TAC; MATCH_MP_TAC INTERPSIGN_SUBSET; ASM_MESON_TAC[SUBSET;IN]; REWRITE_ASSUMS[ALL2;interpsigns;interpsign]; FIRST_ASSUM MATCH_MP_TAC; ASM_REWRITE_TAC[]; ]);;
(* }}} *)
let NOPOINT_LEM = 
prove_by_refinement( `!pl sl. interpsigns pl (\x. T) sl ==> (interpsigns pl (\x. x < &0) sl /\ interpsigns pl (\x. x = &0) sl /\ interpsigns pl (\x. &0 < x) sl)`,
(* {{{ Proof *) [ REPEAT STRIP_TAC THEN MATCH_MP_TAC INTERPSIGNS_SUBSET THEN ASM_MESON_TAC[SUBSET;IN] ]);;
(* }}} *)