TEACH LISTQUESTIONS                                    A. Sloman Feb 1984

=== LIST PROCESSING EXERCISES ========================================

1) Write a procedure, called LISTIFY, such that:

        listify([a b c d]) =>
        ** [[a] [b] [c] [d]]

2) Write a procedure, called DOUBLEL, such that:

        doublel([2 5 13 7]) =>
        ** [4 10 26 14]

3) Write a procedure, called COUNTW, such that:

        countw([the man opened the door], "the") =>
        ** 2

COUNTW takes a list and a word and counts the number of times  the  word
occurs in the list. When you've define the procedure check whether it also
works for something other than a word as the second argument, e.g. a number.

4) Write a procedure, called COUNTP, such that:

        countp([the man ate 3 apples and 2 pears], isinteger) =>
        ** 2

        countp([the man ate 3 apples and 2 pears], isword) =>
        ** 6

COUNTP takes a list and a predicate (a procedure of one  argument  which
produces the result TRUE or FALSE) and counts the number of items in the
list which 'satisfy' the procedure, i.e. make it come out true.

5) Write a procedure, called ALLBEFORE, such that:

        allbefore([the man opened the door], "opened") =>
        ** [the man]
        allbefore([a b c d e f g h], "e") =>
        ** [a b c d]

ALLBEFORE takes a list and a word and returns a list of all the elements
of the list which precede the the given word.

6) Write a procedure, called ALLAFTER, such that:

        allafter([the man opened the door], "opened") =>
        ** [the door]
        allafter([a b c d e f g h], "e") =>
        ** [f g h]

7) Write a procedure, called ADDUP, so that:

        addup([10 3 5 4]) =>
        ** 22

ADDUP takes a list of numbers and produces as its result their sum.

8) Write a procedure, called MORE, so that:

        more([10 3 5 4], [2 1 5 2 1]) =>
        ** [10 3 5 4]

MORE takes two lists of numbers and returns the one whose  elements  add
up to the most.

9) Write a procedure, called REPEATED, such that:
        repeated([a b c c d e f f g h]) =>
        ** [c f]

        repeated([a b c d d  c b a]) =>
        ** [d]

        repeated([a b c d]) =>
        ** []
REPEATED takes a list of items and returns a list of those  elements  of
the original list which are followed by themselves.

10)  Write  a  procedure,  called  MERGE,  which  takes  two  lists  and
interleaves them.
        merge([a b c d], [1 2 3 4]) =>
        ** [a 1 b 2 c 3 d 4]

11) Write a procedure, called INSERT, so that:

        insert(34,[12 15 25 36 52 100]) =>
        ** [12 15 25 34 36 52 100]

INSERT takes a number and an ordered list. It returns a new list similar
to the input except that it includes the given number.

12) Write a procedure, called ORDER, such that:

        order([52 100 12 34 52 36 25 15]) =>
        ** [12 15 25 34 36 52 52 100]

ORDER takes an unordered list and returns a  sorted  one.   There  is  a
library procedure SORT which does this.

13) Pretend ADD REMOVE PRESENT and  LOOKUP  don't  exist  in  the  POP11
system  and  that  you have to define them, using the names STORE FORGET
KNOWN and RECALL. Assume the procedure  MATCHES  is  already  available.
Assume all information is stored in a list called MEMORY. So

        vars memory; [] -> memory;
        store([john hates teaching]);
        memory ==>
        ** [[john hates teaching]]
        store([aaron likes teaching]);
        memory ==>
        ** [[aaron likes teaching]
                [john hates teaching]]
        vars x;
        recall([aaron likes ?x]);
        x =>
        ** teaching
        recall([ == likes eating]) =>
        ;;; MISHAP RECALL ERROR - PATTERN NOT FOUND
        ;;; INVOLVING [== likes eating]

        known([aaron hates ?x]) =>
        ** false
        known([?x hates teaching]) =>
        ** [john hates teaching]

NOTE
  The last example implies that -known- is defined differently
  from -present-, since the latter would return TRUE, not the item
  found to match the pattern.

        forget([ == likes == ]);
        memory ==>
        ** [[john hates teaching]]

Write the procedures illustrated, and test them.

14) Write a procedure called PICPOINTS which will make a list of all the
points  marked in a turtle picture. Assume the bounds of the picture are
in the variables XMAX and YMAX. (If necessary read TEACH TURTLE or
TEACH VTURTLE first.)
        vars xmax ymax;
        25 -> xmax; 20 -> ymax;
        newpicture(xmax, ymax);
        jumpto(5,5); draw(3);
        picpoints() ==>
        ** [[5 5] [6 5] [7 5] [8 5]]

TEACH PICTURES elaborates on this exercise.


TEACH SETS and TEACH SETS2 give more practice to illustrate the
sorts of techniques used in this file.

--- C.all/teach/listquestions
--- Copyright University of Sussex 1988. All rights reserved. ----------
