Chapter 3
Normalisation of proof obligations

Hypotheses and goals are normalised by the Proof Obligation Generator and the prover. This normalisation enables the transformation of expressions into expressions in normal form, which will afterwards be used by all the rules related to this expression.

This limits polymorphism of the rules of the prover rule base, and thus their number.

The normal forms selected are:



Expression Normal Form




n > m m + 1 <= n


m < n m + 1 <= 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


It is advised during a rule writing, to check that this rule is normalised. If not, the rule will be normalised when loading and may not be applied anymore.

For example, the following rule:

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

is normalised into

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

But the btest only accepts parameters with the form a op b, where a and b are literal integers. This rule will never be applied. It should have rather been written:

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