A constructive approach to the problem of program correctness