Prof. Fateman CS 164 Lecture 23

Slides:



Advertisements
Similar presentations
- Vasvi Kakkad.  Formal -  Tool for mathematical analysis of language  Method for precisely designing language  Well formed model for describing and.
Advertisements

Adapted from Scott, Chapter 6:: Control Flow Programming Language Pragmatics Michael L. Scott.
The lambda calculus David Walker CS 441. the (untyped) lambda calculus a language of functions e ::= x | \x.e | e1 e2 v ::= \x.e there are several different.
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
Functional Programming. Pure Functional Programming Computation is largely performed by applying functions to values. The value of an expression depends.
Lambda Calculus and Lisp PZ03J. Lambda Calculus The lambda calculus is a model for functional programming like Turing machines are models for imperative.
INF 212 ANALYSIS OF PROG. LANGS LAMBDA CALCULUS Instructors: Crista Lopes Copyright © Instructors.
Catriel Beeri Pls/Winter 2004/5 functional-language 1 Substitution Semantics of FL – a simple functional language FL is EL + (non-recursive) function creation.
Comp 205: Comparative Programming Languages Semantics of Imperative Programming Languages denotational semantics operational semantics logical semantics.
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
6. Introduction to the Lambda Calculus. © O. Nierstrasz PS — Introduction to the Lambda Calculus 6.2 Roadmap  What is Computability? — Church’s Thesis.
School of Computing and Mathematics, University of Huddersfield CAS810: WEEK 3 LECTURE: LAMBDA CALCULUS PRACTICAL/TUTORIAL: (i) Do exercises given out.
7. Fixed Points. © O. Nierstrasz PS — Fixed Points 7.2 Roadmap  Representing Numbers  Recursion and the Fixed-Point Combinator  The typed lambda calculus.
Lisp. Versions of LISP Lisp is an old language with many variants –LISP is an acronym for List Processing language Lisp is alive and well today Most modern.
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.
Functional programming: LISP Originally developed for symbolic computing First interactive, interpreted language Dynamic typing: values have types, variables.
C. Varela1 Lambda Calculus alpha-renaming, beta reduction, applicative and normal evaluation orders, Church-Rosser theorem, combinators Carlos Varela Rennselaer.
PPL Syntax & Formal Semantics Lecture Notes: Chapter 2.
PPL Syntax & Formal Semantics Lecture Notes: Chapter 2.
Functional Programing Referencing material from Programming Language Pragmatics – Third Edition – by Michael L. Scott Andy Balaam (Youtube.com/user/ajbalaam)
Functional Languages. Why? Referential Transparency Functions as first class objects Higher level of abstraction Potential for parallel execution.
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.
© Kenneth C. Louden, Chapter 11 - Functional Programming, Part III: Theory Programming Languages: Principles and Practice, 2nd Ed. Kenneth C. Louden.
Formal Semantics Chapter Twenty-ThreeModern Programming Languages, 2nd ed.1.
1 ML fun x -> e e 1 e 2 0, 1, 2,..., +, -,... true, false, if e then e else e patterns datatypes exceptions structures functors let f x = e variables These.
© Kenneth C. Louden, Chapter 11 - Functional Programming, Part III: Theory Programming Languages: Principles and Practice, 2nd Ed. Kenneth C. Louden.
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.
Lambda Calculus Prepared by Manuel E. Bermúdez, Ph.D. Associate Professor University of Florida Programming Language Principles Lecture 11.
Scheme Profs Tim Sheard and Andrew Black CS 311 Computational Structures.
-Calculus Kangwon National University 임현승 Programming Languages These slides are based on the slides by Prof. Sungwoo Park at POSTECH.
Lambda Calculus CSE 340 – Principles of Programming Languages Fall 2015 Adam Doupé Arizona State University
CMSC 330: Organization of Programming Languages Operational Semantics a.k.a. “WTF is Project 4, Part 3?”
1/33 Basic Scheme February 8, 2007 Compound expressions Rules of evaluation Creating procedures by capturing common patterns.
Fall 2008Programming Development Techniques 1 Topic 17 Assignment, Local State, and the Environment Model of Evaluation Section 3.1 & 3.2.
1 FP Foundations, Scheme In Text: Chapter Chapter 14: FP Foundations, Scheme Mathematical Functions Def: A mathematical function is a mapping of.
CMSC 330: Organization of Programming Languages Operational Semantics.
CS7120 (Prasad)L13-1-Lambda-Opt1 Typed Lambda Calculus Adapted from Lectures by Profs Aiken and Necula of Univ. of California at Berkeley.
CSE 425: Functional Programming I Programs as Functions Some programs act like mathematical functions –Associate a set of input values from the function’s.
C H A P T E R E I G H T Functional Programming Programming Languages – Principles and Paradigms by Allen Tucker, Robert Noonan.
PPL Syntax & Formal Semantics Lecture Notes: Chapter 2.
6/21/20161 Programming Languages and Compilers (CS 421) Reza Zamani Based in part on slides by Mattox Beckman,
CSE341: Programming Languages Lecture 17 Implementing Languages Including Closures Dan Grossman Winter 2013.
Arvind Computer Science and Artificial Intelligence Laboratory M.I.T. L03-1 September 14, 2006http:// -calculus: A Basis for.
Chapter 2: Lambda Calculus
CS5205: Foundations in Programming Languages
Functional Programming
CS 550 Programming Languages Jeremy Johnson
Unit – 3 :LAMBDA CALCULUS AND FUNCTIONAL PROGRAMMING
Lambda Calculus CSE 340 – Principles of Programming Languages
Carlos Varela Rennselaer Polytechnic Institute September 5, 2017
Introduction to Scheme
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.
Lecture 15 (Notes by P. N. Hilfinger and R. Bodik)
The Metacircular Evaluator
Carlos Varela Rennselaer Polytechnic Institute September 4, 2015
FP Foundations, Scheme In Text: Chapter 14.
Announcements Quiz 6 HW7 due Tuesday, October 30
Announcements Exam 2 on Friday, November 2nd Topics
L Calculus.
CSE S. Tanimoto Lambda Calculus
Programming Languages
Carlos Varela Rennselaer Polytechnic Institute September 8, 2015
Carlos Varela Rennselaer Polytechnic Institute September 6, 2019
Presentation transcript:

Prof. Fateman CS 164 Lecture 23 Foundations of Theory of Programming Languages: Introduction to Lambda Calculus Lecture 23 Prof. Fateman CS 164 Lecture 23

Prof. Fateman CS 164 Lecture 23 Lecture Outline Some History Why study lambda calculus? What IS lambda calculus? How extensions relate to explaining Lisp, Tiger, Java etc. semantics Prof. Fateman CS 164 Lecture 23

Lambda Calculus. History. A framework developed in 1930s by Alonzo Church to study computations with functions Church wanted a minimal notation to expose only what is essential Two operations with functions are essential: function creation function application Um, what has this to do with (integral?) calculus? Prof. Fateman CS 164 Lecture 23

Prof. Fateman CS 164 Lecture 23 Function Creation Church introduced the notation lx. E to denote a function with formal argument x and with body E Functions do not have names names are not essential for the computation Functions have a single argument once we understand how functions with one argument work we can generalize to multiple args. Prof. Fateman CS 164 Lecture 23

Prof. Fateman CS 164 Lecture 23 History of Notation Whitehead & Russell (Principia Mathematica) used the notation ŷ P to denote the set of y’s such that P holds. Church borrowed the notation but moved ˆ down to create Ùy E Which later turned into ly. E and the calculus became known as lambda calculus John McCarthy, inventor of Lisp, who later admitted he didn’t really “understand” lambda calculus at the time, appropriated the notation lambda[y](E), later changed to (lambda(y) E) for an “anonymous” function. Prof. Fateman CS 164 Lecture 23

Prof. Fateman CS 164 Lecture 23 More on Lisp and Lambda... We will find it useful to use lisp notation in these slides because logicians muck up their formal notation with implicit operators (just putting items next to each other) and expecting the reader to figure out precedence. Prof. Fateman CS 164 Lecture 23

Preview: Function Application The only thing that we can do with a function is to apply it to an argument Church used the notation E1 E2 …in lisp, (E1 E2 ) to denote the application of function E1 to actual argument E2 All functions are applied to a single argument Even so, THIS IS ENOUGH TO COMPUTE ANYTHING. Prof. Fateman CS 164 Lecture 23

It sounds too dumb!! Why Study Lambda Calculus? l-calculus has had a tremendous influence on the theory and analysis of programming languages Comparable to Turing machines Provides a PL framework: Realistic languages are too large and complex to study from scratch as a whole Typical approach is to modularize the study into one feature at a time E.g., recursion, looping, exceptions, objects, etc. Then we assemble the features together Prof. Fateman CS 164 Lecture 23

Is lambda calculus a programming language? l-calculus as a concept is the standard testbed for studying programming language features Because of its minimality Despite its syntactic simplicity the l-calculus can easily encode: numbers, recursive data types, modules, imperative features, exceptions, etc. Certain language features necessitate more substantial extensions to l-calculus: for distributed & parallel languages: p-calculus for object oriented languages: -calculus But as will be evident shortly, the bare lambda calculus is not a PL in a practical sense. Prof. Fateman CS 164 Lecture 23

Prof. Fateman CS 164 Lecture 23 A prediction come true “Whatever the next 700 languages turn out to be, they will surely be variants of lambda calculus.” (Peter Landin 1966) Prof. Fateman CS 164 Lecture 23

Syntax of Lambda Calculus Syntax: Only three kinds of expressions E  x variables | E1 E2 function application | lx. E function creation The form lx. E is also called lambda abstraction, or simply abstraction E are called l-terms or l-expressions Prof. Fateman CS 164 Lecture 23

Syntax of Lambda Calculus in Lisp Only three kinds of LISP expressions E ! x variables | (E1 E2 ) function application | (lambda(x) E) function creation The form (lambda(x)E) is also called lambda abstraction, or simply abstraction E are called s-expressions or terms Prof. Fateman CS 164 Lecture 23

Examples of Lambda Expressions The identity function: I =def lx. x … (lambda(x) x) A function that given an argument y discards it and computes the identity function: ly. (lx. x) ... (lambda(y)(lambda(x)x)) A function that given a function f invokes it on the identity function lf. f (l x. x) …(lambda(f)(f(lambda(x)x))) {actually, that’s Scheme. In CL we need…(lambda(f)(funcall f (lambda(x)x))) } Prof. Fateman CS 164 Lecture 23

Notational Conventions which primarily serve to confuse. Application associates to the left x y z parses as (x y) z Abstraction extends to the right as far as possible lx. x ly. x y z parses as l x. (x (ly. ((x y) z))) And yields the the parse tree: lx app x ly z y Prof. Fateman CS 164 Lecture 23

Notational Conventions in Lisp require no precedence to parse Application ((x y) z) “Abstraction” is also obvious in Lisp syntax lx. x ly. x y z parses as (lambda(x) (x (lambda(y)((x y) z)) Note that in this bottom example, x is a function applied to y. x is also a function applied to (lambda(y)((x y) z)) Prof. Fateman CS 164 Lecture 23

Prof. Fateman CS 164 Lecture 23 Scope of Variables As in all languages with variables it is important to discuss the notion of scope Recall: the scope of an identifier is the portion of a program where the identifier is accessible An abstraction lx. E binds variable x in E x is the newly introduced variable E is the scope of x we say x is bound in lx. E … (lambda(x)E) Prof. Fateman CS 164 Lecture 23

Free and Bound Variables A variable is said to be free in E if it is not bound in E We can define the free variables of an expression E recursively as follows: Free(x) = {x} Free(E1 E2) = Free(E1) È Free(E2) Free(lx. E) = Free(E) - { x } Example: Free(lx. x (ly. x y z)) = { z } You could think that free variables are global or bound “outside” the expression we are looking at. Prof. Fateman CS 164 Lecture 23

Free and Bound Variables Lisp notation A variable is said to be free in E if it is not bound in E We can define the free variables of an expression E recursively as follows: Free(x) = {x} Free( (E1 E2) ) = Free(E1) È Free(E2) Free( (lambda(x) E)) = Free(E) - { x } Example: Free( (lambda(x)(x (lambda(y)((x y) z)))) ) = { z } Lisp would call these global or special vars Prof. Fateman CS 164 Lecture 23

Free and Bound Variables Lisp notation Actually, common lisp is not so functionally pure; Scheme indeed looks more like what we have just written, but in CL we have to use a few extra marks to denote functions. instead of (lambda(x)(x (lambda(y)((x y) z)… (compile nil '(lambda(x)(funcall x #'(lambda(y)(funcall (funcall x y) z)))) ; While compiling (:internal (:anonymous-lambda 0) 0): Warning: Free reference to undeclared variable z assumed special. Prof. Fateman CS 164 Lecture 23

Free and Bound Variables (Cont.) Just like in any language with static nested scoping we have to worry about variable shadowing An occurrence of a variable might refer to different things in different context E.g. Lisp (let ((x E))(+ x (let ((x E2)) x))) In l-calculus: lx. x (lx. x) x note we can’t do + here Prof. Fateman CS 164 Lecture 23

Renaming Bound Variables What if two l-terms can be obtained from each other by a renaming of the bound variables ? Example: lx. x is identical to ly. y and to lz. z Intuition: by changing the name of a formal argument and of all its occurrences in the function body, the behavior of the function cannot change in l-calculus such functions are considered identical In Lisp (lambda(x) x) and (lambda(y) y) are different programs, but computationally equivalent. Mathematicians don’t have such subtle notions of difference as programmers… Prof. Fateman CS 164 Lecture 23

Renaming Bound Variables (Cont.) Convention: we will always rename bound variables so that they are all unique e.g., write lx. x (ly.y) x instead of lx. x (lx.x) x This makes it easy to see the scope of bindings And also prevents serious confusion ! Bad: (lambda(x)((x (lambda(x)x) x) OK: (lambda(x)((x (lambda(y)y) x) well, about as good as it is going to get... Prof. Fateman CS 164 Lecture 23

What can we do with lambda calculus expressions? Need operations to apply functions taking into account bindings If possible, find canonical “simplest” forms for expressions Prof. Fateman CS 164 Lecture 23

Prof. Fateman CS 164 Lecture 23 Substitution The substitution of E’ for x in E (written [E’/x]E ) Step 1. Rename bound variables in E and E’ so they are unique Step 2. Perform the textual substitution of E’ for x in E Example: [y (lx. x) / x] ly. (lx. x) y x After renaming: [y (lv. v)/x] lz. (lu. u) z x After substitution: lz. (lu. u) z (y (lv. v)) [(y (lambda(x)x)) / x] (lambda(y)(((lambda(x)x)y)x) [(y (lambda(v)v)) / x] (lambda(z)(((lambda(u)u)z)x) (lambda(z)(((lambda(u)u)y) (y (lambda(v)v)) ) Prof. Fateman CS 164 Lecture 23

Prof. Fateman CS 164 Lecture 23 Evaluation of l-terms There is one key evaluation step in l-calculus: the function application (lx. E) E’ evaluates to [E’/x]E This is called b-reduction We write E ®b E’ to say that E’ is obtained from E in one b-reduction step We write E ®*b E’ if there are zero or more steps Prof. Fateman CS 164 Lecture 23

Examples of Evaluation The identity function: (lx. x) E ® [E / x] x = E Another example with the identity: (lf. f (lx. x)) (lx. x) ® [lx. x / f] f (lx. x)) = [(lx. x) / f] f (ly. y)) = (lx. x) (ly. y) ® [ly. y /x] x = ly. y A non-terminating evaluation: (lx. xx)(ly. yy) ® [ly. yy / x]xx = (ly. yy)(ly. yy) ® … Prof. Fateman CS 164 Lecture 23

Examples of Evaluation in Lisp notation The identity function: ((lambda(x)x) E) =E (lx. x) E ® [E / x] x = E Another example with the identity: ((lambda(f)(f(lambda(x) x))(lambda(x)x)) = … (lambda(y) y) A non-terminating evaluation: (lx. xx)(ly. yy) ® [ly. yy / x]xx = (ly. yy)(ly. yy) ® … ( (lambda(x)(x x)) (lambda(y) (y y))) beta reduces to ( (lambda(y)(y y)) (lambda(y) (y y))) Prof. Fateman CS 164 Lecture 23

Functions with Multiple Arguments Consider that we extend the calculus with the add primitive operation The l-term lx. ly. add x y can be used to add two arguments E1 and E2: (lx. ly. add x y) E1 E2 ®b ([E1/x] ly. add x y) E2 = (ly. add E1 y) E2 ®b [E2/y] add E1 y = add E1 E2 The arguments are passed one at a time Prof. Fateman CS 164 Lecture 23

Functions with Multiple Arguments Consider that we extend the calculus with the add primitive operation The l-term(lambda(x)(lambda(y)((add x) y))) can be used to add two arguments E1 and E2: ( (lambda(x)(lambda(y)((add x) y))) e1 e2) beta reduces to ((add e1) e2) ;; oddly enough, this is claimed to be The Answer… The arguments are passed one at a time to make multiple arguments “Currying”.. Prof. Fateman CS 164 Lecture 23

Functions with Multiple Arguments, some of which are MISSING What is the result of (lx. ly. add x y) E ? It is ly. add E y (A function that given a value E’ for y will compute add E E’) The function lx. ly. E when applied to one argument E’ computes the function ly. [E’/x]E This is one example of higher-order computation We write a function whose result is another function In lisp notation, (add 3) would be a function that takes one argument, say x and adds 3 to it. This is really old stuff from CS61a. Prof. Fateman CS 164 Lecture 23

Evaluation and Static Scope The definition of substitution guarantees that evaluation respects static scoping: (l x. (ly. y x)) (y (lx. x)) ®b lz. z (y (lv. v)) (y remains free, i.e., defined externally) If we forget to rename the bound y: (l x. (ly. y x)) (y (lx. x)) ®*b ly. y (y (lv. v)) (y was free before but is bound now) Prof. Fateman CS 164 Lecture 23

The Order of Evaluation In a l-term there could be more than one instance of (lx. E) E’ (ly. (lx. x) y) E could reduce the inner or the outer l which one should we pick? (ly. (lx. x) y) E inner outer (ly. [y/x] x) E = (ly. y) E [E/y] (lx. x) y =(lx. x) E E Prof. Fateman CS 164 Lecture 23

Order of Evaluation (Cont.) The Church-Rosser theorem says that any order will compute the same result A result is a l-term that cannot be reduced further But we might want to fix the order of evaluation when we model a certain language In (typical) programming languages we do not reduce the bodies of functions (under a l) functions are considered values Prof. Fateman CS 164 Lecture 23

Prof. Fateman CS 164 Lecture 23 Call by Name Do not evaluate under a l Do not evaluate the argument prior to call Example: (ly. (lx. x) y) ((lu. u) (lv. v)) ®bn (lx. x) ((lu. u) (lv. v)) ®bn (lu. u) (lv. v) ®bn lv. v Prof. Fateman CS 164 Lecture 23

Prof. Fateman CS 164 Lecture 23 Call by Value Do not evaluate under l Evaluate an argument prior to call Example: (ly. (lx. x) y) ((lu. u) (lv. v)) ®bv (ly. (lx. x) y) (lv. v) ®bv (lx. x) (lv. v) ®bv lv. v Prof. Fateman CS 164 Lecture 23

Call by Name and Call by Value CBN difficult to implement order of side effects not predictable CBV: easy to implement efficiently might not terminate even if CBN might terminate Example: (lx. l z.z) ((ly. yy) (lu. uu)) Outside the functional programming language community only CBV is used Prof. Fateman CS 164 Lecture 23

Lambda Calculus and Programming Languages Pure lambda calculus has only functions What if we want to compute with booleans, numbers, lists, etc.? Like 3+4=7? All these can be encoded in pure l-calculus The trick: do not encode what a value is but what we can do with it! For each data type we have to describe how it can be used, as a function then we write that function in l-calculus Prof. Fateman CS 164 Lecture 23

Encoding Booleans in Lambda Calculus What can we do with a boolean? we can make a binary choice A boolean is a function that given two choices selects one of them true =def lx. ly. x false =def lx. ly. y if E1 then E2 else E3 =def E1 E2 E3 Example: if true then u else v is (lx. ly. x) u v ®b (ly. u) v ®b u Prof. Fateman CS 164 Lecture 23

Encoding Booleans in Lambda Calculus Lisp notation What can we do with a boolean? we can make a binary choice A boolean is a function that given two choices selects one of them true =def ((lambda(x)(lambda(y) x)) false =def ((lambda(x)(lambda(y) y)) if E1 then E2 else E3 =def ((E1 E2 )E3 ) Example: if true then u else v is ((lambda(x)(lambda(y) x)) u) v) ®b ((lambda(y) u) v) ®b u Prof. Fateman CS 164 Lecture 23

Encoding Pairs in Lambda Calculus What can we do with a pair? we can select one of its elements A pair is a function that given a boolean returns the left or the right element cons x y =def l b. b x y (lambda(b)((b x) y) car p =def p true (p true) cdr p =def p false (p false) Example: (car (cons x y)) ® ((cons x y) true) ® (true x y) ® x You may recall having seen this in CS61a! Prof. Fateman CS 164 Lecture 23

Encoding Natural Numbers in Lambda Calculus What can we do with a natural number? we can iterate a number of times A natural number is a function that given an operation f and a starting value s, applies f a number of times to s: 0 =def lf. ls. s 1 =def lf. ls. f s 2 =def lf. ls. f (f s) and so on Prof. Fateman CS 164 Lecture 23

Encoding Natural Numbers in Lisp What can we do with a natural number? we can iterate a number of times A natural number is a function that given an operation f and a starting value s, applies f a number of times to s: 0 =def (lambda(f) (lambda(s) s) 1 =def (lambda(f) (lambda(s) (f s)) 2 =def (lambda(f) (lambda(s) (f(f s))) and so on Prof. Fateman CS 164 Lecture 23

Computing with Natural Numbers The successor function succ n =def lf. ls. f (n f s) Addition add n1 n2 =def n1 succ n2 Multiplication mult n1 n2 =def n1 (add n2) 0 Testing equality with 0 iszero n =def n (lb. false) true Prof. Fateman CS 164 Lecture 23

Computing with Natural Numbers in lisp notation The successor function succ n =def (lambda(f)(lambda(s) (f ((n f) s))) Addition add n1 n2 =def ((n1 succ) n2 ) Multiplication mult n1 n2 =def ((n1 (add n2)) 0) Prof. Fateman CS 164 Lecture 23

Computing with Natural Numbers. Example mult 2 2 ® 2 (add 2) 0 ® (add 2) ((add 2) 0) ® 2 succ (add 2 0) ® 2 succ (2 succ 0) ® succ (succ (succ (succ 0))) ® succ (succ (succ (lf. ls. f (0 f s)))) ® succ (succ (succ (lf. ls. f s))) ® succ (succ (lg. ly. g ((lf. ls. f s) g y))) succ (succ (lg. ly. g (g y))) ®* lg. ly. g (g (g (g y))) = 4 Prof. Fateman CS 164 Lecture 23

Computing with Natural Numbers. Example What is the result of the application add 0 ? (ln1. ln2. n1 succ n2) 0 ®b ln2. 0 succ n2 = ln2. (lf. ls. s) succ n2 ®b ln2. n2 = lx. x By computing with functions we can express some optimizations Prof. Fateman CS 164 Lecture 23

Expressiveness of Lambda Calculus The l-calculus can express data types (integers, booleans, lists, trees, etc.) branching (using booleans) recursion This is enough to encode Turing machines Encodings are fun But programming in pure l-calculus is painful. A more fruitful approach for language theorists is to extend the pure l calculus actually add constants (0, 1, 2, …, true, false, if-then-else, etc.) types Prof. Fateman CS 164 Lecture 23

We’ll quit here for lack of time Much more in CS 263 Vast literature Prof. Fateman CS 164 Lecture 23