1 6.001 SICP Symbolic data Symbol: a primitive type Generalization Symbolic differentiation.

Slides:



Advertisements
Similar presentations
Scheme in Scheme. Why implement Scheme in Scheme  Implementing a language is a good way to learn more about programming languages  Interpreters are.
Advertisements

1 Programming Languages (CS 550) Lecture Summary Functional Programming and Operational Semantics for Scheme Jeremy R. Johnson.
Lambda Calculus and Lisp PZ03J. Lambda Calculus The lambda calculus is a model for functional programming like Turing machines are models for imperative.
מבוא מורחב 1 Lecture #7. מבוא מורחב 2 The rational number abstraction Wishful thinking: (make-rat ) Creates a rational number (numer ) Returns the numerator.
6.001: Structure and Interpretation of Computer Programs Symbols Quotation Relevant details of the reader Example of using symbols Alists Differentiation.
1 The metacircular evaluator Names Extend the calculator to store intermediate results as named values (define x (+ 4 5)) store result as x (+ x.
Fall 2008Programming Development Techniques 1 Topic 10 Example: Symbolic Differentiation Section October 2008.
1 The Metacircular Evaluator Chapter 4 Section 4.1 We will not cover every little detail in the lectures, so you MUST read Section 4.1 in full.
מבוא מורחב - שיעור 10 1 Symbols Manipulating lists and trees of symbols: symbolic differentiation Lecture 10.
Functional programming: LISP Originally developed for symbolic computing Main motivation: include recursion (see McCarthy biographical excerpt on web site).
6.001 SICP SICP Sections 5 & 6 – Oct 5, 2001 Quote & symbols Equality Quiz.
SICP Interpretation part 1 Parts of an interpreter Arithmetic calculator Names Conditionals and if Store procedures in the environment.
6.001 SICP SICP – Evaluation I Recitation 11/19/2004 Eval review Evaluation examples define lambda apply New language elements.
SICP Data Mutation Primitive and Compound Data Mutators Stack Example non-mutating mutating Queue Example non-mutating mutating.
Functional programming: LISP Originally developed for symbolic computing First interactive, interpreted language Dynamic typing: values have types, variables.
SchemeCOP Introduction to Scheme. SchemeCOP Scheme Meta-language for coding interpreters –“ clean ” semantics Scheme = LISP + ALGOL –simple.
6.001 SICP 1/ : Structure and Interpretation of Computer Programs Symbols Example of using symbols Differentiation.
CS 152: Programming Language Paradigms February 17 Class Meeting Department of Computer Science San Jose State University Spring 2014 Instructor: Ron Mak.
SICP Interpretation Parts of an interpreter Arithmetic calculator Names Conditionals and if Storing procedures in the environment Environment as.
D x (c) = 0 D x (x) = 1 D x (y) = 0 for y an independent variable D x (u+v) = D x (u) + D x (v) D x (uv) = u D x (v) + v D x (u) D x (u n ) = nu n-1 D.
COP4020 Programming Languages Functional Programming Prof. Xin Yuan.
1/38. 2/38 Tagged Data Tag: a symbol in a data structure that identifies its type Why we need tags Extended example: evaluating arithmetic expressions.
1 The Evaluator. 2 Compiler vs. Interpreter Command Processing Unit The Computer Program in Low Level Machine Language Program in High Level Language.
18-October-2002cse Symbols © 2002 University of Washington1 Symbols CSE 413, Autumn 2002 Programming Languages
מבוא מורחב 1 Lecture #9. מבוא מורחב 2 Symbol: a primitive type constructors: (quote alpha) ==> quote is a special form. One argument: a name. selectors.
CS220 Programming Principles 프로그래밍의 이해 2002 가을학기 Class 6 한 태숙.
SICP Tagged data Why do we need tags Concept of tags Extended example.
1 Lecture 14: Assignment and the Environment Model (EM)
Fall 2008Programming Development Techniques 1 Topic 16 Assignment and Local State Section 3.1.
Functional Programming: Lisp MacLennan Chapter 10.
1 Data Abstraction. Pairs and Lists. (SICP Sections – 2.2.1)
מבוא מורחב שיעור 7 1 Lecture 7 Data Abstraction. Pairs and Lists. (Sections – 2.2.1)
1 Vectors, binary search, and sorting. 2 We know about lists O(n) time to get the n-th item. Consecutive cons cell are not necessarily consecutive in.
CS 152: Programming Language Paradigms February 12 Class Meeting Department of Computer Science San Jose State University Spring 2014 Instructor: Ron Mak.
SICP Interpretation part 2 Store operators in the environment Environment as explicit parameter Defining new procedures.
SICP Tagged data Why do we need tags Concept of tags Extended example.
Operational Semantics of Scheme
Edited by Original material by Eric Grimson
Tagged Data Tag: a symbol in a data structure that identifies its type
6.001 SICP Variations on a Scheme
Pairs and Lists. Data Abstraction. SICP: Sections – 2.2.1
6.001 SICP Object Oriented Programming
6.001: Structure and Interpretation of Computer Programs
Env. Model Implementation
Original material by Eric Grimson
6.001 SICP Data abstractions
The Metacircular Evaluator
Dynamic Scoping Lazy Evaluation
The Metacircular Evaluator
The Metacircular Evaluator (Continued)
Lecture 26: The Metacircular Evaluator Eval Apply
6.001 SICP Further Variations on a Scheme
Lecture #9 מבוא מורחב.
Lecture 12: Message passing The Environment Model
Lecture 13 - Assignment and the environments model Chapter 3
Data Mutation Primitive and compound data mutators set! for names
6.001 SICP Variations on a Scheme
6.001 SICP Data Mutation Primitive and Compound Data Mutators
Lecture 14: The environment model (cont
6.001 SICP Data abstractions
Lecture #7 מבוא מורחב.
List and list operations (continue).
Today’s topics Abstractions Procedural Data
Functional Programming: Lisp
6.001 SICP Interpretation Parts of an interpreter
Lecture # , , , , מבוא מורחב.
Introduction to the Lab
topics interpreters meta-linguistic abstraction eval and apply
Lecture 25: The Metacircular Evaluator Eval Apply
Dispatch on Type (one-less x) => x-1 if x is a <number>
Presentation transcript:

SICP Symbolic data Symbol: a primitive type Generalization Symbolic differentiation

2 Quiz Reminder Review sessions 2/27 5-7, /27 7-9, /28 7-9, QUIZ I on 3/1/00 in Walker (Bldg 50) 3 rd floor Take at either 5-7 or 7-9 One sheet (8.5 by 11 inches) of notes only Covers material through the end of this week

3 A data abstraction consists of: constructors selectors operations contract (define make-point (lambda (x y) (list x y))) (define x-coor (lambda (pt) (car pt))) (define on-y-axis? (lambda (pt) (= (x-coor pt) 0))) (x-coor (make-point )) = Review: data abstraction

4 Symbols? Say your favorite color Say “your favorite color” What is the difference? In one case, we want the meaning associated with the expression In the other case, we want the actual words (or symbols) of the expression

5 Symbol: a primitive type constructors: (quote alpha) ==> quote is a special form. One argument: a name. selectors none operations: symbol?; type: anytype -> boolean (symbol? (quote alpha)) ==> #t eq? ; discuss in a minute

6 Symbol: printed representation (lambda (x) (* x x)) eval lambda-rule A compound proc that squares its argument #[compound-...] print (quote beta) eval quote-rule symbol print beta

7 Symbols are ordinary values (list 1 2) ==> (1 2) (list (quote delta) (quote gamma)) ==> (delta gamma) symbol gamma symbol delta

8 A useful property of the quote special form (list (quote delta) (quote delta)) symbol delta Two quote expressions with the same name return the same object

9 The operation eq? tests for the same object a primitive procedure returns #t if its two arguments are the same object very fast (eq? (quote eps) (quote eps)) ==> #t (eq? (quote delta) (quote eps)) ==> #f For those who are interested: ; eq?: EQtype, EQtype ==> boolean ; EQtype = any type except number or string One should therefore use = for equality of numbers, not eq?

10 End of part 1 symbol is a primitive type the special form quote is its constructor quoting the same name always returns the same object the primitive procedure eq? tests for sameness

11 Generalization: quoting other expressions Expression: Rewrites to: 1. (quote (a b)) (list (quote a) (quote b)) 2. (quote ()) nil 3. (quote ) (quote (1 (b c))) rewrites to (list (quote 1) (quote (b c))) rewrites to (list 1 (quote (b c))) rewrites to (list 1 (list (quote b) (quote c))) ==> (1 (b c)) In general, (quote DATUM) evaluates to DATUM

12 Shorthand: the single quote mark 'a is shorthand for (quote a) '(1 2)(quote (1 2))

13 Your turn: what does evaluating these print out? (define x 20) (+ x 3) ==> '(+ x 3) ==> (list (quote +) x '3) ==> (list '+ x 3) ==> (list + x 3) ==> 23 (+ x 3) (+ 20 3) ([procedure #…] 20 3)

14 End of part 2 (quote DATUM) evaluates to DATUM for any DATUM 'DATUM is the same as (quote DATUM) quoting self-evaluating expressions is worthless

15 Symbolic differentiation (deriv ) ==> (deriv '(+ x 3) 'x) ==> 1 (deriv '(+ (* x y) 4) 'x) ==> y (deriv '(* x x) 'x) ==> (+ x x) Algebraic expressionRepresentation X + 3(+ x 3) XX 5y5y(* 5 y) X+ y + 3(+ x (+ y 3))

16 Building a system for differentiation Example of: trees how to use the symbol type symbolic manipulation 1. how to get started 2. a direct implementation 3. a better implementation

17 1. How to get started Analyze the problem precisely deriv constant dx = 0 deriv variable dx = 1 if variable is the same as x = 0 otherwise deriv (e1+e2) dx = deriv e1 dx + deriv e2 dx deriv (e1*e2) dx = e1 * (deriv e2 dx) + e2 * (deriv e1 dx) Observe: e1 and e2 might be complex subexpressions derivative of (e1+e2) formed from deriv e1 and deriv e2 a tree problem Base Recursive

18 Type of the data will guide implementation legal expressions x(+ x y) 2(* 2 x)(+ (* x y) 3) illegal expressions *(3 5 +)(+ x y z) ()(3)(* x) ; Expr = SimpleExpr | CompoundExpr ; SimpleExpr = number | symbol ; CompoundExpr = a list of three elements where the first element is either + or * ; = pair >>

19 2. A direct implementation Overall plan: one branch for each subpart of the type (define deriv (lambda (expr var) (if (simple-expr? expr) ))) To implement simple-expr? look at the type CompoundExpr is a pair nothing inside SimpleExpr is a pair therefore (define simple-expr? (lambda (e) (not (pair? e))))

20 Simple expressions One branch for each subpart of the type (define deriv (lambda (expr var) (if (simple-expr? expr) (if (number? expr) ) ))) Implement each branch by looking at the math 0 (if (eq? expr var) 1 0)

21 Compound expressions One branch for each subpart of the type (define deriv (lambda (expr var) (if (simple-expr? expr) (if (number? expr) 0 (if (eq? expr var) 1 0)) (if (eq? (car expr) '+) ) )))

22 Sum expressions To implement the sum branch, look at the math (define deriv (lambda (expr var) (if (simple-expr? expr) (if (number? expr) 0 (if (eq? expr var) 1 0)) (if (eq? (car expr) '+) (list '+ (deriv (cadr expr) var) (deriv (caddr expr) var)) ) ))) (deriv '(+ x y) 'x) ==> (+ 1 0) (a list!)

23 The direct implementation works, but... Programs always change after initial design Hard to read Hard to extend safely to new operators or simple exprs Can't change representation of expressions Source of the problems: nested if expressions explicit access to and construction of lists few useful names within the function to guide reader

24 3. A better implementation 1. Use cond instead of nested if expressions 2. Use data abstraction To use cond : write a predicate that collects all tests to get to a branch: (define sum-expr? (lambda (e) (and (pair? e) (eq? (car e) '+)))) ; type: Expr -> boolean do this for every branch: (define variable? (lambda (e) (and (not (pair? e)) (symbol? e))))

25 Use data abstractions To eliminate dependence on the representation: (define make-sum (lambda (e1 e2) (list '+ e1 e2)) (define addend (lambda (sum) (cadr sum)))

26 A better implementation (define deriv (lambda (expr var) (cond ((number? expr) 0) ((variable? expr) (if (eq? expr var) 1 0)) ((sum-expr? expr) (make-sum (deriv (addend expr) var) (deriv (augend expr) var))) ((product-expr? expr) ) (else (error "unknown expression type" expr)) ))

27 Isolating changes to improve performance (deriv '(+ x y) 'x) ==> (+ 1 0) (a list!) (define make-sum (lambda (e1 e2) (cond ((number? e1) (if (number? e2) (+ e1 e2) (list ‘+ e1 e2))) ((number? e2) (list ‘+ e2 e1)) (else (list ‘+ e1 e2))))) (deriv '(+ x y) 'x) ==> 1

28 End of part 3 Carefully think about problem and type of data before starting Structure your function around the branches of the type Avoid nested if expressions Use data abstractions for better modifiability Use good names for better readability

29 Recitation problem What is the value printed if you evaluate the following two expressions ( list (+ 3 4) '(+ 3 4) '(list 3 4)) ==> ?? ''x ==> ?? You observe the following behavior (cons 1 nil) ==> (1) (list 1) ==> (1) (eq? (cons 1 nil) (list 1)) ==> #f Why does eq? return false?