![]() ![]() » fonctions calculables , ensemble récursivement énumérables |
Les termes récursif, récursion, récursivité ont la même racine latine que récurrence : currere = courir, et par là : recurrere = courir en arrière qui a donné également recourir, recours = action de faire appel (en justice).
Le terme récurrence
apparaît avec Poincaré dans
La Science et L'hypothèse au
tout début du 20è siècle. On parle dès lors de formule de récurrence, et de
raisonnement par récurrence pour signifier le
raisonnement
par induction de Pascal.
La récursivité n'apparaît dans le Larousse qu'en 1968 avec les progrès de l'informatique et des algorithmes récursifs : la notion actuelle de fonction (ou de procédure) récursive rencontrée en programmation se rattache à celle définie par Skolem (1923) puis Gödel (1926) sans en avoir exactement le même sens.
I - Les fonctions récursives en informatique :
Une fonction ou procédure (ensemble de règles logiques) X est définie récursivement si sa définition est de la forme X = Φ(A, B, ..., X) où A, B, ... désignent des règles ou fonctions connues et Φ une fonction ou procédure combinant A, B, ... et X. C'est dire que X fait appel à elle-même pour se définir.
à cette relation générale, il faut associer une condition d'arrêt, s'apparentant généralement à une condition initiale. En cas d'oubli, la procédure pourrait boucler indéfiniment ou provoquer un dépassement de capacité...
La fonction factorielle de n est définie récursivement dans N par :
function factorielle(n)
{
if (n<=1) return 1 else return n*factorielle(n-1)
}L'instruction y = factorielle(4) retourne 1 × 2 × 3 × 4 dans la variable y. L'algorithme empile en mémoire les calculs intermédiaires 4*factorielle(3) | 4*3*factorielle(2) | 4*3*2*factorielle(1) | 4*3*2*1. La condition if (n<=1) return 1 est la condition d'arrêt effectivement calculable conduisant à y = 24. Ce petit algorithme renvoie 1 si n = 0 (convention 0! = 1! = 1).
Le propre d'une procédure récursive bien pensée est qu'elle généralement d'une admirable concision et n'utilise qu'un minimum de concepts extérieurs à sa définition.
➔ Il s'agit de bien distinguer récursion , récurrence et itération
♦ Définir une suite (un) par uo = 1, un = 3un-1, c'est écrire une relation récurrente. Pour calculer un en fonction de n, il faut "courir en arrière" : reculer jusqu'à uo (valeur initiale), en décrémentant n.
un = 3un-1 = 3 × 3un-2 = 3 × 3 × 3un-3 = 3 × 3 × 3 × 3un-4 = ... = 3nuo
Mais un n'est autre qu'une fonction de n : un = f(n). En écrivant :
n∈N*, f(0) = 1, f(n) = 3f(n-1)
On définit une fonction récursive dans l'ensemble des entiers naturels, dont f(0) = 1 est la condition d'arrêt. On est donc en présence d'une procédure récursive de type récurrent conduisant à la fonction exponentielle de base 3 restreinte à N. La fonction factorielle décrite précédemment est également récursive de type récurrent.
» factorielle n , suite de Fibonacci , fonction d'Ackermann , Nombres de Fibonacci , Nombres de Lucas
♦ Le calcul du PGCD selon la méthode d'Euclide est une méthode récursive non récurrente :
PGCD(a,0) = a (condition d'arrêt);
PGCD(a , b) = PGCD(b , r) avec r = a - b × Ent(a/b), reste de la division de a par b.
On réitère la formule récursive 2 tant que la condition d'arrêt r = 0 n'a pas lieu. Le pgcd est le dernier reste non nul : par exemple, d(24,18) = d(18,6) = d(6,0) = 6.
On remarque que dans les deux méthodes, le cas "général" s'obtient en revenant au cas initial par un processus bien défini au bout d'un nombre fini d'itérations.
♦ On parlera d'un algorithme itératif (du latin iterare = répéter) lorsqu'un résultat souhaité est obtenu en répétant (en réitérant) un même processus pn pour des valeurs croissantes de n. En termes de programmation, on parle de boucle (for ... do ..., while ...).
II - Les procédures récursives en informatique :
Le traitement récursif des chaînes de caractères est très efficace et très instructif de la puissance de la récursion par la simplicité de mise en œuvre. On pourra consulter quelques exemples donnés dans ChronoMath :
» Inversion d'une chaîne , Tri d'une liste , Formule de Wallis (tableur) , Autres cas sur la page Ackermann
III - Les fonctions récursives en logique mathématique :
C'est tout particulièrement à Gödel et Herbrand en 1930-31, puis Turing et Post, mais aussi Rózsa Péter et Kalmár en Hongrie, que l'on doit la mise en place du concept mathématique nouveau de fonction récursive dans leurs travaux relatifs aux fondements des mathématiques gravement ébranlés par les contradictions apparues dans la logique classique du tiers-exclu d'Aristote suite à l'apparition de la théorie des ensembles de Cantor.
Kronecker, qui affirmait « Dieu a créé les nombres entiers, le reste est l'œuvre de l'homme » avait prédit que la recherche mathématique devait s'appuyer exclusivement sur les propriétés des nombres entiers. Reconstruire les mathématiques à partir de N, ensemble des entiers naturels, source de toute la mathématique, nécessite donc une définition sans faille exempte de toute intuition susceptible de mettre à mal le futur édifice.
Les nombres réels, base de l'analyse, sont construits à partir des rationnels, quotients d'entiers, et les géométries reposent sur leurs métriques définies par des propriétés numériques, ce qui nous ramène encore aux entiers. Ce principe de construction se rencontre par exemple dans la mise en place de la fonction exponentielle :
Construction de la fonction exponentielle : »
➔
La validité et la puissance du concept de
fonction et d'énoncés récursifs défini par Gödel
en 1931 (et, indépendamment, par Jacques Herbrand, 1908-1931) réside
dans sa totale indépendance de toute théorie mathématique existante, aspect
évidemment fondamental lorsque l'objectif est de fonder une logique nouvelle
suite aux failles des systèmes de pensée précédents. La seule connaissance
admise et utilisée fut l'ensemble des entiers naturels que
von Neumann s'amusera à définir
récursivement...
Ambiguïté d'un vocabulaire pléthorique... :
Dans les années 1930, un des objectifs était d'étudier la consistance
des théories mathématiques et de la décidabilité
de propositions énoncées en leur sein :
Dans une théorie T, une proposition p est décidable si l'on peut prouver, au moyen des axiomes de T, soit p soit non p.
Prouver p c'est établir au moyen de la logique de T (définie par ses axiomes et son langage) que non p est contradictoire en ce sens qu'elle impliquerait la la négation d'un axiome ou d'un énoncé (formule, proposition) déjà établi.
La validité de p consiste alors à exhiber une méthode effective de preuve, c'est à dire un algorithme aboutissant à p par l'usage d'un nombre fini « d'opérations » fondamentales. Les langages informatiques ayant emprunté les terme récursif (adjectif), récursivité (substantif associé) récursion (action récursive au sein d'un programme récursif) on préfère, en logique mathématique, parler aujourd'hui de fonction calculable (concept initié par Gödel) ou, plus précisément, de fonction effectivement calculable, pour signifier qu'il existe une méthode permettant de la calculer en un nombre fini d'opérations fondamentales. C'est le cas, par exemple, de la définition du PGCD défini par Euclide.
Kleene qualifia de primitives (on dit aussi fondamentales) les premières fonctions récursives introduites par Skolem (1923). Augmentées des fonctions obtenues par son opération de minimum, dites μ-récursives (» ci-après), on parla de fonctions récursives partielles.
Après les travaux de Gödel et Herbrand et les résultats décisifs de Turing (1936) apportés par sa fameuse « machine à penser », on parla, avec Gödel, de fonctions récursives générales (Princeton, 1934) pour exprimer des définitions récursives composées de fonctions récursives primitives au sens de Kleene.
En 1936-37, Church et Kleene prouvent, au moyen de leurs fonctions λ-définissables et μ-récursives (respectivement) clôturent le chapitre en prouvant que :
Les fonctions calculables sont les fonctions récursives
générales lesquelles coïncident
avec les fonctions calculables au sens de (la machine de) Turing.
En logique, les fonctions calculables sont désormais les fonctions récursives générales, ou récursives (tout court) : fonctions construites et obtenues au moyen d'un nombre fini d'étapes en utilisant les fonctions récursives primitives décrites ci-dessous. Après six années de recherches, il apparaissait donc que la calculabilité au sens de la pensée logique, sans rapport à l'informatique, inexistante à l'époque, coïncide avec la calculabilité "mécanique" ! C'est là un résultat à la fois remarquable et bouleversant auquel ne s'attendait certes pas Gödel dans un contexte philosophique du mécanisme de la pensée, ni Hilbert qui énonçait, au tout début du 20 siècle, ses célèbres 23 problèmes pour le (les ?) siècle(s) à venir.
Au fait, existe-t-il des fonctions non calculables ? Oui, mais elles sont "rares" pour ne pas dire tirées par les cheveux... On pourra consulter la réf.9 et l'exemple dit du castor affairé, (busy biver problem) qui empile les 1 (plutôt que les branchages...), une fonction qui boucle indéfiniment sur une machine de Turing.
Les fonctions récursives primitives, récursives élémentaires : |
On suppose ici que l'ensemble N des entiers naturels est construit ou accepté dans son sens intuitif. Selon Kleene, les fonctions de Np dans N, p ≥ 1, établies comme effectivement calculables depuis les premiers travaux de Skolem et Gödel sur le sujet, dites récursives primitives (appellation due à Skolem) sont les suivantes :
La nature récursive de ces fonctions (au sens usuel de fonction se définissant en faisant appel à elle-même) n'apparaît peut-être pas clairement. Étudions les à travers des exemples plus concrets, les fonctions récursives élémentaires :
La fonction prédécesseur Decr (décrémentation, antécedent) :
Si x est un entier naturel, son antécédent est 0 s'il est nul, sinon, c'est x - 1. Or, (x + 1) - 1 = x. On peut donc la définir très simplement au moyen de la fonction successeur par :
Decr0) = N(x) (i.e. = 0, initialisation)
Decr(Incr(x)) = P1(x) (= x, récurrence simple).
La fonction addition Add :
Additionner y à x, c'est incrémenter x en décrémentant y jusqu'à obtenir 0. On peut la définir par récurrence :
Add(x,0) = P1(x) (i.e. = x, condition d'arrêt)
Add(x,y) = Incr(Add(x,Decr(y))
Et on pose plus simplement : Add(x,y) = x + y.
La fonction soustraction Sous :
La soustraction dans N définie par : S(x,y) = x - y si x ≥ y et 0 sinon, peut être définie par :
Sous(x, 0) = x et Sous(x,y) = Decr(Sous(x,Decr(y))
La fonction multiplication M :
M(x,y) = xy. Elle sera définie par :
M(x,0) = N(x) (= 0, fonction nulle : condition d'arrêt)
M(x,y) = A(M(x,D(y)),P1(x,y)) , c'est à dire x(y - 1) + x : appel récursif
On définira alors facilement la fonction puissance entière.
Ensembles récursifs ou récursivement énumérables : |
En simplifiant : une partie X de N, et plus généralement de Np, est dite récursive ou décidable pour signifier qu'il existe un algorithme permettant d'affirmer en un nombre fini d'étapes qu'un élément x de X appartient ou non à cet ensemble. Cela revient à dire que sa fonction caractéristique (égale à 1 dans X, 0 sinon) est calculable.
X est dit récursivement énumérable ou semi-décidable (définition due à Kleene), s'il existe une fonction récursive (autrement dit calculable) dont l'image est cet ensemble. Plus intuitivement : s'il existe un algorithme capable d'établir la liste de tous les éléments de X.
Toute partie décidable est récursivement énumérable. Tout ensemble diophantien est récursivement énumérable. Inversement tout ensemble récursivement énumérable est diophantien : difficile résultat (étroitement lié au 10ème problème de Hilbert) étudié et prouvé de 1950 à 1970.
Si X est semi-décidable ainsi que son complémentaire, alors X est décidable.
N ainsi que toutes ses parties finies sont décidables.
H = {t∈N, ∃ (x,y,z)∈N3, xt + yt = zt}. H est l'image de G par la projection (x,y,z,t) → t, et p est manifestement calculable. Donc H est récursivement énumérable (semi-décidable). Avant la preuve de Wiles concernant l'ex conjecture de Fermat, H n'était pas décidable car aucune procédure n'était capable de prouver en un nombre fini d'étapes qu'un entier t donné appartient ou non à H.
Cette nouvelle vision permet d'exhiber sans ambiguïté, dans un contexte constructiviste, des objets mathématiques en un nombre fini d'étapes et conduisent au concept d'ensembles et de théories axiomatisables et décidables. Ces idées novatrices permettront de résoudre négativement le 10ème problème de Hilbert.
» Turing , Rózsa Péter , Ackermann , Church , Kleene
➔ Pour en savoir plus :