:- module(_,_).

% Example of cut execution
% ------------------------

s(1) :- write('\n Clause 1 of s/1 succeeded.').
s(2) :- write('\n Clause 2 of s/1 succeeded.').

l(a) :- write('\n Clause 1 of l/1 succeeded.').    
l(b) :- write('\n Clause 2 of l/1 succeeded.').    

r(8) :- write('\n Clause 1 of r/1 succeeded.').  
r(9) :- write('\n Clause 2 of r/1 succeeded.').

m(e) :- write('\n m/1 succeeded.').

p(X,_Y) :-
    l(X),
    write('\n Reached end of clause 1 of p.').
p(X,_Y) :-
    r(X),
    !,    % Cut
    write('\n Executed cut (no more alternatives of r/1 or p/1)'),
    write('\n At end of clause 2 of p.').
p(X,_Y) :-
    write('\n Reached clause 3 of p.'),
    m(X).
    
%  If execution reaches the cut (!):
%  - The second alternative of r/1 is not considered.
%  - The third clause of p/2 is not considered.

% Try (asking for more solutions):
% ?- s(A), p(X,Y).
% ?- s(2), p(X,Y).
% ?- p(9,Y).
% ?- p(e,Y).
% Execute also in debugger to see how execution proceeds!
