La preuve de ce résultat repose sur un argument diagonal, tout comme la preuve d'indénombrabilité des réels Cantor (1891) et celle du théorème d'incomplétude de Gödel (1931).
Dans le cas général tout programme est une fonction PROG() qui transforme une chaîne de bits ch (appelée l'entrée) en une autre chaîne de bits PROG(ch) (appelée la sortie, éventuellement la sortie peut ne pas dépendre de l'entrée). Bien sûr, tout programme PROG() est en fait une chaîne de bits prog (qui représente le codage de PROG). Dans la suite on notera ch1ch2 la chaîne obtenue en concaténant les deux chaînes ch1 et ch2.
Supposons par l'absurde qu'il existe un programme HALT() tel que HALT(progch)=1 si PROG(ch) s'arrête, et HALT(progch)=0 si au contraire PROG(ch) boucle infiniment. On pourrait alors construire le programme TROUBLE() suivant:
TROUBLE(ch)
1. faire HALT(chch)
2. si HALT(chch)=1, alors faire{...} tant que(vrai)
Mais, on obtient une contradiction pour l'entrée trouble. En effet, supposons que TROUBLE(trouble) s'arrête, alors par définition de HALT(), on a HALT(troubletrouble)=1. Par définition de TROUBLE(), on a alors que TROUBLE(trouble) boucle infiniment. Admettons alors que TROUBLE(trouble) boucle infiniment. Dans ce cas par définition de HALT(), on a HALT(troubletrouble)=0 et donc par définition de TROUBLE(), on a TROUBLE(trouble) qui s'arrête. Cette contradiction prouve donc que HALT() n'existe pas.