When I implement not-quite-trivial business rules, I usually spend at least two thirds of the time to give good, verbose error messages about which rules are violated, and what to do instead.
Often it would be rather easy to make the check itself a few lines of conditional code or a single SQL query, but then the only response I could give to the user is "you can't do that", plus a link to the requirements document. Instead effort is spent to follow the steps in which a human might check the constraints.