Besides the sequencing of goals and clauses, Prolog provides one other very
important  facility  for  specifying  control information.  This is the cut
symbol,  written  '!'.  It is inserted in the program just like a goal, but
is  not  to  be  regarded as part of the logic of the program and should be
ignored as far as the declarative semantics is concerned.

The  effect  of  the cut symbol is as follows.  When first encountered as a
goal, cut succeeds immediately.  If backtracking should later return to the
cut,  the effect is to fail the "parent goal", ie.  that goal which matched
the  head  of  the  clause  containing the cut, and caused the clause to be
activated.   In  other  words,  the cut operation commits the system to all
choices   made  since  the  parent  goal  was  invoked,  and  causes  other
alternatives  to  be  discarded.  The goals thus rendered "determinate" are
the  parent  goal  itself, any goals occurring before the cut in the clause
containing  the  cut,  and  any  subgoals  which  were  executed during the
execution of those preceding goals.  Examples:-

     (1)     member(X,[X,..L]) :- !.
             member(X,[Y,..L]) :- member(X,L).

The only result produced by executing:-

                             member(X, [a, b, c]) ?

is X = a, the other two potential solutions being discarded.

     (2)     compile(S,R) :- parse(S,T), !, translate(T,R).

The  procedure  'compile'  only  calls  'translate'  for the first solution
produced by 'parse'.  Alternative solutions which 'parse' might produce are
discarded.
