Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Posting-Version: version B 2.10.2 9/18/84 +MMDF+MULTI+2.11; site icdoc.UUCP
Path: utzoo!watmath!clyde!burl!ulysses!allegra!mit-eddie!think!harvard!seismo!mcvax!ukc!icdoc!cdsm
From: cdsm@icdoc.UUCP
Newsgroups: net.lang.prolog
Subject: Investigating implementations of cut
Message-ID: <225@ivax.icdoc.UUCP>
Date: Fri, 28-Jun-85 04:08:22 EDT
Article-I.D.: ivax.225
Posted: Fri Jun 28 04:08:22 1985
Date-Received: Sun, 30-Jun-85 03:03:57 EDT
Sender: cdsm@icdoc.UUCP
Reply-To: cdsm@icdoc.UUCP (Chris Moss)
Organization: Dept. of Computing, Imperial College, London, UK.
Lines: 68
Xpath: icdoc ivax


		Implementations of CUT

	As part of the BSI Prolog standardisation process I am
looking at the way in which cut is implemented in different
Prolog systems. The following program illustrates the
differences which have been found. I would be grateful if you
could run the program on your system and send me the answers; if
you have an interpreter and compiler please execute it for both
systems. 

---------------------------------------------------------
/* Tests to distinguish various implementations of cut */
/* Chris Moss, Imperial College, June 1985 */

test1 :- do('Testing that cut is implemented). ', t1).
test2 :- do('Test if cut acts within disjunction', t2).
test3 :- do('Test if it cuts previous choices within disjunction', t3).
test4 :- do('Test if cut acts when passed as metacall', t4).
test5 :- do('Test if & cut acts within metacall', t5 ).
test6 :- do('Test if cut acts through not', t6).

do(Message,Test) :- w(Message), Test.
do(Message,Test) :- w('Does act').
w(X) :- write(X), nl.  
t :- w('Does not act').

t1  :- (true;w('Did not cut alternatives correctly'),fail),
       !, w('Succeeds going forwards'), fail.
t1  :- w('Failed to cut goal'). 

t2  :- (!;w('Fails to cut disjoint alternatives')), fail.
t2  :- t.

t3  :- t3a(X),(!,fail;w('Fails to cut disjunction')).
t3  :- t.
t3a(!).
t3a(X) :- w('Did not cut alternatives'), fail.

t4  :- t3a(X), X, w('Ok going forwards'),fail.
t4  :- t.

t5  :- t5a(X), X, fail.
t5  :- t.
t5a((true,!)).

t6  :- not(not(!)), fail.
t6  :- t.

-------------------------------------------------

From initial tests we have the following results:

Implementation		Test 1  2  3  4  5  6  

DEC10 Compiler		     Y  Y  Y  Y  Y  Y
Waterloo, MUprolog	     Y  Y  Y  Y  Y  N
DEC10 int, CProlog	     Y  Y  Y  N  N  N
POPLOG			     Y  Y  Y  I  I  I
micro, sigma		     Y  N  N  Y  Y  N

where Y means did cut, N means did not cut and I means that it
was trapped as an illegal use and failed.
Note that in all cases 2=3 and 4=5; however in some
implementations this may not be the case.
If there are any other discriminating cases not covered above I
would be glad to hear of them.