4.5 Apply rule

Application dune règle ou une théorie utilisateur

Syntaxe

  ar(T)
  ar(r, M)

avec :

Utilisation

ar est une commande qui permet d’appliquer une règle ou une théorie sur différentes parties du lemme à prouver.
Pour des règles de réécriture, l’argument M permet d’agir de manière contrôlée sur n’importe quelle partie de l’obligation de preuve, but ou hypothèse.

Les règles utilisées sont celles de la base de règles du prouveur, des règles éventuelles contenues dans le fichier pmm (voir chapitre 6 page §) associé au composant, ainsi que les règles contenues dans le fichier PatchProver (voir chapitre 7 page §).

Pour accéder à la base de règles il faut cliquer sur le menu ”Display/print” et ensuite sur le bouton ”Display Rules Database” de la fenêtre INTERACTIVE PROOF du prouveur interactif.

Application en mode backward (M=Once ou M=Multi) :

Application en mode forward (M=Fwd) :

Application d’une tactique :

Après l’application de la commande ar, si de nouvelles hypothèses sont générées, le but est de la forme H B (l’opérateur peut voir les nouvelles hypothèses générées). Il faut exécuter la commande pr (voir chapitre 4.38 page §) pour relancer la preuve et faire monter ces hypothèses.

Attention ! Si des règles utilisateur (pmm, PatchProver) sont utilisées, la validité de la preuve peut être remise en question. Il faut alors effectuer une démonstration mathématique pour chacune de ces règles.

Exemple 1

Soit la situation suivante :


 
    Hypothesis  
        xx: 1..10 &  
        yy: 1..10 &  
        zz: 1..100  
    Goal  
        xx+yy-1: 1..100  
 


L’opérateur utilise le fichier pmm suivant :


 
THEORY test IS  
 
        a: 1..d &  
        b: 1..d  
        =>  
        a+b: 2..2*d;  
 
        d <= a-c &  
        a-c <= e  
        =>  
        a-c: d..e  
 
END  
 


La théorie test est lue et compilée, grâce à la commande pc (voir chapitre 4.35 page §).


 
PRI> pc  
Loading theory test  
 


La règle test.1 est alors appliquée en mode forward (génération d’hypothèses).


 
PRI> ar(test.1,Fwd)  
Starting Apply Rule  
 


5 nouvelles hypothèses ont été générées. Le but devient :


 
    Goal  
        xx+xx: 2..20 &  
        xx+yy: 2..20 &  
        yy+xx: 2..20 &  
        yy+yy: 2..20 &  
        zz+zz: 2..200  
        =>  
       xx+yy-1: 1..100  
 


Grâce à la commande dd (voir chapitre 4.14 page §).


 
PRI> dd  
Starting Deduction  
 


les hypothèses sont ensuite montées dans la pile des hypothèses.


 
     New Hypothesis since last command  
        xx+xx: 2..20 &  
        xx+yy: 2..20 &  
        yy+xx: 2..20 &  
        yy+yy: 2..20 &  
        zz+zz: 2..200  
    Goal  
        xx+yy-1: 1..100  
 


La règle test.2 est alors utilisée en mode backward.


 
PRI> ar(test.2, Once)  
Starting Apply Rule  
 


La règle s’applique (on vérifie que la ligne de commande contient ar(test.2,Once)) et les deux sous-buts 1 xx + yy - 1 et xx + yy - 1 100 vont être traités. Le premier sous-but est à prouver :


 
    Goal  
        1<=xx+yy-1  


Le prouveur automatique est appelé une première fois :


 
PRI> pr  
Starting Prover Call  
 


Le premier sous-but est déchargé. Le second sous-but devient le but courant.


 
    Goal  
        xx+yy-1<=100  
 


Par appel au prouveur automatique


 
PRI> pr  
Starting Prover Call  


le second sous-but est déchargé et l’obligation de preuve est prouvée, moyennant la justesse des règles contenues dans le fichier pmm !

La ligne de commande est finalement :


 
        Force(0) &  
          ar(test.1,Fwd) &  
            dd &  
              dd &  
                ar(test.2,Once) &  
                  pr &  
                  pr &  
          Next  


Exemple 2

Soit la situation suivante :


 
    Hypothesis  
        tt: {e1,e2,e3,e4,e5} => zz = e5 &  
        zz = e5 => tt: {e1,e2,e3,e4} &  
        tt = e5 => zz = e1 &  
        zz = e1 => tt = e5  
    Goal  
        tt = e5 or zz = e2  
 


associée au fichier pmm suivant :


 
THEORY test IS  
 
        bguard(WRITE: bwritef("Application de test.1\n")) &  
        (B=>not(A))  
        =>  
        (A or B)  
 
END  
&  
THEORY testbis IS  
 
        a = b &  
        b: E  
        =>  
        a: E  
END  
 


L’opérateur essaye d’appliquer la théorie backward test au but courant. Les hypothèses seront montées par la théorie DED. En cas de génération d’hypothèses, la théorie forward testbis sera alors essayée.


 
PRI> ar((test;DED),testbis)  
Application de test.1  
Starting Apply Rule  
 


La règle test.1 contient une garde permettant d’imprimer un message indiquant son déclenchement (Application de test.1). La règle testbis.1 s’est déclenchée lors de la montée de l’hypothèse zz = e2 et a permis de générer l’hypothèse zz ∈{e1,e2,e3,e4,e5}. Toutes les hypothèses générées sont finalement rangées comme antécédent du but courant.


 
    Goal  
        btrue & zz=e2 & zz: {e1,e2,e3,e4,e5} => not(tt = e5)