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

Similar documents
CMSC 330: Organization of Programming Languages

CMSC 330: Organization of Programming Languages

CMSC 330: Organization of Programming Languages. Lambda Calculus

CMSC 330: Organization of Programming Languages

CMSC 330: Organization of Programming Languages. Lambda Calculus

CMSC 330: Organization of Programming Languages

CMSC 330: Organization of Programming Languages. Lambda Calculus Encodings

CMSC 330: Organization of Programming Languages

CMSC330. Objects, Functional Programming, and lambda calculus

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

Lecture 5: The Untyped λ-calculus

Introduction to the λ-calculus

Fundamentals and lambda calculus

Formal Semantics. Aspects to formalize. Lambda calculus. Approach

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

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

Lambda Calculus and Type Inference

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

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

Type Systems Winter Semester 2006

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

5. Introduction to the Lambda Calculus. Oscar Nierstrasz

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

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

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

Lambda Calculus. CS 550 Programming Languages Jeremy Johnson

dynamically typed dynamically scoped

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

CSE 505: Concepts of Programming Languages

λ-calculus Lecture 1 Venanzio Capretta MGS Nottingham

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

CIS 500 Software Foundations Fall September 25

Lambda Calculus and Extensions as Foundation of Functional Programming

Lambda Calculus. Lecture 4 CS /26/10

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

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

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

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

Introductory Example

The Untyped Lambda Calculus

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

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

CS152: Programming Languages. Lecture 11 STLC Extensions and Related Topics. Dan Grossman Spring 2011

Lambda Calculus. Lambda Calculus

Activity. CSCI 334: Principles of Programming Languages. Lecture 4: Fundamentals II. What is computable? What is computable?

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

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

Lecture 2: Big-Step Semantics

Introduction to the Lambda Calculus

Programming Languages

Lambda Calculus. Variables and Functions. cs3723 1

The Untyped Lambda Calculus

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

Review. CS152: Programming Languages. Lecture 11 STLC Extensions and Related Topics. Let bindings (CBV) Adding Stuff. Booleans and Conditionals

CIS 500 Software Foundations Fall October 2

Recursive Definitions, Fixed Points and the Combinator

Implementing functional languages with abstract machines

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

Untyped Lambda Calculus

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

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

Untyped Lambda Calculus

Formal Systems and their Applications

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

CMSC 330: Organization of Programming Languages. Operational Semantics

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

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

CS 6110 S14 Lecture 1 Introduction 24 January 2014

Introduction to the Lambda Calculus. Chris Lomont

CITS3211 FUNCTIONAL PROGRAMMING

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.

Chapter 5: The Untyped Lambda Calculus

Concepts of programming languages

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

More Lambda Calculus and Intro to Type Systems

CSE-321 Programming Languages 2010 Midterm

Functional Programming

Lambda calculus. Wouter Swierstra and Alejandro Serrano. Advanced functional programming - Lecture 6

CMSC 330: Organization of Programming Languages. Formal Semantics of a Prog. Lang. Specifying Syntax, Semantics

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

Elixir, functional programming and the Lambda calculus.

1.3. Conditional expressions To express case distinctions like

Denotational Semantics. Domain Theory

Pure Lambda Calculus. Lecture 17

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

Functional Programming Languages (FPL)

The Untyped Lambda Calculus

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.

Resources: The slides of this lecture were derived from [Järvi], with permission of the original author, by copy & x = 1 let x = 1 in...

VU Semantik von Programmiersprachen

Lambda Calculus as a Programming Language

CS-XXX: Graduate Programming Languages. Lecture 9 Simply Typed Lambda Calculus. Dan Grossman 2012

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

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

The Untyped Lambda Calculus

An Introduction to the Lambda Calculus

International School on Rewriting (ISR 2015) Rewriting Techniques for Correctness of Program Transformations

More Lambda Calculus and Intro to Type Systems

A Functional Evaluation Model

Lecture 13 CIS 341: COMPILERS

Transcription:

CMSC 330: Organization of Programming Languages Lambda Calculus Programming Language Features Many features exist simply for convenience Multi-argument functions foo ( a, b, c ) Ø Use currying or tuples Loops while (a < b) Ø Use recursion Side effects a := 1 Ø Use functional programming So what language features are really needed? CMSC 330 1 CMSC 330 2 Turing Completeness Turing Machine Computational system that can Simulate a Turing machine Compute every Turing-computable function A programming language is Turing complete if It can map every Turing machine to a program A program can be written to emulate a Turing machine It is a superset of a known Turing-complete language Most powerful programming language possible Since Turing machine is most powerful automaton CMSC 330 3 CMSC 330 4 1

Programming Language Theory Come up with a core language That s as small as possible But still Turing complete Helps illustrate important Language features Algorithms One solution Lambda calculus CMSC 330 5 Mini C You only have: If statement Plus 1 Minus 1 functions Sum n = 1+2+3+4+5 n in Mini C int add1(int n){return n+1;} int sub1(int n){return n-1;} int add(int a,int b){ if(b == 0) return a; else return add( add1(a),sub1(b)); } int sum(int n){ if(n == 1) return 1; else return add(n, sum(sub1(n))); } int main(){ printf("%d\n",sum(5)); } CMSC 330 6 Lambda Calculus (λ-calculus) Proposed in 1930s by Alonzo Church (born in Washingon DC!) Formal system Designed to investigate functions & recursion For exploration of foundations of mathematics Now used as Tool for investigating computability Basis of functional programming languages Ø Lisp, Scheme, ML, OCaml, Haskell CMSC 330 7 Lambda Expressions A lambda calculus expression is defined as e ::= x variable λx.e function e e function application Ø Note that this is CFG is ambiguous, but that s not a problem for defining the terms in the language we are not using it for parsing (i.e., different parse trees = different expressions) λx.e is like (fun x -> e) in OCaml That s it! Nothing but higher-order functions CMSC 330 8 2

Three Conveniences Syntactic sugar for local declarations let x = e1 in e2 is short for (λx.e2) e1 Scope of λ extends as far right as possible Subject to scope delimited by parentheses λx. λy.x y is same as λx.(λy.(x y)) Function application is left-associative x y z is (x y) z Same rule as OCaml CMSC 330 9 OCaml implementation y e ::= x λx.e e e λx.x λx.λy.x y (λx.λy.x y) λx.x x type id = string type exp = Var of id Lam of id * exp App of exp * exp Var y Lam ( x, Var x ) Lam ( x, (Lam ( y, App (Var x, Var y ) App (Lam ( x, Lam ( y, App (Var x, Var y ))), Lam ( x, App (Var x, Var x ))) CMSC 330 10 Lambda Calculus Semantics All we ve got are functions So all we can do is call them To evaluate (λx.e1) e2 Evaluate e1 with x replaced by e2 This application is called beta-reduction (λx.e1) e2 e1[x:=e2] Ø e1[x:=e2] is e1 with occurrences of x replaced by e2 Ø This operation is called substitution Replace formals with actuals Instead of using environment to map formals to actuals We allow reductions to occur anywhere in a term Ø Order reductions are applied does not affect final value! Beta Reduction Example (λx.λz.x z) y (λx.(λz.(x z))) y (λx.(λz.(x z))) y // since λ extends to right // apply (λx.e1) e2 e1[x:=e2] // where e1 = λz.(x z), e2 = y λz.(y z) // final result Parameters Formal Actual Equivalent OCaml code (fun x -> (fun z -> (x z))) y fun z -> (y z) CMSC 330 11 CMSC 330 12 3

Lambda Calculus Examples Lambda Calculus Examples (cont.) (λx.x) z z (λx.x y) (λz.z) (λz.z) y y (λx.y) z y (λx.x y) z z y A function that applies its argument to y (λx.λy.x y) z λy.z y A curried function of two arguments Applies its first argument to its second (λx.λy.x y) (λz.zz) x (λy.(λz.zz)y)x (λz.zz)x xx CMSC 330 13 CMSC 330 14 Static Scoping & Alpha Conversion Lambda calculus uses static scoping Consider the following (λx.x (λx.x)) z? Ø The rightmost x refers to the second binding This is a function that Ø Takes its argument and applies it to the identity function This function is the same as (λx.x (λy.y)) Renaming bound variables consistently is allowed Ø This is called alpha-renaming or alpha conversion Ex. λx.x = λy.y = λz.z λy.λx.y = λz.λx.z CMSC 330 15 Defining Substitution Use recursion on structure of terms x[x:=e] = e // Replace x by e y[x:=e] = y // y is different than x, so no effect (e1 e2)[x:=e] = (e1[x:=e]) (e2[x:=e]) // Substitute both parts of application (λx.e )[x:=e] = λx.e Ø In λx.e, the x is a parameter, and thus a local variable that is different from other x s. Implements static scoping. Ø So the substitution has no effect in this case, since the x being substituted for is different from the parameter x that is in e (λy.e )[x:=e] =? Ø The parameter y does not share the same name as x, the variable being substituted for Ø Is λy.(e [x:=e]) correct? No CMSC 330 16 4

Variable capture How about the following? (λx.λy.x y) y? When we replace y inside, we don t want it to be captured by the inner binding of y, as this violates static scoping I.e., (λx.λy.x y) y λy.y y Solution (λx.λy.x y) is the same as (λx.λz.x z) Ø Due to alpha conversion So alpha-convert (λx.λy.x y) y to (λx.λz.x z) y first Ø Now (λx.λz.x z) y λz.y z Completing the Definition of Substitution Recall: we need to define (λy.e )[x:=e] We want to avoid capturing (free) occurrences of y in e Solution: alpha-conversion! Ø Change y to a variable w that does not appear in e or e (Such a w is called fresh) Ø Replace all occurrences of y in e by w. Ø Then replace all occurrences of x in e by e! Formally: (λy.e )[x:=e] = λw.((e [y:=w]) [x:=e]) (w is fresh) CMSC 330 17 CMSC 330 18 Beta-Reduction, Again Whenever we do a step of beta reduction (λx.e1) e2 e1[x:=e2] We must alpha-convert variables as necessary Usually performed implicitly (w/o showing conversion) Examples (λx.λy.x y) y = (λx.λz.x z) y λz.y z // y z (λx.x (λx.x)) z = (λy.y (λx.x)) z z (λx.x) // x y OCaml Implementation: Substitution (* substitute e for y in m *) let rec subst m y e = match m with Var x -> if y = x then e (* substitute *) else m (* don t subst *) App (e1,e2) -> App (subst e1 y e, subst e2 y e) Lam (x,e0) -> CMSC 330 19 CMSC 330 20 5

OCaml Impl: Substitution (cont d) (* substitute e for y in m *) let rec subst m y e = match m with Lam (x,e0) -> Shadowing blocks if y = x then m substitution else if not (List.mem x (fvs e)) then Lam (x, subst e0 y e) Safe: no capture possible else Might capture; need to α-convert let z = newvar() in (* fresh *) let e0' = subst e0 x (Var z) in Lam (z,subst e0' y e) OCaml Impl: Reduction let rec reduce e = match e with Straight β rule App (Lam (x,e), e2) -> subst e x e2 App (e1,e2) -> let e1' = reduce e1 in Reduce lhs of app if e1'!= e1 then App(e1',e2) else App (e1,reduce e2) Reduce rhs of app Lam (x,e) -> Lam (x, reduce e) _ -> e nothing to do Reduce function body CMSC 330 21 CMSC 330 22 Encodings The lambda calculus is Turing complete Means we can encode any computation we want If we re sufficiently clever... Examples Booleans Pairs Natural numbers & arithmetic Looping Booleans Church s encoding of mathematical logic true = λx.λy.x false = λx.λy.y if a then b else c Ø Defined to be the λ expression: a b c Examples if true then b else c = (λx.λy.x) b c (λy.b) c b if false then b else c = (λx.λy.y) b c (λy.y) c c CMSC 330 23 CMSC 330 24 6

Booleans (cont.) Other Boolean operations not = λx.((x false) true) Ø not x = if x then false else true Ø not true (λx.(x false) true) true ((true false) true) false and = λx.λy.((x y) false) Ø and x y = if x then y else false or = λx.λy.((x true) y) Ø or x y = if x then true else y Given these operations Can build up a logical inference system Pairs Encoding of a pair a, b (a,b) = λx.if x then a else b fst = λf.f true snd = λf.f false Examples fst (a,b) = (λf.f true) (λx.if x then a else b) (λx.if x then a else b) true if true then a else b a snd (a,b) = (λf.f false) (λx.if x then a else b) (λx.if x then a else b) false if false then a else b b CMSC 330 25 CMSC 330 26 Natural Numbers (Church* Numerals) Operations On Church Numerals Encoding of non-negative integers 0 = λf.λy.y 1 = λf.λy.f y 2 = λf.λy.f (f y) 3 = λf.λy.f (f (f y)) i.e., n = λf.λy.<apply f n times to y> Formally: n+1 = λf.λy.f (n f y) *(Alonzo Church, of course) Successor succ = λz.λf.λy.f (z f y) Example succ 0 = (λz.λf.λy.f (z f y)) (λf.λy.y) λf.λy.f ((λf.λy.y) f y) λf.λy.f ((λy.y) y) λf.λy.f y = 1 0 = λf.λy.y 1 = λf.λy.f y Since (λx.y) z y CMSC 330 27 CMSC 330 28 7

Operations On Church Numerals (cont.) IsZero? iszero = λz.z (λy.false) true This is equivalent to λz.((z (λy.false)) true) Example iszero 0 = (λz.z (λy.false) true) (λf.λy.y) (λf.λy.y) (λy.false) true (λy.y) true Since (λx.y) z y true 0 = λf.λy.y Arithmetic Using Church Numerals If M and N are numbers (as λ expressions) Can also encode various arithmetic operations Addition M + N = λf.λy.(m f)((n f) y) Equivalently: + = λm.λn.λf.λy.(m f)((n f) y) Ø In prefix notation (+ M N) Multiplication M * N = λf.(m (N f)) Equivalently: * = λm.λn.λf.λy.(m (N f)) y Ø In prefix notation (* M N) CMSC 330 29 CMSC 330 30 Arithmetic (cont.) Looping & Recursion Prove 1+1 = 2 1+1 = λx.λy.(1 x)((1 x) y) = λx.λy.((λf.λy.f y) x)((1 x) y) λx.λy.(λy.x y)((1 x) y) λx.λy.x ((1 x) y) λx.λy.x (((λf.λy.f y) x) y) λx.λy.x ((λy.x y) y) λx.λy.x (x y) = 2 1 = λf.λy.f y 2 = λf.λy.f (f y) Define D = λx.x x, then D D = (λx.x x) (λx.x x) (λx.x x) (λx.x x) = D D So D D is an infinite loop In general, self application is how we get looping With these definitions Can build a theory of arithmetic CMSC 330 31 CMSC 330 32 8

The Fixpoint Combinator Y = λf.(λx.f (x x)) (λx.f (x x)) Then Y F = (λf.(λx.f (x x)) (λx.f (x x))) F (λx.f (x x)) (λx.f (x x)) F ((λx.f (x x)) (λx.f (x x))) = F (Y F) Y F is a fixed point (aka fixpoint ) of F Thus Y F = F (Y F) = F (F (Y F)) =... We can use Y to achieve recursion for F CMSC 330 33 Example fact = λf. λn.if n = 0 then 1 else n * (f (n-1)) The second argument to fact is the integer The first argument is the function to call in the body Ø We ll use Y to make this recursively call fact (Y fact) 1 = (fact (Y fact)) 1 if 1 = 0 then 1 else 1 * ((Y fact) 0) 1 * ((Y fact) 0) 1 * (fact (Y fact) 0) 1 * (if 0 = 0 then 1 else 0 * ((Y fact) (-1)) 1 * 1 1 CMSC 330 34 Discussion Lambda calculus is Turing-complete Most powerful language possible Can represent pretty much anything in real language Ø Using clever encodings But programs would be Pretty slow (10000 + 1 thousands of function calls) Pretty large (10000 + 1 hundreds of lines of code) Pretty hard to understand (recognize 10000 vs. 9999) In practice We use richer, more expressive languages That include built-in primitives CMSC 330 35 The Need For Types Consider the untyped lambda calculus false = λx.λy.y 0 = λx.λy.y Since everything is encoded as a function... We can easily misuse terms Ø false 0 λy.y Ø if 0 then... because everything evaluates to some function The same thing happens in assembly language Everything is a machine word (a bunch of bits) All operations take machine words to machine words CMSC 330 36 9

Simply-Typed Lambda Calculus (STLC) e ::= n x λx:t.e e e Added integers n as primitives Ø Need at least two distinct types (integer & function) Ø to have type errors Functions now include the type of their argument Simply-Typed Lambda Calculus (cont.) t ::= int t t int is the type of integers t1 t2 is the type of a function Ø That takes arguments of type t1 and returns result of type t2 t1 is the domain and t2 is the range Notice this is a recursive definition Ø So we can give types to higher-order functions CMSC 330 37 CMSC 330 38 Types are limiting STLC will reject some terms as ill-typed, even if they will not produce a run-time error Cannot type check Y in STLC Ø Or in Ocaml, for that matter! Surprising theorem: All (well typed) simply-typed lambda calculus terms are strongly normalizing They will terminate Proof is not by straightforward induction Ø Applications increase term size Summary Lambda calculus shows issues with Scoping Higher-order functions Types Useful for understanding how languages work CMSC 330 39 CMSC 330 40 10