Bases mathématiques de la progammation récursive. Première partie. Option informatique 2016-2017 Un pas vers la programmation impérative : test conditionnel en Caml • Jusqu’à présent programmation purement fonctionnelle ; Un pas vers la programmation impérative : test conditionnel en Caml • Jusqu’à présent programmation purement fonctionnelle ; • on propose une première structure (plutôt impérative) permettant une écriture parfois plus légère et lisible, Un pas vers la programmation impérative : test conditionnel en Caml • Jusqu’à présent programmation purement fonctionnelle ; • on propose une première structure (plutôt impérative) permettant une écriture parfois plus légère et lisible, • en particulier dans les filtrages : test conditionnel ; Un pas vers la programmation impérative : test conditionnel en Caml • Jusqu’à présent programmation purement fonctionnelle ; • on propose une première structure (plutôt impérative) permettant une écriture parfois plus légère et lisible, • en particulier dans les filtrages : test conditionnel ; • En Caml il s’agit de la structure if condition then expression1 else expression2 ; 1 # if condition then expression1 else expression2 Un pas vers la programmation impérative : test conditionnel en Caml • Jusqu’à présent programmation purement fonctionnelle ; • on propose une première structure (plutôt impérative) permettant une écriture parfois plus légère et lisible, • en particulier dans les filtrages : test conditionnel ; • En Caml il s’agit de la structure if condition then expression1 else expression2 ; 1 # if condition then expression1 else expression2 • C’est elle-même une expression, dont la valeur est expression1 si la condition est vraie et expression2 sinon ; Un pas vers la programmation impérative : test conditionnel en Caml • Jusqu’à présent programmation purement fonctionnelle ; • on propose une première structure (plutôt impérative) permettant une écriture parfois plus légère et lisible, • en particulier dans les filtrages : test conditionnel ; • En Caml il s’agit de la structure if condition then expression1 else expression2 ; 1 # if condition then expression1 else expression2 • C’est elle-même une expression, dont la valeur est expression1 si la condition est vraie et expression2 sinon ; • Pour cause de typage il est indispensable que expression1 et expression2 soient du même type Un pas vers la programmation impérative : test conditionnel en Caml • Si le else est omis, il est implicitement remplacé par () Un pas vers la programmation impérative : test conditionnel en Caml • Si le else est omis, il est implicitement remplacé par () • Et donc il faut que expression1 soit de type unit ... Un pas vers la programmation impérative : test conditionnel en Caml • Si le else est omis, il est implicitement remplacé par () • Et donc il faut que expression1 soit de type unit ... • pas de elif en Caml Un pas vers la programmation impérative : test conditionnel en Caml • Si le else est omis, il est implicitement remplacé par () • Et donc il faut que expression1 soit de type unit ... • pas de elif en Caml • Exemple fonction factorielle : 1 # let rec fact n = 2 if n = 0 then 0 3 else n * fact ( n - 1) ;; 4 fact : int -> int = <fun> Un pas vers la programmation impérative : test conditionnel en Caml • Si le else est omis, il est implicitement remplacé par () • Et donc il faut que expression1 soit de type unit ... • pas de elif en Caml • Exemple fonction factorielle : 1 # let rec fact n = 2 if n = 0 then 0 3 else n * fact ( n - 1) ;; 4 fact : int -> int = <fun> • Fonction valeur absolue sur les entiers. 1 # let abs x = if x > 0 then x else -x ;; 2 abs : int -> int = <fun> Introduction • Jusqu’à présent, définition très informelle de la récursivité : est récursive toute fonction qui intervient dans sa définition. 1. Un prédicat est une fonction à valeurs booléennes, true ou false Introduction • Jusqu’à présent, définition très informelle de la récursivité : est récursive toute fonction qui intervient dans sa définition. • Comme pour toute fonction, se posent trois questions : 1. Un prédicat est une fonction à valeurs booléennes, true ou false Introduction • Jusqu’à présent, définition très informelle de la récursivité : est récursive toute fonction qui intervient dans sa définition. • Comme pour toute fonction, se posent trois questions : • Terminaison 1. Un prédicat est une fonction à valeurs booléennes, true ou false Introduction • Jusqu’à présent, définition très informelle de la récursivité : est récursive toute fonction qui intervient dans sa définition. • Comme pour toute fonction, se posent trois questions : • Terminaison • Correction 1. Un prédicat est une fonction à valeurs booléennes, true ou false Introduction • Jusqu’à présent, définition très informelle de la récursivité : est récursive toute fonction qui intervient dans sa définition. • Comme pour toute fonction, se posent trois questions : • Terminaison • Correction • Complexité. 1. Un prédicat est une fonction à valeurs booléennes, true ou false Introduction • Jusqu’à présent, définition très informelle de la récursivité : est récursive toute fonction qui intervient dans sa définition. • Comme pour toute fonction, se posent trois questions : • Terminaison • Correction • Complexité. • Rapport évident avec le principe de récurrence : 1. Un prédicat est une fonction à valeurs booléennes, true ou false Introduction • Jusqu’à présent, définition très informelle de la récursivité : est récursive toute fonction qui intervient dans sa définition. • Comme pour toute fonction, se posent trois questions : • Terminaison • Correction • Complexité. • Rapport évident avec le principe de récurrence : • Soit P un prédicat 1 défini sur N, tel que P(0) est vrai, 1. Un prédicat est une fonction à valeurs booléennes, true ou false Introduction • Jusqu’à présent, définition très informelle de la récursivité : est récursive toute fonction qui intervient dans sa définition. • Comme pour toute fonction, se posent trois questions : • Terminaison • Correction • Complexité. • Rapport évident avec le principe de récurrence : • Soit P un prédicat 1 défini sur N, tel que P(0) est vrai, • ainsi que l’implication ∀n ∈ N∗ , P(n − 1) =⇒ P(n). 1. Un prédicat est une fonction à valeurs booléennes, true ou false Introduction • Jusqu’à présent, définition très informelle de la récursivité : est récursive toute fonction qui intervient dans sa définition. • Comme pour toute fonction, se posent trois questions : • Terminaison • Correction • Complexité. • Rapport évident avec le principe de récurrence : • Soit P un prédicat 1 défini sur N, tel que P(0) est vrai, • ainsi que l’implication ∀n ∈ N∗ , P(n − 1) =⇒ P(n). • Alors pour tout entier n ∈ N, P(n) est vrai. 1. Un prédicat est une fonction à valeurs booléennes, true ou false Introduction • Jusqu’à présent, définition très informelle de la récursivité : est récursive toute fonction qui intervient dans sa définition. • Comme pour toute fonction, se posent trois questions : • Terminaison • Correction • Complexité. • Rapport évident avec le principe de récurrence : • Soit P un prédicat 1 défini sur N, tel que P(0) est vrai, • ainsi que l’implication ∀n ∈ N∗ , P(n − 1) =⇒ P(n). • Alors pour tout entier n ∈ N, P(n) est vrai. • Cette présentation : définition d’un cadre formel plus général que simple principe de récurrence pour prouver la terminaison et la correction des fonctions récursives. 1. Un prédicat est une fonction à valeurs booléennes, true ou false Introduction • Jusqu’à présent, définition très informelle de la récursivité : est récursive toute fonction qui intervient dans sa définition. • Comme pour toute fonction, se posent trois questions : • Terminaison • Correction • Complexité. • Rapport évident avec le principe de récurrence : • Soit P un prédicat 1 défini sur N, tel que P(0) est vrai, • ainsi que l’implication ∀n ∈ N∗ , P(n − 1) =⇒ P(n). • Alors pour tout entier n ∈ N, P(n) est vrai. • Cette présentation : définition d’un cadre formel plus général que simple principe de récurrence pour prouver la terminaison et la correction des fonctions récursives. • Commençons par comprendre ce qui est à l’origine de la terminaison d’une fonction récursive, puis nous passerons à quelques rappels mathématiques avant d’énoncer le théorème qui nous sera très utile... 1. Un prédicat est une fonction à valeurs booléennes, true ou false Condition de terminaison d’une fonction récursive • Soit la fonction suivante 1 # let rec f n = f ( n - 1) ;; 2 f : int -> ’a = <fun> Condition de terminaison d’une fonction récursive • Soit la fonction suivante 1 # let rec f n = f ( n - 1) ;; 2 f : int -> ’a = <fun> • Quel est le problème ? Condition de terminaison d’une fonction récursive • Soit la fonction suivante 1 # let rec f n = f ( n - 1) ;; 2 f : int -> ’a = <fun> • Quel est le problème ? • Pas de cas de base ! Condition de terminaison d’une fonction récursive • Soit la fonction suivante 1 # let rec f n = f ( n - 1) ;; 2 f : int -> ’a = <fun> • Quel est le problème ? • Pas de cas de base ! • Soit la fonction suivante 1 # let rec f n = 2 match n with 3 | 0 -> 0 4 | n -> f ( n * n ) ;; 5 f : int -> int = <fun> Condition de terminaison d’une fonction récursive • Soit la fonction suivante 1 # let rec f n = f ( n - 1) ;; 2 f : int -> ’a = <fun> • Quel est le problème ? • Pas de cas de base ! • Soit la fonction suivante 1 # let rec f n = 2 match n with 3 | 0 -> 0 4 | n -> f ( n * n ) ;; 5 f : int -> int = <fun> • Quel est le problème ? Condition de terminaison d’une fonction récursive • Soit la fonction suivante 1 # let rec f n = f ( n - 1) ;; 2 f : int -> ’a = <fun> • Quel est le problème ? • Pas de cas de base ! • Soit la fonction suivante 1 # let rec f n = 2 match n with 3 | 0 -> 0 4 | n -> f ( n * n ) ;; 5 f : int -> int = <fun> • Quel est le problème ? • Si appel avec n > 0, on n’arrivera jamais sur le cas de base ! Condition de terminaison d’une fonction récursive • Conclusion informelle : il faut donc un (des) cas de base et une décroissance stricte du paramètre Condition de terminaison d’une fonction récursive • Conclusion informelle : il faut donc un (des) cas de base et une décroissance stricte du paramètre • Et pour la fonction suivante ? 1 # let rec fortier a b = 2 match a , b with 3 | 0 , _ -> b 4 | _ , 0 -> a 5 | _ , _ when a mod 2 = 0 -> 2 + fortier ( b + 1) ( a - 3) 6 | _ -> 1 + fortier ( b - 2) ( a + 1) ;; 7 fortier : int -> int -> int = <fun> Condition de terminaison d’une fonction récursive • Conclusion informelle : il faut donc un (des) cas de base et une décroissance stricte du paramètre • Et pour la fonction suivante ? 1 # let rec fortier a b = 2 match a , b with 3 | 0 , _ -> b 4 | _ , 0 -> a 5 | _ , _ when a mod 2 = 0 -> 2 + fortier ( b + 1) ( a - 3) 6 | _ -> 1 + fortier ( b - 2) ( a + 1) ;; 7 fortier : int -> int -> int = <fun> • Se termine-t-elle ? Que fait-elle ? Condition de terminaison d’une fonction récursive • Conclusion informelle : il faut donc un (des) cas de base et une décroissance stricte du paramètre • Et pour la fonction suivante ? 1 # let rec fortier a b = 2 match a , b with 3 | 0 , _ -> b 4 | _ , 0 -> a 5 | _ , _ when a mod 2 = 0 -> 2 + fortier ( b + 1) ( a - 3) 6 | _ -> 1 + fortier ( b - 2) ( a + 1) ;; 7 fortier : int -> int -> int = <fun> • Se termine-t-elle ? Que fait-elle ? • Réponse plus tard... Rappels mathématiques, définitions 2 • Une relation binaire R sur un ensemble E est un ordre s’il elle est : 2. Un peu de programmation éloigne des mathématiques. Beaucoup de programmation y ramène. Xavier Leroy, un des fondateurs d’objective Caml Rappels mathématiques, définitions 2 • Une relation binaire R sur un ensemble E est un ordre s’il elle est : • Réflexive :∀x ∈ E , x Rx 2. Un peu de programmation éloigne des mathématiques. Beaucoup de programmation y ramène. Xavier Leroy, un des fondateurs d’objective Caml Rappels mathématiques, définitions 2 • Une relation binaire R sur un ensemble E est un ordre s’il elle est : • Réflexive :∀x ∈ E , x Rx • Antisymétrique : ∀x , y ∈ E 2 , x Ry et y Rx =⇒ x = z 2. Un peu de programmation éloigne des mathématiques. Beaucoup de programmation y ramène. Xavier Leroy, un des fondateurs d’objective Caml Rappels mathématiques, définitions 2 • Une relation binaire R sur un ensemble E est un ordre s’il elle est : • Réflexive :∀x ∈ E , x Rx • Antisymétrique : ∀x , y ∈ E 2 , x Ry et y Rx =⇒ x = z • Transitive : ∀x , y , z ∈ E 3 , x Ry et y Rz =⇒ x Rz 2. Un peu de programmation éloigne des mathématiques. Beaucoup de programmation y ramène. Xavier Leroy, un des fondateurs d’objective Caml Rappels mathématiques, définitions 2 • Une relation binaire R sur un ensemble E est un ordre s’il elle est : • Réflexive :∀x ∈ E , x Rx • Antisymétrique : ∀x , y ∈ E 2 , x Ry et y Rx =⇒ x = z • Transitive : ∀x , y , z ∈ E 3 , x Ry et y Rz =⇒ x Rz • On note plutôt 4 les relations d’ordre. Un ensemble muni d’un ordre est un ensemble ordonné. 2. Un peu de programmation éloigne des mathématiques. Beaucoup de programmation y ramène. Xavier Leroy, un des fondateurs d’objective Caml Rappels mathématiques, définitions 2 • Une relation binaire R sur un ensemble E est un ordre s’il elle est : • Réflexive :∀x ∈ E , x Rx • Antisymétrique : ∀x , y ∈ E 2 , x Ry et y Rx =⇒ x = z • Transitive : ∀x , y , z ∈ E 3 , x Ry et y Rz =⇒ x Rz • On note plutôt 4 les relations d’ordre. Un ensemble muni d’un ordre est un ensemble ordonné. • Si (E , 4) est un ensemble ordonné, A une partie non vide de E et a ∈ A, on dit que : 2. Un peu de programmation éloigne des mathématiques. Beaucoup de programmation y ramène. Xavier Leroy, un des fondateurs d’objective Caml Rappels mathématiques, définitions 2 • Une relation binaire R sur un ensemble E est un ordre s’il elle est : • Réflexive :∀x ∈ E , x Rx • Antisymétrique : ∀x , y ∈ E 2 , x Ry et y Rx =⇒ x = z • Transitive : ∀x , y , z ∈ E 3 , x Ry et y Rz =⇒ x Rz • On note plutôt 4 les relations d’ordre. Un ensemble muni d’un ordre est un ensemble ordonné. • Si (E , 4) est un ensemble ordonné, A une partie non vide de E et a ∈ A, on dit que : • a est un élément minimal de A lorsque pour tout x ∈ A, x 4 a =⇒ x = a ; 2. Un peu de programmation éloigne des mathématiques. Beaucoup de programmation y ramène. Xavier Leroy, un des fondateurs d’objective Caml Définitions • On dit qu’un ensemble ordonné (E , 4) est bien fondé (ou que 4 est un ordre bien fondé) lorsque toute partie non vide possède (au moins) un élément minimal Définitions • Caractérisation équivalente : un ensemble ordonné (E , 4) est bien fondé si et seulement s’il n’existe pas de suite infinie strictement décroissante dans E . Définitions • Caractérisation équivalente : un ensemble ordonné (E , 4) est bien fondé si et seulement s’il n’existe pas de suite infinie strictement décroissante dans E . • ou encore : dans un ensemble bien fondé, toute suite infinie décroissante est stationnaire (constante à partir d’un certain rang). Exemples : les ensembles ordonnées suivants sont-ils bien fondés ? • (N, 6) Exemples : les ensembles ordonnées suivants sont-ils bien fondés ? • (N, 6) • (N ∪ {−1}, 6) Exemples : les ensembles ordonnées suivants sont-ils bien fondés ? • (N, 6) • (N ∪ {−1}, 6) • (Z, 6) Exemples : les ensembles ordonnées suivants sont-ils bien fondés ? • (N, 6) • (N ∪ {−1}, 6) • (Z, 6) • (N, |) (relation d’ordre a|b ⇐⇒ a divise b) Définitions • On définit l’ordre produit sur deux ensembles ordonnés (E1 , 41 ) et (E2 , 42 ) par (x1 , x2 ) 4 (y1 , y2 ) si et seulement si x1 41 y1 et x2 42 y2 . Définitions • On définit l’ordre produit sur deux ensembles ordonnés (E1 , 41 ) et (E2 , 42 ) par (x1 , x2 ) 4 (y1 , y2 ) si et seulement si x1 41 y1 et x2 42 y2 . • On montre que l’ordre produit de deux ordres bien fondés est bien fondé. Définitions • On définit l’ordre produit sur deux ensembles ordonnés (E1 , 41 ) et (E2 , 42 ) par (x1 , x2 ) 4 (y1 , y2 ) si et seulement si x1 41 y1 et x2 42 y2 . • On montre que l’ordre produit de deux ordres bien fondés est bien fondé. • Exemple : N2 muni de l’ordre produit : (a, b) 4 (a0 , b 0 ) ⇐⇒ a 6 a0 et b 6 b 0 , est un ensemble bien fondé Définitions • On définit l’ordre produit sur deux ensembles ordonnés (E1 , 41 ) et (E2 , 42 ) par (x1 , x2 ) 4 (y1 , y2 ) si et seulement si x1 41 y1 et x2 42 y2 . • On montre que l’ordre produit de deux ordres bien fondés est bien fondé. • Exemple : N2 muni de l’ordre produit : (a, b) 4 (a0 , b 0 ) ⇐⇒ a 6 a0 et b 6 b 0 , est un ensemble bien fondé • Schéma de l’ensemble des éléments plus petits qu’un élément donné. Définitions • On définit l’ordre lexicographique sur deux ensembles ordonnés (E1 , 41 ) et (E2 , 42 ) par (x1 , x2 ) 4 (y1 , y2 ) si et seulement si x1 ≺1 y1 ou (x1 = y1 et x2 42 y2 ). Définitions • On définit l’ordre lexicographique sur deux ensembles ordonnés (E1 , 41 ) et (E2 , 42 ) par (x1 , x2 ) 4 (y1 , y2 ) si et seulement si x1 ≺1 y1 ou (x1 = y1 et x2 42 y2 ). • On montre que l’ordre lexicographique de deux ordres bien fondés est bien fondé. Définitions • On définit l’ordre lexicographique sur deux ensembles ordonnés (E1 , 41 ) et (E2 , 42 ) par (x1 , x2 ) 4 (y1 , y2 ) si et seulement si x1 ≺1 y1 ou (x1 = y1 et x2 42 y2 ). • On montre que l’ordre lexicographique de deux ordres bien fondés est bien fondé. • Exemple : (a, b) 4 (a0 , b 0 ) ⇐⇒ a < a0 ou (a = a0 et b 6 b 0 ), N2 est bien fondé. Définitions • On définit l’ordre lexicographique sur deux ensembles ordonnés (E1 , 41 ) et (E2 , 42 ) par (x1 , x2 ) 4 (y1 , y2 ) si et seulement si x1 ≺1 y1 ou (x1 = y1 et x2 42 y2 ). • On montre que l’ordre lexicographique de deux ordres bien fondés est bien fondé. • Exemple : (a, b) 4 (a0 , b 0 ) ⇐⇒ a < a0 ou (a = a0 et b 6 b 0 ), N2 est bien fondé. • Schéma de l’ensemble des éléments plus petits qu’un élément donné. Théorème de terminaison d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé Théorème de terminaison d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé • Soit A et B deux ensembles et f : A → B une fonction récursive Théorème de terminaison d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé • Soit A et B deux ensembles et f : A → B une fonction récursive • Soit ϕ : A → E une application. Théorème de terminaison d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé • Soit A et B deux ensembles et f : A → B une fonction récursive • Soit ϕ : A → E une application. • On note M = {x ∈ A t.q. ϕ(x ) est minimal dans ϕ(A)} Théorème de terminaison d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé • Soit A et B deux ensembles et f : A → B une fonction récursive • Soit ϕ : A → E une application. • On note M = {x ∈ A t.q. ϕ(x ) est minimal dans ϕ(A)} • On fait les hypothèses suivantes : Théorème de terminaison d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé • Soit A et B deux ensembles et f : A → B une fonction récursive • Soit ϕ : A → E une application. • On note M = {x ∈ A t.q. ϕ(x ) est minimal dans ϕ(A)} • On fait les hypothèses suivantes : • le calcul de f (x ) se termine pour tous les éléments x ∈ M ; Théorème de terminaison d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé • Soit A et B deux ensembles et f : A → B une fonction récursive • Soit ϕ : A → E une application. • On note M = {x ∈ A t.q. ϕ(x ) est minimal dans ϕ(A)} • On fait les hypothèses suivantes : • le calcul de f (x ) se termine pour tous les éléments x ∈ M ; • ∀x ∈ A , le calcul de f (x ), n’utilise qu’un nombre fini de calculs f (y1 ), · · · , f (yk ) où ϕ(yi ) ≺ ϕ(x ). Théorème de terminaison d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé • Soit A et B deux ensembles et f : A → B une fonction récursive • Soit ϕ : A → E une application. • On note M = {x ∈ A t.q. ϕ(x ) est minimal dans ϕ(A)} • On fait les hypothèses suivantes : • le calcul de f (x ) se termine pour tous les éléments x ∈ M ; • ∀x ∈ A , le calcul de f (x ), n’utilise qu’un nombre fini de calculs f (y1 ), · · · , f (yk ) où ϕ(yi ) ≺ ϕ(x ). • Alors le calcul de f (x ) se termine pour toute valeur de x ∈ A . Théorème de terminaison d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé • Soit A et B deux ensembles et f : A → B une fonction récursive • Soit ϕ : A → E une application. • On note M = {x ∈ A t.q. ϕ(x ) est minimal dans ϕ(A)} • On fait les hypothèses suivantes : • le calcul de f (x ) se termine pour tous les éléments x ∈ M ; • ∀x ∈ A , le calcul de f (x ), n’utilise qu’un nombre fini de calculs f (y1 ), · · · , f (yk ) où ϕ(yi ) ≺ ϕ(x ). • Alors le calcul de f (x ) se termine pour toute valeur de x ∈ A . • Idée de la preuve. Théorème de terminaison d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé • Soit A et B deux ensembles et f : A → B une fonction récursive • Soit ϕ : A → E une application. • On note M = {x ∈ A t.q. ϕ(x ) est minimal dans ϕ(A)} • On fait les hypothèses suivantes : • le calcul de f (x ) se termine pour tous les éléments x ∈ M ; • ∀x ∈ A , le calcul de f (x ), n’utilise qu’un nombre fini de calculs f (y1 ), · · · , f (yk ) où ϕ(yi ) ≺ ϕ(x ). • Alors le calcul de f (x ) se termine pour toute valeur de x ∈ A . • Idée de la preuve. • Si ne terminait pas on pourrait former une suite infinie (un )n∈N strictement décroissante d’éléments de E . Théorème de terminaison d’une fonction récursive • Très souvent A = E = N et ϕ(n) = n Théorème de terminaison d’une fonction récursive • Très souvent A = E = N et ϕ(n) = n • Alors M = {0}. n = 0 sera le cas de base Théorème de terminaison d’une fonction récursive • Très souvent A = E = N et ϕ(n) = n • Alors M = {0}. n = 0 sera le cas de base • Il suffit que pour le calcul de f (n) la fonction n’utilise que des appels avec des valeurs m < n Théorème de terminaison d’une fonction récursive • Très souvent A = E = N et ϕ(n) = n • Alors M = {0}. n = 0 sera le cas de base • Il suffit que pour le calcul de f (n) la fonction n’utilise que des appels avec des valeurs m < n • pour que la fonction termine. Théorème de terminaison d’une fonction récursive • Très souvent A = E = N et ϕ(n) = n • Alors M = {0}. n = 0 sera le cas de base • Il suffit que pour le calcul de f (n) la fonction n’utilise que des appels avec des valeurs m < n • pour que la fonction termine. • Exemple 1 fonction fact 1 # let rec fact n = 2 match n with 3 | 0 -> 1 4 | _ -> n * fact ( n - 1) ;; 5 fact : int -> int = <fun> Théorème de terminaison d’une fonction récursive • Exemple 2 : longueur d’une liste 1 # let rec longueur liste = 2 match liste with 3 | [] -> 0 4 | _ :: queue -> 1 + longueur queue ;; 5 longueur : ’a list -> int = <fun> Théorème de terminaison d’une fonction récursive • Exemple 2 : longueur d’une liste 1 # let rec longueur liste = 2 match liste with 3 | [] -> 0 4 | _ :: queue -> 1 + longueur queue ;; 5 longueur : ’a list -> int = <fun> • A =?, B =?, M =?, ϕ =? Théorème de terminaison d’une fonction récursive • Exemple 3 : fonction fortier 1 # let rec fortier a b = 2 match a , b with 3 | 0 , _ -> b 4 | _ , 0 -> a 5 | _ , _ when a mod 2 = 0 -> 2 + fortier ( b + 1) ( a - 3) 6 | _ -> 1 + fortier ( b - 2) ( a + 1) ;; 7 fortier : int -> int -> int = <fun> Théorème de terminaison d’une fonction récursive • Exemple 3 : fonction fortier 1 # let rec fortier a b = 2 match a , b with 3 | 0 , _ -> b 4 | _ , 0 -> a 5 | _ , _ when a mod 2 = 0 -> 2 + fortier ( b + 1) ( a - 3) 6 | _ -> 1 + fortier ( b - 2) ( a + 1) ;; 7 fortier : int -> int -> int = <fun> • A =?, B =?, M =?, ϕ =? Preuve de la correction d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé Preuve de la correction d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé • Soit A et B deux ensembles et f : A → B une fonction récursive Preuve de la correction d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé • Soit A et B deux ensembles et f : A → B une fonction récursive • Soit ϕ : A → E une application. Preuve de la correction d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé • Soit A et B deux ensembles et f : A → B une fonction récursive • Soit ϕ : A → E une application. • On note M = {x ∈ A t.q. ϕ(x ) est minimal dans ϕ(A)} Preuve de la correction d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé • Soit A et B deux ensembles et f : A → B une fonction récursive • Soit ϕ : A → E une application. • On note M = {x ∈ A t.q. ϕ(x ) est minimal dans ϕ(A)} • Soit P(x ) un prédicat faisant intervenir f (x ). Preuve de la correction d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé • Soit A et B deux ensembles et f : A → B une fonction récursive • Soit ϕ : A → E une application. • On note M = {x ∈ A t.q. ϕ(x ) est minimal dans ϕ(A)} • Soit P(x ) un prédicat faisant intervenir f (x ). • On fait les hypothèses suivantes : Preuve de la correction d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé • Soit A et B deux ensembles et f : A → B une fonction récursive • Soit ϕ : A → E une application. • On note M = {x ∈ A t.q. ϕ(x ) est minimal dans ϕ(A)} • Soit P(x ) un prédicat faisant intervenir f (x ). • On fait les hypothèses suivantes : • ∀x ∈ M, P(x ) est vrai ; Preuve de la correction d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé • Soit A et B deux ensembles et f : A → B une fonction récursive • Soit ϕ : A → E une application. • On note M = {x ∈ A t.q. ϕ(x ) est minimal dans ϕ(A)} • Soit P(x ) un prédicat faisant intervenir f (x ). • On fait les hypothèses suivantes : • ∀x ∈ M, P(x ) est vrai ; • ∀x ∈ A , le calcul de f (x ), n’utilise qu’un nombre fini de calculs f (y1 ), · · · , f (yk ) où ϕ(yi ) ≺ ϕ(x ) et si P(y1 ) ∧ · · · ∧ P(yk ) =⇒ P(x ) Preuve de la correction d’une fonction récursive • Soit (E , 4) un ensemble muni d’un ordre bien fondé • Soit A et B deux ensembles et f : A → B une fonction récursive • Soit ϕ : A → E une application. • On note M = {x ∈ A t.q. ϕ(x ) est minimal dans ϕ(A)} • Soit P(x ) un prédicat faisant intervenir f (x ). • On fait les hypothèses suivantes : • ∀x ∈ M, P(x ) est vrai ; • ∀x ∈ A , le calcul de f (x ), n’utilise qu’un nombre fini de calculs f (y1 ), · · · , f (yk ) où ϕ(yi ) ≺ ϕ(x ) et si P(y1 ) ∧ · · · ∧ P(yk ) =⇒ P(x ) • Alors ∀x ∈ A P(x ) est vrai. Résumé : méthodologie • Pour la preuve de la correction, on prendra pour P : « f (x ) calcule bien ce qu’il faut » Résumé : méthodologie • Trouver un ordre bien fondé adapté au problème ; Résumé : méthodologie • Trouver un ordre bien fondé adapté au problème ; • Quels sont les cas de base pour lesquels on renvoie directement le résultat ? Les éléments « minimaux » sont-ils bien inclus dans les cas de base ? Résumé : méthodologie • Trouver un ordre bien fondé adapté au problème ; • Quels sont les cas de base pour lesquels on renvoie directement le résultat ? Les éléments « minimaux » sont-ils bien inclus dans les cas de base ? • (La partie cruciale). Soit x un élément arbitraire. En supposant que l’on sache calculer f (y ) pour tous les éléments y ≺ x , comment en déduire le calcul de f (x ) en n’utilisant qu’un nombre fini d’éléments strictement inférieurs ? Résumé : méthodologie • Trouver un ordre bien fondé adapté au problème ; • Quels sont les cas de base pour lesquels on renvoie directement le résultat ? Les éléments « minimaux » sont-ils bien inclus dans les cas de base ? • (La partie cruciale). Soit x un élément arbitraire. En supposant que l’on sache calculer f (y ) pour tous les éléments y ≺ x , comment en déduire le calcul de f (x ) en n’utilisant qu’un nombre fini d’éléments strictement inférieurs ? • La terminaison et la correction de la fonction découlent des raisonnements précédents. Un exemple d’algorithme récursif : les tours de Hanoï • Puzzle inventé par le mathématicien français Édouard Lucas : Un exemple d’algorithme récursif : les tours de Hanoï • Puzzle inventé par le mathématicien français Édouard Lucas : • trois tiges sur lesquelles peuvent être enfilés n disques de diamètres différents. Un exemple d’algorithme récursif : les tours de Hanoï • Puzzle inventé par le mathématicien français Édouard Lucas : • trois tiges sur lesquelles peuvent être enfilés n disques de diamètres différents. • Au début du jeu, ces disques sont tous enfilés sur la même tige, du plus grand au plus petit Un exemple d’algorithme récursif : les tours de Hanoï • Puzzle inventé par le mathématicien français Édouard Lucas : • trois tiges sur lesquelles peuvent être enfilés n disques de diamètres différents. • Au début du jeu, ces disques sont tous enfilés sur la même tige, du plus grand au plus petit • but du jeu : déplacer tous ces disques sur une autre tige en respectant les règles suivantes : Un exemple d’algorithme récursif : les tours de Hanoï • Puzzle inventé par le mathématicien français Édouard Lucas : • trois tiges sur lesquelles peuvent être enfilés n disques de diamètres différents. • Au début du jeu, ces disques sont tous enfilés sur la même tige, du plus grand au plus petit • but du jeu : déplacer tous ces disques sur une autre tige en respectant les règles suivantes : • un seul disque peut être déplacé à la fois ; Un exemple d’algorithme récursif : les tours de Hanoï • Puzzle inventé par le mathématicien français Édouard Lucas : • trois tiges sur lesquelles peuvent être enfilés n disques de diamètres différents. • Au début du jeu, ces disques sont tous enfilés sur la même tige, du plus grand au plus petit • but du jeu : déplacer tous ces disques sur une autre tige en respectant les règles suivantes : • un seul disque peut être déplacé à la fois ; • on ne peut jamais poser un disque sur un disque de diamètre inférieur. Un exemple d’algorithme récursif : les tours de Hanoï • Proposer un algorithme récursif pour résoudre le problème Un exemple d’algorithme récursif : les tours de Hanoï • Proposer un algorithme récursif pour résoudre le problème • Proposer une représentation de la description des mouvements à effectuer Un exemple d’algorithme récursif : les tours de Hanoï • Proposer un algorithme récursif pour résoudre le problème • Proposer une représentation de la description des mouvements à effectuer • Écrire une fonction Caml résolvant le puzzle Un exemple d’algorithme récursif : les tours de Hanoï • Proposer un algorithme récursif pour résoudre le problème • Proposer une représentation de la description des mouvements à effectuer • Écrire une fonction Caml résolvant le puzzle • Calculer le nombre de mouvements nécessaires