Computer Science Fundamentals (CS153 2004S)

Booleans and Conditionals

In this lab, you will have the opportunity to explore a number of issues relating to predicates, Boolean values, and conditional operations.

Procedures covered in this lab include:


Exercise 0: Preparation

You may find it helpful to rescan the readings on Boolean values and conditionals.

You may also want to rescan the reading on numbers.

After making sure that you're prepared, start DrScheme.

Exercise 1: Empty lists

The null? predicate determines whether its parameter is an empty list.

Which of the following does Scheme consider an empty list?

Exercise 2: Equality

Consider the following definitions

(define alpha (list 'a 'b 'c))
(define beta (list 'a 'b 'c))
(define gamma alpha)

Determine which of the lists are eq?, eqv?, or equal?.

Exercise 3: Reflection

What, if anything, did you find surprising in the results of the previous exercises?

By looking at the Scheme report, see if you can find a pair of values that are equal in the sense of = but not in the sense of eqv.

Exercise 4: What is not?

a. What type is not?

b. What predicate would you use to verify your answer?

Exercise 5: Ranges

a. Write a Boolean expression that determines if the value named by grade is between 0 and 100, inclusive.

b. Test that expression using different values of grade.

Exercise 6: Exploring and and or

a. Determine the value and returns when called with no parameters.

b. Explain why you think the designers of Scheme had and return that value.

c. Determine the value or returns when called with no parameters.

d. Explain why you think the designers of Scheme had or return that value.

Exercise 7: What is it?

Define and test a Scheme predicate symbol-or-list? that takes one argument and returns #t if the argument is either a symbol or a list, #f if it is neither.

Exercise 8: Between, Revisited

Define and test a Scheme predicate between? that takes three arguments, all real numbers, and determines whether the second one lies strictly between the first and third (returning #t if it is, #f if it is not). For example, 6 lies strictly between 5 and 13, so both (between? 5 6 13) and (between? 13 6 5) should have the value #t.

Exercise 9: Triangulation

Three line segments can be assembled into a triangle if, and only if, the length of each of them is less than the sum of the lengths of the other two. Define a Scheme predicate triangle? that takes three arguments, all positive real numbers, and determines whether line segments of those three lengths (assumed to be measured in the same units) could be assembled into a triangle.

Exercise 10: Being Neighborly

Define and test a Scheme procedure neighbor that takes one argument, an integer, and returns the next higher integer if its argument is even, the next lower integer if its argument is odd. (Start by writing a comment that describes the purpose of the procedure.)

Exercise 11: Non-Boolean Tests

For each of the following expressions, guess what the output should be and then test it in Scheme.

a. (if #t 'aardvark 'zebra)

b. (if #f 'aardvark 'zebra)

c. (if (null? null) 'aardvark 'zebra)

d. (if (null? 'null) 'aardvark 'zebra)

e. (if (null? (list 'a 'b 'c)) 'aardvark 'zebra)

f. (if () 'aardvark 'zebra)

g. (if (list 'a 'b 'c) 'aardvark 'zebra)

h. (if 2 'aardvark 'zebra)

i. (if 'true 'aardvark 'zebra)

j. (if 'false 'aardvark 'zebra)

Exercise 12: The Sphinx's Riddle

As you may know, one of the famous riddles of the Sphinx goes something like the following:

What is it that walks upon four legs, then two legs, then three legs?

The answer is humans.

Write a Scheme procedure, legs, that, given someone's age, tells how many legs they walk upon. (You get to choose reasonable ages for the three phases of life.)


Notes on Problem 6

(and) has value true because and has a value of true if none of the parameters have value false. Since it has no parameters, none are false.

(or) has value false because or has value false if none of the parameters is non-false. Since it has no parameters, none are non-false.



Wednesday, 6 September 2000 [Samuel A. Rebelsky]

Friday, 8 September 2000 [Samuel A. Rebelsky]

Wednesday, 31 January 2001 [Samuel A. Rebelsky]

Thursday, 1 February 2001 [Samuel A. Rebelsky]

Wednesday, 7 February 2001 [Samuel A. Rebelsky]

Tuesday, 10 September 2002 [Samuel A. Rebelsky]

Tuesday, 28 January 2003 [Samuel A. Rebelsky]

Thursday, 28 Janaury 2003 [Samuel A. Rebelsky]


Disclaimer: I usually create these pages on the fly, which means that I rarely proofread them and they may contain bad grammar and incorrect details. It also means that I tend to update them regularly (see the history for more details). Feel free to contact me with any suggestions for changes.

This document was generated by Siteweaver on Fri May 7 09:44:12 2004.
The source to the document was last modified on Wed Jan 28 10:23:10 2004.
This document may be found at

You may wish to validate this document's HTML ; Valid CSS! ; Check with Bobby

Samuel A. Rebelsky,