Abstraction d’une expression
ae(EX,ID)
avec :
Cette commande permet de générer le but Δe(EX) ∧ (EX = ID => [EX := ID]G) où
Δe(EX) représente le lemme de bonne définition de l’expression EX (voir chapitre 2.3 page §)
et [EX := ID]G le but courant dans lequel ont été remplacées les diverses occurences de
l’expression EX (apparaissant dans le but) par l’identificateur ID.
Il est nécessaire de vérifier la bonne définition de l’expression EX car sortie de son contexte (le
but courant), elle peut éventuellement être mal définie.
Supposons en effet que sous l’hypothèse xx + 1 <= 1 on ait le but
xx + 1 <= 1 ∨ max(1..xx) = xx. Ce but est bien défini puisque xx + 1 <= 1 est bien défini et
not(xx + 1 <= 1) ⇒ Δp(max(1..xx) = xx) i.e. not(xx + 1 <= 1) => Δe(max(1..xx)) soit
encore not(xx + 1 <= 1) => 1..x ∩ NAT ∈ FIN(NAT) ∧ not(1..xx) = ∅ (d’après la bonne
définition de ∨ et de max). Si on effectue ae(max(1..xx),MAX) sans précaution concernant la
bonne définition, on obtient le but max(1..xx) = MAX => xx + 1 <= 1 ∨ MAX = xx. Puis
une déduction (par dd) permet de faire monter en hypothèses la formule max(1..xx) = MAX
qui est maintenant dépourvue de sens puisqu’on a l’hypothèse xx + 1 <= 1 (et donc
1..xx = ∅).
Remarquons enfin que le prouveur tente une preuve automatique du lemme de bonne définition de l’expression EX et si la preuve échoue, le lemme de bonne définition devra être démontrée interactivement.
Soit le but à démontrer suivant :
1+wr<=p2 => p2+1<=p1 or p1<=wr & 1+p2<=wr => p2+1<=p1 & p1<=wr => p2+1<=p1 or p1<=p3
|
L’opérateur désire remplacer l’expression p2 + 1 par pp2 :
PRI> ae(p2+1,pp2)
|
On obtient le but suivant (le lemme de bonne défintion de p2 + 1, réduit à btrue, est démontré
automatiquement par le prouveur) :
p2+1=pp2 => (1+wr<=p2 => pp2<=p1 or p1<=wr & 1+p2<=wr => pp2<=p1 & p1<=wr => pp2<=p1 or p1<=p3)
|
On peut ensuite monter en hypothèse l’égalité pp2 = p2 + 1 (en utilisant la commande
deduction dd) et on vérifie cela à l’aide de la commande Search Hypothesis :
PRI> sh(p2) Searching all Hypothesis that contain p2 match with a Starting search... Found hypothesis List is pp2=p2+1 & 3<=p2 & p2<=2147483647 & 0<=p2 & p2: INTEGER End of found hypothesis
|
Soit le but à démontrer suivant :
Hypothesis ... 0<=aa & aa <= bb & ... Goal max(aa..bb) = {bb}
|
L’utilisateur souhaite remplacer l’expression max(aa..bb) par MAXI :
ae(max(aa..bb),MAXI)
|
Le lemme de bonne définition associé à l’expression max(aa..bb) est
not(aa..bb = ∅) ∧ aa..bb ∩ NATURAL : FIN(NATURAL). Le prouveur automatique ne
parvient pas à le démontrer, il génére donc le premier sous-but suivant :
not(aa..bb = {})
|
Une fois ce but démontré (par exemple par ah(aa<=bb) & pp(rp.0)), le prouveur génére le
sous-but suivant :
aa..bb /\ NATURAL: FIN(NATURAL)
|
La commande pr suffit alors à démontrer ce but. La bonne définition de l’expression
max(aa..bb) est donc démontrée. Le prouveur peut donc effectuer la subsitution de max(aa..bb)
par MAXI dans le but de départ et générer le nouveau but :
max(aa..bb) = MAXI => MAXI = {bb}
|