CSC 533: Programming Languages
Spring 2016

HW6: Advanced Scheme

Note: late submissions will NOT be accepted for this final assignment.

PART 1: Association Lists

In biology, the four bases that make up messenger RNA (mRNA) are adenine (A), cytosine (C), guanine (G), and uracil (U). Within a cell, an mRNA sequence is processed by a ribosome and translated into amino acids. Each grouping of 3 bases is known as a codon, and is translated to a particular amino acid. For example, the codon GCU translates to Alanine. The following Scheme association list (defined in hw6.ss) maps each codon (represented by a triplet of base symbols) to the abbreviation for the corresponding amino acid. (define ACIDS '( ((U U U) F) ((U U C) F) ((U U A) L) ((U U G) L) ((U C U) S) ((U C C) S) ((U C A) S) ((U C G) S) ((U A U) Y) ((U A C) Y) ((U A A) *) ((U A G) *) ((U G U) C) ((U G C) C) ((U G A) *) ((U G G) W) ((C U U) L) ((C U C) L) ((C U A) L) ((C U G) L) ((C C U) P) ((C C C) P) ((C C A) P) ((C C G) P) ((C A U) H) ((C A C) H) ((C A A) Q) ((C A G) Q) ((C G U) R) ((C G C) R) ((C G A) R) ((C G G) R) ((A U U) I) ((A U C) I) ((A U A) I) ((A U G) M) ((A C U) T) ((A C C) T) ((A C A) T) ((A C G) T) ((A A U) N) ((A A C) N) ((A A A) K) ((A A G) K) ((A G U) S) ((A G C) S) ((A G A) R) ((A G G) R) ((G U U) V) ((G U C) V) ((G U A) V) ((G U G) V) ((G C U) A) ((G C C) A) ((G C A) A) ((G C G) A) ((G A U) N) ((G A C) N) ((G A A) E) ((G A G) E) ((G G U) G) ((G G C) G) ((G G A) G) ((G G G) G) ))

Download a copy of this file and add the following definitions. Note: you should comment each function with a description of its behavior.

  1. Define a function named translate that takes one input, a list representing a codon, and returns the abbreviation for the corresponding amino acid. For example, (translate '(G G A)) should evaluate to G.

  2. Define a function named translate-sequence that takes one input, an arbitrarily long sequence of bases, and returns the corresponding list of amino acid abbreviations. That is, the first symbol in the returned list should be the amino acid corresponding to the first three bases, the second symbol should be the amino acid corresponding to the next three bases, etc. If the length of the sequence is not a multiple of three, any trailing bases should be ignored. For example, (translate-sequence '(G G A U U C A C C C)) should evaluate to (G F T).

  3. When scientists extract mRNA samples from a cell, they invariably obtain partial sequences. Since the start of the sequence may be unknown, it is unclear exactly how the codons will be grouped in an actual translation. For example, in the sequence GGAUUCACCC the codons could be grouped starting at the beginning (yielding codons GGA UUC ACC), at the second base (yielding codons GAU UCA CCC), or at the third base (yielding codons AUU CAC). In addition, it is possible that the sequence has been read backwards, so the actual sequence to be translated should be CCCACUUAGG.

    Define a function named translate-all-possible that takes one input, an arbitrarily long sequence of bases, and returns a list containing all six possible translations of that sequence. Any extra bases at the beginning or end of the sequence should be ignored in the translation. For example, (translate-all-possible '(G G A U U C A C C C)) should evaluate to ((G F T) (N S P) (I H) (P T *) (P L R) (H L)).

PART 2: Binary Trees

In class, we discussed how structured lists could be used to represent binary trees. For example, the following binary tree is represented by the list to the right:

(define ANIMALS '(dog (bird (horse () ()) (cat () ())) (possum (dog () ()) ())))

Several utility functions (empty-tree?, root, left-subtree, and right-subtree) are provided for you in hw6.ss). Add the following functions for manipulating binary trees.

  1. Define a function named rightmost that takes one input, a list representing a binary tree, and returns the value that is stored rightmost in the tree. For example, given the ANIMALS structure above, (rightmost ANIMALS) should evaluate to possum.

  2. Define a function named height that takes one input, a list representing a binary tree, and returns the height (i.e., maximum root-to-leaf path length) in the tree. For example, given the ANIMALS structure above, (height ANIMALS) should evaluate to 3.

  3. Define a function named num-occur that takes two inputs, a list representing a binary tree and a value, and returns the number of occurrences of the value in that tree. For example, given the ANIMALS structure above, (num-occur ANIMALS 'dog) should evaluate to 2.

  4. Define a function named contains? that takes two inputs, a list representing a binary tree and a value, and returns #t if the list contains the value (otherwise #f). For example, given the ANIMALS structure above, (contains? ANIMALS 'emu) should evaluate to #f while (contains? ANIMALS 'cat) should evaluate to #t.

PART 3: Lazy Streams

Bizz-buzz is a children's game in which a circle of people take turns counting out numbers, but with a wrinkle. Two numbers are selected ahead of time, say 3 and 5. When counting out numbers, multiples of the first selected number (3) must be replaced with "bizz." Likewise, multiples of the second selected number (5) must be replaced by "buzz," and multiples of both (3 and 5) must be replaced by "bizz-buzz." For example:

1 2 bizz 4 buzz bizz 7 8 bizz buzz 11 bizz 13 14 bizz-buzz 16 17 ... If the numbers 5 and 7 were instead selected, the sequence would be: 1 2 3 4 bizz 6 buzz 8 9 bizz 11 12 13 buzz bizz 16 17 18 19 bizz ...

You are to define Scheme functions that can be used to generate streams that represent bizz-buzz sequences.

  1. Define a function named replaceStream that takes three inputs, a function, a value, and a stream. This function should behave similarly to the filterStream function written in class, except that instead of filtering the input stream based on the function, it replaces each qualifying element with the new value. For example: > (define naturals (arithSequence 1 1)) > (lazyHead naturals 10) (1 2 3 4 5 6 7 8 9 10) > (lazyHead (replaceStream even? 'boo naturals) 10) (1 boo 3 boo 5 boo 7 boo 9 boo) > (lazyHead (replaceStream (lambda (x) (and (>= x 3) (<= x 7))) 0 naturals) 15) (1 2 0 0 0 0 0 8 9 10 11 12 13 14 15)
  2. Define a function named bbSeq that takes two inputs, the selected numbers, and returns the stream representing the corresponding bizz-buzz sequence. Note that constructing a particular bizz-buzz stream can be accomplished by starting with the natural number stream, then repeatedly transforming it (using replaceStream) so that multiples of the specified numbers are replaced the corresponding words. For example:
> (lazyHead (bbSeq 3 5) 20) (1 2 bizz 4 buzz bizz 7 8 bizz buzz 11 bizz 13 14 bizz-buzz 16 17 bizz 19 buzz) > (lazyHead (bbSeq 3 7) 21) (1 2 bizz 4 5 bizz buzz 8 bizz 10 11 bizz 13 buzz bizz 16 17 bizz 19 20 bizz-buzz)