Algorithmique et ComplexiT´
e
Rappels:
Preuve et complexit´
e des algorithmes
Master1 Informatique
Sophie Tison
Un premier rappel: comment prouver qu’un
algorithme est correct
PROUVER QUUN PROGRAMME EST CORRECT?
Certaines estimations ´
evaluent les pertes annuelles li´
ees aux
erreurs de programmation en Europe `
a plusieurs dizaines de
milliards d’euros.
Les exemples de bugs c´
el`
ebres sont nombreux: Sonde Mariner
1, Ariane V, Panne d’Electricit´
e en Am´
erique du Nord en 2003,
F22 Raptor en 2007, BNP Paribas en 2009, . . . Certains bugs ont
des cons´
equences dramatiques comme celui du Therac-25.
PROUVER QUUN PROGRAMME EST CORRECT???
TESTER?
Le test est un outil essentiel mais ne garantit pas l’absence de
bugs.
”Program testing can be used to show the presence of bugs, but never
to show their absence !” Edsger W. Dijkstra
PROUVER QUUN PROGRAMME EST CORRECT???
PREUVE FORMELLE?
Elle peut ˆ
etre:
IManuelle
IAutomatique – donc limit´
ee
IInteractive comme par exemple avec Coq.
LASSISTANT DE PREUVE COQ
Coq Selected As Recipient Of The ACM 2013 Software System
Award:
”Coq is a software tool for the interactive development of
formal proofs, which is a key enabling technology for certified
software. It provides a formal language to write mathematical
definitions, executable algorithms and theorems together with
an environment for semi-interactive development of
machine-checked proofs.”
Coq a par exemple permis la r´
ealisation de CompCert,
compilateur certifi´
e C.
PROUVER QUUN PROGRAMME EST CORRECT???
PREUVE FORMELLE?
”One does not need to give a formal proof of an obviously correct
program; but one needs a thorough understanding of formal proof
methods to know when correctness is obvious.” John C. Reynolds
PROUVER LA CORRECTION DUN PROGRAMME,
c’est prouver qu’il correspond `
a la sp´
ecification donn´
ee.
La Logique de Hoare-Floyd a ´
et´
e introduite `
a la fin des ann´
ees
60 pour formaliser la relation entre langage de programmation
(imp´
eratif) et langage de sp´
ecification.
CHARLES ANTONY RICHARD HOARE
Charles Anthony Richard Hoare, laur´
eat du prestigieux Prix
Turing (1980), a eu de nombreuses contributions remarquables,
comme la logique de Hoare mais aussi le Quicksort, un
compilateur Algol 60 ou la d´
efinition de CSP, un mod`
ele pour
la programmation concurrente.
TRIPLETS DE HOARE
La logique de Hoare-Floyd se base sur la notion de triplet de
Hoare, de la forme
{P}A{Q}
Pest la pr´
econdition,
Qla postcondition,
Aune expression du langage de programmation.
SP´
ECIFICATION
{P}A{Q}
Pet Qsont des assertions, i.e. des formules du langage de
sp´
ecification d´
ecrivant les valeurs des variables, l’´
etat de la
m´
emoire ou du syst`
eme.
En toute rigueur, le langage de sp´
ecification devrait ˆ
etre un
langage math´
ematique comme la logique des pr´
edicats, mais
dans un objectif de documentation plus que de preuve de
programmes, le langage de sp´
ecification peut ˆ
etre le langage
naturel (en ´
evitant les ambiguit´
es!).
INTERPR´
ETATION
L’interpr´
etation de {P}A{Q}est:
si le syst`
eme v´
erifie {P}, on peut assurer qu’il v´
erifie {Q}apr`
es
l’ex´
ecution de A;
En fait, c’est un peu plus compliqu´
e que cela; en effet, il se peut
que l’ex´
ecution de Ane termine pas! On a donc deux
interpr´
etations possibles:
Isi {P}est v´
erifi´
ee, apr`
es l’ex´
ecution de A, si celle-ci termine,
on peut assurer {Q}; on parle alors de correction partielle.
Isi {P}est v´
erifi´
ee, la terminaison de Aest assur´
ee et apr`
es
son ex´
ecution, on peut assurer {Q}; on parle alors de
correction totale.
PROUVER UN PROGRAMME REVIENT DONC `
A
PROUVER
{Pr´
econdition sur les donn´
ees}
Programme
{condition exprimant les r´
esultats attendus}
`
a partir des axiomes et des r`
egles d’inf´
erences de Hoare qui
montrent comment inf´
erer la correction d’instructions
compos´
ees `
a partir de celles de base -donn´
ees par la
s´
emantique du langage-.
UN EXEMPLE
Input: Integers x0 and b0
Output: R=???
int R=0,a=x,b=y;
while b>0do
if b impair then
R=R+a;
end
a=2a;
b=b÷2 ;
end
Algorithm 1: Myst`
ere
UN EXEMPLE:MULTIPLICATION `
A L´
EGYPTIENNE (OU
`
A L´
ETHIOPIENNE OU `
A LA RUSSE, ...)
Le papyrus Rhind
MULTIPLICATION `
A L´
EGYPTIENNE
Input: Integers x0 and b0
Output:R=xy?
int R=0,a=x,b=y;
while b>0do
if b impair then
R=R+a;
end
a=2a;
b=b÷2 ;
end
Algorithm 2: Multiplication `
a l’´
egyptienne
MULTIPLICATION `
A L´
EGYPTIENNE
Input: Integers x0 and b0
Output:R=xy?
int R=0,a=x,b=y;
while b>0do
// ???
if b impair then
R=R+a;
end
a=2a;
b=b÷2 ;
end
Algorithm 3: Multiplication `
a l’´
egyptienne
MULTIPLICATION `
A L´
EGYPTIENNE
Input: Integers x0 and b0
Output:R=xy?
int R=0,a=x,b=y;
while b>0do
// R+ab=xy,b0
if b impair then
R=R+a;
end
a=2a;
b=b÷2 ;
end
Algorithm 4: Multiplication `
a l’´
egyptienne
MULTIPLICATION `
A L´
EGYPTIENNE
Input: Integers x0 and b0
Output:R=xy?
int R=0,a=x,b=y;
while b>0do
// R+ab=xy,b0
// R+2a(b÷2) + a(bmod 2) = xy
if b impair then
R=R+a;
end
a=2a;
b=b÷2 ;
end
Algorithm 5: Multiplication `
a l’´
egyptienne
MULTIPLICATION `
A L´
EGYPTIENNE
Input: Integers x0 and b0
Output:R=xy?
int R=0,a=x,b=y;
while b>0do
// R+ab=xy,b0
// R+2a(b÷2) + a(bmod 2) = xy
if b impair then
R=R+a;
end
// R+2a(b÷2) = xy
a=2a;
b=b÷2 ;
end
Algorithm 6: Multiplication `
a l’´
egyptienne
1 / 18 100%