%%% File: lp.pro %%% Line: List Processing %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% writelist writelist([]). writelist([H|T]) :- write(H),nl,writelist(T). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% member member(H,[H|_]). member(X,[_|T]) :- member(X,T). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% size size([],0). size([_|T],L) :- size(T,X), L is (X + 1). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% item item(X,[H|_],H) :- X=0. item(X,[_|T],Y) :- X > 0, Z is X - 1, item(Z,T,Y). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% append append([],L,L). append([H|T1],L2,[H|T3]) :- append(T1,L2,T3). append(L1,L2,L3,Result) :- append(L1,L2,L12),append(L12,L3,Result). append(L1,L2,L3,L4,Result) :- append(L1,L2,L3,L123),append(L123,L4,Result). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% last last([H|[]],H). last([_|T],Result) :- last(T, Result). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% remove remove(_,[],[]). remove(First,[First|Rest],Rest). remove(Element,[First|Rest],[First|RestLessElement]) :- remove(Element,Rest,RestLessElement). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% replace replace(0,Object,[_|T],[Object|T]). replace(ListPosition,Object,[H|T1],[H|T2]) :- X is ListPosition - 1, replace(X,Object,T1,T2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% makelist makelist(0,_,[]). makelist(Length,Element,[Element|Rest]) :- X is Length - 1, makelist(X,Element,Rest). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% reverse reverse([],[]). reverse([H|T],R) :- reverse(T,Rev),lastput(H,Rev,R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% lastput lastput(E,[],[E]). lastput(E,[H|T],[H|L]) :- lastput(E,T,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% pick pick(L,Item) :- length(L,Length), random(0,Length,RN), item(RN,L,Item). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% take take(List,Element,Rest) :- pick(List,Element), remove(Element,List,Rest). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% iota iota(0,[]). iota(N,IotaN) :- NM1 is N - 1, iota(NM1,IotaNM1), lastput(N,IotaNM1,IotaN). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% sum sum([],0). sum([H|T],Sum) :- sum(T, SumT), Sum is H + SumT. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% min min([H], H). min([H | T], H) :- min(T, L), H =< L, !. min([_ | T], A) :- min(T, A). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% max max([H], H). max([H | T], H) :- max(T, L), H >= L, !. max([_ | T], A) :- max(T, A). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% sort_inc insert(H,T,[H|T]). sort_inc([],[]). sort_inc(Unordered,Ordered) :- min(Unordered,Minimum), remove(Minimum,Unordered,Rest), sort(Rest,Number), insert(Minimum,Number,Ordered). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% sort_des sort_dec([],[]). sort_dec(A,B) :- sort_inc(A,C), reverse(C,B). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% %% make_set([a,b,a,c,d,e,c,a,f], Set). get rid of duplicates %% Set = [a,b,c,d,e,f]. %% (hint: use member/ 3 clauses). make_set([],[]). make_set([H|T],Result) :- member(H,T), make_set(T,Result). make_set([H|T], Result) :- make_set(T,Partial), Result = [H|Partial]. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% DEMO/CODE Alist %% ?- alist([2,queen,7,ace,king],[club,spade,diamond,spade,heart],Alist). %% [pair(2,club),pair(queen,spade),pair(7,diamond),pair(ace,spade),pair(king,heart)]. alist([],[],[]). alist([H1|T1],[H2|T2], Alist) :- insert([pair(H1,H2)],Nlist,Alist), alist(T1,T2,Nlist). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% DEMO/CODE assoc %% ?- assoc(Alist,ace,Result). %% Result = spade. assoc([pair(K,V)|_],K,V). assoc([_|T],K,V) :- assoc(T,K,V). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% flatten flatten([],[]). flatten([H|T],L) :- atom(H), flatten(T,Tflattened), append([H],Tflattened,L). flatten([H|T],L) :- flatten(H,FlatHead), flatten(T,FlatTail), append(FlatHead,FlatTail,L).