| % 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 ). |
| |
| meta_qsort :- interpret(qsort). |
| |
| 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, _) :- |
| number(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(_=<_). |
| |
| interpret_built_in(true). |
| interpret_built_in(X=<Y) :- X =< Y. |
| |
| define(qsort,( |
| qsort([27,74,17,33,94,18,46,83,65, 2, |
| 32,53,28,85,99,47,28,82, 6,11, |
| 55,29,39,81,90,37,10, 0,66,51, |
| 7,21,85,27,31,63,75, 4,95,99, |
| 11,28,61,74,18,92,40,53,59, 8],_,[]))). |
| |
| define(qsort([X|L],R,R0),( |
| partition(L,X,L1,L2), |
| qsort(L2,R1,R0), |
| qsort(L1,R,[X|R1]))). |
| define(qsort([],R,R),true). |
| |
| define(partition([X|L],Y,[X|L1],L2),( |
| X=<Y,!, |
| partition(L,Y,L1,L2))). |
| define(partition([X|L],Y,L1,[X|L2]),( |
| partition(L,Y,L1,L2))). |
| define(partition([],_,[],[]),true). |