Exemple: Le programme suivant:
P: \tt m:=a; \tt n:=b; \tt while m != n do \tt if m > n then m <- m - n fi \tt od
On vérifie aisément que
(car
est un invariant, mais ce programme ne
termine pas toujours.
La seule instruction pour laquelle le problème de la terminaison se pose est la boucle.
Il n'existe pas de moyen ``automatique'' de prouver la terminaison
d'une boucle (en fait, il s'agit d'un problème indécidable), on
peut procéder de la façon suivante: définir une expression à valeur
entière dépendant des variables qui décroît à chaque itération et
telle que si
devient nulle alors la condition de test de boucle
est faux. On vérifie alors aisément qu'alors le nombre d'itérations de
la boucle est borné. (toute suite décroissante d'entiers est finie).
Exemple:
Dans le programme du PGCD, à chaque itération, ou
décroît: on
peut prendre
dans ce cas, on a si
est la valeur de
après l'itération, on vérifie aisément que
et d'autre part
si
alors
ce qui assure que la terminaison.
Pour montrer que la terminaison est un problème difficile on peut
considérer le problème suivant:
Une Conjecture:
On considère la fonction
définie par