% append % append called with two lists and a variable (++-) % generates an answer list consisting of the % two lists joined together. Notice how it preserves order. append([], List, List). append([Head|Tail], List, [Head|Rest]) :- append(Tail, List, Rest). % | ?- append([the,cat],[sat,on,the,mat], R). % % R = [the,cat,sat,on,the,mat] % % yes % | ? %%%% cf. the same thing in ML: % fun append [] k = k % | append (x :: l) k = (x :: (append l k)); % %%%% but ML matching is more restrictive. Consider Prolog list %%%% membership: % member(X, []) :- fail. % This case is not necessary, because prolog considers % not matching to be failure. It is here for illustrative reasons. member(X, [X|_]). member(X, [_|Z]) :- member(X,Z). % | ?- member(1,[5,4,3,2,1]). % % yes % | ?- member(1,[5,4,3,2]). % % no % | ?- % %%%% The following is NOT allowed in ML: % fun member x [] = false % | member x (x :: l) = true (* here is the problem *) % | member x (y :: l) = member x l; %%%% -- instead we must write: % fun member x [] = false % | member x (y :: l) = if (x=y) then true else member x l;