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.