/* LISTRO : List manipulating routines UTILITY Lawrence Updated: 11 September 81 */ %%% LISTRO requires module: SETROU append([],L,L). append([HD|TL],L,[HD|LL]) :- append(TL,L,LL). disjoint([]). disjoint([HD|TL]) :- memberchk(HD,TL), !, fail ; disjoint(TL). last(X,[X]) :- !. last(X,[HD|TL]) :- last(X,TL). listtoset([],[]). listtoset([HD|TL],Ans) :- member(HD,TL), !, listtoset(TL,Ans). listtoset([HD|TL],[HD|Ans]) :- listtoset(TL,Ans). nextto(X,Y,[X,Y,..Rest]). nextto(X,Y,[HD|TL]) :- nextto(X,Y,TL). numlist(N,N,[N]) :- !. numlist(N1,N2,[N1|Rest]) :- N1 < N2, N3 is N1+1, numlist(N3,N2,Rest). perm([],[]). perm(L,[X|Xs]) :- select(X,L,R), perm(R,Xs). perm2(X,Y,X,Y). perm2(X,Y,Y,X). remove_dups(A,B) :- listtoset(A,B). rev(L1,L2) :- revconc(L1,[],L2). revconc([],L,L). revconc([X|L1],L2,L3) :- revconc(L1,[X|L2],L3). select(X,[X|TL],TL). select(X,[Y|TL1],[Y|TL2]) :- select(X,TL1,TL2). % Sum a list of integers sumlist([],0) :- !. sumlist([Hd|Tl],Sum) :- sumlist(Tl,TlSum), Sum is Hd+TlSum, !. % Get a pair of elements from a list, also % return the rest. Pairs are only returned % once (not twice different ways round) pairfrom([X|T],X,Y,R) :- select(Y,T,R). pairfrom([H|S],X,Y,[H|T]) :- pairfrom(S,X,Y,T).