% nreverse % % David H. D. Warren % % "naive"-reverse a list of 30 integers #ifndef MERCURY #include "harness.cpp" benchmark(Data, Out) :- nreverse(Data, Out). #ifdef AQUARIUS_DECLS :- mode((nreverse(L1, L2) :- ground(L1), rderef(L1), list(L1) )). :- mode((concatenate(L1, L2, L3) :- ground(L1), rderef(L1), list(L1), ground(L2), rderef(L2), list(L2) )). #endif #else :- module nrev. :- interface. :- import_module list, int, io, printlist. :- pred benchmark(list(int)). :- mode benchmark(out) is det. :- pred main(io__state, io__state). :- mode main(di, uo) is det. :- implementation. benchmark(Out) :- data(Data), nreverse(Data, Out). main --> { benchmark(Out) }, print_list(Out). :- pred data(list(int)). :- mode data(out) is det. #ifdef POLYMORPHISM :- pred nreverse(list(T), list(T)). :- mode nreverse(in, out) is det. :- pred concatenate(list(T), list(T), list(T)). :- mode concatenate(in, in, out) is det. #else :- pred nreverse(list(int), list(int)). :- mode nreverse(in, out) is det. :- pred concatenate(list(int), list(int), list(int)). :- mode concatenate(in, in, out) is det. #endif #endif data([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, 16,17,18,19,20,21,22,23, 24,25,26,27,28,29,30]). #ifdef NUPROLOG_DECLS :- nreverse(L0, L1) when L0. #endif #ifdef SICSTUS_DECLS :- block nreverse(-, ?). #endif nreverse([X|L0], L) :- nreverse(L0, L1), concatenate(L1, [X], L). nreverse([], []). #ifdef NUPROLOG_DECLS :- concatenate(L1, L2, L3) when L1. #endif #ifdef SICSTUS_DECLS :- block concatenate(-, ?, ?). #endif concatenate([X|L1], L2, [X|L3]) :- concatenate(L1, L2, L3). concatenate([], L, L).