Concepts of programming languages Lecture 6 Wouter Swierstra - - PowerPoint PPT Presentation

concepts of programming languages
SMART_READER_LITE
LIVE PREVIEW

Concepts of programming languages Lecture 6 Wouter Swierstra - - PowerPoint PPT Presentation

Faculty of Science Information and Computing Sciences 1 Concepts of programming languages Lecture 6 Wouter Swierstra Faculty of Science Information and Computing Sciences 2 Announcements and will try to get back to you with feedback soon.


slide-1
SLIDE 1

Faculty of Science Information and Computing Sciences 1

Concepts of programming languages

Lecture 6

Wouter Swierstra

slide-2
SLIDE 2

Faculty of Science Information and Computing Sciences 2

Announcements

▶ Thanks for all the proposals – I’ve read most of them

and will try to get back to you with feedback soon.

▶ The presentation schedule has some minor

modifications – be sure to check that you can make it.

▶ The lecture and lab session on Thursday is cancelled. ▶ I’m trying to book ‘de Vagant’ to host the final project

  • presentation. Ideally, I’d like you all to prepare a poster

about your project.

slide-3
SLIDE 3

Faculty of Science Information and Computing Sciences 3

Last time

▶ How can we define the semantics of trivial languages? ▶ What is the λ-calculus and what is its semantics?

slide-4
SLIDE 4

Faculty of Science Information and Computing Sciences 4

Micro programming languages

We defined the semantics of a series of small programming languages. And started the study of the lambda calculus.

slide-5
SLIDE 5

Faculty of Science Information and Computing Sciences 5

The lambda calculus

The lambda calculus is the ’smallest programming language imaginable’. It was originally introduced by Alonzo Church (1930’s) as a foundation for mathematics – but surprisingly, it perfectly captures computation! There are only three constructs: e ::= x (variables) | e e (application) | λx . e (abstraction)

slide-6
SLIDE 6

Faculty of Science Information and Computing Sciences 6

λ-Calculus: β-Reduction

A term of the form λx . e is called an abstraction or lambda binding; e is called the abstraction’s body. The central rewrite rule of the λ-calculus is β-reduction: (λx . e) a →β e [x → a] [x → a] := substitution of all free occurrences of variable x by a (λf . λx . λy . f y x) a b c →β (λx . λy . a y x) b c →β (λy . a y b) c →β a c b An expression of the form (λx . e) (t) is called a β-redex.

slide-7
SLIDE 7

Faculty of Science Information and Computing Sciences 7

λ-Calculus: Name Capturing and α-conversion

Consider the following example: (λy . (λb . y b)) a →β (λb . y b) [y → a] = λb . a b And now we can reduce the following equivalent expression: (λy . (λa . y a)) a →β (λa . y a) [y → a] = λa . a a What went wrong? Two equivalent expressions produced different results! Problem: a is captured by the innermost lambda binding!

slide-8
SLIDE 8

Faculty of Science Information and Computing Sciences 7

λ-Calculus: Name Capturing and α-conversion

Consider the following example: (λy . (λb . y b)) a →β (λb . y b) [y → a] = λb . a b And now we can reduce the following equivalent expression: (λy . (λa . y a)) a →β (λa . y a) [y → a] = λa . a a What went wrong? Two equivalent expressions produced different results! Problem: a is captured by the innermost lambda binding!

slide-9
SLIDE 9

Faculty of Science Information and Computing Sciences 8

Capture avoiding substitution

The substitution [x → y] must be a capture-avoiding substitution – that is, it should renames the abstraction variable if necessary: (λy . (λa . y a)) a →β (λa . y a) [y → a] →α (λa′ . y a′) [y → a] = λa′ . a a′ Note that we introduce an explicit α-conversion step, renaming a to a′.

slide-10
SLIDE 10

Faculty of Science Information and Computing Sciences 9

Capture avoiding substitution

We can define such a capture avoiding substitution as follows: x [x → t] = t y [x → t] = y when x ̸≡ y (t1 t2) [x → t] = (t1 [x → t]) (t2 [x → t]) (λy . s) [x → t] = λy . s [x → t] provided y ̸≡ x and y does not occur free in t. Note that this last rule may require α-renaming the variable y in order to proceed with the substitution.

slide-11
SLIDE 11

Faculty of Science Information and Computing Sciences 10

Transitive, reflexive closure

Beta-reduction allows us to define a single reduction step… …but what if we’re interested in evaluating a more complicated λ-term? We can define the relation t →∗

β t′ as follows: ▶ t →∗ β t for any term t ▶ if t1 →β t2 and t2 →∗ β t3, then also t1 →∗ β t3

If t →∗

β t′, we can reach t′ from t after zero or more

β-reduction steps.

slide-12
SLIDE 12

Faculty of Science Information and Computing Sciences 11

λ-Calculus: β-equivalence

When we can find a term v, such that t →∗

β v or t′ →∗ β v we

call t and t′ β-equivalent. In that case, we sometimes write t =β t′. This corresponds to saying that the two lambda terms, t and t′, correspond to the same program. This is undecidable in general. For example (λy . a y) b =β (λx . x b) a because (λy . a y) b →β a b ←β (λx . x b) a

slide-13
SLIDE 13

Faculty of Science Information and Computing Sciences 12

Lambda terms and functional programming

Despite all its simplicity, the lambda calculus really captures the heart of (functional) programming. A function like: flip f x y = f y x Is easy to represent by the following lambda term: flip = λf . λx . λy . f y x In fact, this is how GHC represents programs under the hood.

slide-14
SLIDE 14

Faculty of Science Information and Computing Sciences 13

Extended example

Given the following definitions: main = print (flip map [1 . .] inc) print x = putStrLn (show x) flip f x y = f y x inc x = x + 1 map f = ... These can be desugared as: main = print (flip map [1 . .] inc) print = λx . putStrLn (show x) flip = λf . λx . λy . f y x inc = λx . x + 1 map = λf . ... And after substituting function calls with their definition: (λx . putStrLn (show x)) ((λf . λy . λx . f y x) ...

slide-15
SLIDE 15

Faculty of Science Information and Computing Sciences 14

Example as a Syntax-Tree

@ λx @ putStrLn @ show x @ @ @ λ f λx λy @ @ f y x λ f . . . [1..] λx @ @ + x 1

slide-16
SLIDE 16

Faculty of Science Information and Computing Sciences 14

Example as a Syntax-Tree

@ λx @ putStrLn @ show x @ @ @ λ f λx λy @ @ f y x λ f . . . [1..] λx @ @ + x 1

slide-17
SLIDE 17

Faculty of Science Information and Computing Sciences 14

Example as a Syntax-Tree

@ λx @ putStrLn @ show x @ @ λx λy @ @ λ f . . . y x [1..] λx @ @ + x 1

slide-18
SLIDE 18

Faculty of Science Information and Computing Sciences 14

Example as a Syntax-Tree

@ λx @ putStrLn @ show x @ @ λx λy @ @ λ f . . . y x [1..] λx @ @ + x 1

slide-19
SLIDE 19

Faculty of Science Information and Computing Sciences 14

Example as a Syntax-Tree

@ λx @ putStrLn @ show x @ λy @ @ λ f . . . y [1..] λx @ @ + x 1

slide-20
SLIDE 20

Faculty of Science Information and Computing Sciences 14

Example as a Syntax-Tree

@ λx @ putStrLn @ show x @ λy @ @ λ f . . . y [1..] λx @ @ + x 1

slide-21
SLIDE 21

Faculty of Science Information and Computing Sciences 14

Example as a Syntax-Tree

@ λx @ putStrLn @ show x @ @ λ f . . . λx @ @ + x 1 [1..]

slide-22
SLIDE 22

Faculty of Science Information and Computing Sciences 14

Example as a Syntax-Tree

@ λx @ putStrLn @ show x @ @ λ f . . . λx @ @ + x 1 [1..]

slide-23
SLIDE 23

Faculty of Science Information and Computing Sciences 14

Example as a Syntax-Tree

@ putStrLn @ show @ @ λ f . . . λx @ @ + x 1 [1..]

slide-24
SLIDE 24

Faculty of Science Information and Computing Sciences 15

Evaluation order

As we saw previously, we can choose different evaluation

  • rders:

▶ strict languages evaluate arguments to a value, before

beta reducing;

▶ non-strict languages evaluate leftmost-outermost beta

redex on the spine; never reduce under lambdas. This reduces a term to weak head normal form – we will have a lambda or stuck application at the top level, but there may still be beta redexes.

slide-25
SLIDE 25

Faculty of Science Information and Computing Sciences 16

Example: Non-strict Evaluation

@ @ λy @ λx x y @ λz z a @ λx c b

slide-26
SLIDE 26

Faculty of Science Information and Computing Sciences 16

Example: Non-strict Evaluation

@ @ λy @ λx x y @ λz z a @ λx c b

slide-27
SLIDE 27

Faculty of Science Information and Computing Sciences 16

Example: Non-strict Evaluation

@ @ λx x @ λz z a @ λx c b

slide-28
SLIDE 28

Faculty of Science Information and Computing Sciences 16

Example: Non-strict Evaluation

@ @ λx x @ λz z a @ λx c b

slide-29
SLIDE 29

Faculty of Science Information and Computing Sciences 16

Example: Non-strict Evaluation

@ @ λz z a @ λx c b

slide-30
SLIDE 30

Faculty of Science Information and Computing Sciences 16

Example: Non-strict Evaluation

@ @ λz z a @ λx c b

slide-31
SLIDE 31

Faculty of Science Information and Computing Sciences 16

Example: Non-strict Evaluation

@ a @ λx c b

Term is a WHNF but not a normal form.

slide-32
SLIDE 32

Faculty of Science Information and Computing Sciences 17

Semantics

To complete our definition of the lambda calculus, we need to specify its semantics. To do so, we’ll define a handful of rules capturing how to perform a single evaluation step. These rules should – of course – include β-reduction – but they also need to fix the order of evaluation.

slide-33
SLIDE 33

Faculty of Science Information and Computing Sciences 18

Dynamic Semantics

We will define an dynamic semantics for the lambda calculus. This corresponds to defining a relation between two terms, t → t′, when we can perform a single reduction step from t to t′. Note that the values of our language are variables and lambda abstractions. We will use the variable v (rather than t) to refer to values.

slide-34
SLIDE 34

Faculty of Science Information and Computing Sciences 19

Evaluation rules

t1 → t2 t1 t → t2 t Left t1 → t2 v t1 → v t2 Right (λx . t) v → t [x → v] Beta Question: Is this strict or lazy? The beta rule will only trigger when the argument is a value; hence these rules describe a strict evaluation order.

slide-35
SLIDE 35

Faculty of Science Information and Computing Sciences 19

Evaluation rules

t1 → t2 t1 t → t2 t Left t1 → t2 v t1 → v t2 Right (λx . t) v → t [x → v] Beta Question: Is this strict or lazy? The beta rule will only trigger when the argument is a value; hence these rules describe a strict evaluation order.

slide-36
SLIDE 36

Faculty of Science Information and Computing Sciences 20

Evaluation rules

t1 → t2 t1 t → t2 t Left t1 → t2 v t1 → v t2 Right (λx . t) v → t [x → v] Beta Question: Why do these rules fix the evaluation order? The beta rule will only trigger when the argument is a value; the second rule will only trigger when the left-hand side of an application is a value.

slide-37
SLIDE 37

Faculty of Science Information and Computing Sciences 20

Evaluation rules

t1 → t2 t1 t → t2 t Left t1 → t2 v t1 → v t2 Right (λx . t) v → t [x → v] Beta Question: Why do these rules fix the evaluation order? The beta rule will only trigger when the argument is a value; the second rule will only trigger when the left-hand side of an application is a value.

slide-38
SLIDE 38

Faculty of Science Information and Computing Sciences 21

What can you do with lambda terms?

The untyped lambda calculus is surprisingly expressive. In fact you can encode:

▶ booleans and if-then-else; ▶ natural numbers and iteration; ▶ arbitrary recursion; ▶ ...

all using untyped lambda terms… In fact, it’s a Turing complete language. But in general, we’re (more) interested in typed programming languages.

slide-39
SLIDE 39

Faculty of Science Information and Computing Sciences 22

Terms and Types

Terms

e ::= x variables | e e application | λ(x : τ) . e lambda abstraction The only new thing is that lambda abstractions are annotated with a type.

Types

constant type function type We assume some collection of constant types , which could include, for instance, bool, int, float, ...

slide-40
SLIDE 40

Faculty of Science Information and Computing Sciences 22

Terms and Types

Terms

e ::= x variables | e e application | λ(x : τ) . e lambda abstraction The only new thing is that lambda abstractions are annotated with a type.

Types

τ ::= σ constant type | τ → τ function type We assume some collection of constant types σ, which could include, for instance, bool, int, float, ...

slide-41
SLIDE 41

Faculty of Science Information and Computing Sciences 23

Typing rules

To define a type system for the lambda calculus, we will need to define an inductive relation between types and terms: t : τ Expressing the fact that the term t has the type τ. But unfortunately, this isn’t quite enough…

slide-42
SLIDE 42

Faculty of Science Information and Computing Sciences 24

Types and free variables

Question: How do we assign a type to a term with free variables? λ(x : Nat) . plus x one

Answer

We cannot unless we know the types of the free variables.

slide-43
SLIDE 43

Faculty of Science Information and Computing Sciences 24

Types and free variables

Question: How do we assign a type to a term with free variables? λ(x : Nat) . plus x one

Answer

We cannot unless we know the types of the free variables.

slide-44
SLIDE 44

Faculty of Science Information and Computing Sciences 25

Environments

We therefore do not assign types to terms, but types to terms in a certain environment (also called a (type) context).

Environments

Γ ::= ε empty environment | Γ, x : τ binding Later bindings for a variable always shadow earlier bindings.

slide-45
SLIDE 45

Faculty of Science Information and Computing Sciences 26

The typing relation

A statement of the form Γ ⊢ e : τ can be read as follows: “In environment Γ, term e has type τ.” Note that e is formally a ternary relation between an environment, a term and a type. The (called turnstile) and the colon are just notation for making the relation look nice but carry no meaning. We could have chosen the notation T e for the relation as well, but e is commonly used.

slide-46
SLIDE 46

Faculty of Science Information and Computing Sciences 26

The typing relation

A statement of the form Γ ⊢ e : τ can be read as follows: “In environment Γ, term e has type τ.” Note that Γ ⊢ e : τ is formally a ternary relation between an environment, a term and a type. The ⊢ (called turnstile) and the colon are just notation for making the relation look nice but carry no meaning. We could have chosen the notation T (Γ, e, τ) for the relation as well, but Γ ⊢ e : τ is commonly used.

slide-47
SLIDE 47

Faculty of Science Information and Computing Sciences 27

Type rules

We are now free to choose the inference rules describing

  • ur typing relation:

Variables

x x

slide-48
SLIDE 48

Faculty of Science Information and Computing Sciences 27

Type rules

We are now free to choose the inference rules describing

  • ur typing relation:

Variables

x : τ ∈ Γ Γ ⊢ x : τ

slide-49
SLIDE 49

Faculty of Science Information and Computing Sciences 28

Type rules – contd.

Application

Γ ⊢ e1 : τ1 → τ2 Γ ⊢ e2 : τ1 Γ ⊢ (e1 e2) : τ2 Variables scope over the entire inference rule. Multiple

  • ccurences of the same variable must be instantiated with

the same expressions – in this rule, both occurrences of τ1 must be equal.

slide-50
SLIDE 50

Faculty of Science Information and Computing Sciences 29

Type rules – contd.

Abstraction

Γ, x : τ1 ⊢ e : τ2 Γ ⊢ λ(x : τ1) . e : τ1 → τ2 It pays off that we introduced the environments. The body

  • f a lambda abstraction (viewed in isolation) can contain

free occurrences of the bound variable.

slide-51
SLIDE 51

Faculty of Science Information and Computing Sciences 30

Example derivation

x : Nat ∈ x : Nat x : Nat ⊢ x : Nat ε ⊢ λx : Nat . x : Nat → Nat Multiple applications of type rules can be stacked, leading (in general) to proof trees or derivation trees.

slide-52
SLIDE 52

Faculty of Science Information and Computing Sciences 30

Example derivation

x : Nat ∈ x : Nat x : Nat ⊢ x : Nat ε ⊢ λx : Nat . x : Nat → Nat Multiple applications of type rules can be stacked, leading (in general) to proof trees or derivation trees.

slide-53
SLIDE 53

Faculty of Science Information and Computing Sciences 31

Examples – contd.

Let Γ abbreviate neg : Nat → Nat, one : Nat. neg : Nat → Nat ∈ Γ Γ ⊢ neg : Nat → Nat

  • ne : Nat ∈ Γ

Γ ⊢ one : Nat Γ ⊢ neg one : Nat

slide-54
SLIDE 54

Faculty of Science Information and Computing Sciences 32

Examples – contd.

Let Γ abbreviate plus : Nat → Nat → Nat, one : Nat.

Exercise

Try to complete the following proof tree: ... Γ ⊢ λ(x : Nat) . plus x one : Nat → Nat

slide-55
SLIDE 55

Faculty of Science Information and Computing Sciences 33

Adding types

The simply typed lambda calculus itself knows only type variables and function types. We can simulate constants of certain types by placing them in the environment. We can also actually extend the calculus with new types. Then we can also add reduction rules – as we saw at the beginning of this lecture.

slide-56
SLIDE 56

Faculty of Science Information and Computing Sciences 33

Adding types

The simply typed lambda calculus itself knows only type variables and function types. We can simulate constants of certain types by placing them in the environment. We can also actually extend the calculus with new types. Then we can also add reduction rules – as we saw at the beginning of this lecture.

slide-57
SLIDE 57

Faculty of Science Information and Computing Sciences 33

Adding types

The simply typed lambda calculus itself knows only type variables and function types. We can simulate constants of certain types by placing them in the environment. We can also actually extend the calculus with new types. Then we can also add reduction rules – as we saw at the beginning of this lecture.

slide-58
SLIDE 58

Faculty of Science Information and Computing Sciences 34

Other types

For other types (such as natural numbers or tuples or lists), we can also extend the simply typed lambda calculus. We can also add additional constructs such as let or case to come closer to a full programming language. However, there are still a few fundamental shortcomings …

slide-59
SLIDE 59

Faculty of Science Information and Computing Sciences 34

Other types

For other types (such as natural numbers or tuples or lists), we can also extend the simply typed lambda calculus. We can also add additional constructs such as let or case to come closer to a full programming language. However, there are still a few fundamental shortcomings …

slide-60
SLIDE 60

Faculty of Science Information and Computing Sciences 35

Lack of polymorphism

In the simply typed lambda lambda calculus, there are no polymorphic functions. We cannot type a term like let id = λ(x : ?) . x in if id True then id 0 else 1 because there is no valid type we can choose for ?. Neither Bool nor Nat nor any other single type works. We need multiple variants of the identity function for different types.

slide-61
SLIDE 61

Faculty of Science Information and Computing Sciences 36

Introducing polymorphism

Idea

Allow to abstract from types. let id a x a x in if id Bool True then id Nat 0 else 1 We use angle brackets to syntactically distinguish type abstraction and application from term abstraction and application – similar to the way generics work in languages like C#.

slide-62
SLIDE 62

Faculty of Science Information and Computing Sciences 36

Introducing polymorphism

Idea

Allow to abstract from types. let id = λ⟨a⟩ (x : a) . x in if id ⟨Bool⟩ True then id ⟨Nat⟩ 0 else 1 We use angle brackets to syntactically distinguish type abstraction and application from term abstraction and application – similar to the way generics work in languages like C#.

slide-63
SLIDE 63

Faculty of Science Information and Computing Sciences 37

Polymorphic types

A type abstraction is reflected in the type: λ⟨a⟩ (x : a) . x : forall a.a → a Note that this is quite different from Haskell: In Haskell, type abstraction, type application and polymorphism is implicit. In (standard) Haskell, there is a difference between let-bound variables (can be polymorphic) and lambda-bound variables (always monomorphic).

slide-64
SLIDE 64

Faculty of Science Information and Computing Sciences 37

Polymorphic types

A type abstraction is reflected in the type: λ⟨a⟩ (x : a) . x : forall a.a → a Note that this is quite different from Haskell:

▶ In Haskell, type abstraction, type application and

polymorphism is implicit. In (standard) Haskell, there is a difference between let-bound variables (can be polymorphic) and lambda-bound variables (always monomorphic).

slide-65
SLIDE 65

Faculty of Science Information and Computing Sciences 37

Polymorphic types

A type abstraction is reflected in the type: λ⟨a⟩ (x : a) . x : forall a.a → a Note that this is quite different from Haskell:

▶ In Haskell, type abstraction, type application and

polymorphism is implicit.

▶ In (standard) Haskell, there is a difference between

let-bound variables (can be polymorphic) and lambda-bound variables (always monomorphic).

slide-66
SLIDE 66

Faculty of Science Information and Computing Sciences 38

What is still missing?

Parameterized types

Even if we have polymorphic types, but there is no general mechanism to abstract from type constructors such as lists.

Inference

All our lambdas carry type information: the language is very

  • verbose. We need to look at how to infer types.
slide-67
SLIDE 67

Faculty of Science Information and Computing Sciences 39

What is still missing?

Data types

The ability for users to define their own data types, together with the associated constructors and elimination principle.

Effects

We haven’t said anything about assignments, exceptions, concurrency, interacting with file system, etc.

slide-68
SLIDE 68

Faculty of Science Information and Computing Sciences 40

What is still missing?

General recursion

The simply typed lambda calculus can only express terminating computations – what about arbitrary recursion?

Subtyping and objects

Many programming language allow programmers to

  • rganize their code into objects/classes. These classes may

be related through subtyping (or inheritance) – how can we define these notions?

slide-69
SLIDE 69

Faculty of Science Information and Computing Sciences 41

What is still missing?

On the one hand, this is an impressive list of missing features… Adding these features requires careful thought. But no ’fundamental changes’ to our definitions or principles.

slide-70
SLIDE 70

Faculty of Science Information and Computing Sciences 42

Recap

▶ How can we define the semantics of trivial languages? ▶ What is the λ-calculus and what is its semantics?

slide-71
SLIDE 71

Faculty of Science Information and Computing Sciences 43

Reading

Types and Programming Languages, Benjamin Pierce – Chapters 3,5,8 and 9.