Summary: In this laboratory, you will have the opportunity to explore a number of issues relating to predicates, Boolean values, and conditional operations.
You need not do any preparation for this lab, other than starting DrFu and making sure that you've done the reading.
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 (, where and arg1
arg2)arg1
is the first argument and arg2 is the
second argument. The fourth column should be the value of
(.
or arg1
arg2)
|
|
( |
( |
#f |
#f |
||
#f |
#t |
||
#t |
#f |
||
#t |
#t |
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.
;;; Procedure:
;;; rgb-light?
;;; Parameters:
;;; color, an RGB color
;;; Purpose:
;;; Determine if the color seems light.
;;; Produces:
;;; light?, a Boolean value
;;; Preconditions:
;;; [None]
;;; Postconditions:
;;; light? is true (#t) if color's intensity is relatively high.
;;; light? is false (#f) otherwise.
(define rgb-light?
(lambda (color)
(<= 192 (+ (* 0.30 (rgb-red color)) (* 0.59 (rgb-green color)) (* 0.11 (rgb-blue color))))))
;;; Procedure:
;;; rgb-dark?
;;; Parameters:
;;; color, an RGB color
;;; Purpose:
;;; Determine if the color seems dark.
;;; Produces:
;;; dark?, a Boolean value
;;; Preconditions:
;;; [None]
;;; Postconditions:
;;; dark? is true (#t) if color's intensity is relatively low.
;;; dark? is false (#f) otherwise.
(define rgb-dark?
(lambda (color)
(>= 64 (+ (* 0.30 (rgb-red color)) (* 0.59 (rgb-green color)) (* 0.11 (rgb-blue color))))))
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.
e. Give instructions that someone else could follow in order to
determine the darkest shade of grey that is still considered light.
(In writing these instructions, assume that the precise algorithm
rgb-light? uses is unknown. All you know about
the procedure is that if it considers one shade of grey light, then
it considers every lighter shade of grey light.)
f. Get instructions from someone else in class and attempt to follow those instructions. (Share your instructions with a neighbor, too.)
a. Write a predicate, (, that holds only when the color's
blue component is less than 64.
not-very-blue?
color)
b. Write a predicate, (, that
holds only if the red component is greater than the sum of the
green and the blue components.
red-dominates?
color)
c. Write a predicate, (, that holds only if no two
components of greyish?
color)color differ by more than 8.
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,
(, that holds only if the green
component of rgb-greener? color1
color2)color1 is larger than the green
component of color2.
b. Write a two-parameter predicate,
(, that holds
only if rgb-lighter? color1
color2)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 compents or by using the more complex lightness computation).
Write a procedure, (, that determines if the value
named by valid-component?
comp)comp is between 0 and 255, inclusive.
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.
The reading included a procedure that used and and
or to convert colors to black, grey, or red.
;;; Procedure:
;;; rgb-bgw
;;; Parameters:
;;; color, an RGB color
;;; Purpose:
;;; Convert an RGB color to black, grey, or white, depending on
;;; the intensity of the color.
;;; Produces:
;;; bgw, an RGB color
;;; Preconditions:
;;; rgb-light? and rgb-dark? are defined.
;;; Postconditions:
;;; If (rgb-light? color) and not (rgb-dark? color), then bgw is white.
;;; If (rgb-dark? color) and not (rgb-light? color), then bgw is black.
;;; If neither (rgb-light? color) nor (rgb-dark? color), then bgw is
;;; grey.
;;; Problems:
;;; In the unexpected case that none of the above conditions holds,
;; bgw will be one of black, white, and grey.
(define rgb-bgw
(lambda (color)
(or (and (rgb-light? color) color-white)
(and (rgb-dark? color) color-black)
color-grey)))
a. Test this procedure by applying it to some colors you know are light, some colors you know are dark, and some colors you know are neither light nor dark. For example,
>(rgb->string (rgb-bgw (rgb-new 10 10 10)))
b. Change the code so that light colors are converted to yellow, dark colors to blue, and other colors to green.
(mostly-red?
color) holds if the red component of
color is the largest of the three components.
(mostly-green?
color) holds if the green component
of color is the largest of the three components.
(mostly-blue?
color) holds if the blue component of
color is the largest of the three components.
Write a procedure, (rgb-dominant
, similar to color)rgb-bgw,
that, given a color, converts it to red if the color is mostly red,
to blue if the color is mostly blue, and to green if the color is
mostly green. If the color is none of those, rgb-dominant
should convert the color to a middle grey.
( has value true (and)#t)
because “ has a value of
true if none of the parameters have value false”. Since this
calls has no parameters, none are false.
and
Alternately, you can think of #t as the “and-itive
identity”. That is, (and #t is
x)x.
( has value false (or)#f)
because “ has value false
if none of the parameters is non-false”. Since this call has
no parameters, none are non-false.
or
Alternately, you can think of #f as the “or-itive identity”.
That is, ( is or #f x)x.