Théorème 3Calculabilité
Théorème s-m-n
Pour tous , il existe une fonction primitive récursive telle que, pour tous , et ,
Démonstration
Soit ; ce registre est vide dans la configuration initiale de , et aucune des instructions ci-dessous ne l'incrémente. On fait précéder le programme d'indice , décodé comme au nœud Kleene, d'un préfixe qui transforme la configuration initiale de en celle de .
Pour , dans cet ordre, transfère dans , par la boucle , , ; comme , les registres d'arrivée sont vides quand on y transfère, ceux d'indice supérieur à ayant déjà été vidés. Puis contient, pour , instructions .
Le programme est suivi de , dont chaque saut devient , où est la longueur de ; un saut de vers devient un saut au-delà de la fin, et arrête encore le calcul. Le calcul de sur est celui de sur , précédé de celui de , qui s'arrête toujours.
Le code est primitif récursif. Le code de s'obtient par la fonction d'ajout de Codages, les instructions par récurrence primitive sur . Le code du programme décalé s'obtient par récurrence primitive sur le rang, en ajoutant, pour chaque terme , le terme s'il est pair, et sinon, avec et . On conclut par la concaténation.
□Le théorème dit qu'on peut fixer une partie des données d'un programme, et que le programme spécialisé se calcule à partir du programme initial et des données fixées. C'est l'outil qui permet de transformer une famille de questions en une seule, comme dans la preuve du théorème de Rice.
Il est dû à Kleene ; les sources ne s'accordent pas sur la date, 1938 (« On notation for ordinal numbers », Journal of Symbolic Logic 3) selon Odifreddi, 1943 selon d'autres. Sa preuve est ici élémentaire parce que le modèle est une machine : fixer une donnée, c'est écrire quelques instructions au début du programme.