⇐←0→
met de computer bewijzen correct bewijzen
Freek Wiedijk
Raboud Universiteit Nijmegen
Vakantiecursus Wiskunde
Eindhoven, 26 augustus 2017
Amsterdam, 2 september 2017
⇐←1→
het vermoeden van Kepler
Johannes Kepler en de zeshoekige sneeuwvlok
Strena Seu De Nive Sexangula, 1611
⇐←2→
Tom Hales en het Flyspeck-project
⇐←3→
John Harrison, Intel en HOL Light
⇐←4→
efficiënt bollen stapelen verschillende dichtste stapelingen
√ π
18 = 74,0480 . . . %
FCC = face-centered cubic = kubisch vlakgecentreerd
HCP = hexagonal close-packed = hexagonale dichtst
⇐←5→
hexagonale lagen
⇐←5→
hexagonale lagen
c a
a b c a
b c a b c
c a b c a
a b c a b
b c a b c
c a b c a
a b c a b
a b
c a
⇐←5→
hexagonale lagen
a
a b
c a
a b
c a
a b
FCC
⇐←5→
hexagonale lagen
a b a
b
a b a
b
a b a
b
HCP
⇐←6→
kubisch vlakgecentreerd
a
a
a
a
a
a b
b
b
b
b
b c
⇐←6→
kubisch vlakgecentreerd
⇐←6→
kubisch vlakgecentreerd
⇐←6→
kubisch vlakgecentreerd
⇐←6→
kubisch vlakgecentreerd
⇐←7→
vierkante lagen
⇐←7→
vierkante lagen
⇐←8→
het Flyspeck-bewijs de precieze formulering
voor iedere stapeling van bollen met straal één bestaat er een reëel getal c zodat voor het aantal middelpunten N van de gestapelde bollen binnen een groeiende grote bol met straal R geldt dat
N ≤ π
√ 18 R
3+ cR
2volume gestapelde bollen: N ·
43π volume groeiende grote bol:
43πR
3verhouding volumes: N ·
43π
4
3
πR
3= N R
3≤ π
√ 18 + c
R
⇐←8→
het Flyspeck-bewijs de precieze formulering
voor iedere stapeling van bollen met straal één bestaat er een reëel getal c zodat voor het aantal middelpunten N van de gestapelde bollen binnen een groeiende grote bol met straal R geldt dat
N ≤ π
√ 18 R
3+ cR
2volume gestapelde bollen: N ·
43π volume groeiende grote bol:
43πR
3verhouding volumes: N ·
43π
4
3
πR
3= N R
3≤ π
√ 18 + c
R
⇐←8→
het Flyspeck-bewijs de precieze formulering
voor iedere stapeling van bollen met straal één bestaat er een reëel getal c zodat voor het aantal middelpunten N van de gestapelde bollen binnen een groeiende grote bol met straal R geldt dat
N ≤ π
√ 18 R
3+ cR
2volume gestapelde bollen: N ·
43π volume groeiende grote bol:
43πR
3verhouding volumes: N ·
43π
4
3
πR
3= N R
3≤ π
√ 18 + c
R
⇐←9→
Voronoi-cellen
⇐←10→
verwaarloosbare FCC-compatible functies
4 √
2 = 5,55685 . . .
volume Voronoi-cel van de FCC-stapeling
voor iedere stapeling V
Sbestaat er een functie G(v) met X
v∈VS(0,R)
G(v) ≤ c
1R
2vol(Ω(V
S, v)) ≥ 4 √
2 − G(v)
⇐←11→
de lokale annulus-ongelijkheid
X
v∈VS
L(h(v)) ≤ 12
1 1.26 1
0 L(h)
⇐←12→
19.715 tamme grafen
⇐←13→
23.242 niet-lineaire ongelijkheden
tan( π
2 −0.74) >
−x
1x
3− x
2x
4+ x
1x
5+ x
3x
6− x
5x
6+ x
2(−x
2+ x
1+ x
3− x
4+ x
5+ x
6) v
u u u u t
4x
2
x
2x
4(−x
2+ x
1+ x
3− x
4+ x
5+ x
6) + x
1x
5(x
2− x
1+ x
3+ x
4− x
5+ x
6) +
x
3x
6(x
2+ x
1− x
3+ x
4+ x
5− x
6)
− x
1x
3x
4− x
2x
3x
5− x
2x
1x
6− x
4x
5x
6
⇐←14→
HOL Light een lemma uit het boek van Hales
Dense Sphere Packings: a Blueprint for Formal Proofs
⇐←15→
hetzelfde lemma in HOL Light
let NORM_CAUCHY_SCHWARZ = prove
(‘!(x:real^N) y. x dot y <= norm(x) * norm(y)‘, REPEAT STRIP_TAC THEN MAP_EVERY ASM_CASES_TAC
[‘norm(x:real^N) = &0‘; ‘norm(y:real^N) = &0‘] THEN ASM_SIMP_TAC[NORM_EQ_0_IMP; DOT_LZERO; DOT_RZERO;
REAL_MUL_LZERO; REAL_MUL_RZERO] THEN
MP_TAC(ISPEC ‘norm(y:real^N) % x - norm(x:real^N) % y‘ DOT_POS_LE) THEN REWRITE_TAC[DOT_RSUB; DOT_LSUB; DOT_LMUL; DOT_RMUL; GSYM NORM_POW_2;
REAL_POW_2; REAL_LE_REFL] THEN REWRITE_TAC[DOT_SYM; REAL_ARITH
‘&0 <= y * (y * x * x - x * d) - x * (y * d - x * y * y) <=>
x * y * d <= x * y * x * y‘] THEN
ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_LT_LE; NORM_POS_LE]);;
⇐←15→
hetzelfde lemma in HOL Light
let NORM_CAUCHY_SCHWARZ = prove
(‘!(x:real^N) y. x dot y <= norm(x) * norm(y)‘, REPEAT STRIP_TAC THEN MAP_EVERY ASM_CASES_TAC
[‘norm(x:real^N) = &0‘; ‘norm(y:real^N) = &0‘] THEN ASM_SIMP_TAC[NORM_EQ_0_IMP; DOT_LZERO; DOT_RZERO;
REAL_MUL_LZERO; REAL_MUL_RZERO] THEN
MP_TAC(ISPEC ‘norm(y:real^N) % x - norm(x:real^N) % y‘ DOT_POS_LE) THEN REWRITE_TAC[DOT_RSUB; DOT_LSUB; DOT_LMUL; DOT_RMUL; GSYM NORM_POW_2;
REAL_POW_2; REAL_LE_REFL] THEN REWRITE_TAC[DOT_SYM; REAL_ARITH
‘&0 <= y * (y * x * x - x * d) - x * (y * d - x * y * y) <=>
x * y * d <= x * y * x * y‘] THEN
ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_LT_LE; NORM_POS_LE]);;
⇐←16→
een klein voorbeeld: bewijs met inductie
n
X
i=1
i = n(n + 1)
2
⇐←16→
een klein voorbeeld: bewijs met inductie
0
X
i=1
i = 0 (0 + 1) 2
n
X
i=1
i = n(n + 1) 2
⇓
n+1
X
i=1
i = (n + 1)((n + 1) + 1)
2
⇐←16→
een klein voorbeeld: bewijs met inductie
0
X
i=1
i = 0 (0 + 1) 2
n
X
i=1
i = n(n + 1) 2
⇓
n+1
X
i=1
i = (n + 1)((n + 1) + 1) 2
n+1
X
i=1
i =
n
X
i=1
i + (n + 1) = ( n(n + 1)
2 ) + (n + 1) = (n + 1)((n + 1) + 1)
2
⇐←17→
Proofs without Words: Exercises in Visual Thinking
⇐←18→
HOL Light sessie: doelen en tactieken
#
⇐←18→
HOL Light sessie: doelen en tactieken
#g ‘!n. nsum (1..n) (\i. i) = (n*(n + 1)) DIV 2‘;;
val it : goalstack = 1 subgoal (1 total)
‘!n. nsum (1..n) (\i. i) = (n * (n + 1)) DIV 2‘
#
⇐←18→
HOL Light sessie: doelen en tactieken
#g ‘!n. nsum (1..n) (\i. i) = (n*(n + 1)) DIV 2‘;;
val it : goalstack = 1 subgoal (1 total)
‘!n. nsum (1..n) (\i. i) = (n * (n + 1)) DIV 2‘
#e INDUCT_TAC;;
val it : goalstack = 2 subgoals (2 total) 0 [‘nsum (1..n) (\i. i) = (n * (n + 1)) DIV 2‘]
‘nsum (1..SUC n) (\i. i) = (SUC n * (SUC n + 1)) DIV 2‘
‘nsum (1..0) (\i. i) = (0 * (0 + 1)) DIV 2‘
#
⇐←18→
HOL Light sessie: doelen en tactieken
#g ‘!n. nsum (1..n) (\i. i) = (n*(n + 1)) DIV 2‘;;
val it : goalstack = 1 subgoal (1 total)
‘!n. nsum (1..n) (\i. i) = (n * (n + 1)) DIV 2‘
#e INDUCT_TAC;;
val it : goalstack = 2 subgoals (2 total) 0 [‘nsum (1..n) (\i. i) = (n * (n + 1)) DIV 2‘]
‘nsum (1..SUC n) (\i. i) = (SUC n * (SUC n + 1)) DIV 2‘
‘nsum (1..0) (\i. i) = (0 * (0 + 1)) DIV 2‘
#NSUM_CLAUSES_NUMSEG;;
val it : thm =
|- (!m. nsum (m..0) f = (if m = 0 then f 0 else 0)) /\
(!m n.
nsum (m..SUC n) f =
(if m <= SUC n then nsum (m..n) f + f (SUC n) else nsum (m..n) f))
#
⇐←18→
HOL Light sessie: doelen en tactieken
#g ‘!n. nsum (1..n) (\i. i) = (n*(n + 1)) DIV 2‘;;
val it : goalstack = 1 subgoal (1 total)
‘!n. nsum (1..n) (\i. i) = (n * (n + 1)) DIV 2‘
#e INDUCT_TAC;;
val it : goalstack = 2 subgoals (2 total) 0 [‘nsum (1..n) (\i. i) = (n * (n + 1)) DIV 2‘]
‘nsum (1..SUC n) (\i. i) = (SUC n * (SUC n + 1)) DIV 2‘
‘nsum (1..0) (\i. i) = (0 * (0 + 1)) DIV 2‘
#NSUM_CLAUSES_NUMSEG;;
val it : thm =
|- (!m. nsum (m..0) f = (if m = 0 then f 0 else 0)) /\
(!m n.
nsum (m..SUC n) f =
(if m <= SUC n then nsum (m..n) f + f (SUC n) else nsum (m..n) f))
#e (REWRITE_TAC[NSUM_CLAUSES_NUMSEG]);;
val it : goalstack = 1 subgoal (2 total)
‘(if 1 = 0 then 0 else 0) = (0 * (0 + 1)) DIV 2‘
#
⇐←18→
HOL Light sessie: doelen en tactieken
val it : goalstack = 1 subgoal (2 total)
‘(if 1 = 0 then 0 else 0) = (0 * (0 + 1)) DIV 2‘
#e ARITH_TAC;;
val it : goalstack = 1 subgoal (1 total) 0 [‘nsum (1..n) (\i. i) = (n * (n + 1)) DIV 2‘]
‘nsum (1..SUC n) (\i. i) = (SUC n * (SUC n + 1)) DIV 2‘
#
⇐←18→
HOL Light sessie: doelen en tactieken
val it : goalstack = 1 subgoal (2 total)
‘(if 1 = 0 then 0 else 0) = (0 * (0 + 1)) DIV 2‘
#e ARITH_TAC;;
val it : goalstack = 1 subgoal (1 total) 0 [‘nsum (1..n) (\i. i) = (n * (n + 1)) DIV 2‘]
‘nsum (1..SUC n) (\i. i) = (SUC n * (SUC n + 1)) DIV 2‘
#e (REWRITE_TAC[NSUM_CLAUSES_NUMSEG]);;
val it : goalstack = 1 subgoal (1 total) 0 [‘nsum (1..n) (\i. i) = (n * (n + 1)) DIV 2‘]
‘(if 1 <= SUC n then nsum (1..n) (\i. i) + SUC n else nsum (1..n) (\i. i)) = (SUC n * (SUC n + 1)) DIV 2‘
#
⇐←18→
HOL Light sessie: doelen en tactieken
val it : goalstack = 1 subgoal (1 total) 0 [‘nsum (1..n) (\i. i) = (n * (n + 1)) DIV 2‘]
‘(if 1 <= SUC n then nsum (1..n) (\i. i) + SUC n else nsum (1..n) (\i. i)) = (SUC n * (SUC n + 1)) DIV 2‘
#e (ASM_REWRITE_TAC[]);;
val it : goalstack = 1 subgoal (1 total) 0 [‘nsum (1..n) (\i. i) = (n * (n + 1)) DIV 2‘]
‘(if 1 <= SUC n then (n * (n + 1)) DIV 2 + SUC n else (n * (n + 1)) DIV 2) = (SUC n * (SUC n + 1)) DIV 2‘
#
⇐←18→
HOL Light sessie: doelen en tactieken
val it : goalstack = 1 subgoal (1 total) 0 [‘nsum (1..n) (\i. i) = (n * (n + 1)) DIV 2‘]
‘(if 1 <= SUC n then nsum (1..n) (\i. i) + SUC n else nsum (1..n) (\i. i)) = (SUC n * (SUC n + 1)) DIV 2‘
#e (ASM_REWRITE_TAC[]);;
val it : goalstack = 1 subgoal (1 total) 0 [‘nsum (1..n) (\i. i) = (n * (n + 1)) DIV 2‘]
‘(if 1 <= SUC n then (n * (n + 1)) DIV 2 + SUC n else (n * (n + 1)) DIV 2) = (SUC n * (SUC n + 1)) DIV 2‘
#e ARITH_TAC;;
val it : goalstack = No subgoals
#
⇐←18→
HOL Light sessie: doelen en tactieken
val it : goalstack = 1 subgoal (1 total) 0 [‘nsum (1..n) (\i. i) = (n * (n + 1)) DIV 2‘]
‘(if 1 <= SUC n then nsum (1..n) (\i. i) + SUC n else nsum (1..n) (\i. i)) = (SUC n * (SUC n + 1)) DIV 2‘
#e (ASM_REWRITE_TAC[]);;
val it : goalstack = 1 subgoal (1 total) 0 [‘nsum (1..n) (\i. i) = (n * (n + 1)) DIV 2‘]
‘(if 1 <= SUC n then (n * (n + 1)) DIV 2 + SUC n else (n * (n + 1)) DIV 2) = (SUC n * (SUC n + 1)) DIV 2‘
#e ARITH_TAC;;
val it : goalstack = No subgoals
#top_thm();;
val it : thm = |- !n. nsum (1..n) (\i. i) = (n * (n + 1)) DIV 2
#
⇐←18→
HOL Light sessie: doelen en tactieken
let TRIANGULAR_SUM = prove
(‘!n. nsum (1..n) (\i. i) = (n*(n + 1)) DIV 2‘, INDUCT_TAC THENL
[REWRITE_TAC[NSUM_CLAUSES_NUMSEG] THEN ARITH_TAC;
REWRITE_TAC[NSUM_CLAUSES_NUMSEG] THEN ASM_REWRITE_TAC[] THEN
ARITH_TAC]);;
⇐←18→
HOL Light sessie: doelen en tactieken
let TRIANGULAR_SUM = prove
(‘!n. nsum (1..n) (\i. i) = (n*(n + 1)) DIV 2‘, INDUCT_TAC THEN
ASM_REWRITE_TAC[NSUM_CLAUSES_NUMSEG] THEN ARITH_TAC);;
⇐←19→
formele bewijzen in de computer
Coq en Isabelle
⇐←20→
formalisaties van George Gonthier
iedere vlakke kaart is kleurbaar met vier kleuren
iedere eindige groep van oneven orde is oplosbaar
⇐←21→
het criterium van N.G. de Bruijn
eenvoudige checker die volledige wiskundige correctheid garandeert
⇐←22→
de drie revoluties in de wiskunde
bewijzen rigoreus formeel
bewijzen rigoreus
bewijzen
⇐←23→