% generated: 8 March 1990 % option(s): % % meta_qsort % % Ralph M. Haygood % % meta-interpret Warren benchmark qsort % % For any meta-variable ~X~, interpret(~X~) behaves as if % % interpret(~X~):- ~X~. % % Thus, for example, interpret((foo(X), bar(X), !)) behaves as if % % interpret((foo(X), bar(X), !)):- foo(X), bar(X), !. % % Note that though ~X~ may contain cuts, those cuts cannot escape from % interpret(~X~) to effect the parent goal; interpret(!) is equivalent % to true. % % Cuts inside ~X~ are executed according to the rule that conjunction, % disjunction, and if-then-else are transparent to cuts, and any other % form is transparent to cuts if and only if it can be macro-expanded % into a form involving only these three without interpret/1. If-then % and negation are the only such other forms currently recognized; ( A % -> B) is equivalent to ( A -> B ; fail ), and \+ A is equivalent to % ( A -> fail ; true ). :- main. q:- statistics(runtime,_), interpret(qsort), statistics(runtime,[_,Y]), write('time : '), write(Y), nl, halt_or_else(0,true). interpret(Goal):- interpret(Goal, Rest), (nonvar(Rest), !, interpret(Rest) ; true). interpret(G, _):- var(G), !, fail. interpret((A, B), Rest):- !, interpret(A, Rest0), (nonvar(Rest0) -> Rest = (Rest0, B) ; interpret(B, Rest)). interpret((A ; B), Rest):- !, interpret_disjunction(A, B, Rest). interpret((A -> B), Rest):- !, interpret_disjunction((A -> B), fail, Rest). interpret(\+A, Rest):- !, interpret_disjunction((A -> fail), true, Rest). interpret(!, true):- !. interpret(G, _):- integer(G), !, fail. interpret(G, _):- is_built_in(G), !, interpret_built_in(G). interpret(G, _):- define(G, Body), interpret(Body). interpret_disjunction((A -> B), _, Rest):- interpret(A, Rest0), !, (nonvar(Rest0) -> Rest = (Rest0 -> B) ; interpret(B, Rest)). interpret_disjunction((_ -> _), C, Rest):- !, interpret(C, Rest). interpret_disjunction(A, _, Rest):- interpret(A, Rest). interpret_disjunction(_, B, Rest):- interpret(B, Rest). is_built_in(true). is_built_in(_=<_). is_built_in(write(_)). interpret_built_in(true). interpret_built_in(X=