by Edsger Wybe Dijkstra, W. H. J. Feijen
An introduction to computer programming motivated by successively transforming mathematical characterizations of program state.