/* Example 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 ? ; b2 c true ? ; b3 b2 c b1 c true ? ; b2 c true ? ; b3 b3 a2 b1 c true ? ; b2 c true ? ; b3 Test run with tracing: | ?- a. 1 1 Call: a ? 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 ? 7 2 Redo: b ? 8 3 Call: write('b2\n') ? b2 8 3 Exit: write('b2\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 ? */