Also, slightly less advanced:
A Discipline of Programming
https://www.amazon.com/Discipline-Programming-Edsger-W-Dijks...
For more practical fun, consider Frama-C, SPARK, and Dafny.
I learned this stuff from Roland's 'Program Construction'. Great book. Once you've been through that, then suddenly Dijkstra's writing becomes really practical.
Also advanced, but quite readable: https://www.amazon.com/Discipline-Programming-Edsger-W-Dijks...
Ad 1) Two five-star reviews on amazon UK:
https://www.amazon.co.uk/Algorithmic-Problem-Solving-Roland-...
1) basic (great for kids, math novices, whatever): https://www.amazon.com/gp/product/0470684534/ref=dbs_a_def_r... (ignore the two star review, this book would get 5 stars from me)
2) advanced (free, complete with videos): http://www.cs.toronto.edu/~hehner/aPToP/
3) advanced: https://www.amazon.com/gp/product/0470848820/ref=dbs_a_def_r...
4) advanced, theoretical, from the man himself: https://www.springer.com/gp/book/9781461279242