CS5205: Foundations in Programming Languages

Slides:



Advertisements
Similar presentations
Types and Programming Languages Lecture 4 Simon Gay Department of Computing Science University of Glasgow 2006/07.
Advertisements

Types and Programming Languages Lecture 13 Simon Gay Department of Computing Science University of Glasgow 2006/07.
Types and Programming Languages Lecture 7 Simon Gay Department of Computing Science University of Glasgow 2006/07.
Substitution & Evaluation Order cos 441 David Walker.
- Vasvi Kakkad.  Formal -  Tool for mathematical analysis of language  Method for precisely designing language  Well formed model for describing and.
The lambda calculus David Walker CS 441. the lambda calculus Originally, the lambda calculus was developed as a logic by Alonzo Church in 1932 –Church.
Elements of Lambda Calculus Functional Programming Academic Year Alessandro Cimatti
Type checking © Marcelo d’Amorim 2010.
Advanced Formal Methods Lecture 2: Lambda calculus Mads Dam KTH/CSC Course 2D1453, Some material from B. Pierce: TAPL + some from G. Klein, NICTA.
Foundations of Programming Languages: Introduction to Lambda Calculus
The lambda calculus David Walker CS 441. the lambda calculus Originally, the lambda calculus was developed as a logic by Alonzo Church in 1932 –Church.
Chair of Software Engineering 1 Concurrent Object-Oriented Programming Arnaud Bailly, Bertrand Meyer and Volkan Arslan.
Doaitse Swierstra Atze Dijkstra Doaitse Swierstra Atze Dijkstra Type Systems.
CS5205: Foundation in Programming Languages Lecture 1 : Overview
CMSC 330: Organization of Programming Languages Lambda Calculus Introduction λ.
CSE S. Tanimoto Lambda Calculus 1 Lambda Calculus What is the simplest functional language that is still Turing complete? Where do functional languages.
Lambda Calculus History and Syntax. History The lambda calculus is a formal system designed to investigate function definition, function application and.
Typed Lambda Calculus Chapter 9 Benjamin Pierce Types and Programming Languages.
Lesson 4 Typed Arithmetic Typed Lambda Calculus 1/21/02 Chapters 8, 9, 10.
© Kenneth C. Louden, Chapter 11 - Functional Programming, Part III: Theory Programming Languages: Principles and Practice, 2nd Ed. Kenneth C. Louden.
Arvind Computer Science and Artificial Intelligence Laboratory M.I.T. L06-1 September 26, 2006http:// Type Inference September.
CSE 230 The -Calculus. Background Developed in 1930’s by Alonzo Church Studied in logic and computer science Test bed for procedural and functional PLs.
Types and Programming Languages Lecture 6 Simon Gay Department of Computing Science University of Glasgow 2006/07.
1 Formal Semantics. 2 Why formalize? ML is tricky, particularly in corner cases generalizable type variables? polymorphic references? exceptions? Some.
Type Checking Textbook: Types and Programming Languages Benjamin Pierce.
Lambda Calculus CSE 340 – Principles of Programming Languages Fall 2015 Adam Doupé Arizona State University
Advanced Formal Methods Lecture 3: Simply Typed Lambda calculus Mads Dam KTH/CSC Course 2D1453, Some material from B. Pierce: TAPL + some from.
CMSC 330: Organization of Programming Languages Lambda Calculus and Types.
Advanced Functional Programming Tim Sheard 1 Lecture 17 Advanced Functional Programming Tim Sheard Oregon Graduate Institute of Science & Technology Lecture:
6/21/20161 Programming Languages and Compilers (CS 421) Reza Zamani Based in part on slides by Mattox Beckman,
Arvind Computer Science and Artificial Intelligence Laboratory M.I.T. L03-1 September 14, 2006http:// -calculus: A Basis for.
COMP 412, FALL Type Systems C OMP 412 Rice University Houston, Texas Fall 2000 Copyright 2000, Robert Cartwright, all rights reserved. Students.
Arvind Computer Science and Artificial Intelligence Laboratory M.I.T. L05-1 September 21, 2006http:// Types and Simple Type.
A LISP interepreter for the Lambda Calculus Functional Programming
Lecture 9 : Universal Types
Lesson 10 Type Reconstruction
CS5205: Foundation in Programming Languages Type Reconstruction
Chapter 2: Lambda Calculus
Conditional Expressions
CS 550 Programming Languages Jeremy Johnson
Unit – 3 :LAMBDA CALCULUS AND FUNCTIONAL PROGRAMMING
Lambda Calculus CSE 340 – Principles of Programming Languages
CSE-321 Programming Languages Simply Typed -Calculus
Carlos Varela Rennselaer Polytechnic Institute September 5, 2017
A lightening tour in 45 minutes
More on Lambda Calculus
CS 611: Lecture 9 More Lambda Calculus: Recursion, Scope, and Substitution September 17, 1999 Cornell University Computer Science Department Andrew Myers.
September 4, 1997 Programming Languages (CS 550) Lecture 6 Summary Operational Semantics of Scheme using Substitution Jeremy R. Johnson TexPoint fonts.
Corky Cartwright January 18, 2017
Lesson 4 Typed Arithmetic Typed Lambda Calculus
Typed Arithmetic Expressions
Carlos Varela Rennselaer Polytechnic Institute September 6, 2016
Lesson2 Lambda Calculus Basics
Lecture 15 (Notes by P. N. Hilfinger and R. Bodik)
Carlos Varela Rennselaer Polytechnic Institute September 4, 2015
Programming Languages and Compilers (CS 421)
Announcements Quiz 6 HW7 due Tuesday, October 30
Carlos Varela Rennselaer Polytechnic Institute September 8, 2017
PROGRAMMING IN HASKELL
CSCE 314: Programming Languages Dr. Dylan Shell
CS 611: Lecture 10 More Lambda Calculus September 20, 1999
Announcements Exam 2 on Friday, November 2nd Topics
L Calculus.
Programming Languages and Compilers (CS 421)
Programming Languages and Compilers (CS 421)
CSE S. Tanimoto Lambda Calculus
CS 611: Lecture 10 More Lambda Calculus September 20, 1999
Carlos Varela Rennselaer Polytechnic Institute September 8, 2015
Carlos Varela Rennselaer Polytechnic Institute September 6, 2019
Carlos Varela Rennselaer Polytechnic Institute September 10, 2019
Presentation transcript:

CS5205: Foundations in Programming Languages Lambda Calculus CS5205 Lambda Calculus

Lambda Calculus Untyped Lambda Calculus Evaluation Strategy Techniques - encoding, extensions, recursion Operational Semantics Explicit Typing Type Rules and Type Assumption Progress, Preservation, Erasure Introduction to Lambda Calculus: http://www.inf.fu-berlin.de/lehre/WS03/alpi/lambda.pdf http://www.cs.chalmers.se/Cs/Research/Logic/TypesSS05/Extra/geuvers.pdf CS5205 Lambda Calculus

Untyped Lambda Calculus Extremely simple programming language which captures core aspects of computation and yet allows programs to be treated as mathematical objects. Focused on functions and applications. Invented by Alonzo (1936,1941), first used in a programming language (Lisp) by John McCarthy (1959). CS5205 Lambda Calculus

Functions without Names Usually functions are given a name (e.g. in language C): int plusone(int x) { return x+1; } …plusone(5)… However, function names can also be dropped: (int (int x) { return x+1;} ) (5) Notation used in untyped lambda calculus: (l x. x+1) (5) CS5205 Lambda Calculus

Syntax x variable l x . t abstraction t t application In purest form (no constraints, no built-in operations), the lambda calculus has the following syntax. t ::= terms x variable l x . t abstraction t t application This is simplest universal programming language! CS5205 Lambda Calculus

Conventions Parentheses are used to avoid ambiguities. e.g. x y z can be either (x y) z or x (y z) Two conventions for avoiding too many parentheses: Applications associates to the left e.g. x y z stands for (x y) z Bodies of lambdas extend as far as possible. e.g. l x. l y. x y x stands for l x. (l y. ((x y) x)). Nested lambdas may be collapsed together. e.g. l x. l y. x y x can be written as l x y. x y x CS5205 Lambda Calculus

Scope An occurrence of variable x is said to be bound when it occurs in the body t of an abstraction l x . t An occurrence of x is free if it appears in a position where it is not bound by an enclosing abstraction of x. Examples: x y y. x y l x. x (identity function) (l x. x x) (l x. x x) (non-stop loop) (l x. x) y (l x. x) x CS5205 Lambda Calculus

Alpha Renaming Lambda expressions are equivalent up to bound variable renaming. e.g. l x. x =a l y. y l y. x y =a l z. x z But NOT: l y. x y =a l y. z y Alpha renaming rule: l x . E =a l z . [x a z] E (z is not free in E) CS5205 Lambda Calculus

Beta Reduction An application whose LHS is an abstraction, evaluates to the body of the abstraction with parameter substitution. e.g. (l x. x y) z !b z y (l x. y) z !b y (l x. x x) (l x. x x) !b (l x. x x) (l x. x x) Beta reduction rule (operational semantics): ( l x . t1 ) t2 !b [x a t2] t1 Expression of form ( l x . t1 ) t2 is called a redex (reducible expression). CS5205 Lambda Calculus

Evaluation Strategies A term may have many redexes. Evaluation strategies can be used to limit the number of ways in which a term can be reduced. Examples: - full beta reduction - normal order - call by name - call by value, etc An evaluation strategy is deterministic, if it allows reduction with at most one redex, for any term. CS5205 Lambda Calculus

Full Beta Reduction Any redex can be chosen, and evaluation proceeds until no more redexes found. Example: (lx.x) ((lx.x) (lz. (lx.x) z)) denoted by id (id (lz. id z)) Three possible redexes to choose: id (id (lz. id z)) Reduction: ! id (id (lz.z)) ! id (lz.z) ! lz.z ! CS5205 Lambda Calculus

Normal Order Reduction Deterministic strategy which chooses the leftmost, outermost redex, until no more redexes. Example Reduction: id (id (lz. id z)) ! id (lz. id z)) ! lz.id z ! lz.z ! CS5205 Lambda Calculus

Call by Name Reduction Chooses the leftmost, outermost redex, but never reduces inside abstractions. Example: id (id (lz. id z)) ! id (lz. id z)) ! lz.id z ! CS5205 Lambda Calculus

Call by Value Reduction Chooses the leftmost, innermost redex whose RHS is a value; and never reduces inside abstractions. Example: id (id (lz. id z)) ! id (lz. id z) ! lz.id z ! CS5205 Lambda Calculus

Strict vs Non-Strict Languages Strict languages always evaluate all arguments to function before entering call. They employ call-by-value evaluation (e.g. C, Java, ML). Non-strict languages will enter function call and only evaluate the arguments as they are required. Call-by-name (e.g. Algol-60) and call-by-need (e.g. Haskell) are possible evaluation strategies, with the latter avoiding the re-evaluation of arguments. In the case of call-by-name, the evaluation of argument occurs with each parameter access. CS5205 Lambda Calculus

Programming Techniques in l-Calculus Multiple arguments. Church Booleans. Pairs. Church Numerals. Enrich Calculus. Recursion. CS5205 Lambda Calculus

Multiple Arguments Pass multiple arguments one by one using lambda abstraction as intermediate results. The process is also known as currying. Example: f = l(x,y).s f = l x. (l y. s) Application: f(v,w) (f v) w requires pairs as primitve types requires higher order feature CS5205 Lambda Calculus

Church Booleans Church’s encodings for true/false type with a conditional: true = l t. l f. t false = l t. l f. f if = l l. l m. l n. l m n Example: if true v w = (l l. l m. l n. l m n) true v w ! true v w = (l t. l f. t) v w ! v Boolean and operation can be defined as: and = l a. l b. if a b false = l a. l b. (l l. l m. l n. l m n) a b false = l a. l b. a b false CS5205 Lambda Calculus

Pairs Define the functions pair to construct a pair of values, fst to get the first component and snd to get the second component of a given pair as follows: pair = l f. l s. l b. b f s fst = l p. p true snd = l p. p false Example: snd (pair c d) = (l p. p false) ((l f. l s. l b. b f s) c d) ! (l p. p false) (l b. b c d) ! (l b. b c d) false ! false c d ! d CS5205 Lambda Calculus

Church Numerals Numbers can be encoded by: c0 = l s. l z. z c1 = l s. l z. s z c2 = l s. l z. s (s z) c3 = l s. l z. s (s (s z)) : CS5205 Lambda Calculus

Church Numerals Successor function can be defined as: Example: succ = l n. l s. l z. s (n s z) Example: succ c1 = ( n.  s.  z. s (n s z)) ( s.  z. s z)  l s. l z. s ((l s. l z. s z) s z) ! l s. l z. s (s z) succ c2 = l n. l s. l z. s (n s z) (l s. l z. s (s z)) ! l s. l z. s ((l s. l z. s (s z)) s z) ! l s. l z. s (s (s z)) CS5205 Lambda Calculus

Church Numerals Other Arithmetic Operations: plus = l m. l n. l s. l z. m s (n s z) times = l m. l n. m (plus n) c0 iszero = l m. m (l x. false) true Exercise : Try out the following. plus c1 x times c0 x times x c1 iszero c0 iszero c2 CS5205 Lambda Calculus

Enriching the Calculus We can add constants and built-in primitives to enrich l-calculus. For example, we can add boolean and arithmetic constants and primitives (e.g. true, false, if, zero, succ, iszero, pred) into an enriched language we call lNB: Example: l x. succ (succ x) 2 lNB l x. true 2 lNB CS5205 Lambda Calculus

Recursion Some terms go into a loop and do not have normal form. Example: (l x. x x) (l x. x x) ! (l x. x x) (l x. x x) ! … However, others have an interesting property fix = l f. (l x. f (l y. x x y)) (l x. f (l y. x x y)) which returns a fix-point for a given functional. Given x = h x = fix h That is: fix h ! h (fix h) ! h (h (fix h)) ! … x is fix-point of h CS5205 Lambda Calculus

Example - Factorial We can define factorial as: fact = l n. if (n<=1) then 1 else times n (fact (pred n)) = (l h. l n. if (n<=1) then 1 else times n (h (pred n))) fact = fix (l h. l n. if (n<=1) then 1 else times n (h (pred n))) CS5205 Lambda Calculus

Example - Factorial Recall: fact = fix (l h. l n. if (n<=1) then 1 else times n (h (pred n))) Let g = (l h. l n. if (n<=1) then 1 else times n (h (pred n))) Example reduction: fact 3 = fix g 3 = g (fix g) 3 = times 3 ((fix g) (pred 3)) = times 3 (g (fix g) 2) = times 3 (times 2 ((fix g) (pred 2))) = times 3 (times 2 (g (fix g) 1)) = times 3 (times 2 1) = 6 CS5205 Lambda Calculus

Formal Treatment of Lambda Calculus Let V be a countable set of variable names. The set of terms is the smallest set T such that: x 2 T for every x 2 V if t1 2 T and x 2 V, then l x. t1 2 T if t1 2 T and t2 2 T, then t1 t2 2 T Recall syntax of lambda calculus: t ::= terms x variable l x.t abstraction t t application CS5205 Lambda Calculus

Free Variables The set of free variables of a term t is defined as: FV(x) = {x} FV(l x.t) = FV(t) \ {x} FV(t1 t2) = FV(t1) [ FV(t2) CS5205 Lambda Calculus

Substitution Works when free variables are replaced by term that does not clash: [x a l z. z w] (l y.x) = (l y. l x. z w) However, problem if there is name capture/clash: [x a l z. z w] (l x.x) ¹ (l x. l z. z w) [x a l z. z w] (l w.x) ¹ (l w. l z. z w) CS5205 Lambda Calculus

Formal Defn of Substitution [x a s] x = s if y=x [x a s] y = y if y¹x [x a s] (t1 t2) = ([x a s] t1) ([x a s] t2) [x a s] (l y.t) = l y.t if y=x [x a s] (l y.t) = l y. [x a s] t if y¹ x Æ y FV(s) [x a s] (l y.t) = [x a s] (l z. [y a z] t) if y¹ x Æ y 2 FV(s) Æ fresh z CS5205 Lambda Calculus

Syntax of Lambda Calculus Term: t ::= terms x variable l x.t abstraction t t application Value: l x.t abstraction value CS5205 Lambda Calculus

Call-by-Value Semantics premise t1 ! t’1 t1 t2 ! t’1 t2 (E-App1) conclusion t2 ! t’2 v1 t2 ! v1 t’2 (E-App2) (l x.t) v ! [x a v] t (E-AppAbs) CS5205 Lambda Calculus

Call-by-Name Semantics t1 ! t’1 t1 t2 ! t’1 t2 (E-App1) (l x.t1) t2 ! [x a t2] t (E-AppAbs) CS5205 Lambda Calculus

Getting Stuck Evaluation can get stuck. (Note that only values are l-abstraction) e.g. (x y) In extended lambda calculus, evaluation can also get stuck due to the absence of certain primitive rules. (l x. succ x) true ! succ true ! CS5205 Lambda Calculus

Boolean-Enriched Lambda Calculus Term: t ::= terms x variable l x.t abstraction t t application true constant true false constant false if t then t else t conditional Value: v ::= value l x.t abstraction value true true value false false value CS5205 Lambda Calculus

Key Ideas Exact typing impossible. if <long and tricky expr> then true else (l x.x) Need to introduce function type, but need argument and result types. if true then (l x.true) else (l x.x) CS5205 Lambda Calculus

Simple Types The set of simple types over the type Bool is generated by the following grammar: T ::= types Bool type of booleans T ! T type of functions ! is right-associative: T1 ! T2 ! T3 denotes T1 ! (T2 ! T3) CS5205 Lambda Calculus

Implicit or Explicit Typing Languages in which the programmer declares all types are called explicitly typed. Languages where a typechecker infers (almost) all types is called implicitly typed. Explicitly-typed languages places onus on programmer but are usually better documented. Also, compile-time analysis is simplified. CS5205 Lambda Calculus

Steps for a Type System Decide the static property to track. Design the type annotation. Design the type rules. Prove soundness with respect to semantics Design type inference algorithm, where possible CS5205 Lambda Calculus

Explicitly Typed Lambda Calculus t ::= terms … l x : T.t abstraction v ::= value l x : T.t abstraction value T ::= types Bool type of booleans T ! T type of functions CS5205 Lambda Calculus

Examples l x:Bool . x (l x:Bool . x) true true if false then (l x:Bool . True) else (l x:Bool . x) CS5205 Lambda Calculus

Erasure The erasure of a simply typed term t is defined as: erase(x) = x erase(lx :T.t) = l x. erase(t) erase(t1 t2) = erase(t1) erase(t2) A term m in the untyped lambda calculus is said to be typable in l! (simply typed l-calculus) if there are some simply typed term t, type T and context  such that: erase(t)=m Æ  ` t : T CS5205 Lambda Calculus

Typing Rule for Functions First attempt: But t2:T2 can assume that x has type T1 t2 : T2 l x:T1 . t2 : T1 ! T2 CS5205 Lambda Calculus

Need for Type Assumptions Typing relation becomes ternary x:T1 ` t2 : T2 l x:T1.t2 : T1 ! T2 For nested functions, we may need several assumptions. CS5205 Lambda Calculus

Typing Context A typing context is a finite map from variables to their types. Examples: x : Bool x : Bool, y : Bool ! Bool, z : (Bool ! Bool) ! Bool CS5205 Lambda Calculus

Type Rule for Abstraction Shall use  to denote typing context. , x:T1 ` t2 : T2  ` l x:T1.t2 : T1 ! T2 (T-Abs) CS5205 Lambda Calculus

Other Type Rules Variable Application Boolean Terms. x:T 2   ` x : T (T-Var)  ` t1 : T1 ! T2  ` t2 : T1  ` t1 t2 : T2 (T-App) CS5205 Lambda Calculus

Typing Rules True : Bool (T-true) False : Bool (T-false) 0 : Nat (T-Zero) if t1 then t2 else t3 : T t1:Bool t2:T t3:T (T-If) succ t : Nat t : Nat (T-Succ) pred t : Nat (T-Pred) iszero t : Bool (T-Iszero) CS5205 Lambda Calculus

` (l x : Bool. x) true : Bool Example of Typing Derivation x : Bool 2 x : Bool x : Bool ` x : Bool (T-Var) (T-Abs) ` true : Bool (T-True) ` (l x : Bool. x) : Bool ! Bool ` (l x : Bool. x) true : Bool (T-App) CS5205 Lambda Calculus

Canonical Forms If v is a value of type Bool, then v is either true or false. If v is a value of type T1 ! T2, then v=l x:T1. t2 where t:T2 CS5205 Lambda Calculus

Progress Suppose t is a closed well-typed term (that is {} ` t : T for some T). Then either t is a value or else there is some t’ such that t ! t’. CS5205 Lambda Calculus

Preservation of Types (under Susbtitution) If ,x:S ` t : T and  ` s : S then  ` [x a s]t : T CS5205 Lambda Calculus

Preservation of Types (under reduction) If  ` t : T and t ! t’ then  ` t’ : T CS5205 Lambda Calculus

Motivation for Typing Evaluation of a term either results in a value or gets stuck! Typing can prove that an expression cannot get stuck. Typing is static and can be checked at compile-time. CS5205 Lambda Calculus

Normal Form A term t is a normal form if there is no t’ such that t ! t’. The multi-step evaluation relation !* is the reflexive, transitive closure of one-step relation. pred (succ(pred 0)) ! pred (succ 0) pred (succ(pred 0)) !* CS5205 Lambda Calculus

Stuckness A term is stuck if it is a normal form but not a value. Evaluation may fail to reach a value: succ (if true then false else true) ! succ (false) A term is stuck if it is a normal form but not a value. Stuckness is a way to characterize runtime errors. CS5205 Lambda Calculus

Safety = Progress + Preservation Progress : A well-typed term is not stuck. Either it is a value, or it can take a step according to the evaluation rules. Suppose t is a well-typed term (that is t:T for some T). Then either t is a value or else there is some t‘ with t ! t‘ CS5205 Lambda Calculus

Safety = Progress + Preservation Preservation : If a well-typed term takes a step of evaluation, then the resulting term is also well-typed. If t:T Æ t ! t‘ then t’:T . CS5205 Lambda Calculus