floor

 今回は,床関数の性質の一つです.定義に近い形で進めるなら

g `!x m. floor (x + &m) = floor x + &m`;;
e(REPEAT GEN_TAC);;
e(MAP_EVERY ASSUME_TAC [SPEC`x + &m`FLOOR; SPEC`x:real`FLOOR]);;
e(SUBGOAL_TAC""`integer (floor x + &m)`[ASM_SIMP_TAC[INTEGER_CLOSED]]);;
e(ASM_SIMP_TAC[REAL_EQ_INTEGERS] THEN ASM_ARITH_TAC);;

または

g `!x m. floor (x + &m) = floor x + &m`;;
e(REPEAT GEN_TAC);;
e(MAP_EVERY ASSUME_TAC [SPEC`x + &m`FLOOR; 
                        SPEC`x:real`FLOOR; 
                        MESON[FLOOR; INTEGER_CLOSED]`integer (floor x + &m)`]);;
e(ASM_SIMP_TAC[REAL_EQ_INTEGERS] THEN ASM_ARITH_TAC);;

或いは

# [REAL_FLOOR_ADD; FLOOR_FRAC; FRAC_NUM; REAL_ADD_RID; FLOOR_NUM];;
val it : thm list =
  [|- !x y.
          floor (x + y) =
          (if frac x + frac y < &1
           then floor x + floor y
           else (floor x + floor y) + &1);
   |- !x. integer (floor x) /\
          &0 <= frac x /\
          frac x < &1 /\
          x = floor x + frac x;
   |- !n. frac (&n) = &0; |- !x. x + &0 = x; |- !n. floor (&n) = &n]

を参照するなら

# prove(`!x m. floor (x + &m) = floor x + &m`,SIMP_TAC it);;
val it : thm = |- !x m. floor (x + &m) = floor x + &m

となり,符号を考慮して

let thm20120127_1 = prove
 (`!x m. floor (x + &m) = floor x + &m`,
  SIMP_TAC[REAL_FLOOR_ADD; FLOOR_FRAC; FRAC_NUM; REAL_ADD_RID; FLOOR_NUM]);;

let thm20120127_2 = prove
 (`!x m. floor (x - &m) = floor x - &m`,
  MESON_TAC[REAL_EQ_SUB_LADD; REAL_SUB_ADD; thm20120107_1]);;

let thm20120127_3 = prove
 (`!x y. integer y ==> floor (x + y) = floor x + y`,
  REPEAT GEN_TAC THEN SIMP_TAC[is_int] THEN REPEAT STRIP_TAC THENL
  [ASM_SIMP_TAC[thm20120107_1];
   ASM_SIMP_TAC[thm20120107_2; GSYM real_sub]]);;

を得ます.
 なお,最初からintegerで行くなら

let thm20120127_4 = prove
 (`!x y. integer y ==> floor (x + y) = floor x + y`,
  SIMP_TAC[REAL_FLOOR_ADD; FLOOR_FRAC; REAL_FRAC_ZERO; REAL_ADD_RID; REAL_FLOOR_REFL]);;

が簡明です.