arcsin (sin x)

g `!x. asn (sin x) = pi / &2 - abs (pi / &2  - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi))))` ;;
e( GEN_TAC );;
e( SUBGOAL_THEN `asn (sin x) = asn (sin (pi / &2 - abs (pi / &2  - (x - &2 * pi * floor ( (x + pi / &2) / (&2 * pi) ) ) )) ) /\ -- (pi / &2) <= pi / &2 - abs (pi / &2  - (x - &2 * pi * floor ( (x + pi / &2) / (&2 * pi) ) ) ) /\ pi / &2 - abs (pi / &2  - (x - &2 * pi * floor ( (x + pi / &2) / (&2 * pi) ) ) ) <= pi / &2` MP_TAC THEN STRIP_TAC );;
e( SIMP_TAC [GSYM COS_SIN;COS_ABS;GSYM SIN_COS;REAL_ARITH`x - &2 * pi * y = x + (&2 * pi) * (-- y)`;SIN_ADD;SIN_INTEGER_2PI;COS_INTEGER_2PI;FLOOR;INTEGER_NEG;REAL_MUL_RID;REAL_MUL_RZERO;REAL_ADD_RID]  );;
e( STRIP_TAC );;
e( SIMP_TAC [REAL_ARITH`--(pi / &2) <= pi / &2 - abs (pi / &2 - (x - &2 * pi * f)) <=> pi * f <= x / &2 + pi / &4 /\ x / &2 + pi / &4 <= pi * (f + &1)`;SIMP_RULE [PI_POS] (REAL_FIELD`&0 < pi ==> x / &2 + pi / &4 = pi * (x / (&2 * pi) + &1 / &4)`);SIMP_RULE [PI_POS] (REAL_FIELD`&0 < pi ==> (x + pi / &2) / (&2 * pi) = x / (&2 * pi) + &1 / &4`);PI_POS;REAL_LE_LMUL_EQ]);;
e( SIMP_TAC [FLOOR;REAL_LT_IMP_LE] );;
e( REAL_ARITH_TAC );;
e( ASM_SIMP_TAC [ASN_SIN] );;
top_thm () ;;
# g `!x. asn (sin x) = pi / &2 - abs (pi / &2  - (x - &2 * pi * floor ( (x + pi / &2) / (&2 * pi) ) ) )` ;;
val it : goalstack = 1 subgoal (1 total)

`!x. asn (sin x) =
     pi / &2 -
     abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi))))`

# e( GEN_TAC );;
val it : goalstack = 1 subgoal (1 total)

`asn (sin x) =
 pi / &2 - abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi))))`

# e( SUBGOAL_THEN `asn (sin x) = asn (sin (pi / &2 - abs (pi / &2  - (x - &2 * pi * floor ( (x + pi / &2) / (&2 * pi) ) ) )) ) /\ -- (pi / &2) <= pi / &2 - abs (pi / &2  - (x - &2 * pi * floor ( (x + pi / &2) / (&2 * pi) ) ) ) /\ pi / &2 - abs (pi / &2  - (x - &2 * pi * floor ( (x + pi / &2) / (&2 * pi) ) ) ) <= pi / &2` MP_TAC THEN STRIP_TAC );;
val it : goalstack = 3 subgoals (3 total)

  0 [`asn (sin x) =
      asn
      (sin
      (pi / &2 -
       abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi))))))`]
  1 [`--(pi / &2) <=
      pi / &2 -
      abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi))))`]
  2 [`pi / &2 -
      abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi)))) <=
      pi / &2`]

`asn (sin x) =
 pi / &2 - abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi))))`

`--(pi / &2) <=
 pi / &2 - abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi)))) /\
 pi / &2 - abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi)))) <=
 pi / &2`

`asn (sin x) =
 asn
 (sin
 (pi / &2 -
  abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi))))))`

# e( SIMP_TAC [GSYM COS_SIN;COS_ABS;GSYM SIN_COS;REAL_ARITH`x - &2 * pi * y = x + (&2 * pi) * (-- y)`;SIN_ADD;SIN_INTEGER_2PI;COS_INTEGER_2PI;FLOOR;INTEGER_NEG;REAL_MUL_RID;REAL_MUL_RZERO;REAL_ADD_RID]  );;
val it : goalstack = 1 subgoal (2 total)

`--(pi / &2) <=
 pi / &2 - abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi)))) /\
 pi / &2 - abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi)))) <=
 pi / &2`

# e( STRIP_TAC );;
val it : goalstack = 2 subgoals (3 total)

`pi / &2 - abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi)))) <=
 pi / &2`

`--(pi / &2) <=
 pi / &2 - abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi))))`

# e( SIMP_TAC [REAL_ARITH`--(pi / &2) <= pi / &2 - abs (pi / &2 - (x - &2 * pi * f)) <=> pi * f <= x / &2 + pi / &4 /\ x / &2 + pi / &4 <= pi * (f + &1)`;SIMP_RULE [PI_POS] (REAL_FIELD`&0 < pi ==> x / &2 + pi / &4 = pi * (x / (&2 * pi) + &1 / &4)`);SIMP_RULE [PI_POS] (REAL_FIELD`&0 < pi ==> (x + pi / &2) / (&2 * pi) = x / (&2 * pi) + &1 / &4`);PI_POS;REAL_LE_LMUL_EQ]);;
2 basis elements and 0 critical pairs
3 basis elements and 1 critical pairs
3 basis elements and 0 critical pairs
2 basis elements and 0 critical pairs
3 basis elements and 1 critical pairs
3 basis elements and 0 critical pairs
val it : goalstack = 1 subgoal (3 total)

`floor (x / (&2 * pi) + &1 / &4) <= x / (&2 * pi) + &1 / &4 /\
 x / (&2 * pi) + &1 / &4 <= floor (x / (&2 * pi) + &1 / &4) + &1`

# e( SIMP_TAC [FLOOR;REAL_LT_IMP_LE] );;
val it : goalstack = 1 subgoal (2 total)

`pi / &2 - abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi)))) <=
 pi / &2`

# e( REAL_ARITH_TAC );;
val it : goalstack = 1 subgoal (1 total)

  0 [`asn (sin x) =
      asn
      (sin
      (pi / &2 -
       abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi))))))`]
  1 [`--(pi / &2) <=
      pi / &2 -
      abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi))))`]
  2 [`pi / &2 -
      abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi)))) <=
      pi / &2`]

`asn (sin x) =
 pi / &2 - abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi))))`

# e( ASM_SIMP_TAC [ASN_SIN] );;
val it : goalstack = No subgoals

# top_thm () ;;
val it : thm =
  |- !x. asn (sin x) =
         pi / &2 -
         abs (pi / &2 - (x - &2 * pi * floor ((x + pi / &2) / (&2 * pi))))