type ConstrainedByW = | { w: false, x: false } | { w: true, x: bool } type ConstrainedByY = | { x: bool, y: false, z: bool } | { x: true, y: true, z: false } type ProgramState = ConstrainedByW & ConstrainedByY
Complexity is both subjective and relative. Allowing invalid states in your model is going to complicate things, too.
I wouldn't mind having this example in production. It will scale just fine with the number of booleans.