Fundamentals of Computer Science I (CSC-151.02 2000F)


Preconditions and Postconditions

Exercises

Exercise 0: Preparation

If you have not done so already, scan the reading on preconditions and postconditions

Exercise 1: Are they all real?

a. Write the all-real? procedure described in the accompanying reading.

b. What preconditions should all-real? have?

c. Is it necessary to test those preconditions? Why or why not?

Exercise 2: Differentiating Errors

Revise the definition of greatest-of-list given in the corresponding reading so that it prints a different (and appropriate) error message for each error condition.

I'd recommend that you use cond rather than if.

Exercise 3: When can you count between?

Revise the definition of the count-from procedure presented in the reading on recursion with natural numbers so that it enforces the precondition that its first argument be less than or equal to its second argument.

Exercise 4: An odd factorial

Here is a procedure that computes the product of all of the odd natural numbers up to and including number:

(define odd-factorial
  (lambda (number)
    (if (= number 1)
        1
        (* number (odd-factorial (- number 2))))))

a. What precondition does odd-factorial impose on its argument?

b. What will happen if this precondition is not met?

c. Revise the definition of odd-factorial as a husk-and-kernel program in which the husk enforces the precondition.

d. How can we be certain, in this case, that none of the calls we make to the kernel procedure violates the precondition?

Exercise 5: Finding values

a. Define and test a procedure named index that takes a symbol sym and a list ls of symbols as its arguments and returns the number of list elements that precede the first occurrence of sym in ls:

> (index 'gamma (list 'alpha 'beta 'gamma 'delta))
2
> (index 'easy (list 'easy 'medium 'difficult 'impossible))
0
> (index 'the (list 'and 'the 'cat 'sat 'on 'the 'mat))
1

b. Arrange for index to signal an error (by invoking the error procedure) if sym does not occur at all as an element of ls.

Exercise 6: Substitution

Define and test a procedure named substitute that takes three arguments -- a symbol new, another symbol old, and a list ls of symbols -- and returns a list just like ls except that every occurrence of old has been replaced with an occurrence of new. Use the husk-and-kernel structure to make sure that new and old are symbols and that ls is a list of symbols before starting into the recursion.

> (substitute 'alpha 'omega (list 'phi 'chi 'psi 'omega 'omega)
(phi chi psi alpha alpha)
> (substitute 'starboard 'port (list 'port 'starboard 'port 'port))
(starboard starboard starboard starboard)
> (substitution 'in 'out null)
()

Notes

History

Friday, 15 September 2000

Monday, 18 September 2000


Disclaimer Often, these pages were created "on the fly" with little, if any, proofreading. Any or all of the information on the pages may be incorrect. Please contact me if you notice errors.

This page may be found at http://www.cs.grinnell.edu/~rebelsky/Courses/CS151/2000F/Labs/prepost.html

Source text last modified Mon Sep 18 11:58:46 2000.

This page generated on Mon Sep 18 11:59:34 2000 by Siteweaver. Validate this page's HTML.

Contact our webmaster at rebelsky@grinnell.edu