0% found this document useful (0 votes)
23 views5 pages

Lecture2 6up

The document outlines Lecture 2 of the CS345H course on Programming Languages, focusing on Lambda Calculus and the introduction to the L programming language. It discusses recursion, fixed points, and the Y-combinator, along with practical examples of function definitions and input/output operations in L. Additionally, it provides details on course assignments and the structure of the L language, including support for lists and error handling.

Uploaded by

f.beyza03
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
23 views5 pages

Lecture2 6up

The document outlines Lecture 2 of the CS345H course on Programming Languages, focusing on Lambda Calculus and the introduction to the L programming language. It discusses recursion, fixed points, and the Y-combinator, along with practical examples of function definitions and input/output operations in L. Additionally, it provides details on course assignments and the structure of the L language, including support for lists and error handling.

Uploaded by

f.beyza03
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 5

Administrativa

CS345H: Programming Languages


I Forgot to mention last time: No Textbook
Lecture 2: Lambda Calculus II
I Today thee handouts: L Reference Manual, Written
and Introduction to L
Assignment 1 and Programming Assignment 0.

Thomas Dillig I Piazza course site is set up with discussion forum

I Please use forum instead of email

Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 1/27 Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 2/27

Recursion Recall: Named Function

I Write function definition as


I I claimed last lecture that λ-calculus was as expressive as any
programming language, e.g. it is Turing-complete fun f with x in e ≡ let f = λx .e in

I Function call is now just application (f e1 ) → (λx .e)e1


I But for Turing completeness, we need to write recursive
functions in λ-calculus
I What about recursion?

Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 3/27 Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 4/27

Recursion Recursion

I Let us try to define a function that computes the factorial of a


number
I First, expand the function definition:
I Recall recursive factorial definition:
I Factorial of 0 is 1 I fun f with n = ( if n = 0 then 1 else n ∗ (f (n − 1))) in ... →
let f = λn.( if n = 0 then 1 else n ∗ (f (n − 1))) in ...
I Factorial of n is n∗ Factorial of (n − 1)
I Now, consider computing factorial of 3:
I Let’s try to write this in λ-calculus:
I let f = λn.( if n = 0 then 1 else n ∗ (f (n − 1))) in (f 3)
I fun f with n = ( if n = 0 then 1 else n ∗ (f (n − 1))) in ...

I Does this work?

Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 5/27 Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 6/27

1
Recursion What about Recursion?

I Next, expand the let binding: I On the face of it, λ-calculus does not seem to allow recursion

I Recall: let x = e1 in e2 defined as e2 [e1 /x ] I But this would make λ-calculus very boring; not many
interesting functions can be computed without recursion
I let f = λn.( if n = 0 then 1 else n ∗ (f (n − 1))) in (f 3) →
(λn.( if n = 0 then 1 else n ∗ (f (n − 1))) 3 I Amazing fact: It is possible to encode recursion in λ-calculus

I Left with undefined symbol f I It is just a little bit involved (but very instructive to
understand)
I Conclusion: We cannot encode recursion using named
functions I Any ideas?

Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 7/27 Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 8/27

Encoding Recursion Encoding Recursion Cont.

I Now, we can use a λ-abstraction to remove n from the


I Recall again the factorial function we would like to compute:
left-hand side: (f n) = ( if n = 0 then 1 else n ∗ (f (n − 1)))
I fun f with n = ( if n = 0 then 1 else n ∗ (f (n − 1)))
I f = λn.( if n = 0 then 1 else n ∗ (f (n − 1)))
I We can view this function definition as an equation:
I Consider defining another function G by moving f to the
I (f n) = ( if n = 0 then 1 else n ∗ (f (n − 1))) right-hand side:

I G = λf .λn.( if n = 0 then 1 else n ∗ (f (n − 1)))


I This states that the value of f n is 1 if n is 0 and
n ∗ (f (n − 1)) otherwise
I To see that this is correct, show that f = G(f ) at home

Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 9/27 Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 10/27

Fixed Points The Y -combinator

I We can define a fixed-point operator in λ-calculus as follows:


I A fixed point of function h is value v such that v = h(v ) Y = λf .(λx .f (x x ))(λx .f (x x ))

I Intuition: The fixed point of h is applying h until v = h(v ), I This bizarre expression is called Y-combinator
i.e., the base case of the recursion is hit
I Recall property of fixed-point: v = h(v ) for any function h.
I But completely unclear how we can compute fixed-point of h
I Lets confirm that Y has this property:
I An expression that computes a fixed point is called a fixed
I Y h → λf .(λx .f (x x ))(λx .f (x x )) h →
point operator
(λx .h(x x ))(λx .h(x x )) → (h(x x ))[(λx .h(x x ))/x ] →
h(λx .h(x x ))(λx .h(x x )) → h(Yh)

Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 11/27 Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 12/27

2
Using the Y -combinator Fixed points Summary
I Let’s see how we can use the Y −combinator to compute
factorial:
I We can compute recursive functions in λ-calculus using
I Recall: G = λf .λn.( if n = 0 then 1 else n ∗ (f (n − 1)))
fixed-point operators
I Claim: Factorial of n can be computed as (YG) n
I We have seen the most famous fixed-point operator, the
I Example: Y -combinator

(YG) 2 I However, there are other λ expressions that also compute


→ (G(YG))2 fixed points.
→ (λf .λn( if n = 0 then 1 else n ∗ (f (n − 1)))(YG))2
→ λn( if n = 0 then 1 else n ∗ ((YG) (n − 1)))2 I Remember: Not every recursive function has to terminate, so
→ if 2 = 0 then 1 else 2 ∗ ((YG) (2 − 1)) this means we can write λ terms that will reduce forever
→ if 2 = 0 then 1 else 2 ∗ ((YG) 1)
→ 2 ∗ ((YG) 1)
→ ...

Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 13/27 Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 14/27

Next: Your course project Course Project Overview

I You will implement a lexer, parser, interpreter for the L


language

I You can find a reference interpreter on the UT Austin


machines to run L programs on (see the L Language handout
for details)

I As the name suggests, L is very similar to λ-calculus, but still


a useful language

I L has a bizarre property that is (almost) unique among


programming languages: At the end of the semester, there
will be many more interpreters for L than L programs

Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 15/27 Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 16/27

Language Overview Language Overview

I In L, every expression evaluates to a value


I Of course, L has the λ-operator
I The result of running a L program is the value of the program
I Example: (lambda x. x+3 2) will evaluate to ”5”
I Example: let x = 3 in x will evaluate to ”3”
I Note: You must write parenthesis for any applications!
I In addition to integers, L also supports strings
I This means lambda x. x+3 2 is not a valid L program
I Example: let x = "cs312" in x will evaluate to ”cs312”

Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 17/27 Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 18/27

3
More L Examples Functions in L
I let g =
lambda a.if a>0 then 2*a else 3*a
in I For convenience, L also has built-in function definitions:
let u = 12 in
(g u) I fun compute_grade with percent =
if percent>90 then "A" else
I Value: ”24” if percent>80 then "B" else "F"
in
I L also supports currying:
(compute_grade 73)
I let x = lambda a,b.a+b in I Result: ”F”
let y = (x 2) in
(y 3)

I Value: ”5”

Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 19/27 Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 20/27

Recursion in L Input/Output in L
I Unlike λ-calculus, L allows you to write ”naturally” recursive
functions
I L has special operators for input/output:
I fun factorial with n =
if n<=0 then 1 else n* (factorial (n-1)) I let _ = print "Please enter an integer: " in
in let i = readInt in
... let _ = print "Please enter a string: " in
let s = readString in
I Can also write ”naturally recursive” anonymous functions: let _ = print "Integer read: " in
let _ = print i in
I let fact = let _ = print "String read: " in
lambda n. if n=0 then 1 else n* (fact (n-1)) let _ = print s in
in 0
(fact 6)

I We will learn later how L allows natural recursion


Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 21/27 Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 22/27

Lists in L List Examples

I L also supports lists


I let x = 1@2@3@4 in x
I Lists are represented as pairs with a head and tail element
I Value: ”[1, [2, [3, 4]]]”
I This allows very generic data structures, no just linear lists
I let x = 1@2@3@4 in !x
I L has the following list operators:
I isNil: 1 if list is empty, 0 otherwise I Value: ”1”

I e1@e2: Returns a list with e1 as head and e2 as tail I let x = 1@2@3@4 in #x


I !e1:Returns head of e1 if e1 is list, e1 otherwise I Value: ”[2, [3, 4]]”
I #e1:Returns tail of e1 if e1 is list, Nil otherwise

Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 23/27 Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 24/27

4
More List Examples Run-time errors

I How about computing the length of a list? I There are many run-time errors possible in L programs:

I fun length with l = I Example: let x = "hello" in x+3


if isNil l then 0 else 1 + (length (#l))
in I Result: ”Run-time error: Binop + can only be applied to
(length "A"@"B"@"C") expressions of same type”

I Value: ”3” I The L reference manual lists all possible errors

Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 25/27 Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 26/27

Course Project Details


I Your first four programming assignments will use L and built
an L interpreter
I Assignment 0: Develop and L program

I Assignment 1: Lexer

I Assignment 2: Parser

I Assignment 3: Interpreter

I Assignment 4: Type Inference

I You will complete these assignments in L and C++

I I posted a quick C++ introduction on the website

I But we will use only tiny subset of C++, easy to pick up


Thomas Dillig, CS345H: Programming Languages Lecture 2: Lambda Calculus II and Introduction to L 27/27

You might also like