Reactive Programming in Lean Part 3: A Deep Embedding of Linear Temporal Logic

In the previous posts, we saw how dependent types let us enforce that every step our reactive program took was valid, and how our monadic API gives us a nice way to sequence those steps (even if we lose static guarantees in the process). However, we hit the limits of what we could express in terms of propositions over our system’s traces. It’s straightforward enough to write statements about an…