Preuve de programmes en logique de Hoare

Projet pour le cours [PLOG] 2011.

version du 25/05/2011


  1. Présentation

    La logique de Hoare (1969) est une forme systématique et automatisable de la méthode de preuve de programmes impératifs par assertions due à Floyd (1967).
    Le but du projet est d'en donner une réalisation en Prolog.

    On se limite ici au cas le plus élémentaire de programmes écrits dans le "micro-langage" MIL
    opérant sur des entiers, avec comme constructions
    Ces programmes sont donnés en syntaxe abstraite sous forme de documents XML.
    En voici quelques exemples.
    (Au sujet de leur représentation comme des termes Prolog, voyez mil_H.pl et tradXML_H.pl,
    variantes de programmes présentés en cours.)

    La validité du programme se détermine par rapport à
    Notez que la précondition, la postcondition et les invariants de boucle sont a priori des formules quelconques.
    Nous n'utiliserons que des formules propositionnelles où les atomes sont

    Exemple.

    La logique de Hoare a pour fonction d'exhiber les conditions de vérification,
    c'est-à-dire les propriétés qui doivent être vraies pour que la précondition implique effectivement la postcondition
    à travers l'exécution du programme.
    En voici une réalisation en Prolog, explication, programme.

    Suite de l'exemple.

    Démontrer que ces conditions sont effectivement vérifiées est une autre histoire...
    La validité du programme peut parfaitement reposer sur des propriétés arithmétiques fines qui restent hors de portée de la démonstration automatique !

    Le projet a pour but de construire un programme Prolog démontrant le plus possible de conditions de vérification dans la collection précitée (voici la signification des prédicats supplémentaires).

  2. Premiers pas

    Je vous propose d'utiliser pour chaque condition de vérification le programme Wang (théorie, fichier Wang.pl),
    qui démonte la structure logique pour la réduire à sa forme normale conjonctive.
    Je vous rappelle que la représentation d'une clause en Prolog par un couple de listes comme "[[x, y, z], [u, v]]"
    s'interprète comme une implication "(x⋀y⋀z) ⊃ (u⋁v)".
    En l'occurrence les atomes ne sont plus des variables propositionnelles mais des comparaisons arithmétiques
    (ou des applications de prédicats supplémentaires).

    Mais cette technique s'applique mieux à des conditions de vérification normalisées pour en extraire toute la logique,
    par exemple en remplaçant "b<=a" par "0<a-b ou 0=a-b".

    Les prédicats définis dans norm.pl permettent de régler des cas très faciles (exemple1, exemple2), il s'agit d'aller plus loin !

    Très vite se pose le problème de la stratégie de preuve.
    On distingue en effet deux parties bien distinctes,

    L'idée est d'utiliser systématiquement le programme Wang pour traiter les aspects logiques.
    Encore faut-il le mettre en œuvre à bon escient.

    La statégie du prédicat voirCV détini dans le fichier norm.pl est
    1. d'effectuer d'abord une normalisation/simplification arithmétique (prédicat normTop),
    2. puis d'appliquer Wang,
    3. et enfin d'éliminer les énoncés qui sont "évidemment vrais" vu les connaissances du système
      (prédicat spll).

    On a le choix (non exclusif !) entre :

    Vous aurez d'autres idées !
    À suivre...