Some quick comments. Richard’s explanation of when and where to use cuts is probably the best there is. It leads to these remarks:
It typically an indication that it is the client committing some predicate. Though it makes the cut invisible, is IMO more indication of something dubious. I very rarely use once/1.
->/2 is often good in “procedural” code. *->/2
is a strange beast that is better avoided until you really know what you are doing.
In what sense is this a replacement for the cut? Surely, dif/2 (and constraints in general) are incompatible with cuts.
Yes. This is more or less the same argument as using “non-defaulty” representation. The problem is that Prolog doesn’t make many guarantees.
Note that this also relates to my RFC Picat style matching