Les hypothèses et les buts sont normalisés par le Générateur d’obligations de preuve et le
prouveur. La normalisation permet de transformer une expression en une expression normale,
qui sera par la suite utilisée, sous cette forme, dans l’ensemble des règles relatives à cette
expression.
Cela permet de limiter le polymorphisme des règles de la base de règles du prouveur, donc leur
nombre.
Les formes normales retenues sont :
Expression | Forme normale |
n > m - 1 | m <= n |
m < n - 1 | m <= n |
a <=> b | (a => b)&(b => a) |
a <: b | a : POW(b) |
a <<: b | a : POW(b)¬(a = b) |
a ∕ : b | not(a : b) |
a ∕ = b | not(a = b) |
a ∕ <: b | not(a : POW(b)) |
a ∕ <<: b | a : POW(b) => a = b |
a : NATURAL | a : INTEGER&0 <= a |
NATURAL1 | NATURAL -{0} |
NAT1 | NAT -{0} |
FIN1(A) | FIN(A) -{{}} |
POW1(A) | POW(A) -{{}} |
seq1(A) | seq(A) -{{}} |
iseq1(A) | iseq(A) -{{}} |
perm(E) | iseq(E)∕\(NATURAL -{0} + - >> E) |
<> | {} |
{x,y} | {x}\∕{y} |
{x|P} | SET(x).P |
Il convient, lors de l’écriture d’une règle, de vérifier que cette règle est bien normalisée. Dans le
cas contraire, la règle va être normalisée lors de son chargement et peut ne plus pouvoir
s’appliquer.
Par exemple, la règle suivante :
va être normalisée en
Or la garde btest n’accepte que des paramètres de la forme a op b, où a et b sont des entiers. Cette règle ne va donc jamais s’appliquer. Il aurait fallu écrire plutôt :