logicwa@utecfa.UUCP (Earl Fogel) (09/04/85)
Here are the results from running Chris Moss' cut tests on MProlog. I've added one more test (5a) since it appeared to be meaningful for MProlog. Earl Fogel Implementation Test 1 2 3 4 5 5a 6 MPROLOG 1.5 cut Y Y Y Y N N N MPROLOG 2.1 cut Y Y Y Y Y N N MPROLOG 2.1 slash Y N N Y Y N N where Y means did cut, and N means did not cut. Note: identical results are achieved with tracing. For comparison purposes, here are the reported results from other Prologs: Implementation Test 1 2 3 4 5 6 DEC-10 Compiler Y Y Y Y Y Y Waterloo, MU-Prolog Y Y Y Y Y N DEC-10 int, C-Prolog Y Y Y N N N POPLOG Y Y Y I I I micro, Sigma Y N N Y Y N where Y and N are as above, and I means that it was trapped as an illegal use and failed. CONCLUSIONS: The MProlog "cut" is like the Waterloo and MU-Prolog cuts, while the "slash" is like the micro and Sigma Prolog cuts. Here's the program: ---------------------------------------------------------- /* Tests to distinguish various implementations of cut */ /* Chris Moss, Imperial College, June 1985 */ /* 5a added by Earl Fogel, Logicware Inc., July 1985 */ /* note: replace "true" by "succeed" for MProlog */ test1 :- do('Testing that cut is implemented). ', t1). test2 :- do('Test if cut acts within disjunction', t2). test3 :- do('Test if it cuts prev. choice within disjunction',t3). test4 :- do('Test if cut acts when passed as metacall', t4). test5 :- do('Test if & cut acts within metacall', t5 ). test5a :- do('Test if & & cut acts within metacall', t5a ). 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 :- t5(X), X, fail. t5 :- t. t5((true,!)). t5a :- t5a(X), X, fail. t5a :- t. t5a((true,true,!)). t6 :- not(not(!)), fail. t6 :- t.