素数全体の集合が上に有界でないこと
g `~(?n. !p. prime p ==> p <= n)` ;; e( STRIP_TAC THEN ABBREV_TAC `k = FACT n + 1` );; e( SUBGOAL_THEN `?p. prime p /\ p divides k` MP_TAC );; e( ASM_MESON_TAC [FACT_LE; ARITH_RULE `1 <= f ==> ~(f + 1 = 1)`; PRIME_FACTOR] );; e( STRIP_TAC THEN FIRST_X_ASSUM (ASSUME_TAC o (UNDISCH o (SPEC `p:num`))) );; e( ASM_MESON_TAC [DIVIDES_FACT_PRIME; COPRIME_PLUS1; coprime; prime] );; # g `~(?n. !p. prime p ==> p <= n)` ;; val it : goalstack = 1 subgoal (1 total) `~(?n. !p. prime p ==> p <= n)` # e( STRIP_TAC THEN ABBREV_TAC `k = FACT n + 1` );; val it : goalstack = 1 subgoal (1 total) 0 [`!p. prime p ==> p <= n`] 1 [`FACT n + 1 = k`] `F` # e( SUBGOAL_THEN `?p. prime p /\ p divides k` MP_TAC );; val it : goalstack = 2 subgoals (2 total) 0 [`!p. prime p ==> p <= n`] 1 [`FACT n + 1 = k`] `(?p. prime p /\ p divides k) ==> F` 0 [`!p. prime p ==> p <= n`] 1 [`FACT n + 1 = k`] `?p. prime p /\ p divides k` # e( ASM_MESON_TAC [FACT_LE; ARITH_RULE `1 <= f ==> ~(f + 1 = 1)`; PRIME _FACTOR] );; 0..0..0..3..8..18..solved at 24 val it : goalstack = 1 subgoal (1 total) 0 [`!p. prime p ==> p <= n`] 1 [`FACT n + 1 = k`] `(?p. prime p /\ p divides k) ==> F` # e( STRIP_TAC THEN FIRST_X_ASSUM (ASSUME_TAC o (UNDISCH o (SPEC `p:num` ))) );; val it : goalstack = 1 subgoal (1 total) 0 [`FACT n + 1 = k`] 1 [`prime p`] 2 [`p divides k`] 3 [`p <= n`] `F` # e( ASM_MESON_TAC [DIVIDES_FACT_PRIME; COPRIME_PLUS1; coprime; prime] ) ;; 0..0..0..2..5..18..41..78..solved at 103 val it : goalstack = No subgoals
miz3 へコンバートすると...
# miz3_of_hol "test.ml" "thm20130322_2";; 0..0..0..3..8..18..solved at 24 0..0..0..2..5..18..41..78..solved at 103 val it : step = ~(?n. !p. prime p ==> p <= n) [1] proof !n. (!p. prime p ==> p <= n) ==> F [2] proof let n be num; assume !p. prime p ==> p <= n [3]; !k. FACT n + 1 = k ==> F [4] proof let k be num; assume FACT n + 1 = k [5]; ?p. prime p /\ p divides k [6] by ASM_MESON_TAC [FACT_LE; ARITH_RULE (parse_term "1 <= f ==> ~(f + 1 = 1)"); PRIME_FACTOR],3,5; !p. p divides k ==> prime p ==> F [7] proof let p be num; assume p divides k [8]; assume prime p [9]; p <= n ==> F [10] proof assume p <= n [11]; qed by ASM_MESON_TAC [DIVIDES_FACT_PRIME; COPRIME_PLUS1; coprime; prime],5,9,8,11; qed by FIRST_X_ASSUM (ASSUME_TAC o (UNDISCH o (SPEC (parse_term "p:num")))),3,5,9,8 from 10; (?p. prime p /\ p divides k) ==> F [12] by STRIP_TAC,3,5 from 7; qed by SUBGOAL_THEN (parse_term "?p. prime p /\\ p divides k") MP_TAC,3,5 from 6,12; qed by ABBREV_TAC (parse_term "k = FACT n + 1"),3 from 4; qed by STRIP_TAC from 1;