380 likes | 395 Views
Learn about refined substitution model, recursive procedures, procedural abstraction, and scope of variables. Understand syntax vs. semantics and how to evaluate expressions in Scheme. Dive into lambda expressions, naming procedures, compound procedures, and substitution model for evaluation. Discover values, types, booleans, IF special form, and recursive algorithms.
E N D
Lecture 2Lecturer: Prof. Benny ChorOffice hours: Thursday 15-16, Shrieber 223benny@cs.tau.ac.il מבוא מורחב
Lecture OverviewRefined substitution model of evaluationRecursive proceduresProcedural abstractionScope of Variables מבוא מורחב
Reminder: Syntax vs. semantics Syntax Semantics מבוא מורחב
The value of a numeral: number The value of a built-in operator: machine instructions to execute The value of any name: the associated object in the environment • To Evaluate a combination: (other than special form) • Evaluate all of the sub-expressions in any order • Apply the procedure that is the value of the leftmost sub-expression to the arguments (the values of the other sub-expressions) Reminder: Evaluation of An Expression מבוא מורחב
==> (define score 23) ==> (* (+ 5 6 ) (- score (* 2 3 2 ))) * + 5 6 - 23 * 2 3 2 11 12 11 121 An example מבוא מורחב
Reminder: Lambda special form lambda: (lambda (x y) (+ x y x 2)) • 1st operand position: the parameter list(x y) • a list of names (perhaps empty) • 2nd operand position: the body(+ x y x 2) • may be any sequence of expressions The value of a lambda expression is a compound procedure. מבוא מורחב
Naming procedures • An application of an unnamed procedure: • ((lambda (x) (* x x)) 4) ==> 16 • 2. Naming the procedure: • (define square (lambda (x) (* x x))) • (square 3)
Environment Table Name Value score 23 square Proc (x) (* x x) Reminder: Abstraction forCompound procedures (define square (lambda (x) (* x x))) מבוא מורחב
Some examples: • (define twice ) • (twice 2) ==> 4 (twice 3) ==> 6 • (define second ) • (second 2 15 3) ==> 15(second 34 -5 16) ==> -5 (lambda (x) (* 2 x)) Using “syntactic sugar”: (define (twice x) (* 2 x)) (lambda (x y z) y) (define (second x y z) y) מבוא מורחב
Proc (x) (* x x) 4 New: Substitution model for Evaluation Lets evaluate: ==> (square 4) • To Apply a compound procedure to a list of arguments: • Replace the formal parameters with the corresponding actual values. • Evaluate the body of the procedure with these values. (* 4 4) 16 מבוא מורחב
An example of the substitution model (define square (lambda (x) (* x x)))(define average (lambda (x y) (/ (+ x y) 2))) (average 5 (square 3))(average 5 (* 3 3))(average 5 9) first evaluate operands,then substitute (/ (+ 5 9) 2)(/ 14 2) if operator is a primitive procedure, 7replace by result of operation מבוא מורחב
The value of a numeral: number The value of a built-in operator: machine instructions to execute The value of any name: the associated object in the environment • To Evaluate a combination: (other than special form) • Evaluate all of the sub-expressions in any order • Apply the procedure that is the value of the leftmost sub-expression to the arguments (the values of the other sub-expressions) Evaluation of An Expression (refined) To Apply a compound procedure:(to a list of arguments) Evaluate the body of the procedure with the formal parameters replaced by the corresponding actual values מבוא מורחב
Values and types In scheme almost every expression has a value Examples: 1) The value of 23 is 23 2) The value of (lambda (x) (* x x))is the compound procedure Proc (x) (* x x) Values have types. For example: 1) The type of 23is numeral 2) The type of Proc (x) (* x x) is a compound procedure מבוא מורחב
Reminder: Booleans Two distinguished values denoted by the constants #t and #f The type of these values is boolean ==> (< 2 3) #t ==> (< 4 3) #f מבוא מורחב
Reminder: IF special form (if <predicate> <consequent> <alternative>) (if (< 2 3) 2 3) ==> 2 (if (< 2 3) 2 (/ 1 0)) ==> ERROR 2 • If the value of <predicate> is #t, • Evaluate <consequent> and return it • Otherwise • Evaluate <alternative> and return it In a “regular” form, we first evaluate all arguments and then apply the function מבוא מורחב
S(n-1) • Notice that: • S(n) = S(n-1) + n2 • S(0) = 0 • These two properties completely define the function Sum of squares • S(n) = 02 + 12 + 22 ………. …… (n-1)2 + n2 Wishful thinking: if I could only solve the smaller instance …
Recursive algorithm for sum of squares (define sum-squares (lambda (n) (if (= n 0) 0 (+ (sum-squares (- n 1)) (square n))))
General form of recursive algorithms • test, base case, recursive case (define sum-sq (lambda (n) (if (= n 0) ; test for base case 0 ; base case (+ (sum-sq (- n 1)) (square n)) ; recursive case ))) • base case: non-decomposable problem • recursive case: larger (decomposable) problem מבוא מורחב
Evaluating (sum-squares 3) (define (sum-squares n) (if (= n 0) 0 (+ (sum-squares (- n 1)) (square n)))) (sum-squares 3) (if (= 3 0) 0 (+ (sum-squares (- 3 1)) (square 3))) (+ (sum-squares (- 3 1)) (square 3)) (+ (sum-squares (- 3 1)) (* 3 3)) (+ (sum-squares(- 3 1)) 9) (+ (sum-squares 2) 9) (+ (if (= 2 0) 0 (+ (sum-squares (- 2 1)) (square 2))) 9) … (+ (+ (sum-squares 1) 4) 9) … (+ (+ (+ (sum-squares 0) 1) 4) 9) (+ (+ (+ (if (= 0 0) 0 (+ (sum-squares (- 0 1)) (square 0))) 1) 4) 9) (+ (+ (+ 0 1) 4) 9) … 14 What would have happen if ‘if’ was a regular function ? מבוא מורחב
Another example of a recursive algorithm • even? (define even? (lambda (n) (not (even? (- n 1))) ; recursive case ))) • (if (= n 0) ; test for base case • #t ; base case מבוא מורחב
Short summary • Design a recursive algorithm by 1. Solving big instances using the solution to smaller instances. 2. Solving directly the base cases. • Recursive algorithms have 1. test 2. recursive case 3. base case מבוא מורחב
Block structure Lets write a procedure that given x, y, and z computes f(x,y,z) = (x+y)2 + (x+z)2 (define (sum-and-square x y) (square (+ x y))) (define (f x y z) (+ (sum-and-square x y) (sum-and-square x z))) מבוא מורחב
Block structure (cont.) We could also make sum-and-square private to f: (define (f x y z)(define (sum-and-square x y) (square (+ x y))) (+ (sum-and-square x y) (sum-and-square x z))) מבוא מורחב
(define (sum-and-square 1 2) (square (+ 1 2))) (+ (sum-and-square 1 2) (sum-and-square 1 3))) Need to clarify the substitution model.. (define (f x y z)(define (sum-and-square x y) (square (+ x y))) (+ (sum-and-square x y) (sum-and-square x z))) ==> (f 1 2 3) מבוא מורחב
(define (f x y z)(define (sum-and-square x y) (square (+ x y))) (+ (sum-and-square x y) (sum-and-square x z))) x,y,z x,y Bounded variables and scope A procedure definition binds its formal parameters The scope of the formal parameter is the body of the procedure. מבוא מורחב
The value of a numeral: number The value of a built-in operator: machine instructions to execute The value of any name: the associated object in the environment • To Evaluate a combination: (other than special form) • Evaluate all of the sub-expressions in any order • Apply the procedure that is the value of the leftmost sub-expression to the arguments (the values of the other sub-expressions) Evaluation of An Expression (refined) To Apply a compound procedure: (to a list of arguments) Evaluate the body of the procedure with the formal parameters replaced by the corresponding actual values. Do not substitute for occurrences that are bound by an internal definition. מבוא מורחב
(define (sum-and-square x y) (square (+ x y))) (+ (sum-and-square 1 2) (sum-and-square 1 3))) The refined substitution model (define (f x y z)(define (sum-and-square x y) (square (+ x y))) (+ (sum-and-square x y) (sum-and-square x z))) ==> (f 1 2 3) מבוא מורחב
Sum-and-square Proc (x y) (square (+ x y)) (+ (sum-and-square 1 2) (sum-and-square 1 3))) The refined substitution model ==> (f 1 2 3) (define (sum-and-square x y) (square (+ x y))) (+ (sum-and-square 1 2) (sum-and-square 1 3))) מבוא מורחב
X = 2 G = 1 X/G = 2 G = ½ (1+ 2) = 1.5 X/G = 4/3 G = ½ (3/2 + 4/3) = 17/12 = 1.416666 X/G = 24/17 G = ½ (17/12 + 24/17) = 577/408 = 1.4142156 SQRT • To find an approximation of square root of x: • Make a guess G • Improve the guess by averaging G and x/G • Keep improving the guess until it is good enough מבוא מורחב
(define initial-guess 1.0) (define precision 0.0001) (define (sqrt-iter guess x) (if (good-enough? guess x) guess (sqrt-iter (improve guess x) x))) (define (good-enough? guess x) (< (abs (- (square guess) x)) precision)) (define (improve guess x) (average guess (/ x guess))) (define (sqrt x) (sqrt-iter initial-guess x)) מבוא מורחב
Good programming Style • 1. Divide the task to well-defined, natural, and • simple sub-tasks. • E.g: good-enough? and improve. • Thumb of rule: If you can easily name it, it does a well-defined task. 2. Use parameters. E.g.: precision, initial-guess. 3. Use meaningful names. מבוא מורחב
Procedural abstraction • It is better to: • Export only what is needed • Hide internal details. The procedure SQRT is of interest for the user. The procedure improve-guessis an internal detail. • Exporting only what is needed leads to: • A clear interface • Avoids confusion מבוא מורחב
Rewriting SQRT (Block structure) (define (sqrt x) (define (sqrt-iter guess x) (if (good-enough? guess x) guess (sqrt-iter (improve guess x) x))) (define (good-enough? guess x) (< (abs (- (square guess) x)) precision)) (define (improve guess x) (average guess (/ x guess))) (define initial-guess 1.0) (define precision 0.00001) (sqrt-iter initial-guess x)) מבוא מורחב
Further improving sqrt Note that in every application of sqrt we substitute for x the same value in all subsequent applications of compound procedures ! Therefore wedo not have to explicitly pass x as a formal variable to all procedures. Instead, can leave it unbounded (“free”). מבוא מורחב
Lexical Scoping The value of an variable which is unbounded (free) in a procedure f is taken from the procedure in which f was defined. מבוא מורחב
SQRT again, take advantage of the refined substitution model (define (sqrt x) (define (good-enough? guess) (< (abs (- (square guess) x)) precision)) (define (improve guess) (average guess (/ x guess))) (define (sqrt-iter guess) (if (good-enough? guess) guess (sqrt-iter (improve guess)))) (define initial-guess 1.0) (define precision 0.00001) (sqrt-iter initial-guess)) מבוא מורחב
SQRT (cont.) ==>(sqrt 2) (define (good-enough? guess) (< (abs (- (square guess) 2)) precision)) (define (improve guess) (average guess (/ 2 guess))) (define (sqrt-iter guess) (if (good-enough? guess) guess (sqrt-iter (improve guess)))) (define initial-guess 1.0) (define precision 0.00001) (sqrt-iter initial-guess))
Proc1.x Proc3.x Another example (define (proc1 x) (define (proc2 y) (+ x y)) (define (proc3 x) (proc2 x)) (proc3 (* 2 x))) (proc1 4) proc1.x = 4 (proc3 8) proc3.x = 8 (proc2 8) proc2.y = 8 proc2.x=proc1.x=4 12 מבוא מורחב