Planche 1

Inf 431 -- Cours 9
Assertions et Programmes
http://jeanjacqueslevy.net
secrétariat de l'enseignement:
Catherine Bensoussan
cb@lix.polytechnique.fr
Aile 00, LIX,
01 69 33 34 67
http://www.enseignement.polytechnique.fr/informatique/IF

Planche 2

Plan

  1. Correction de programmes itératifs scalaires
  2. Terminaison de programmes itératifs
  3. Correction de programmes avec des tableaux
  4. Logique de Hoare
  5. Récursion et assertions
  6. Ordres bien-fondés

Planche 3

La suite de Fibonacci (1/6)


Planche 4

La suite de Fibonacci (2/6)

Planche 5

La suite de Fibonacci (3/6)

Planche 6

La suite de Fibonacci (4/6)

Planche 7

La suite de Fibonacci (5/6)



Planche 8

La suite de Fibonacci (6/6)

1 2 3 4 5 6 7

Planche 9

Le PGCD (1/3)

Planche 10

Le PGCD (2/3)

2 3 4 5 6 7

Exercice 1 Montrer que le raisonnement n'est plus valide avec {a ³ 0 Ù b ³ 0}. Comment corriger le programme?


Planche 11

Le PGCD (3/3)

Exercice 2 Faire le raisonnement avec l'algorithme d'Euclide suivant avec {a ³ 0 Ù b ³ 0} comme assertion d'entrée.
static int pgcd (int a, int b) {
  int x = a, y = b;
  while (y != 0) {
    int r = x % y;
    x = y;
    y = r;
  }
  return x;
}

Exercice 3 Modifier les programmes pour qu'ils acceptent comme assertion d'entrée {a Î Z Ù b Î Z}.


Planche 12

Assertions

Planche 13

Terminaison (1/2)


static int fibonacci (int n) {
  {n ³ 0}
  int x = 0;
  if (n != 0) {
    x = 1; int y = 0;
    int k = 1;
    {W(n,k) = n - k}
    while (k != n) {
      int t = y;
      y = x;
      x = x + t;
      ++k;
    }
  }
  {x = fib(n)}
  return x;
}

En un tour de boucle comme (n,k) devient (n,k+1), on a
W(n,k) = n-k > n-k-1=W(n,k+1).

L'instruction
while s'arrête donc.

Planche 14

Terminaison (2/2)


static int pgcd (int a, int b) {
  {a > 0 Ù b > 0}
  int x = a, y = b;
  {x > 0 Ù y>0 Ù W(x,y) = max(x,y)}
  while (x != y)
    if (x > y)
      x = x - y;
    else
      y = y - x;
  return x;
}

Ici encore en un tour de boucle, si x>y, on a
W(x,y) = max(x,y) > max(x-y,y)=W(x-y,y)

De même, si x < y, on a
W(x,y) = max(x,y) > max(x,y-x)=W(x,y-x)

L'instruction
while s'arrête donc.

Exercice 4 Montrer la terminaison de l'algorithme d'Euclide.


Planche 15

Assertions et tableaux (1/3)


  static void drapeauHollandais (int[ ] a) {       [Dijkstra]
    int n = a.length; int b = 0, i = 0, r = n;
    while (i < r) {
      switch (a[i]) {
      case BLEU:
        int t = a[b]; a[b] = a[i]; a[i] = t;
        ++b; ++i;
        break;
      case BLANC:
        ++i;
        break;
      case ROUGE:
        --r;
        int u = a[r]; a[r] = a[i]; a[i] = u;
        break;
      }
    }
  }


Planche 16

Assertions et tableaux (2/3)


  static void drapeauHollandais (int[ ] a) {
    int n = a.length; int b = 0, i = 0, r = n;
    {f(0,b,BLEU) Ù f(b,i,BLANC) Ù f(r,n,ROUGE) Ù i £ r}
    while (i < r) {
      switch (a[i]) {
      case BLEU:
        1{f(0,b,BLEU) Ù f(b,i,BLANC) Ù f(r,n,ROUGE) Ù a[i] = BLEU Ù i < r}
        int t = a[b]; a[b] = a[i]; a[i] = t;
        2{f(0,b+1,BLEU) Ù f(b+1,i+1,BLANC) Ù f(r,n,ROUGE) Ù i < r}
        ++b; ++i; break;
      case BLANC:
        3{f(0,b,BLEU) Ù f(b,i+1,BLANC) Ù f(r,n,ROUGE) Ù i < r }
        ++i; break;
      case ROUGE:
        4{f(0,b,BLEU) Ù f(b,i,BLANC) Ù f(r,n,ROUGE) Ù a[i] = ROUGE Ù i < r}
        --r;
        5{f(0,b,BLEU) Ù f(b,i,BLANC) Ù f(r+1,n,ROUGE) Ù a[i] = ROUGE Ù i £ r}
        int u = a[r]; a[r] = a[i]; a[i] = u;
        break;
    } }
    {f(0,b,BLEU) Ù f(b,r,BLANC) Ù f(r,n,ROUGE)}
  }

f(i,j,c) = " ki £ k < j Þ a[k] = c

1 2 3 4 5


Planche 17

Assertions et tableaux (3/3)

La terminaison du drapeau hollandais se montre en considérant l'ordinal W(b,i,r) = r - i.

Exercice 5 Montrer la correction du tri par sélection suivant:
static void triSelection (int[ ] a) {
  int n = a.length;
  for (int i = 0; i < n - 1; ++i) {
    int min = i;
    for (int j = i+1; j < n; ++j)
      if (a[j] < a[min])
        min = j;
    int t = a[min]; a[min] = a[i]; a[i] = t;
  }
}

Exercice 6 Montrer la correction du tri par insertion.

Exercice 7 Montrer la correction du tri par bulles.
(cf. cours 1ère année)


Planche 18

Quelques principes logiques

cf. logique de Floyd-Hoare.
Dans le triplet {P} S {Q}, on appelle P et Q des pré-condition et post-condition de S.


Planche 19

Logique de Hoare


   
{P (E)} x = E; {P(x)}
{P Ù E}   S {Q} {P Ù ¬ E} S'{Q}
{P} if (E) S else S' {Q}
{P} S {Q} {Q} S'{R}
{P} S S'{R}
{P} S {Q}
{P} {S} {Q}
{P Ù E} S {P}
{P} while (E) S {P Ù ¬ E}
P Þ P' {P'} S {Q'} Q' Þ Q
{P} S {Q}

Les formules sont des triplets {P} S {Q}.

Les prémisses d'une règle d'inférence sont au dessus de la barre.

La conclusion d'une règle d'inférence est en dessous.

Un axiome est une règle sans prémisse.


Planche 20

Correction partielle -- Correction totale

Planche 21

Implémentation des assertions (1/2)

Java 1.4: l'instruction assert lève AssertionError si l'assertion n'est pas vérifiée. Beaucoup de langages ont cette facilité: Caml, C, C++.
Planche 22

Implémentation des assertions (2/2)

Planche 23

Récursion et assertions (1/3)

Planche 24

Récursion et assertions (2/3)

Planche 25

Récursion et assertions (3/3)

Exercice 8 Le démontrer... Indication: se servir de la formule

{prem(x,a) = (a =
null Ú inserer(x,a).val = x Ú inserer(x,a).val = a.val)}

Planche 26

Ordres bien-fondés et terminaison (1/3)

Planche 27

Ordres bien-fondés et terminaison (2/3)



Théorie des w.q.o. (well quasi orderings) [Kruskal, Nash-Williams, Plaisted, Dershowitz]
Théorie des systèmes de réécriture
Démonstration automatique.

En fait tout ordre sur les arbres étiquetés par un ensemble fini E Ì N vérifiant:
t=n(t1, t2, ··· tn) u=n(u1, u2, ··· up)   si   ti ui   pour un i
t=n(···,  ti,  ···) u=n(···,  ···)
est bien fondé.

Planche 28

Ordres bien-fondés et terminaison (3/3)

Exercice 9 Trouver les ordres bien-fondés qui permettent de conclure à la terminaison de ces deux fonctions récursives (fonction 91 de [McCarthy] ou de [Ackermann]).
static int ack (int m, int n) {
  if (m == 0)
    return n + 1;
  else
    if (n == 0)
      return ack (m - 1, 1);
    else
      return ack (m - 1, ack (m, n - 1));
}  

Indications: considérer l'ordre lexicographique pour Ackermann et l'ordre partiel suivant pour 91:
0 1 2 ··· 98 99 100 x
x quelconque tel que x > 100.

Planche 29

Exercices

Exercice 10 Montrer la correction de Quicksort.

Exercice 11 Montrer la correction de la fusion de listes triées.

Exercice 12 Montrer la correction du test d'acyclicité des graphes par depth-first-search.

Exercice 13 Montrer que la terminaison peut être une propriété aussi dure à montrer que la correction.





This document was translated from LATEX by HEVEA.