<< Prev | - Up - |
The purpose of Practical Session 6 is to help you get more experience with list manipulation. We first suggest some traces for you to carry out, and then some programming exercises.
The following traces will help you get to grips with the predicates discussed in the text:
Carry out traces of append
with the first two arguments instantiated, and the third argument uninstantiated. For example, append([a,b,c],[[],[2,3],b],X)
Make sure the basic pattern is clear.
Next, carry out traces on append
as used to split up a list, that is, with the first two arguments given as variables, and the last argument instantiated. For example, append(L,R,[foo,wee,blup]).
Carry out some traces on prefix
and suffix
. Why does prefix
find shorter lists first, and suffix
longer lists first?
Carry out some traces on sublist
. As we said in the text, via backtracking this predicate generates all possible sublists, but as you'll see, it generates several sublists more than once. Do you understand why?
Carry out traces on both naiverev
and rev
, and compare their behavior.
Now for some programming work:
It is possible to write a one line definition of the member
predicate by making use of append
. Do so. How does this new version of member
compare in efficiency with the standard one?
Write a predicate set(InList,OutList)
which takes as input an arbitrary list, and returns a list in which each element of the input list appears only once. For example, the query
set([2,2,foo,1,foo, [],[]],X).
should yield the result
X = [2,foo,1,[]].
Hint: use the member
predicate to test for repetitions of items you have already found.
We `flatten' a list by removing all the square brackets around any lists it contains as elements, and around any lists that its elements contain as element, and so on for all nested lists. For example, when we flatten the list
[a,b,[c,d],[[1,2]],foo]
we get the list
[a,b,c,d,1,2,foo]
and when we flatten the list
[a,b,[[[[[[[c,d]]]]]]],[[1,2]],foo,[]]
we also get
[a,b,c,d,1,2,foo].
Write a predicate flatten(List,Flat)
that holds when the first argument List
flattens to the second argument Flat
. This exercise can be done without making use of append
.
<< Prev | - Up - |