CSC151.02 2010S Functional Problem Solving : Labs
Primary: [Front Door] [Schedule] - [Academic Honesty] [Instructions]
Current: [Outline] [EBoard] [Reading] [Lab] - [Assignment]
Groupings: [Assignments] [EBoards] [Examples] [Exams] [Handouts] [Labs] [Outlines] [Projects] [Readings]
References: [A-Z] [By Topic] - [Scheme Report (R5RS)] [R6RS] [TSPL4]
Related Courses: [CSC151.01 2010S (Weinman)] [CSC151 2009F (Rebelsky)]
Misc: [SamR] [MediaScript] [GIMP]
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 the traditional preparation. Make sure you've done the reading and asked questions about it. Start GIMP. Start the MediaScript plugin.
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.
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 components 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.
You may recall that in problem 2, you explored how certain components can affect whether a color is considered light or dark, and you attempted to find colors that helped you make those determinations. As you know, an important aspect of computer science is taking the informal processes we use and attempting to formalize them. So, let's try that for a similar problem.
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. (Recall that we have
decided that a color is a shade of grey if its three components are
all equal.)
If someone else in the class has also developed a set of instructions, get their instructions and attempt to follow them. (You should also share your instructions with others.)
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 (let ((black (rgb-new 0 0 0)) (grey (rgb-new 128 128 128)) (white (rgb-new 255 255 255))) (lambda (color) (or (and (rgb-light? color) white) (and (rgb-dark? color) black) 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. Try building an image variant using rgb-bgw
.
For example,
>
(define kitten (image-load "/home/rebelsky/MediaScheme/Images/kitten.png"))
>
(image-show (image-variant kitten rgb-bgw))
c. Write a similar procedure, rgb-bgy
, in which
light colors are converted to yellow, dark colors to blue, and other
colors to green.
d. Try building an image variant using this new version
of rgb-bgy
.
(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.
a. Write a procedure, (
, that
that converts a color 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
color
)rgb-dominant
should convert the color to a moderate grey. You may want to use the
structure of rgb-bgw
as a pattern for this
procedure.
b. Try applying rgb-dominant
to a variety of colors.
c. Try building an image variant using rgb-dominant
.
(
has value true (and
)#t
)
because “
has a value of
true if none of the parameters have value false”. This
call has no parameters, which means none are false.
and
Alternately, you can think of #t
as the “and-itive
identity”. That is, (and #t
is
x
)x
. When given no parameters,
and
returns its identity value.
(
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
.
When given no parameters, or
returns its
identity value.
Primary: [Front Door] [Schedule] - [Academic Honesty] [Instructions]
Current: [Outline] [EBoard] [Reading] [Lab] - [Assignment]
Groupings: [Assignments] [EBoards] [Examples] [Exams] [Handouts] [Labs] [Outlines] [Projects] [Readings]
References: [A-Z] [By Topic] - [Scheme Report (R5RS)] [R6RS] [TSPL4]
Related Courses: [CSC151.01 2010S (Weinman)] [CSC151 2009F (Rebelsky)]
Misc: [SamR] [MediaScript] [GIMP]
Copyright (c) 2007-10 Janet Davis, Matthew Kluber, Samuel A. Rebelsky, and Jerod Weinman. (Selected materials copyright by John David Stone and Henry Walker and used by permission.)
This material is based upon work partially supported by the National Science Foundation under Grant No. CCLI-0633090. Any opinions, findings, and conclusions or recommendations expressed in this material are those of the author(s) and do not necessarily reflect the views of the National Science Foundation.
This work is licensed under a Creative Commons
Attribution-NonCommercial 2.5 License. To view a copy of this
license, visit http://creativecommons.org/licenses/by-nc/2.5/
or send a letter to Creative Commons, 543 Howard Street, 5th Floor,
San Francisco, California, 94105, USA.