This is useful for verifiers to enforce behaviour and avoid mismanaging
the witnesses that need to be input into the circuit when verifying
a proof.
Note that the prover still has to manage this by themself. There
might be some way to generalise this, but in practice, when creating
a ZK proof, the prover should always be aware of what witnesses they
should be inputting, so this can be represented procedurally in the
code without the need of an abstraction.