| ?- assert(p(1)), assert(p(2)), assert(p(3)). yes | ?- p(N), write(N), nl, retract(p(2)), retract(p(3)), fail. 1 2 3 no | ?- p(N), write(N), fail. 1 no | ?-
At the first call to p/1
, the procedure has three clauses.
These remain visible throughout execution of the call to p/1
.
Thus, when backtracking is forced by fail/0
, N is bound
to 2 and written. The retraction is again attempted, causing
backtracking into p/1
. N is bound to 3 and written out.
The call to retract/1
fails. There are no more clauses in
p/1
, so the query finally fails. A subsequent call to
p/1
, made after the retractions, sees only one clause.