Chapitre 3
Normalisation des obligations de preuve

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)&not(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 : NATURALa : 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 :

btest(0<x)  
=>  
0<=x**2-1

va être normalisée en

btest(0+1<=x)  
=>  
0<=x**2-1

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 :

btest(1<=x)  
=>  
0<=x**2-1