Laboratory: Boolean Values and Predicate Procedures
Summary:
In this laboratory, you will have the opportunity to explore a number
of issues relating to predicates, Boolean values, and conditional
operations.
Preparation
You need not do any preparation for this lab, other than the traditional
preparation. Make sure you've done the reading and asked questions
about it. Start GIMP. Start the MediaScript plugin.
Exercises
Exercise 1: Combining Boolean Values
Experience suggests that students understand and
and or much better after a little general
practice figuring out how they combine values. Fill in the following
tables for each of the operations and and
or. The third column of the table should be the
value of (and arg1
arg2), where arg1
is the first argument and arg2 is the
second argument. The fourth column should be the value of
(or arg1
arg2).
arg1 |
arg2 |
(and arg1 arg2) |
(or arg1 arg2) |
#f |
#f |
|
|
#f |
#t |
|
|
#t |
#f |
|
|
#t |
#t |
|
|
Exercise 2: Simple Color Predicates
As you may recall, in
the reading on Boolean values
and predicate procedures, we defined two simple predicates,
rgb-light? and rgb-dark?.
Here is their code again.
a. Test those predicates on a few extreme values, such as black, white,
and a grey, to make sure that they work as you might expect.
b. Determine experimentally whether there is a dark color with a blue
component of 255.
c. Determine experimentally the largest green component a color can
have and still be considered dark.
d. Determine experimentally the smallest green component a color can
have and still be considered light.
Exercise 3: Writing Your Own Predicates
a. Write a predicate, (not-very-blue?
color), that holds only when the color's
blue component is less than 64.
b. Write a predicate, (red-dominates?
color), that
holds only if the red component is greater than the sum of the
green and the blue components.
c. Write a predicate, (greyish?
color), that holds only if no two
components of color differ by more than 8.
Exercise 4: Comparing Colors
As you've noted, the < procedure can be used
to determine if one number is smaller than another. Can we do similar
comparisons for colors? Certainly. There are, however, a number of
different criteria one could use to compare colors.
a. Write a two-parameter predicate,
(rgb-greener? color1
color2), that holds only if the green
component of color1 is larger than the green
component of color2.
b. Write a two-parameter predicate,
(rgb-lighter? color1
color2), that holds
only if color1 is lighter than
color2. Note that in doing this comparison,
you should first figure out how light a color is (either by averaging
the three components or by using the more complex lightness computation).
Exercise 5: Ranges
Write a procedure, (valid-component?
comp), that determines if the value
named by comp is between 0 and 255, inclusive.
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 and returns when called
with one, two, and three integers as parameters.
d. Explain why you think the designers of Scheme had
and return that value.
e. Determine the value or returns when called
with no parameters.
f. Explain why you think the designers of Scheme had
or return that value.
g. Determine the value or returns when called
with only integers as parameters.
h. Explain why you think the designers of Scheme had
or return that value.
If you are puzzled by some of the answers, you may want to look at
the notes on this problem.
Notes
Notes on Problem 6
(and) has value true (#t)
because and has a value of
true if none of the parameters have value false
. This
call has no parameters, which means none are false.
Alternately, you can think of #t as the and-itive
identity
. That is, (and #t x) is
x. When given no parameters,
and returns its identity value.
(or) has value false (#f)
because or has value false
if none of the parameters is non-false
. Since this call has
no parameters, none are non-false.
Alternately, you can think of #f as the or-itive
identity
. That is, (or #f
x) is x.
When given no parameters, or returns its
identity value.