有理整数の性質 by HOL4.

やはり METIS は優秀です.
http://www.gilith.com/research/metis/
MESON による PROVE_TAC ではこうは行きません.

load "numRingLib";
open arithmeticTheory numLib numRingLib;

val def1 = Define `p n = (n*n+n+1) MOD 5 <> 0`;
val def2 = Define `p04 <=> (p 0)/\(p 1)/\(p 2)/\(p 3)/\(p 4)`;
val lem1 = ARITH_CONV``0<5:num``;
val lem2 = REDUCE_RULE(REWRITE_CONV[def1,def2]``p04``);

g `!n. (n * n + n + 1) MOD 5 <> 0` ;
e GEN_TAC;
e( SUBGOAL_THEN ``(n MOD 5 * n MOD 5 + n MOD 5 + 1) MOD 5 <> 0`` MP_TAC );
e( MP_TAC(PROVE[lem1,MOD_LESS]``(n MOD 5)< 5``) );
e( Q.ABBREV_TAC `r=n MOD 5` );;
e( METIS_TAC[def1,def2,lem2,ARITH_CONV``!r:num. (r<5)==>((r=0)\/(r=1)\/(r=2)\/(r=3)\/(r=4))``] );
e( METIS_TAC[lem1,MOD_MOD,MOD_PLUS,MOD_TIMES2] );
> val it =
    Proof manager status: 1 proof.
    1. Incomplete goalstack:
         Initial goal:
    
         ∀n. (n * n + n + 1) MOD 5 ≠ 0
    
    
     : proofs
- OK..
1 subgoal:
> val it =
    
    (n * n + n + 1) MOD 5 ≠ 0
    
     : proof
- OK..
2 subgoals:
> val it =
    
    (n MOD 5 * n MOD 5 + n MOD 5 + 1) MOD 5 ≠ 0 ⇒ (n * n + n + 1) MOD 5 ≠ 0
    
    
    
    (n MOD 5 * n MOD 5 + n MOD 5 + 1) MOD 5 ≠ 0
    
     : proof
- Meson search level: ...
OK..
1 subgoal:
> val it =
    
    n MOD 5 < 5 ⇒ (n MOD 5 * n MOD 5 + n MOD 5 + 1) MOD 5 ≠ 0
    
     : proof
- OK..
1 subgoal:
> val it =
    
    r < 5 ⇒ (r * r + r + 1) MOD 5 ≠ 0
    ------------------------------------
      Abbrev (r = n MOD 5)
     : proof
- - OK..
metis: r[+0+13]+0+0+0+0+0+0+0+0+0+0+0+5+0+0+0+0+0+1+4+1+4+1+4+1+10+3#

Goal proved.
 [Abbrev (r = n MOD 5)] |- r < 5 ⇒ (r * r + r + 1) MOD 5 ≠ 0

Goal proved.
 [] |- n MOD 5 < 5 ⇒ (n MOD 5 * n MOD 5 + n MOD 5 + 1) MOD 5 ≠ 0

Goal proved.
 [] |- (n MOD 5 * n MOD 5 + n MOD 5 + 1) MOD 5 ≠ 0

Remaining subgoals:
> val it =
    
    (n MOD 5 * n MOD 5 + n MOD 5 + 1) MOD 5 ≠ 0 ⇒ (n * n + n + 1) MOD 5 ≠ 0
    
     : proof
- OK..
metis: r[+0+7]+0+0+0+0+1+1+1+1+0+8+1+11+2+5+7+8+11+0+10+6+5+15+8+18r+7+9+22+18+22r+26+28+19+23r+13+10+31+30r+29+33+30+35r+35+34+55r#

Goal proved.
 []
|- (n MOD 5 * n MOD 5 + n MOD 5 + 1) MOD 5 ≠ 0 ⇒
   (n * n + n + 1) MOD 5 ≠ 0

Goal proved.
 [] |- (n * n + n + 1) MOD 5 ≠ 0
> val it =
    Initial goal proved.
     [] |- ∀n. (n * n + n + 1) MOD 5 ≠ 0
     : proof