Application d’une règle ou une théorie utilisateur
ar(T)
ar(r, M)
avec :
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 :
La théorie DED (théorie native du kernel réalisant la montée des hypothèses dans la pile) est obligatoire. Les théories Forward ne sont appelées qu’à l’occasion de chaque hypothèse montée. Les théories Backward génèrent des buts dérivés P => Q mais ne font pas monter les hypothèses P. Il faut donc leur associer une théorie permettant d’effectuer une déduction directe (DED). Lorsque la commande ar se terminera, les hypothèses seront associées au but courant, qui sera alors :
Hypothèses générées ⇒ But courant
Bien entendu, les théories peuvent être “tildées”. Par exemple :
Implicitement
est équivalent à
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.
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
|
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)
|