% A version of 'reverse' which requires 'removeLast' and 'last': reverse([],[]). reverse([F|R],L2) :- last(L2,F), removeLast(L2,L2less), reverse(R,L2less). % removeLast, Last -- not included in notes, % since it's part of hw05 !! %% Alternate version: An accumulator variable: reverse(L1,L2) :- reverseHelp( L1, [], L2 ). %% [+,+,-] %% reverseHelp(L1,L2,L3): %% True when: L1 reversed, appended to L2, equals L3. % First, a less idiomatic solution: % reverseHelp([],RevSoFar,Soln) :- RevSoFar = Soln. % reverseHelp(Lst, RevSoFar, Soln) :- % Lst = [Frst,Rst], % reverseHelp( Rst, [Frst,RevSoFar], Soln ). % Here is the same thing, in idiomatic Prolog: % We just move the "=" clauses into the definitions: % reverseHelp([], RevSoFar, RevSoFar). reverseHelp([Frst|Rst], RevSoFar, Out) :- reverseHelp(Rst, [Frst|RevSoFar], Out). %% [+,+,-] %% filterSmallerThan( Threshold, Lst, Result ): %% True when 'Result' is all the elements of 'Lst' which %% are less than Threshold. % First, a less idiomatic solution: % filterLessThan(Threshold,Lst,Answer) :- Lst=[], Answer=[]. % filterLessThan(Threshold,Lst,Answer) :- % Lst = [Frst,Rst], % Frst >= Threshold, % filterLessThan(Threshold,Rst,SmallRest), % Answer = SmallRest. % filterLessThan(Threshold,Lst,Answer) :- % Lst = [Frst,Rst], % Frst < Threshold, % filterLessThan(Threshold,Rst,SmallRest), % Answer = [Frst|SmallRest]. % Here is the same thing, in idiomatic Prolog: % We just move the "=" clauses into the definitions: % filterLessThan(Threshold,[],[]). filterLessThan(Threshold,[Frst|Rst],SmallRest) :- Frst >= Threshold, filterLessThan(Threshold,Rst,SmallRest). filterLessThan(Threshold,[Frst|Rst],[F|SmallRest]) :- Frst < Threshold, filterLessThan(Threshold,Rst,SmallRest).