それでも HOL4 には...
METIS があります.HOL Light には MESON しかなく,口惜しい限りです.
load "dividesTheory"; open dividesTheory; val ARITH_RULE = SIMP_CONV(arith_ss++ARITH_ss)[divides_def]; val lem = ARITH_RULE ``~(9=0:num) /\ ~(2=0:num) /\ ~(4=0:num) /\ ~(5=0:num) /\ ~(6=0:num) /\ ~(7=0:num) /\ ~(8=0:num) /\ (!m:num. m<=9 ==> (m=0) \/ (m=1) \/ (m=2) \/ (m=3) \/ (m=4) \/ (m=5) \/ (m=6) \/ (m=7) \/ (m=8) \/ (m=9) ) /\ ~(divides 2 9) /\ ~(divides 4 9) /\ ~(divides 5 9) /\ ~(divides 6 9) /\ ~(divides 7 9) /\ ~(divides 8 9)``; METIS_PROVE[ZERO_DIVIDES, DIVIDES_LEQ_OR_ZERO, lem]``!m:num. divides m 9 ==> (m=1) \/ (m=3) \/ (m=9)``; - val lem = ARITH_RULE ``~(9=0:num) /\ ~(2=0:num) /\ ~(4=0:num) /\ ~(5=0:num) /\ ~(6=0:num) /\ ~(7=0:num) /\ ~(8=0:num) /\ (!m:num. m<=9 ==> (m=0) \/ (m=1) \/ (m=2) \/ (m=3) \/ (m=4) \/ (m=5) \/ (m=6) \/ (m=7) \/ (m=8) \/ (m=9) ) /\ ~(divides 2 9) /\ ~(divides 4 9) /\ ~(divides 5 9) /\ ~(divides 6 9) /\ ~(divides 7 9) /\ ~(divides 8 9)``; > val lem = [] |- 9 <> 0 /\ 2 <> 0 /\ 4 <> 0 /\ 5 <> 0 /\ 6 <> 0 /\ 7 <> 0 /\ 8 <> 0 /\ (!m. m <= 9 ==> (m = 0) \/ (m = 1) \/ (m = 2) \/ (m = 3) \/ (m = 4) \/ (m = 5) \/ (m = 6) \/ (m = 7) \/ (m = 8) \/ (m = 9)) /\ ~divides 2 9 /\ ~divides 4 9 /\ ~divides 5 9 /\ ~divides 6 9 /\ ~divides 7 9 /\ ~divides 8 9 <=> T : thm - METIS_PROVE[ZERO_DIVIDES, DIVIDES_LEQ_OR_ZERO, lem]``!m:num. divides m 9 ==> (m=1) \/ (m=3) \/ (m=9)``; metis: r[+0+22]+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+1+0+1+1+1+1+1+1+3+1# > val it = [] |- !m. divides m 9 ==> (m = 1) \/ (m = 3) \/ (m = 9) : thm
同じことを HOL Light でやっても
# let lem = ARITH_RULE `~(9=0:num) /\ ~(2=0:num) /\ ~(4=0:num) /\ ~(5=0:num) /\ ~(6=0:num) /\ ~(7=0:num) /\ ~(8=0:num) /\ (!m:num. 1<=m /\ m<=9 ==> (m=1) \/ (m= 2) \/ (m=3) \/ (m=4) \/ (m=5) \/ (m=6) \/ (m=7) \/ (m=8) \/ (m=9) ) /\ ~(9 MOD 2 =0:num) /\ ~(9 MOD 4=0:num) /\ ~(9 MOD 5=0:num) /\ ~(9 MOD 6=0:num) /\ ~(9 MOD 7 =0:num) /\ ~(9 MOD 8=0:num)`;; val lem : thm = |- ~(9 = 0) /\ ~(2 = 0) /\ ~(4 = 0) /\ ~(5 = 0) /\ ~(6 = 0) /\ ~(7 = 0) /\ ~(8 = 0) /\ (!m. 1 <= m /\ m <= 9 ==> m = 1 \/ m = 2 \/ m = 3 \/ m = 4 \/ m = 5 \/ m = 6 \/ m = 7 \/ m = 8 \/ m = 9) /\ ~(9 MOD 2 = 0) /\ ~(9 MOD 4 = 0) /\ ~(9 MOD 5 = 0) /\ ~(9 MOD 6 = 0) /\ ~(9 MOD 7 = 0) /\ ~(9 MOD 8 = 0) # MESON[DIVIDES_LE_STRONG; DIVIDES_MOD; lem] `m divides 9 ==> m=1 \/ m=3 \/ m=9` ;; 0..0..16..39..160..324..539..925..1401..1967..3947..6083..8708..13922..20425..27 447..42673..60257..79062..121878..171932..226393..358326..511500..674976..113476 9..1664765..2227624..4073497..6188804..8436365..
...終わりそうにありません.
ここで参照している2つの定理は,HOL4 にはないので
- val DIVIDES_LE_STRONG = METIS_PROVE[ZERO_DIVIDES, DIVIDES_LEQ_OR_ZERO, ARITH_C ONV``!m:num. ~(m=0)==>1<=m``]``!m n:num. divides m n ==> (1 <= m /\ m <= n \/ (n = 0))``; metis: r[+0+8]+0+0+0+0+0+0+1+0+1+4+1# > val DIVIDES_LE_STRONG = [] |- !m n. divides m n ==> 1 <= m /\ m <= n \/ (n = 0) : thm - val DIVIDES_MOD = METIS_PROVE [ARITH_SIMP[]``!b:num. b MOD 1 = 0``, ARITH_SIMP []``!a:num. a<>0 /\ a<>0 ==> (0 MOD a = 0)``, compute_divides] ``!m n:num. ~(m = 0) ==> (divides m n <=> (n MOD m = 0))``; metis: r[+0+15]+0+0+0+0+0+0+0+0+0+0+0+0+0+1+1# r[+0+15]+0+0+0+0+0+0+0+0+0+0+1+0+0+0+0+1+2+2+1# > val DIVIDES_MOD = [] |- !m n. m <> 0 ==> (divides m n <=> (n MOD m = 0)) : thm
のように新作し,同じ仮定を与えて METIS に渡すと
- val lem = ARITH_SIMP[] ``~(9=0:num) /\ ~(2=0:num) /\ ~(4=0:num) /\ ~(5=0:num) /\ ~(6=0:num) /\ ~(7=0:num) /\ ~(8=0:num) /\ (!m:num. 1<=m /\ m<=9 ==> (m=1) \/ (m=2) \/ (m=3) \/ (m=4) \/ (m=5) \/ (m=6) \/ (m=7) \/ (m=8) \/ (m=9) ) /\ ~(9 MO D 2=0:num) /\ ~(9 MOD 4=0:num) /\ ~(9 MOD 5=0:num) /\ ~(9 MOD 6=0:num) /\ ~(9 MO D 7=0:num) /\ ~(9 MOD 8=0:num)``; > val lem = [] |- 9 <> 0 /\ 2 <> 0 /\ 4 <> 0 /\ 5 <> 0 /\ 6 <> 0 /\ 7 <> 0 /\ 8 <> 0 /\ (!m. 1 <= m /\ m <= 9 ==> (m = 1) \/ (m = 2) \/ (m = 3) \/ (m = 4) \/ (m = 5) \/ (m = 6) \/ (m = 7) \/ (m = 8) \/ (m = 9)) /\ 9 MOD 2 <> 0 /\ 9 MOD 4 <> 0 /\ 9 MOD 5 <> 0 /\ 9 MOD 6 <> 0 /\ 9 MOD 7 <> 0 /\ 9 MOD 8 <> 0 <=> T : thm - METIS_PROVE[DIVIDES_LE_STRONG, DIVIDES_MOD, lem] ``!m:num. divides m 9 ==> (m= 1) \/ (m=3) \/ (m=9)``; metis: r[+0+23]+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+1+0+1+1+0+2+0+0+0+2+2+0+1+1+ 1+1+1+1+1+1+2+1# > val it = [] |- !m. divides m 9 ==> (m = 1) \/ (m = 3) \/ (m = 9) : thm
と即答です.勿論,HOL4 に PROVE として実装されている MESON では延々です.