Selected Solutions for the Sample Final Exam
Solutions for problems 2 and 4 can be obtained by using the computer systems.
Problem 3.
A Haskell solution just appends the appropriate fill items before and after xs.
center xs n f
| n< length xs = error "insufficient size"
| otherwise = replicate half f ++ xs ++ replicate (n–length xs–half) f
where -- n–length xs is fill count
half = quot (n–length xs) 2
A Prolog solution is similar, but not as concise; it fails rather than giving an error when there is insufficient space.
center(Xs,N,F,Result) :-
length(Xs,M), M=<N,
N1 is (N-M)//2, N2 is N-N1,
rep(N1,F,L), rep(N2,F,R),
append(L,Xs,Ys), append(Ys,R,Result).
rep(0, F,[ ]).
rep(N,F,[F|Xs]):- N>0, N1 is N-1, rep(N1,F,Xs),
Problem 5.
(a) Recursive solution checks each item to see if it is repeated using 'member'. If so, retain in answer, delete other occurrences, and continue; if not, just continue with next item.
repeats([ ],[ ]). % stopping case
repeats([X|Xs], [X|Ys]) :- member(X,Xs), delete(X,Xs,Zs), repeats(Zs,Ys).
repeats([X|Xs], Ys) :- \+member(X,Xs), repeats(Xs,Ys).
An alternative iterative solution using Prolog's 'findall' is
repeats(Xs,Ys) :- findall(X,
(append(As,[X|Bs],Xs), % for each X in Xs
\+member(X,As), % select first, reject others
member(X,Bs)), % and check repetition
Ys).
delete(X,[ ],[ ]).
delete(x,[X|Xs],Ys) :- delete(X,Xs,Ys).
delete(X.[Y|Xs],[Y|Ys]) :- X\==Y, delete(X,Xs,Ys).
(b) both versions give only the one solution A=a, Bs=[a].