/* Example with cut showing how backtrack works */ a :- write('a1\n'),b,b. a :- write('a2\n'),b. b :- !,write('b1\n'),c. b :- write('b2\n'),c. b :- write('b3\n'),fail. c :- write('c\n'). /* Test run: | ?- a. a1 b1 c b1 c true ? ; a2 b1 c yes Test run with tracing: | ?- a. 1 1 Call: a ? 2 2 Call: write('a1\n') ? a1 2 2 Exit: write('a1\n') ? 3 2 Call: b ? 4 3 Call: write('b1\n') ? b1 4 3 Exit: write('b1\n') ? 5 3 Call: c ? 6 4 Call: write('c\n') ? c 6 4 Exit: write('c\n') ? 5 3 Exit: c ? 3 2 Exit: b ? 7 2 Call: b ? 8 3 Call: write('b1\n') ? b1 8 3 Exit: write('b1\n') ? 9 3 Call: c ? 10 4 Call: write('c\n') ? c 10 4 Exit: write('c\n') ? 9 3 Exit: c ? 7 2 Exit: b ? 1 1 Exit: a ? true ? ; 1 1 Redo: a ? 2 2 Call: write('a2\n') ? a2 2 2 Exit: write('a2\n') ? 3 2 Call: b ? 4 3 Call: write('b1\n') ? b1 4 3 Exit: write('b1\n') ? 5 3 Call: c ? 6 4 Call: write('c\n') ? c 6 4 Exit: write('c\n') ? 5 3 Exit: c ? 3 2 Exit: b ? 1 1 Exit: a ? */