/* Level 1*/ :-use_module(library(clpr)). /* Q1 */ positive([]). positive([X|Xs]) :- X>0, positive(Xs). /* Q2, see alternate implementation for reverse below */ rev(Xs,Rs) :- revhelper(Xs,[],Rs). revhelper([],Rs,Rs). revhelper([X|Xs],Ys,Rs) :- revhelper(Xs,[X|Ys],Rs). /* Q3 */ mylast([X],X). mylast([_|Xs],X) :- mylast(Xs,X). /* Q4 */ mysum([],0). mysum([X],X). mysum([X|Xs],S) :- mysum(Xs,S1), {X+S1=S}. /* Derivation trees, diagrams coming soon */ /* reverse as implemented in mini-exercises */ reverse([],[]). reverse([X|Xs],Ys) :- reverse(Xs,Rs), append(Rs,[X],Ys). append([],Ys,Ys). append([X|Xs],Ys,[X|Zs]) :- append(Xs,Ys,Zs). /* level 2 */ /* Q1 */ /* order of elements in second list is by last occurrence in first list */ remove_dupl([],[]). remove_dupl([X|Xs],[X|Ys]) :- \+ member(X,Xs), remove_dupl(Xs,Ys). remove_dupl([X|Xs],Ys) :- member(X,Xs), member(X,Ys), remove_dupl(Xs,Ys). /* Q2 */ set_int([],_,[]). set_int([X|Xs],Ys,[X|Zs]):- member(X,Ys),set_int(Xs,Ys,Zs). set_int([X|Xs],Ys,Zs):- \+ member(X,Ys), set_int(Xs,Ys,Zs). set_diff([],_,[]). set_diff([X|Xs],Ys,Zs) :- member(X,Ys),set_diff(Xs,Ys,Zs). set_diff([X|Xs],Ys,[X|Zs]) :- \+ member(X,Ys), set_diff(Xs,Ys,Zs). /* Q3 */ take(0,_,[]). take(N,[X|Xs],[X|Ys]) :- take(M,Xs,Ys), {M=N-1}. /* Q4, should also check that S is a member of the original list */ my_max(_,[]). my_max(S,[X|Xs]) :- {S > X}, mymax(A,Xs). my_max(S,[X|Xs]) :- {S <= X}, mymax(X,Xs).