(* ========================================================================= *)
(* Sum of reciprocals of triangular numbers.                                 *)
(* ========================================================================= *)
needs "Multivariate/misc.ml";;  (*** Just for REAL_ARCH_INV! ***)
prioritize_real();;
(* ------------------------------------------------------------------------- *)
(* Definition of triangular numbers.                                         *)
(* ------------------------------------------------------------------------- *)
(* ------------------------------------------------------------------------- *)
(* Mapping them into the reals: division is exact.                           *)
(* ------------------------------------------------------------------------- *)
let REAL_TRIANGLE = prove
 (`&(triangle n) = (&n * (&n + &1)) / &2`,
  MATCH_MP_TAC(REAL_ARITH `&2 * x = y ==> x = y / &2`) THEN
  REWRITE_TAC[triangle; REAL_OF_NUM_MUL; REAL_OF_NUM_ADD; REAL_OF_NUM_EQ] THEN
  SUBGOAL_THEN `
EVEN(n * (n + 1))` MP_TAC THENL
   [REWRITE_TAC[
EVEN_MULT; 
EVEN_ADD; ARITH] THEN CONV_TAC TAUT;
    REWRITE_TAC[
EVEN_EXISTS] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
    AP_TERM_TAC THEN MATCH_MP_TAC DIV_MULT THEN REWRITE_TAC[ARITH]]);;
 
 
(* ------------------------------------------------------------------------- *)
(* Sum of a finite number of terms.                                          *)
(* ------------------------------------------------------------------------- *)
(* ------------------------------------------------------------------------- *)
(* Hence limit.                                                              *)
(* ------------------------------------------------------------------------- *)
let TRIANGLE_CONVERGES = prove
 (`!e. &0 < e
       ==> ?N. !n. n >= N
                   ==> abs(sum(1..n) (\k. &1 / &(triangle k)) - &2) < e`,
  GEN_TAC THEN GEN_REWRITE_TAC LAND_CONV [
REAL_ARCH_INV] THEN
  DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
  EXISTS_TAC `2 * N + 1` THEN REWRITE_TAC[
GE] THEN REPEAT STRIP_TAC THEN
  REWRITE_TAC[
TRIANGLE_FINITE_SUM; REAL_ARITH `abs(x - y - x) = abs y`] THEN
  MATCH_MP_TAC 
REAL_LET_TRANS THEN EXISTS_TAC `inv(&N)` THEN
  ASM_SIMP_TAC[
REAL_ABS_DIV; 
REAL_ABS_NUM] THEN
  ONCE_REWRITE_TAC[GSYM 
REAL_INV_DIV] THEN MATCH_MP_TAC 
REAL_LE_INV2 THEN
  SIMP_TAC[
REAL_LE_RDIV_EQ; 
REAL_OF_NUM_LT; ARITH] THEN
  REWRITE_TAC[REAL_ARITH `abs(&n + &1) = &n + &1`] THEN
  REWRITE_TAC[REAL_OF_NUM_ADD; REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN
  POP_ASSUM_LIST(MP_TAC o end_itlist CONJ) THEN ARITH_TAC);;
 
 
(* ------------------------------------------------------------------------- *)
(* In terms of limits.                                                       *)
(* ------------------------------------------------------------------------- *)
needs "Library/analysis.ml";;
override_interface ("-->",`(tends_num_real)`);;