% demonstration of some mapping operations and list operations.
% S. Tanimoto, CSE 341, Spring .
% Define a test list:
mylist([a,b,c,d,e]).
% Here is a predicate that "maps" a function onto elements of a list.
% Note that the function is really just a newly constructed term,
% and that no evaluation of such a function is performed.
mapf([],[]).
mapf([X|L], [f(X)|M]) :- mapf(L,M).
?- mylist([H|T]).
?- mylist([H|H]).
?- mylist(L1), mapf(L1, L2).
?- mapf(L1, [f(1),f(2),f(3)]).
% Now let's show definitions for last, butlast, and reverse.
% Note that last and reverse are built into SWI Prolog.
mylast(X, [X]).
mylast(X, [H|T]) :- mylast(X, T).
butlast([],[A]).
butlast([H|T], [H|L]) :- butlast(T,L).
myreverse([],[]).
myreverse([H|T], L) :- mylast(H, L), butlast(L2, L), myreverse(T, L2).
% Here is a mapping predicate that can actually evaluate something
% at each element of a list.
mapp(Pred, [],[]).
mapp(Pred, [H1|T1], [H2|T2]) :-
Q =..[Pred,H1, H2],call(Q), mapp(Pred, T1, T2).
plusone(X, Y) :- Y is X + 1.
% mapp(plusone, [1,2,3], L)
% -> L = [2,3,4].
% =.. is called the "univ" operator. It constructs a goal from
% a predicate, an input term, and a variable to be instantiated to
% give the "output".