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)¬(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 |
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:
is normalised into
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: