Constructing correct software (2. ed.)