Un triplet de Hoare est consitué d'une précondition \(F\) et d'une
postcondition \(G\) qui sont toutes deux des formules du calcul des prédicats,
et d'un programme prog
. On note le triplet de deux façons différentes en
fonction de la sémantique associée :
prog
s'arrête, alors, après l'exécution et l'arrêt de prog
, \(G\) est vraie.prog
s'arrête et, après son exécution, \(G\) est vraie.La logique de Hoare est basée sur deux axiomes portant sur l'affectation. Dans ces axiomes, la notation \(F[x\leftarrow T]\) désigne la formule \(F\) du calcul des prédicats dans laquelle toutes les occurrence de la variable libre \(x\) ont été remplacées par le terme \(T\). La même notation est utilisée pour remplacer les occurrences d'une variable dans un terme par un autre terme.
Les axiomes de Hoare pour l'affectation sont de la forme :
Les axiomes de Floyd pour l'affectation sont de la forme :
Le reste du système consiste en les règles de déduction suivantes.
La correction partielle d'une boucle while
consiste simplement à faire l'hypothèse
que si la boucle possède un invariant, alors celui-ci sera vrai après l'arrêt de la boucle (s'il était
vrai avant). Ceci correspond à la règle suivante :
dans laquelle \(I\) est l'invariant.
Pour la correction totale, il faut aussi garantir l'arrêt de la boucle, ce qui peut se faire grâce à un variant. Il s'agit d'un terme \(V\) dont la valeur décroît strictement à chaque exécution de la boucle, tout en restant de façon garantie supérieure ou égale à zéro. Comme les programmes travaillent en valeurs entières, ces propriétés garantissent l'arrêt de la boucle. On a donc la règle suivante :
dans laquelle \(I\) est l'invariant, \(V\) le variant et \(n\) une variable qui n'apparaît ni dans \(V\), ni
dans \(I\), ni dans prog
.