Fantastic, pron - thanks for the helpful replies.
I had a look at Practical TLA+ a few weeks back, but because its first example also specifies a concurrent system, and because most of it is written in PlusCal syntax, not in TLA+, I decided to put it off. I'll give it another look on your recommendation. I'll also check out the subreddit you linked to.
The idea of starting with a general high-level specification before adding detail makes a lot of sense.
As for specific problems, I have in mind a program that should be simple to specify. At its heart, it tests whether each numeric value in an input tuple X lies between values at the same index in tuples A and B, so that if
∀x ∈ X : a_i ∈ A ≤ x_i ≤ b_i ∈ B
then the program outputs "true", and otherwise the program outputs "false". Because both outputs are allowed,
True ≜ ∧ ∀x ∈ X : ∧ x_i ≥ a_i ∈ A
∧ x_i ≤ b_i ∈ B
∧ Output′ = true
False ≜ ∧ ∃x ∈ X : ∨ x_i < a_i ∈ A
∨ x_i > b_i ∈ B
∧ Output′ = false
covers all states. Some of my syntax is not TLA+, as you can see, so that's the specific problem I'm up against right now.