Prolog Exercises
Prolog Exercises
memberx(N,[N|T]).
memberx(N,[X|T]):-memberx(N,T).
make_unique([],[]).
make_unique([H|T],Y):-memberx(H,T),!,make_unique(T,Y).
make_unique([H|T],[H|Y]):-make_unique(T,Y).
21. maximum function [1,-2,3] => 3
maximumx(P,D,V):- P>=D, V=P, !.
maximumx(P,D,V):-V=D.
max([H],H).
max([H|T],X):-max(T,S),maximumx(H,S,X).
22. return elements >k, [4,6,7,3] and k=5 => [6 7]
morethan(_,[],[]).
morethan(K,[H|T],[H|U]):- H>=K, morethan(K,T,U),!.
morethan(K,[H|T],U):- morethan(K,T,U).
23. remove value ?-deleteall(3,[1,3,2,3,0,1,2],X). X=[1,2,0,1,2]
deleteall(N,[],[]).
deleteall(N,[N|T],U):-!,deleteall(N,T,U).
deleteall(N,[H|T],[H|U]):-deleteall(N,T,U).
24. remove element at given position ?-deleteat(3,[a,b,c,d],X). X=[a,b,d]
deleteat(_,[],[]).
deleteat(0,[H|T],T):-!.
deleteat(N,[H|T],[H|Y]):-N1 is N-1, deleteat(N1,T,Y).
25. split a list into two parts. Length of the first is given.
?-split_list(4,[a,b,c,1,2,3,d,e,f],X). X=[[a b c 1],[2 3 d e f]]
split_list(_,[],[[],[]]).
split_list(0,T,[[],T]).
split_list(N,[H|T],[[H|Y],Z]):-N1 is N-1, split_list(N1,T,[Y,Z]).
26. couple elements ?-couple_elem([1,a,b,4,5,6],X). X=[[1,a],[b,4],[5,6]]
?-couple_elem([1,a,b,4,5],X). no
couple_elem([],[]).
couple_elem([H1,H2|T],[[H1,H2]|Y]):-couple_elem(T,Y).
27. translator([[1,2],[3],[0]],[[5],[1],[7,2]],[[1,2],[0],[3],[3]],X). X =[[5],[7,2],[1],[1]]
translator(A,B,X,Y) defines transformation A=>B and applies it to X. X is always subset of A.
find_key([H|A],[R|B],H,R):-!.
find_key([H1|A],[R|B],H,Y):-find_key(A,B,H,Y).
translator(_,_,[],[]).
translator(A,B,[H|T],[R|Y]):-find_key(A,B,H,R), translator(A,B,T,Y).
28. full member ?-fullmember(8,[1,2,[2,3],[4,5,[6,8,7]]]). yes, ?-fullmember([6,8,7],[1,2,[2,3],[4,5,[6,8,7]]]). yes
fullmember(N,[N|T]):-!.
fullmember(N,[X|T]):-fullmember(N,X),!.
fullmember(N,[X|T]):-fullmember(N,T).
29. remove parenthesis [1,2,[3,4],5,6,[7,[8,9]]] => [1,2,3,4,5,6,7,8,9]
simple_list([],[]).
simple_list([H|T],Y):-is_list(H),!,simple_list(H,L1),simple_list(T,L2),append(L1,L2,Y).
simple_list([H|T],[H|Y]):-simple_list(T,Y).
30. implement list difference ?-difference_list([a,b,c,d,1,2,3],[d,2,3],X). X=[a,b,c,1]
difference_list([],_,[]).
difference_list([H|T],X,Y):-member(H,X),!,difference_list(T,X,Y).
difference_list([H|T],X,[H|Y]):-difference_list(T,X,Y).
31. find number of occurrences, ?-occurrences([a,b,c,1,2,a,b,1,1,1],X). X=[[a,2],[b,2],[c,1],[1,4],[2,1]]
deleteall(N,[],[]).
deleteall(N,[N|T],U):-!,deleteall(N,T,U).
deleteall(N,[H|T],[H|U]):-deleteall(N,T,U).
count(N,[],0).
count(N,[N|T],U):-!,count(N,T,U1), U is U1+1.
count(N,[H|T],U):-count(N,T,U).
occurrences([],[]).
occurrences([H|T],[[H,X]|Y]):-count(H,[H|T],X), deleteall(H,T,T1), occurrences(T1,Y).
32. separation function ?-separation_list([1,2,a,b,3,d],X) X=[[1,2,3],[a,b,d]]
separation_list([],[[],[]]).
separation_list([H|T],[[H|T1],Y]):-number(H),separation_list(T,[T1,Y]),!.
separation_list([H|T],[N,[H|T1]]):-separation_list(T,[N,T1]).
33. algebrogram: SEND+MORE = MONEY
solve(S,E,N,D,M,O,R,Y):-c(S),c(E),c(N),c(D),c(M),c(O),c(R),c(Y),
1000*S+100*E+10*N+D + 1000*M+100*O+10*R+E =:= 10000*M+1000*O+100*N+10*E+Y,
S>0, M>0.
c(1). c(2). c(3). c(4). c(5). c(6). c(7). c(8). c(9). c(0).
34. quick sort
appendx([],A,A).
appendx([H|T],A,[H|U]):-appendx(T,A,U).
splittotwo(_,[],[],[]).
splittotwo(I,[H|T],[H|U],V):- H=<I, splittotwo(I,T,U,V),!.
splittotwo(I,[H|T],U,[H|V]):- splittotwo(I,T,U,V).
quick([],[]).
quick([H|T],L):-splittotwo(H,T,U,V), quick(U,X),quick(V,Y), appendx(X,[H|Y],L).
35. Tower of Hanoi
hanoi_tower(N):-move(N,a,b,c),!.
move(0,_,_,_):-!.
move(N,X,Y,Z):-M is N-1, move(M,X,Z,Y), info(X,Y), move(M,Z,Y,X).
info(X,Y):-write('Move disk from '), write(X), write(' to '), write(Y), nl.