I think the new undo/1 is a great feature to have! Alllows much cleaner code when we need side-effects. I had a question, in the test code you have:
test(error, throws(x)) :-
( undo(throw(x)),
fail
; ok % true is a VMI
).
why does it make a difference to have ok
vs true
?