de Bakker, Mathematical theory of program correctness (1980)