Archive for July 2009
The story of Andrew Wiles who solved Fermat’s Last Theorem in 1994.
Chapter Four – Predicates
A predicate is an operation whose output is always either the word
true or the word
? print listp [ hello ] true ? print listp "hello false ? print listp [ hello ] true ? print listp [ ] true ? print wordp "hello true
By convention, predicates often end in ‘p’ or ‘?’. Here’s an example of defining your own predicate using a built-in predicate:
to vowel? :letter output memberp :letter [a e i o u] end ? print vowel? "i true ? print vowel? "y false
if is a command with two inputs. The first input must be either the word
true or the word
false. The second input must be a list containing Logo instructions. If the first input is
true, the instructions are evaluated.
ifelse is a procedure that requires three inputs. The first input must be either the word
true or the word
false. The second and third inputs must be lists of Logo instructions. If the first input is
true, the list in the second input is evaluated; otherwise, the list in the third input is evaluated.
ifelse is unusual in that it can be used as a command or operation.
test is a command that takes one input that is either
test stores its input in special variable that is local to the procedure from which
test is invoked.
iftrue (abbreviated ift) is a command with one input – a list of Logo instructions which are evaluated if the most recent
test command stored
iffalse (abbreviated iff) is similar except that the list of instructions are evaluated if the recent
and is a predicate with two inputs each of which must be
false. The ouput is
true if both inputs are
true; otherwise, it is
or is a similar predicate whose output is
true if either input is true.
not is a predicate with one input (true or false) whose output is the opposite of the input.
ifelse is used as an operation, the output is the result of evaluating the list of instructions in either the second or third inputs depending on whether the first input was
false respectively. For example:
? print sentence "It's ifelse 2=3 ["correct] ["incorrect] It's incorrect to abs :number output ifelse :number < 0 [-:number] [:number] end ? print abs -7 7 ? print abs 7 7
stop is a command that takes no inputs that finishes the evaluation of the procedure in which it is used. An
output command also finishes the evaluation of the procedure in which it occurs. If you’re writing an operation, which should have an output, you use
output; if you’re writing a command, which doesn’t have an output, you use
repeat is a command with two inputs. The first input is a non-negative whole number. The second input is a list of Logo instructions which will be evaluated the number of times given as the first input.
1) What type of operation always outputs either the word true or the word false? 2) Do names of predicates have to end in the letter p? Is it a good idea to name your predicates with names ending in the letter p? What would be another good way to name a predicate? 3) List eleven primitive predicates that are named in this chapter: 4) What is another way to say the same thing as the following? equalp "hello last [goodbye hello] 5) Fill in the blank so the command prints true: print memberp ______ [barnes noble] 6) Fill in the blank so the command prints true: print memberp _____ "chitty 7) Create a predicate, even?, that returns true if the input is even. 8) Write a procedure that will print the specified output when given the specified input: input: Brian output: [Hello Brian] input: [Brian Adkins] output: [Hello Mr. Adkins] input: [Brian Xavier Adkins] output: [Xavier is a nice middle name.] 9) Write integerp, as described on p. 66 10) Write the procedure converse that's described on the bottom of p. 67. 11) Read the section entitled "About Those Brackets" on the top of p. 69 again to make sure you understand it. 12) Which primitive predicates takes only one input? 13) Use the operation form of ifelse to output the input word backwards if it has an odd number of characters or output it normally if it has an even number of characters. to evenword? :value output equal? 0 (remainder count :value 2) end to condreverse :value output ifelse ______________________________________________ end print condreverse "hello -> olleh print condreverse "hi -> hi print condreverse "daddy -> yddad 14) How are output and stop similar? How are they different? 15) Write a predicate, palindrome?, that outputs true if a word is a palindrome. A word is a palindrome if it is the same forward and backward. print palindrome? "hello -> false print palindrome? "mom -> true print palindrome? "wow -> true 16) Write a procedure that uses the palindrome? predicate you wrote in #15 to accept a list and output a list containing only the words that are palindromes. print palindromes [hello mom daddy wow doogood] -> mom wow doogood
After bumping into a number of local programmers who expressed an interest in functional programming, I thought it might be a good time to start a local group that focused on functional programming languages, so I did a couple days ago.
TriFunc.org is a group for programmers who are interested in functional programming languages and live near the Research Triangle area of North Carolina.
If you live in the area and have an interest in functional programming languages, feel free to dive in and start participating in the Google Group discussions. Once we reach a critical mass, I expect we’ll produce a meeting schedule, etc., but that will depend on where the group wants to take this.