23
Closed and Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Closed and Open Recursion RALF HINZE Institut f¨ ur Informatik III, Universit¨ at Bonn omerstraße 164, 53117 Bonn Email: [email protected] Homepage: http://www.informatik.uni-bonn.de/~ralf July 2007 (Pick up the slides at . . . /~ralf/talks.html#56.) 1 / 23

Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

  • Upload
    others

  • View
    34

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Closed and Open Recursion

RALF HINZE

Institut fur Informatik III, Universitat BonnRomerstraße 164, 53117 Bonn

Email: [email protected]

Homepage: http://www.informatik.uni-bonn.de/~ralf

July 2007

(Pick up the slides at . . . /~ralf/talks.html#56.)

1 / 23

Page 2: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Trinity

I functional core,

I imperative core,

I object-oriented core,

I [module system].

2 / 23

Page 3: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Open recursion

Open recursion. Another handy feature offered by mostlanguages with objects and classes is the ability for one methodbody to invoke another method of the same object via a specialvariable called self or, in some langauges, this. The specialbehavior of self is that it is late-bound, allowing a method definedin one class to invoke another method that is defined later, insome subclass of the first.

3 / 23

Page 4: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Functions

- τ1→ τ2 -

values

fun (x1 : τ1)⇒ e

introduction

fun (x1 : τ1)⇒ e

elimination

e2 e1

4 / 23

Page 5: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Dynamic semantics

(fun (x1 : τ1)⇒ e) ⇓ (fun (x1 : τ1)⇒ e)

e2 ⇓ (fun (x1 : τ1)⇒ e) let val x1 = e1 in e end ⇓ ν

e2 e1 ⇓ ν

5 / 23

Page 6: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Recursive functions

rec fun (n : Nat)⇒if n 0 then 1 else self (n − 1) ∗ n

+ self refers to the function itself.

6 / 23

Page 7: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Dynamic semantics

(rec fun (x1 : τ1)⇒ e) ⇓ (fun (x1 : τ1)⇒ e){self 7→ rec fun (x1 : τ1)⇒ e }

+ The recursive knot is tied at the earliest possible point in time: theintroduction form.

7 / 23

Page 8: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Objects

- object M end -

values

object µ end

introduction

object m end

elimination

e.x

8 / 23

Page 9: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Dynamic semantics

m ⇓ µ

object m end ⇓ object µ end

e ⇓ object µ end µ(x) ⇓ ν

e.x ⇓ ν

9 / 23

Page 10: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Recursive objects

rec objectmethod factorial (n : Nat) =

if n 0 then 1 else self .factorial (n − 1) ∗ nend

+ self refers to the object itself.

10 / 23

Page 11: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Dynamic semantics

m ⇓ µ

rec object m end ⇓ rec object µ end

e ⇓ rec object µ end µ(x){self 7→ rec object µ end} ⇓ ν

e.x ⇓ ν

+ The recursive knot is tied at the latest possible point in time: theelimination form.

11 / 23

Page 12: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Stocktaking

I Closed recursion: tie the recursive knot in the introduction form.

I Open recursion: tie the recursive knot in the elimination form.

I Does it make a difference?

I No! If there is only a single introduction and a single elimination form.

I Let’s add an additional combining form, for instance, delegation.

12 / 23

Page 13: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Delegation

val math =rec object

method factorial (n : Nat) : Nat =if n 0 then 1 else self .factorial ′ n ∗ n

method factorial ′ (n : Nat) : Nat =self .factorial (n − 1)

end

val math′ =rec object

include mathmethod factorial ′ (n : Nat) : Nat =

self .factorial (n − 1) + 1end

13 / 23

Page 14: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Thoughts

I Open recursion is not limited to objects.

I It is also useful for functions.

I Let’s add an additional combining form for functions.

14 / 23

Page 15: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Open functions

val fac-base =fun open (0 : Nat)⇒ 1

val fac-step =rec fun open (n + 1 : Nat)⇒ self n ∗ (n + 1)

val factorial =fac-base or fac-step

+ An open function is a partial function.

+ The combinator or combines two partial functions.

15 / 23

Page 16: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Abstract syntax

e ::= · · · open functions:| fun open r non-recursive open function| rec fun open r recursive open function| e1 or e2 alternation

r ::= ε empty rule| p ⇒ e single rule| r1 | r2 sequences of rules

16 / 23

Page 17: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Dynamic semantics

(rec fun open r) ⇓ (rec fun open r)

e1 ⇓ (rec fun open r1) e2 ⇓ (rec fun open r2)

e1 or e2 ⇓ rec fun open (r1 | r2)

e2 ⇓ (rec fun open r) case e1 of r{self 7→ rec fun open r }end ⇓ ν

e2 e1 ⇓ ν

17 / 23

Page 18: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Application — generic programming

val sum-nat =fun open〈Nat〉 ⇒

fun x ⇒ x

val sum-pair =rec sum fun open〈(a1, a2)〉 ⇒

fun (x1, x2)⇒ sum〈a1〉x1 + sum〈a2〉x2

+ Instead of a case we have a typecase.

18 / 23

Page 19: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Conclusion

I Open functions are useful in conjunction with open data types.

I Vision: replacement for overloading and type classes.

I Open recursive modules?

19 / 23

Page 20: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Objects — example

val my-account =object

localval balance = ref 0

inmethod deposit (amount : Nat) =

balance := !balance + amount

method withdraw (amount : Nat) =balance := sub (!balance, amount)

method balance =! balance

endend

20 / 23

Page 21: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Objects — abstract syntax

m ← Method method declaration

m ::= ε empty declaration| method x = e method definition| m1 m2 sequence of declarations| local d in m end local declaration

21 / 23

Page 22: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Objects — dynamic semantics

ε ⇓ ε

(method x = e) ⇓ {x 7→ e }

m1 ⇓ µ1 m2 ⇓ µ2

m1 m2 ⇓ µ1, µ2

d ⇓ δ mδ ⇓ µ

local d in m end ⇓ µ

22 / 23

Page 23: Closed and Open Recursion · Open Recursion RALF HINZE Introduction Recursive functions Recursive objects Recursive functions revisited Conclusion Appendix Open recursion Open recursion

Closed andOpen Recursion

RALF HINZE

Introduction

Recursivefunctions

Recursiveobjects

Recursivefunctionsrevisited

Conclusion

Appendix

Finite maps

When X and Y are sets X →fin Y denotes the set of finite maps from X toY . The domain of a finite map ϕ is denoted dom ϕ.

I the singleton map is written {x 7→ y }I dom{x 7→ y } = {x }I {x 7→ y }(x) = y

I when ϕ1 and ϕ2 are finite maps the map ϕ1, ϕ2 called ϕ1 extended byϕ2 is the finite map with

I dom (ϕ1, ϕ2) = dom ϕ1 ∪ dom ϕ2

I (ϕ1, ϕ2)(x) =

ϕ2(x) if x ∈ dom ϕ2

ϕ1(x) otherwise

23 / 23