140 likes | 261 Vues
In this lecture, we delve into the world of natural numbers and even numbers using the Prolog programming language. We explore how to define natural numbers recursively and generate even numbers through various methods. The lecture includes practical exercises on writing predicates such as `even/1` and `is_odd/1` to classify numbers as even or odd based on their definitions. We also discuss built-in arithmetic evaluations in Prolog. Students are encouraged to practice and complete their homework assignments to reinforce understanding of these concepts.
E N D
LING 388: Language and Computers Sandiway Fong Lecture 7 9/15
Administrivia • Reminder • Homework 3 • due next Monday by midnight
Today’s Topic • Practice makes perfect… • more practice writing programs
Infinite set: N = {1,2,3,4,5,..} Base case nn(1). “1 is a natural number” Recursive case nn(N) :- nn(M), N is M+1. “N is a natural number if M is a natural number and N is M+1” ?-nn(X). X = 1 ; X = 2 ; X = 3 ; X = 4 ; X = 5 ; X = 6 ; X = 7 ; X = 8 ; X = 9 Natural Numbers (NN)
Suppose even numbers are natural numbers that are divisible by 2 Set: N = {1,2,3,4,5,..} E = {2,4,..} Task: Write a predicate even/1 that generates the even numbers Method 1 Base Case even(2). Recursive Case even(N) :- even(M), N is M+2. Query: ?- e(X). X = 2 ; X = 4 ; X = 6 ; X = 8 Even Numbers
Suppose even numbers are natural numbers that are divisible by 2 Set: N = {1,2,3,4,5,..} E = {2,4,..} Task: Write a predicate even/1 that generates the even numbers Method 2 Use the natural number definition and permit only the even ones Modify: nn(1). nn(N) :- nn(M), N is M+1. into even(N) :- nn(N), is_even(N). where is_even(N) tests N to see if it’s an even number Even Numbers
Method 2 Use the natural number definition and permit only the even ones Modify: nn(1). nn(N) :- nn(M), N is M+1. into even(N) :- nn(N), is_even(N). where is_even(N) tests N to see if it’s an even number Suppose even numbers are natural numbers that are divisible by 2 Let’s use Prolog’s built-in arithmetic evaluation predicate is/2 ?- Y is 3/2. produces a floating point number Y=1.5 ?- Y is 4/2. produces an integer Y=2 ?- Y is round(3/2). rounds up to the nearest integer Y=2 Even Numbers
Suppose even numbers are natural numbers that are divisible by 2 Let’s use Prolog’s built-in arithmetic evaluation predicate is/2 ?- Y is 3/2. produces a floating point number Y=1.5 ?- Y is 4/2. produces an integer Y=2 ?- Y is round(3/2). rounds up to the nearest integer Y=2 Definition so far even(N) :- nn(N), is_even(N). where is_even(N) tests N to see if it’s an even number Simple Idea: to test whether a number X is even divide it by 2, call this number Y divide it by 2 and round it, call this number Z X is even if Y=Z. Define is_even(X) :- Y is X/2, Z is round(X/2), Y = Z. Even Numbers
Even numbers Idea: to test whether a number X is even divide it by 2, call this number Y divide it by 2 and round it, call this number Z X is even if Y=Z. Define is_even(X) :- Y is X/2, Z is round(X/2), Y = Z. Odd numbers Define is_odd(X) :- Y is X/2, Z is round(X/2), \+ Y = Z. or define is_odd(X) :- \+ is_even(X). Odd Numbers
You can use built-in predicates write/1 and nl/1 to print values of variables etc. Example if X = the ?- write(X), nl. prints the [newline] Sometimes useful for debugging is_odd(X) :- Y is X/2, write(Y), nl, Z is round(X/2), write(Z), nl, \+ Y = Z. Examples: ?- is_odd(7). 3.5 4 Yes ?- is_odd(6). 3 3 No Output
Template: <test> -> <then-part> ; <else-part> <test> <then-part> <else-part> are all Prolog goals (queries) Example: test(N) :- is_even(N) -> write(N), write(‘ is even’), nl ; write(N), write(‘ is odd’), nl. Queries: ?- test(3). 3 is odd Yes ?- test(4). 4 is even Yes If-Then-Else
An Aside http://en.wikipedia.org/wiki/Parity_of_zero • Zero is considered to be an even number • Integer multiple of 2 (definition) • shares all properties of even numbers
Template: <test> -> <then-part> ; (<test> -> <then-part> ; <else-part>) <test> <then-part> <else-part> are all Prolog goals (queries) ( ... ) indicate nesting Example: test(N) :- N = 0 -> write(‘Zero is tricky’), nl ; (is_even(N) ->write(N), write(‘ is even’), nl ; write(N), write(‘ is odd’), nl). Queries: ?- test(0). Zero is tricky Nested If-Then-Else
Exercise (Ungraded homework exercise) Write a Prolog program toenumerate the integer line i.e. a program that would print out all and only the numbers on the integer line (given enough time…) Where would you start?