## Asserts and errors for nice wp definition

We used assert(F) to express conditions that should hold.

Can we give executation semantics to assert?

assert(F) = irrecoverable error if is false, terminates execution.

wp computes conditions sufficient for errors not to happen.

Postconditions are just asserts at the end of the program.

How to build a system with relations where at the same time

wp(assert(F),Q) = (F & Q) wp(assume(F),Q) = (F --> Q)

Then

wp(assert(false); assume(false),Q) = false wp(assume(false); assert(false),Q) = true

so cannot have any more, otherwise both

assert(false); assume(false) assume(false); assert(false)

would denote empty relations.

## Error Variable and Good States

Introduce variable “error”. Good states are states where this variable has value zero. We write OK for the formula error=0.

We assume that the desired properties satisfy

## Desired Rules for Weakest Preconditions

For all such that , we would like the following to hold:

We assume above that is not the *error* variable.

Note: we wrote in the weakest precondition of assume, but usually is implicit and we do not write it. We do not need it in other cases because it follows that right hand side implies .

## Relational Semantics that Fulfills These Rules

Let OK denote s(error)=0 and OK' denote s'(error)=0. We define: