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].