不等式の性質 by HOL4.

http://d.hatena.ne.jp/ehito/20130313/1363131870
の定理の HOL4 による証明です.

- g `!s t a b:real. 0<=s /\ 0<=t /\ (s+t=1) /\ 0<=a /\ 0<=b ==> !n. (s*a+t*b) pow n <= s*a pow n + t*b pow n` ;
> val it =
    Proof manager status: 1 proof.
    1. Incomplete goalstack:
         Initial goal:

         !s t a b.
           0 <= s /\ 0 <= t /\ (s + t = 1) /\ 0 <= a /\ 0 <= b ==>
           !n. (s * a + t * b) pow n <= s * a pow n + t * b pow n


     : proofs
- e( REPEAT STRIP_TAC THEN Induct_on `n` );
OK..
2 subgoals:
> val it =

    (s * a + t * b) pow SUC n <= s * a pow SUC n + t * b pow SUC n
    ------------------------------------
      0.  0 <= s
      1.  0 <= t
      2.  s + t = 1
      3.  0 <= a
      4.  0 <= b
      5.  (s * a + t * b) pow n <= s * a pow n + t * b pow n


    (s * a + t * b) pow 0 <= s * a pow 0 + t * b pow 0
    ------------------------------------
      0.  0 <= s
      1.  0 <= t
      2.  s + t = 1
      3.  0 <= a
      4.  0 <= b
     : proof
- e( METIS_TAC [pow, REAL_MUL_RID, REAL_LE_REFL] );
OK..
metis: r[+0+11]+0+0+0+0+0+0+1+0+1+1+1+0+0#

Goal proved.
 [s + t = 1, 0 <= a, 0 <= b, 0 <= s, 0 <= t]
|- (s * a + t * b) pow 0 <= s * a pow 0 + t * b pow 0

Remaining subgoals:
> val it =

    (s * a + t * b) pow SUC n <= s * a pow SUC n + t * b pow SUC n
    ------------------------------------
      0.  0 <= s
      1.  0 <= t
      2.  s + t = 1
      3.  0 <= a
      4.  0 <= b
      5.  (s * a + t * b) pow n <= s * a pow n + t * b pow n
     : proof
- e( REWRITE_TAC [pow] );
OK..
1 subgoal:
> val it =

    (s * a + t * b) * (s * a + t * b) pow n <=
    s * (a * a pow n) + t * (b * b pow n)
    ------------------------------------
      0.  0 <= s
      1.  0 <= t
      2.  s + t = 1
      3.  0 <= a
      4.  0 <= b
      5.  (s * a + t * b) pow n <= s * a pow n + t * b pow n
     : proof
- val lem1 = PROVE [REAL_LE_MUL, REAL_LE_ADD]``!s t a b:real. 0 <= s ==> 0 <= t ==> 0 <= a ==> 0 <= b ==> 0 <= s*a + t*b``;
Meson search level: ..........
> val lem1 =
     []
    |- !s t a b.
         0 <= s ==> 0 <= t ==> 0 <= a ==> 0 <= b ==> 0 <= s * a + t * b : thm
- val lem2 = SPECL [``s*a + t*b:real``,``(s*a + t*b) pow n``,``s*a pow n + t*b pow n``] REAL_LE_LMUL_IMP;
> val lem2 =
     []
    |- 0 <= s * a + t * b /\
       (s * a + t * b) pow n <= s * a pow n + t * b pow n ==>
       (s * a + t * b) * (s * a + t * b) pow n <=
       (s * a + t * b) * (s * a pow n + t * b pow n) : thm
- e( SUBGOAL_THEN ``(s*a + t*b) * (s*a pow n + t*b pow n) <= s * (a * a pow n) + t * (b * b pow n)``  (fn t => MAP_EVERY MP_TAC [t,SPEC_ALL lem1,lem2]
 THEN PROVE_TAC [REAL_LE_TRANS] )  );
OK..
Meson search level: ................................
1 subgoal:
> val it =

    (s * a + t * b) * (s * a pow n + t * b pow n) <=
    s * (a * a pow n) + t * (b * b pow n)
    ------------------------------------
      0.  0 <= s
      1.  0 <= t
      2.  s + t = 1
      3.  0 <= a
      4.  0 <= b
      5.  (s * a + t * b) pow n <= s * a pow n + t * b pow n
     : proof
- val lem3 = EQT_ELIM (SIMP_CONV (real_ss ++ REAL_ARITH_ss) [GSYM REAL_EQ_SUB_LADD] ``!s t a b x y:real. (s+t=1) ==> (s * (a * x) + t * (b * y) - (s *
 a + t * b) * (s * x + t * y)=(b-a)*(y-x)*s*t)``);
> val lem3 =
     []
    |- !s t a b x y.
         (s + t = 1) ==>
         (s * (a * x) + t * (b * y) - (s * a + t * b) * (s * x + t * y) =
          (b - a) * (y - x) * s * t) : thm
- e( ONCE_REWRITE_TAC [GSYM REAL_SUB_LE]  );
OK..
1 subgoal:
> val it =

    0 <=
    s * (a * a pow n) + t * (b * b pow n) -
    (s * a + t * b) * (s * a pow n + t * b pow n)
    ------------------------------------
      0.  0 <= s
      1.  0 <= t
      2.  s + t = 1
      3.  0 <= a
      4.  0 <= b
      5.  (s * a + t * b) pow n <= s * a pow n + t * b pow n
     : proof
- e( REWRITE_TAC [UNDISCH(SPEC_ALL lem3)]  );
OK..
1 subgoal:
> val it =

    0 <= (b - a) * (b pow n - a pow n) * s * t
    ------------------------------------
      0.  0 <= s
      1.  0 <= t
      2.  s + t = 1
      3.  0 <= a
      4.  0 <= b
      5.  (s * a + t * b) pow n <= s * a pow n + t * b pow n
     : proof
- e( METIS_TAC [POW_LE, REAL_SUB_LE, REAL_LE_MUL, REAL_LE_TOTAL,  REAL_NEG_MUL2, REAL_NEG_SUB]  );
OK..
metis: r[+0+16]+0+0+0+0+0+0+0+0+2+0+0+0+0+0+2+0+1+0+0+5+1+1+7+1+1+1+0+2+1+2+1+1#

Goal proved.

[s + t = 1, 0 <= a, 0 <= b, 0 <= s, 0 <= t,
 (s * a + t * b) pow n <= s * a pow n + t * b pow n]
|- 0 <= (b - a) * (b pow n - a pow n) * s * t

Goal proved.

[s + t = 1, 0 <= a, 0 <= b, 0 <= s, 0 <= t,
 (s * a + t * b) pow n <= s * a pow n + t * b pow n]
|- 0 <=
   s * (a * a pow n) + t * (b * b pow n) -
   (s * a + t * b) * (s * a pow n + t * b pow n)

Goal proved.

[s + t = 1, 0 <= a, 0 <= b, 0 <= s, 0 <= t,
 (s * a + t * b) pow n <= s * a pow n + t * b pow n]
|- (s * a + t * b) * (s * a pow n + t * b pow n) <=
   s * (a * a pow n) + t * (b * b pow n)

Goal proved.

[s + t = 1, 0 <= a, 0 <= b, 0 <= s, 0 <= t,
 (s * a + t * b) pow n <= s * a pow n + t * b pow n]
|- (s * a + t * b) * (s * a + t * b) pow n <=
   s * (a * a pow n) + t * (b * b pow n)

Goal proved.

[s + t = 1, 0 <= a, 0 <= b, 0 <= s, 0 <= t,
 (s * a + t * b) pow n <= s * a pow n + t * b pow n]
|- (s * a + t * b) pow SUC n <= s * a pow SUC n + t * b pow SUC n
> val it =
    Initial goal proved.
     []
    |- !s t a b.
         0 <= s /\ 0 <= t /\ (s + t = 1) /\ 0 <= a /\ 0 <= b ==>
         !n. (s * a + t * b) pow n <= s * a pow n + t * b pow n : proof
-