Denkende Machines -- Computers, rekenen, redeneren - CWI
Denkende Machines -- Computers, rekenen, redeneren - CWI
Denkende Machines -- Computers, rekenen, redeneren - CWI
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
3.4. REKENTIJDEN 83<br />
Kortom, een programma HALT dat voor elk programma bepaalt of het stopt of niet, startend<br />
met lege registers, kan niet bestaan. Wat hier direct uit volgt, en wat van groot belang is om te<br />
weten, is dat niet alles berekenbaar is.<br />
Misschien vind je het Q programma nogal vreemd, omdat er in Q een verwijzing zit naar<br />
het programma zelf, in de vorm van de getalscode q. Er zijn echter ook problemen die er op<br />
het eerste oog veel onschuldiger uitzien, en die eveneens niet berekenbaar zijn. Een bekend<br />
voorbeeld is het volgende. Stel we hebben te maken met twee verschillende manieren om een<br />
eindig aantal symbolen met 0-en en 1-en te coderen. Bijvoorbeeld:<br />
a b c d<br />
eerste codering 11 01 01110 1001<br />
tweede codering 101 011 1010 01<br />
De vraag is nu of er een rijtje symbolen te geven is dat na codering volgens de twee verschillende<br />
methoden toch dezelfde rij van 0-en 1-en oplevert. In het geval hierboven kunnen we<br />
het positief beantwoorden, want babcd geeft voor beide coderingen hetzelfde resultaat, namelijk<br />
011101011101001. De vraag is nu of er een programma te schrijven valt dat voor een willekeurig<br />
alfabet van symbolen en voor twee willekeurige binaire coderingen voor dat alfabet berekent of<br />
er een gemeenschappelijk rijtje zoals in het geval hierboven te geven is. Het antwoord op die<br />
vraag is ‘nee’, en daarmee is dit zogenaamde correspondentieprobleem van Post (genoemd naar<br />
de logicus die het probleem verzonnen heeft) een onberekenbaar probleem. Als het gaat om<br />
het stopgedrag van programma’s moeten mensen het trouwens ook nog wel eens laten afweten.<br />
Neem het volgende programma.<br />
while (!(x = 1)) {<br />
if (x % 2 = 0) { x := x/2 }<br />
else { x := 3*x + 1 }<br />
}<br />
Starten met bijvoorbeeld x = 9 levert de rij<br />
9, 28, 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 4, 2, 1<br />
op. Indien dit programma voor verschillende positieve gehele getallen x wordt uitgevoerd blijkt<br />
het steeds te eindigen (soms met verrassend hoge tussenwaarden). Echter, tot op heden is er<br />
niemand in geslaagd te bewijzen dat dit programma altijd eindigt.<br />
Opdracht 3.27 Voor de regenachtige zaterdagmiddag: probeer dit programma eens na te <strong>rekenen</strong><br />
voor x = 27 (een rekenmachine is handig).<br />
3.4.2 Tijdscomplexiteit<br />
Ook al is een probleem berekenbaar volgens de Turing these, dan nog kan het computationeel<br />
onhanteerbaar zijn. De complexiteit van een probleem kan dusdanig zijn dat er alleen maar<br />
programma’s te schrijven zijn die wel stoppen, maar pas na een enorme lange wachttijd. In de