Slide 1 Les fonctions Slide 2 a = 3; b = 4; c = 5; d = 12; u = Math.sqrt(a * a + b * b); v = Math.sqrt(c * c + d * d);
static double hypothenuse return Math.sqrt(x * x + y * y);} (double x, double y){ Slide 3 a = 3; b = 4; c = 5; d = 12; u = hypothenuse(a,b); v = hypothenuse(c,d); Un autre exemple Slide 4 int x; x = 3; x = 0;
Un autre exemple static void reset () {x = 0;} Slide 5 int x; x = 3; reset(); Un autre exemple static int x; Slide 6 static void reset () {x = 0;} x = 3; reset();
Tout à l heure La valeur d une expression Slide 7 Θ(t,e,m) = v Ce qui se passe quand on exécute une instruction Σ(p,e,m) = m Trois nouveautés Slide 8 1. Outre une instruction, un environnement et une mémoire, on a besoin d un environnement global pour les définitions de fonctions et les variables globales Σ(p,e,m,G) = m Idem pour les expressions
2. Calculer la valeur d une expression peut désormais modifier la mémoire : f(4) Slide 9 static int f (int x) { n = n + 1; return 2 * x;} Θ(t,e,m,G) = (v,m ) Slide 10 3. Exécuter une instruction peut désormais produire une valeur : return 5 ; Σ(p,e,m,G) = (v,m )
L évaluation d une expression Slide 11 Θ(n,e,m,G) = (n,m), Θ(x,e,m,G) = (m(e(x)),m) Θ(t + u,e,m,g) = (v + w,m ) où (v,m ) = Θ(t,e,m,G) et (w,m ) = Θ(u,e,m,G), idem pour les autres opérations On vient de spécifier l ordre d évaluation Θ(f(t 1,...,t n),e,m,g)? Slide 12
Θ(f(t 1,...,t n),e,m,g)? x 1,..., x n arguments formels et p le corps de f (dans G) e environnement de variables globales de G Slide 13 Slide 14 Θ(f(t 1,...,t n),e,m,g)? x 1,..., x n arguments formels et p le corps de f (dans G) e environnement de variables globales de G (v 1,m 1) = Θ(t 1,e,m,G) (v 2,m 2) = Θ(t 2,e,m 1,G)... (v n,m n) = Θ(t n,e,m n 1,G)
Slide 15 Θ(f(t 1,...,t n),e,m,g)? x 1,..., x n arguments formels et p le corps de f (dans G) e environnement de variables globales de G (v 1,m 1) = Θ(t 1,e,m,G) (v 2,m 2) = Θ(t 2,e,m 1,G)... (v n,m n) = Θ(t n,e,m n 1,G) e = e + (x 1 = r 1) +... + (x n = r n) m = m n + (r 1 = v 1) +... + (r n = v n) Σ(p,e,m,G) Ordre, e L exécution des instructions déclaration, affectation, séquence, test, boucle : ras Slide 16 appel de fonction idem expressions si Θ(t,e,m,G) = (v,m ), alors Σ(return t ;,e,m,g) = (v,m )
Un exemple static double hypothenuse (double x, double y){ return Math.sqrt(x * x + y * y);} Slide 17 public static void main (String [] args) { a = 3; b = 4; u = hypothenuse(a,b); System.out.println(u);} Et si a, b, u locales à main? Les messages La notion d état «passe à l échelle» Une fonction n est pas juste un couper-coller d un bout de code Slide 18 La portée statique des variables est éclairée par la sémantique : c est un choix (d autres sont possible) La sémantique spécifie tout (e.g. l ordre d évaluation des arguments) et montre les autres choix possibles
Slide 19 Le passage par valeur et le passage par référence class Troisverres { static int a; static int b; Slide 20 public static void main (String [] args) { a = 4; b = 7; int c = a; a = b; b = c; System.out.println(a); System.out.println(b);}}
static int a; static int b; static void swap (int x, int y) { int z = x; x = y; y = z;} Slide 21 public static void main (String [] args) { a = 4; b = 7; swap(a,b); System.out.println(a); System.out.println(b);} Ce que l on fait Slide 22 ce que l on veut faire
Le problème Slide 23 Θ(x) = m(e(x)) Mais on veut avoir accès à la référence e(x) En C Trois nouvelles constructions : une expression &x Θ(&x) = e(x) Slide 24 une expression *t Θ(*t,e,m) = m(θ(t,e,m)) Une instruction *t = u Σ(*t = u, e, m) = m + (r = v) où r = Θ(t,e,m) et v = Θ(u,e,m)
Ainsi L appel swap(&a,&b) produit l environnement Slide 25 [a = r, b = r, x = r, y = r ] et la mémoire [r = 3, r = 7, r = r, r = r ] void swap(int* x, int* y) { int z; z = *x; *x = *y; *y = z;} Slide 26 int main () { a = 4; b = 7; swap(&a,&b); printf("%d\n",a); printf("%d\n",b); return 0;}
Exactement la même solution : *t s écrit!t En Caml Slide 27 *t = u s écrit t := u pas de & car Θ(x,e,m) est toujours égal à e(x) et non m(e(x)) (si bien qu on doit écrire!x et non x sauf quand on veut le référence) Et en Java? Les types enveloppés Slide 28 (à suivre)
Les messages Quand un programme a un comportement inattendu, la sémantique explique pourquoi Slide 29 C et Caml c est pareil (mais pas Java)... sur ce point On peut parler des langages de manière transversale On peut parler de références sans parler d adresse (d ailleurs sont-ce des adresses?) Slide 30 Les fonctions Θ et Σ sont-elle bien définies?
Θ(t + u,e,m,g) = (v + w,m ) où (v,m ) = Θ(t,e,m,G) Slide 31 et (w,m ) = Θ(u,e,m,G), t et u sont des expressions plus petites que t + u Définition par récurrence Avec les fonctions Σ(f(t 1,...,t n),e,m,g) Slide 32 utilise Σ(p,e,m,G) où p est le corps de f Bien formée?
Slide 33 Si appel des fonctions f, g,... dans le programme principal, pas d appel de fonctions dans le corps de f, g,... alors définition de Θ et Σ bien formée Si fonctions f 1, f 2, f 3,..., f n, Slide 34 uniquement appel de f 1,..., f i 1 dans le corps de f i alors définition de Θ et Σ bien formée Fortran Isolations successives de morceaux de programme
Le cas général L environnement global G est global Slide 35 Toutes les fonctions peuvent être appelées dans le corps de chaque fonction static int f (int x) {return f(x);} Θ(f(x),e,m,G) utilise Θ(f(x),e,m,G) Définition circulaire de Θ Slide 36 Appeler une fonction dans le corps de cette même fonction
Très utile Slide 37 static int fact(int x) { if (x == 0) return 1; return x * fact(x - 1);} Les déf. récursives ne sont pas des déf. par récurrence Slide 38 static int f (int n) { if (n <= 1) return 1; if (n % 2 == 0) return (1 + f(n / 2)); return 2 * f(n + 1);} Le calcul la valeur de f en 11 demande celui de sa valeur en 12 qui demande celui de sa valeur en 6 qui demande celui de sa valeur en 3 qui demande celui de sa valeur en 4 qui demande celui de sa valeur en 2 qui demande celui de sa valeur en 1
Les définitions récursives ne sont pas des définitions circulaires Sinon Slide 39 static int fact(int x) { return fact(x);} serait correcte Définitions récursives et programmes infinis Slide 40 static int fact(int x) { if (x == 0) return 1; return x * fact(x - 1);}
Définitions récursives et programmes infinis Slide 41 static int fact(int x) { if (x == 0) return 1; return x * fact1(x - 1);} Définitions récursives et programmes infinis Slide 42 static int fact1(int x) { if (x == 0) return 1; return x * fact1(x - 1);} static int fact(int x) { if (x == 0) return 1; return x * fact1(x - 1);}
Définitions récursives et programmes infinis static int fact2(int x) { if (x == 0) return 1; return x * fact2(x - 1);} Slide 43 static int fact1(int x) { if (x == 0) return 1; return x * fact2(x - 1);} static int fact(int x) { if (x == 0) return 1; return x * fact1(x - 1);} Un programme non récursif... mais infini Slide 44 Récursivité : notation finie pour une instruction infinie Comme la boucle while Potentialité de non terminaison
Approximations On remplace fact10 par giveup Slide 45 Tente de calculer la fact(n) avec 10 appels récursifs imbriqués au maximum Abandonne sinon Les approximations de la factorielle 0 1 2 3 4 5 1 Slide 46 1 1 1 1 2 1 1 2 6 1 1 2 6 24
static int f (int n) { if (n <= 1) return 1; if (n % 2 == 0) return (1 + f(n / 2)); return 2 * f(n + 1);} Slide 47 0 1 2 3 4 5 1 1 1 1 2 1 1 2 3 1 1 2 6 3 Les fonctions Θ k et Σ k Éviter de répliquer les fonctions un nombre infini de fois Θ k(t,e,m,g) : idem Θ si moins de k appels de fonctions imbriqués (et pas définie sinon) Slide 48 Même définition que Θ sauf cas appel de fonction Θ k(f(t 1,...,t n),e,m,g) utilise Σ k 1(p,e,m,G) si k > 0 et Θ 0/Σ 0(f(t 1,...,t n),e,m,g) n est pas définie récurrence sur k
Les fonctions Θ et Σ Slide 49 Θ(t,e,m,G) = lim k Θ k(t,e,m,g) Σ(t,e,m,G) = lim k Σ k(t,e,m,g) Fonctions récursives et définitions au point fixe Une alternative pour définir les fonctions Θ et Σ Slide 50 Voir la définition de la factorielle comme une équation f = x si (x == 0) alors 1 sinon x * f(x-1) f = Φ(f) Équation au point fixe
Toutes les fonctions ont un point fixe Dans l espace des fonctions partielles Exemples : f = x si (x == 0) alors 1 sinon x * f(x-1) Slide 51 f = x 1 + f(x) f = x f(x) La fonction la moins définie Même Θ / Σ (car point fixe = limite) Les messages La récursivité n est pas une licence Slide 52 C est la deuxième fois qu on utilise la notion de limite (et ce n est pas la dernière)