Type Systems Winter Semester 2006

Similar documents
CIS 500 Software Foundations Fall September 25

The Lambda Calculus. 27 September. Fall Software Foundations CIS 500. The lambda-calculus. Announcements

Chapter 5: The Untyped Lambda Calculus

Fall 2013 Midterm Exam 10/22/13. This is a closed-book, closed-notes exam. Problem Points Score. Various definitions are provided in the exam.

CIS 500 Software Foundations Midterm I

CS 4110 Programming Languages & Logics. Lecture 17 Programming in the λ-calculus

λ calculus Function application Untyped λ-calculus - Basic Idea Terms, Variables, Syntax β reduction Advanced Formal Methods

Untyped Lambda Calculus

Untyped Lambda Calculus

CIS 500 Software Foundations Midterm I Answer key October 8, 2003

Introduction to Lambda Calculus. Lecture 7 CS /08/09

Introduction to Lambda Calculus. Lecture 5 CS 565 1/24/08

11/6/17. Outline. FP Foundations, Scheme. Imperative Languages. Functional Programming. Mathematical Foundations. Mathematical Foundations

Concepts of programming languages

CSE 505: Concepts of Programming Languages

Chapter 5: The Untyped Lambda Calculus

Fundamentals and lambda calculus

9/23/2014. Why study? Lambda calculus. Church Rosser theorem Completeness of Lambda Calculus: Turing Complete

Lambda Calculus. Lecture 4 CS /26/10

INF 212 ANALYSIS OF PROG. LANGS LAMBDA CALCULUS. Instructors: Crista Lopes Copyright Instructors.

Formal Systems and their Applications

CMSC 330: Organization of Programming Languages

Introduction to the Lambda Calculus

CS152: Programming Languages. Lecture 7 Lambda Calculus. Dan Grossman Spring 2011

Costly software bugs that could have been averted with type checking

M. Snyder, George Mason University LAMBDA CALCULUS. (untyped)

Lambda Calculus. Type Systems, Lectures 3. Jevgeni Kabanov Tartu,

Whereweare. CS-XXX: Graduate Programming Languages. Lecture 7 Lambda Calculus. Adding data structures. Data + Code. What about functions

One of a number of approaches to a mathematical challenge at the time (1930): Constructibility

The Untyped Lambda Calculus

Programming Language Features. CMSC 330: Organization of Programming Languages. Turing Completeness. Turing Machine.

CMSC 330: Organization of Programming Languages

COMP 1130 Lambda Calculus. based on slides by Jeff Foster, U Maryland

Harvard School of Engineering and Applied Sciences CS 152: Programming Languages. Lambda calculus

Constraint-based Analysis. Harry Xu CS 253/INF 212 Spring 2013

Lambda Calculus. Variables and Functions. cs3723 1

CMSC 336: Type Systems for Programming Languages Lecture 4: Programming in the Lambda Calculus Acar & Ahmed 22 January 2008.

Functional Languages and Higher-Order Functions

Lecture 5: The Untyped λ-calculus

Denotational Semantics; Lambda Calculus Basics Section and Practice Problems Week 4: Tue Feb 13 Fri Feb 16, 2018

1 Scope, Bound and Free Occurrences, Closed Terms

CMSC 330: Organization of Programming Languages. Lambda Calculus

Polymorphic lambda calculus Princ. of Progr. Languages (and Extended ) The University of Birmingham. c Uday Reddy

Advanced Topics in Programming Languages Lecture 3 - Models of Computation

More Lambda Calculus and Intro to Type Systems

Fundamentals and lambda calculus. Deian Stefan (adopted from my & Edward Yang s CSE242 slides)

Formal Semantics. Aspects to formalize. Lambda calculus. Approach

5. Introduction to the Lambda Calculus. Oscar Nierstrasz

Lambda Calculus. Concepts in Programming Languages Recitation 6:

Lecture #3: Lambda Calculus. Last modified: Sat Mar 25 04:05: CS198: Extra Lecture #3 1

CSE-321 Programming Languages 2010 Midterm

Introduction to the λ-calculus

More Lambda Calculus and Intro to Type Systems

Lecture 9: Typed Lambda Calculus

CMSC 330: Organization of Programming Languages

Computer Science 203 Programming Languages Fall Lecture 10. Bindings, Procedures, Functions, Functional Programming, and the Lambda Calculus

CMSC 330: Organization of Programming Languages. Lambda Calculus

The Untyped Lambda Calculus

Lambda Calculus.

CMPUT 325 : Lambda Calculus Basics. Lambda Calculus. Dr. B. Price and Dr. R. Greiner. 13th October 2004

Functional Programming and λ Calculus. Amey Karkare Dept of CSE, IIT Kanpur

Pure Lambda Calculus. Lecture 17

Lambda Calculus. Adrian Groza. Department of Computer Science Technical University of Cluj-Napoca

Graphical Untyped Lambda Calculus Interactive Interpreter

Lambda Calculus. Lambda Calculus

CMSC330. Objects, Functional Programming, and lambda calculus

The University of Nottingham SCHOOL OF COMPUTER SCIENCE A LEVEL 4 MODULE, SPRING SEMESTER MATHEMATICAL FOUNDATIONS OF PROGRAMMING ANSWERS

Pure (Untyped) λ-calculus. Andrey Kruglyak, 2010

Last class. CS Principles of Programming Languages. Introduction. Outline

If a program is well-typed, then a type can be inferred. For example, consider the program

CSC173 Lambda Calculus Lambda Calculus Evaluation (10 min) Evaluate this expression (β-reduce with normal-order evaluation):

Recursion. Lecture 6: More Lambda Calculus Programming. Fixed Points. Recursion

Programming Languages Fall 2014

Functions as data. Massimo Merro. 9 November Massimo Merro The Lambda language 1 / 21

dynamically typed dynamically scoped

Elixir, functional programming and the Lambda calculus.

CMSC 336: Type Systems for Programming Languages Lecture 5: Simply Typed Lambda Calculus Acar & Ahmed January 24, 2008

Lecture 9: More Lambda Calculus / Types

- M ::= v (M M) λv. M - Impure versions add constants, but not necessary! - Turing-complete. - true = λ u. λ v. u. - false = λ u. λ v.

Programming Languages

Programming Languages. Programming with λ-calculus. Lecture 11: Type Systems. Special Hour to discuss HW? if-then-else int

Lecture Notes on Data Representation

More Untyped Lambda Calculus & Simply Typed Lambda Calculus

COMP80 Lambda Calculus Programming Languages Slides Courtesy of Prof. Sam Guyer Tufts University Computer Science History Big ideas Examples:

Functional Programming

CIS 500 Software Foundations Fall October 2

Lambda Calculus. CS 550 Programming Languages Jeremy Johnson

An Introduction to the Lambda Calculus

CITS3211 FUNCTIONAL PROGRAMMING. 10. Programming in the pure λ calculus

Lambda Calculus alpha-renaming, beta reduction, applicative and normal evaluation orders, Church-Rosser theorem, combinators

CMSC 330: Organization of Programming Languages

The Untyped Lambda Calculus

Chapter 2 The Language PCF

lambda calculus History 11/28/13 Jianguo Lu A formal system designed to inves:gate func:on defini:on, func:on applica:on, and recursion.

Implementing functional languages with abstract machines

Recursive Definitions, Fixed Points and the Combinator

From the λ-calculus to Functional Programming Drew McDermott Posted

Lexicografie computationala Feb., 2012

CS 6110 S14 Lecture 1 Introduction 24 January 2014

A Quick Overview. CAS 701 Class Presentation 18 November Department of Computing & Software McMaster University. Church s Lambda Calculus

Transcription:

Type Systems Winter Semester 2006 Week 4 November 8 November 15, 2006 - version 1.1

The Lambda Calculus

The lambda-calculus If our previous language of arithmetic expressions was the simplest nontrivial programming language, then the lambda-calculus is the simplest interesting programming language... Turing complete higher order (functions as data) Indeed, in the lambda-calculus, all computation happens by means of function abstraction and application. The e. coli of programming language research The foundation of many real-world programming language designs (including ML, Haskell, Scheme, Lisp,...)

Intuitions Suppose we want to describe a function that adds three to any number we pass it. We might write plus3 x = succ (succ (succ x)) That is, plus3 x is succ (succ (succ x)).

Intuitions Suppose we want to describe a function that adds three to any number we pass it. We might write plus3 x = succ (succ (succ x)) That is, plus3 x is succ (succ (succ x)). Q: What is plus3 itself?

Intuitions Suppose we want to describe a function that adds three to any number we pass it. We might write plus3 x = succ (succ (succ x)) That is, plus3 x is succ (succ (succ x)). Q: What is plus3 itself? A: plus3 is the function that, given x, yields succ (succ (succ x)).

Intuitions Suppose we want to describe a function that adds three to any number we pass it. We might write plus3 x = succ (succ (succ x)) That is, plus3 x is succ (succ (succ x)). Q: What is plus3 itself? A: plus3 is the function that, given x, yields succ (succ (succ x)). plus3 = λx. succ (succ (succ x)) This function exists independent of the name plus3. λx. t is written fun x t in OCaml and x t in Scala.

So plus3 (succ 0) is just a convenient shorthand for the function that, given x, yields succ (succ (succ x)), applied to succ 0. plus3 (succ 0) = (λx. succ (succ (succ x))) (succ 0)

Abstractions over Functions Consider the λ-abstraction g = λf. f (f (succ 0)) Note that the parameter variable f is used in the function position in the body of g. Terms like g are called higher-order functions. If we apply g to an argument like plus3, the substitution rule yields a nontrivial computation: g plus3 = (λf. f (f (succ 0))) (λx. succ (succ (succ x))) i.e. (λx. succ (succ (succ x))) ((λx. succ (succ (succ x))) (succ 0)) i.e. (λx. succ (succ (succ x))) (succ (succ (succ (succ 0)))) i.e. succ (succ (succ (succ (succ (succ (succ 0))))))

Abstractions Returning Functions Consider the following variant of g: double = λf. λy. f (f y) I.e., double is the function that, when applied to a function f, yields a function that, when applied to an argument y, yields f (f y).

Example double plus3 0 = (λf. λy. f (f y)) (λx. succ (succ (succ x))) 0 i.e. (λy. (λx. succ (succ (succ x))) ((λx. succ (succ (succ x))) y)) 0 i.e. (λx. succ (succ (succ x))) ((λx. succ (succ (succ x))) 0) i.e. (λx. succ (succ (succ x))) (succ (succ (succ 0))) i.e. succ (succ (succ (succ (succ (succ 0)))))

The Pure Lambda-Calculus As the preceding examples suggest, once we have λ-abstraction and application, we can throw away all the other language primitives and still have left a rich and powerful programming language. In this language the pure lambda-calculus everything is a function. Variables always denote functions Functions always take other functions as parameters The result of a function is always a function

Formalities

Syntax t ::= terms x variable λx.t abstraction t t application Terminology: terms in the pure λ-calculus are often called λ-terms terms of the form λx. t are called λ-abstractions or just abstractions

Syntactic conventions Since λ-calculus provides only one-argument functions, all multi-argument functions must be written in curried style. The following conventions make the linear forms of terms easier to read and write: Application associates to the left E.g., t u v means (t u) v, not t (u v) Bodies of λ- abstractions extend as far to the right as possible E.g., λx. λy. x y means λx. (λy. x y), not λx. (λy. x) y

Scope The λ-abstraction term λx.t binds the variable x. The scope of this binding is the body t. Occurrences of x inside t are said to be bound by the abstraction. Occurrences of x that are not within the scope of an abstraction binding x are said to be free. Test: λx. λy. x y z

Scope The λ-abstraction term λx.t binds the variable x. The scope of this binding is the body t. Occurrences of x inside t are said to be bound by the abstraction. Occurrences of x that are not within the scope of an abstraction binding x are said to be free. Test: λx. λy. x y z λx. (λy. z y) y

Values v ::= values λx.t abstraction value

Operational Semantics Computation rule: (λx.t 12 ) v 2 [x v 2 ]t 12 (E-AppAbs) Notation: [x v 2 ]t 12 is the term that results from substituting free occurrences of x in t 12 with v 12.

Operational Semantics Computation rule: (λx.t 12 ) v 2 [x v 2 ]t 12 (E-AppAbs) Notation: [x v 2 ]t 12 is the term that results from substituting free occurrences of x in t 12 with v 12. Congruence rules: t 1 t 1 t 1 t 2 t 1 t 2 (E-App1) t 2 t 2 v 1 t 2 v 1 t 2 (E-App2)

Terminology A term of the form (λx.t) v that is, a λ-abstraction applied to a value is called a redex (short for reducible expression ).

Alternative evaluation strategies Strictly speaking, the language we have defined is called the pure, call-by-value lambda-calculus. The evaluation strategy we have chosen call by value reflects standard conventions found in most mainstream languages. Some other common ones: Call by name (cf. Haskell) Normal order (leftmost/outermost) Full (non-deterministic) beta-reduction

Classical Lambda Calculus

Full beta reduction The classical lambda calculus allows full beta reduction. The argument of a β-reduction to be an arbitrary term, not just a value. Reduction may appear anywhere in a term.

Full beta reduction The classical lambda calculus allows full beta reduction. The argument of a β-reduction to be an arbitrary term, not just a value. Reduction may appear anywhere in a term. Computation rule: (λx.t 12 ) t 2 [x t 2 ]t 12 (E-AppAbs)

Full beta reduction The classical lambda calculus allows full beta reduction. The argument of a β-reduction to be an arbitrary term, not just a value. Reduction may appear anywhere in a term. Computation rule: (λx.t 12 ) t 2 [x t 2 ]t 12 (E-AppAbs) Congruence rules: t 1 t 1 t 1 t 2 t 1 t 2 t 2 t 2 t 1 t 2 t 1 t 2 t t λx.t λx.t (E-App1) (E-App2) (E-Abs)

Substitution revisited Remember: [x v 2 ]t 12 is the term that results from substituting free occurrences of x in t 12 with v 12. This is trickier than it looks! For example: (λx. (λy. x)) y [x y]λy. x =???

Substitution revisited Remember: [x v 2 ]t 12 is the term that results from substituting free occurrences of x in t 12 with v 12. This is trickier than it looks! For example: (λx. (λy. x)) y [x y]λy. x =??? Solution: need to rename bound variables before performing the substitution. (λx. (λy. x)) y = (λx. (λz. x)) y [x y]λz. x = λz. y

Alpha conversion Renaming bound variables is formalized as α-conversion. Conversion rule: y fv(t) λx. t = α λy.[x y]t (α) Equivalence rules: t 1 = α t 2 t 2 = α t 1 (α-symm) t 1 = α t 2 t 2 = α t 3 t 1 = α t 3 (α-trans) Congruence rules: the usual ones.

Confluence Full β-reduction makes it possible to have different reduction paths. Q: Can a term evaluate to more than one normal form?

Confluence Full β-reduction makes it possible to have different reduction paths. Q: Can a term evaluate to more than one normal form? The answer is no; this is a consequence of the following Theorem [Church-Rosser] Let t, t 1, t 2 be terms such that t t 1 and t t 2. Then there exists a term t 3 such that t 1 t 3 and t 2 t 3.

Programming in the Lambda-Calculus

Multiple arguments Consider the function double, which returns a function as an argument. double = λf. λy. f (f y) This idiom a λ-abstraction that does nothing but immediately yield another abstraction is very common in the λ-calculus. In general, λx. λy. t is a function that, given a value v for x, yields a function that, given a value u for y, yields t with v in place of x and u in place of y. That is, λx. λy. t is a two-argument function. (Recall the discussion of currying in OCaml.)

The Church Booleans tru = λt. λf. t fls = λt. λf. f tru v w = (λt.λf.t) v w by definition (λf. v) w reducing the underlined redex v reducing the underlined redex fls v w = (λt.λf.f) v w by definition (λf. f) w reducing the underlined redex w reducing the underlined redex

Functions on Booleans not = λb. b fls tru That is, not is a function that, given a boolean value v, returns fls if v is tru and tru if v is fls.

Functions on Booleans and = λb. λc. b c fls That is, and is a function that, given two boolean values v and w, returns w if v is tru and fls if v is fls Thus and v w yields tru if both v and w are tru and fls if either v or w is fls.

Pairs pair = λf.λs.λb. b f s fst = λp. p tru snd = λp. p fls That is, pair v w is a function that, when applied to a boolean value b, applies b to v and w. By the definition of booleans, this application yields v if b is tru and w if b is fls, so the first and second projection functions fst and snd can be implemented simply by supplying the appropriate boolean.

Example fst (pair v w) = fst ((λf. λs. λb. b f s) v w) by definition fst ((λs. λb. b v s) w) reducing fst (λb. b v w) reducing = (λp. p tru) (λb. b v w) by definition (λb. b v w) tru reducing tru v w reducing v as before.

Church numerals Idea: represent the number n by a function that repeats some action n times. c 0 = λs. λz. z c 1 = λs. λz. s z c 2 = λs. λz. s (s z) c 3 = λs. λz. s (s (s z)) That is, each number n is represented by a term c n that takes two arguments, s and z (for successor and zero ), and applies s, n times, to z.

Functions on Church Numerals Successor:

Functions on Church Numerals Successor: scc = λn. λs. λz. s (n s z)

Functions on Church Numerals Successor: scc = λn. λs. λz. s (n s z) Addition:

Functions on Church Numerals Successor: scc = λn. λs. λz. s (n s z) Addition: plus = λm. λn. λs. λz. m s (n s z)

Functions on Church Numerals Successor: scc = λn. λs. λz. s (n s z) Addition: plus = λm. λn. λs. λz. m s (n s z) Multiplication:

Functions on Church Numerals Successor: scc = λn. λs. λz. s (n s z) Addition: plus = λm. λn. λs. λz. m s (n s z) Multiplication: times = λm. λn. m (plus n) c 0

Functions on Church Numerals Successor: scc = λn. λs. λz. s (n s z) Addition: plus = λm. λn. λs. λz. m s (n s z) Multiplication: times = λm. λn. m (plus n) c 0 Zero test:

Functions on Church Numerals Successor: scc = λn. λs. λz. s (n s z) Addition: plus = λm. λn. λs. λz. m s (n s z) Multiplication: times = λm. λn. m (plus n) c 0 Zero test: iszro = λm. m (λx. fls) tru

Functions on Church Numerals Successor: scc = λn. λs. λz. s (n s z) Addition: plus = λm. λn. λs. λz. m s (n s z) Multiplication: times = λm. λn. m (plus n) c 0 Zero test: iszro = λm. m (λx. fls) tru What about predecessor?

Predecessor zz = pair c 0 c 0 ss = λp. pair (snd p) (scc (snd p)) prd = λm. fst (m ss zz)

Normal forms Recall: A normal form is a term that cannot take an evaluation step. A stuck term is a normal form that is not a value. Are there any stuck terms in the pure λ-calculus?

Normal forms Recall: A normal form is a term that cannot take an evaluation step. A stuck term is a normal form that is not a value. Are there any stuck terms in the pure λ-calculus? Does every term evaluate to a normal form?

Divergence omega = (λx. x x) (λx. x x) Note that omega evaluates in one step to itself! So evaluation of omega never reaches a normal form: it diverges.

Divergence omega = (λx. x x) (λx. x x) Note that omega evaluates in one step to itself! So evaluation of omega never reaches a normal form: it diverges. Being able to write a divergent computation does not seem very useful in itself. However, there are variants of omega that are very useful...

Recursion in the Lambda-Calculus

Iterated Application Suppose f is some λ-abstraction, and consider the following term: Y f = (λx. f (x x)) (λx. f (x x))

Iterated Application Suppose f is some λ-abstraction, and consider the following term: Y f = (λx. f (x x)) (λx. f (x x)) Now the pattern of divergence becomes more interesting: Y f = (λx. f (x x)) (λx. f (x x)) f ((λx. f (x x)) (λx. f (x x))) f (f ((λx. f (x x)) (λx. f (x x)))) f (f (f ((λx. f (x x)) (λx. f (x x)))))

Y f is still not very useful, since (like omega), all it does is diverge. Is there any way we could slow it down?

Delaying divergence poisonpill = λy. omega Note that poisonpill is a value it it will only diverge when we actually apply it to an argument. This means that we can safely pass it as an argument to other functions, return it as a result from functions, etc. (λp. fst (pair p fls) tru) poisonpill fst (pair poisonpill fls) tru poisonpill tru omega

A delayed variant of omega Here is a variant of omega in which the delay and divergence are a bit more tightly intertwined: omegav = λy. (λx. (λy. x x y)) (λx. (λy. x x y)) y Note that omegav is a normal form. However, if we apply it to any argument v, it diverges: omegav v = (λy. (λx. (λy. x x y)) (λx. (λy. x x y)) y) v (λx. (λy. x x y)) (λx. (λy. x x y)) v (λy. (λx. (λy. x x y)) (λx. (λy. x x y)) y) v = omegav v

Another delayed variant Suppose f is a function. Define Z f = λy. (λx. f (λy. x x y)) (λx. f (λy. x x y)) y This term combines the added f from Y f with the delayed divergence of omegav.

If we now apply Z f to an argument v, something interesting happens: Z f v = (λy. (λx. f (λy. x x y)) (λx. f (λy. x x y)) y) v (λx. f (λy. x x y)) (λx. f (λy. x x y)) v f (λy. (λx. f (λy. x x y)) (λx. f (λy. x x y)) y) v = f Z f v Since Z f and v are both values, the next computation step will be the reduction of f Z f that is, before we diverge, f gets to do some computation. Now we are getting somewhere.

Recursion Let f = λfct. λn. if n=0 then 1 else n * (fct (pred n)) f looks just the ordinary factorial function, except that, in place of a recursive call in the last time, it calls the function fct, which is passed as a parameter. N.b.: for brevity, this example uses real numbers and booleans, infix syntax, etc. It can easily be translated into the pure lambda-calculus (using Church numerals, etc.).

We can use Z to tie the knot in the definition of f and obtain a real recursive factorial function: Z f 3 f Z f 3 = (λfct. λn....) Z f 3 if 3=0 then 1 else 3 * (Z f (pred 3)) 3 * (Z f (pred 3))) 3 * (Z f 2) 3 * (f Z f 2)

A Generic Z If we define Z = λf. Z f i.e., Z = λf. λy. (λx. f (λy. x x y)) (λx. f (λy. x x y)) y then we can obtain the behavior of Z f for any f we like, simply by applying Z to f. Z f Z f

For example: fact = Z ( λfct. λn. if n=0 then 1 else n * (fct (pred n)) )

Technical Note The term Z here is essentially the same as the fix discussed the book. Z = λf. λy. (λx. f (λy. x x y)) (λx. f (λy. x x y)) y fix = λf. (λx. f (λy. x x y)) (λx. f (λy. x x y)) Z is hopefully slightly easier to understand, since it has the property that Z f v f (Z f) v, which fix does not (quite) share.