On this page:
2.9.1 A note on testing
2.9.2 Utility Functions
take-while
build-infinite-list
2.9.3 Primes
prime?
primes
prime?/ fast
primes/ fast
2.9.4 Longest Common Subsequence
build-table
lcs-length

2.9 Laziness and Infinite Data

Complete this assignment with Team One.

You must submit this in an archive named "lazy.zip".

You must submit this in a file named "lazy.ss".

Develop the following functions and data structures in the Lazy Scheme language.

2.9.1 A note on testing

There is no testing facility built in to the Lazy Scheme language. So, you should use the following pattern for tests:

  (printf "~S should be ~S~n" testing-expr expected-result-expr)

For example,

  (printf "~S should be ~S~n"
          (take-while odd? (list 1 3 4))
          (list 1 3))

2.9.2 Utility Functions

(take-while p l)  (listof any/c)
  p : (any/c . -> . boolean?)
  l : (listof any/c)

Returns the prefix of l such that for all elements p returns true. This is not filter.

For example, (take-while (lambda (n) (< n 5)) (list 1 2 3 4 5 1 2)) returns (list 1 2 3 4).

(build-infinite-list f)  (listof any/c)
  f : (exact-nonnegative-integer? . -> . any/c)

Lazily constructs the infinite list such that (list-ref (build-infinite-list f) i) returns (f i).

2.9.3 Primes

(prime? n)  boolean?
  n : exact-positive-integer?

Returns true if n is prime.

primes : (listof exact-positive-integer?)

The list of all primes.

You may find filter, prime?, and build-infinite-list useful.

(prime?/fast n)  boolean
  n : exact-positive-integer?

Returns true if n is prime, but tests only prime factors from primes/fast.

primes/fast : (listof exact-positive-integer?)

The list of all primes constructed with prime?/fast.

2.9.4 Longest Common Subsequence

(build-table rows cols f)  (vectorof (vectorof any/c))
  rows : exact-positive-integer?
  cols : exact-positive-integer?
  f : (exact-nonnegative-integer? exact-nonnegative-integer? . -> . any/c)

Lazily constructs a vector such that (vector-ref (vector-ref (build-table rows cols f) i) j) equals (f i j), when (< i rows) (< j cols).

You will find the following function helpful:

  (define (build-vector num f)
    (apply vector (build-list num f)))

(lcs-length s1 s2)  exact-nonnegative-integer?
  s1 : string?
  s2 : string?

Computes the length of the longest common subsequence of two strings s1 and s2.

You must use build-table to construct a table of the longest common subsequence of prefixes of s1 and s2 are synthesize the result from these intermediate points. You will not get credit if you do a computation twice.

You may find string-ref, char=?, apply, and max useful.