%%% 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).