<div class="notebook">
<div class="nb-cell markdown" name="md1">
# Prolog: critical section, backtracking, error handling
See https://stackoverflow.com/questions/43390782/prolog-critical-section-backtracking-error-handling
</div>
<div class="nb-cell program" name="p1">
until_failure((A,B), Result) :-
!,
until_failure(A, Result),
( var(Result)
-> until_failure(B, Result)
; true
).
until_failure(G, Result) :-
( catch(G, Result, true)
*-> true
; Result = false(G)
).
</div>
<div class="nb-cell query" name="q1">
until_failure((Step1 = true,
Step2 = true,
fail,
Step3 = true), Result),
writeln([Step1, Step2, Step3]).
</div>
</div>