theory of program correction