Prolog has Single Sided Unification (SSU). If the code is determinate then one should consider refactoring the code to SSU. When refactoring code to SSU not all changes are straightforward.
Here is an patch showing parts of Red-Black trees being refactored to use SSU.
Which is unlike to what happens in Picat. In my experience demanding a rule to match is exactly what makes our => rules so good at improving reliability of code and the debugging experience. If the failure is not obvious I rerun the program after using
?- gtrap(_).
This often traps the debugger on the errornous goal. Go up a few frames, use retry and it is typically easy to find what is wrong.