This is extremely well written, which I can say, because despite not having a strong background, I understood all of the introductory material. The idea of dividing between monotone and non-monotone expressions is challenging, from a usability perspective. It feels like a leaky abstraction problem made explicit, complicating the language?