À la fin de la partie du cours concernant la récursivité, on a énoncé les vérifications minimum à faire lorsqu'on écrit une fonction récursive, à savoir :
Nous avons vu aussi que la définition de fonctions récursives est liée au principe de récurrence. C'est aussi ce principe que l'on va utiliser pour raisonner sur des fonctions récursives.
Supposons, sans perte de généralité, que la plus petite taille du problème est 0 et notons f(n) le résultat de la fonction f pour le problème à la taille n.
Les preuves de la correction et de l'arrêt de f se font de la manière suivante :
Le principe de récurrence nous permet alors de dire que la propriété P est vraie pour toutes les tailles.
Considérons le problème suivant : étant donnés une liste L de nombres triée en ordre croissant, et un nombre e, on veut écrire une fonction qui insère e dans L à sa place, c'est à dire telle que le résultat soit une liste triée en ordre croissant.
On propose la fonction suivante :
(define insere
(lambda (e L)
(cond ((null? L) (liste e))
((<= e (car L)) (cons e L))
(else (cons (car L) (insere e (cdr L)))) )))
On va montrer que cette fonction se termine et qu'elle rend bien le résultat voulu. Pour cela nous raisonnerons par récurrence sur la longueur de la liste dans laquelle on insère un élément.
Si L est une liste vide alors le calcul de (insere e '()) se résume à l'évaluation de l'expression (cons e l) qui se termine.
Deux cas se présentent :
Plus précisément, étant donnée une liste
de longueur n et une entier e:
Il faut donc montrer que (insere e L) vérifie Pt et Pe, quelque soit la liste L.
Si L est de longueur nulle alors L est la liste vide et le résultat de (insere e '()) est la liste (e) qui, de manière évidente, est triée en ordre croissant et contient e.
Soit
une liste triée en ordre croissant de longueur n. Pour le calcul de (insere e L)1, deux cas se présentent :
(cdr L) étant une liste de longueur n-1, par hypothèse e appartient à la liste (insere e (cdr L)) et a fortiori à la liste L'. La propriété Pe est bien vérifiée.
Il faut encore vérifier que L' est triée en ordre croissant.
Le résultat de (insere e (cdr L)) s'écrit:
Dans le second cas, par hypothèse la liste
est triée en ordre croissant et comme
est
triée, on a
donc la liste L' est triée
en ordre croissant.
Cela clos la démonstration par récurrence sur la longueur de la liste L de la correction de la fonction insere.
Le problème de l'arrêt a été posé par Alan Turing en 1936; on peut l'énoncer de la manière suivante :

Faisons l'hypothèse qu'on peut programmer un tel prédicat.
Et définissons les fonctions :
(define boucle
(lambda () (boucle)))
(define test
(lambda (f)
(if (arret? f f)
(boucle)
1)))
Considérons alors l'appel : (test test)
Il y a donc contradiction.
Il y a encore contradiction.
Dans les deux cas, on aboutit à une contradiction, ce qui montre que l'hypothèse de départ est fausse.

Que penser de la définition suivante ?
(define arret?
(lambda (f n)
(if (number? (f n))
#t
#f)))