guido a. macchi departamento de cs. de la computaci´on ... fileh(g(f(1))). t´ıpicamente, se...

100
Guido A. Macchi Departamento de Cs. de la Computaci´on FCEIA – UNR 1

Upload: others

Post on 27-Oct-2019

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Guido A. MacchiDepartamento de Cs. de la Computacion

FCEIA – UNR

1

Page 2: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

CounterclockwiseProductionsUnion

presenta

2

Page 3: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

CounterclockwiseProductionsUnion

presenta

Continuaciones:La Venganza del GOTO

:

3

Page 4: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

¡Llevo cuarenta anos filmarla!

4

Page 5: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

¡Llevo cuarenta anos filmarla!

Un elenco estelar: Dijkstra, Landin, Stra-chey, Scott, Reynolds, Steele, Appel y mu-chos otros.

5

Page 6: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Una crıtica unanime.

6

Page 7: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Una crıtica unanime.

Dijo Fidel ML: las continuaciones son

lo mas horrible y antinatural que puede

haber.

7

Page 8: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Primer Protagonista: el GOTO y las continuaciones

8

Page 9: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Un GOTO es, sencillamente, un salto. Haceque la ejecucion de una secuencia continueen otra instruccion distinta de la que lesigue.

9

Page 10: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Es, con seguridad, la construccion mascriticada en la historia de la informatica,luego del famoso artıculo de E. DijkstraGOTO considered harmful.

10

Page 11: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Es, con seguridad, la construccion mascriticada en la historia de la informatica,luego del famoso artıculo de E. DijkstraGOTO considered harmful.

A pesar de todo, se toleran versiones do-mesticadas, como call, return, break,o continue.

11

Page 12: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

En setiembre de 1.964, durante IFIP Work-ing Conference on Formal Language De-scription, Adriaan van Wijngaarden pro-puso una mejora en la implementacion delmecanismo para invocar funciones, mostrandoque se podıa descartar un goto.

12

Page 13: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Wijngaarden no tuvo mucho exito, y ningunode los asistentes, E. Dijkstra y Doug McIll-roy incluıdos, entendio la idea.

13

Page 14: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

De hecho, a diferencia de Wijngaarden,que quiso demostrar que un goto era in-necesario, Dijkstra dedujo que todos losgotos eran indeseables ; nace ası el con-cepto de Programacion Estructurada.

14

Page 15: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Ahora, ¿cual fue la malograda idea deWijngaarden?

15

Page 16: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Imaginemos la siguiente expresion en C :

h(g(f(1))).

16

Page 17: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Imaginemos la siguiente expresion en C :

h(g(f(1))).

Tıpicamente, se implementa como

push 1 argumento para f

call f vuelve con ret

add sp, 4 corrige la pilapush rv valor devuelto, argumento para g

call g

add sp, 4

push rv

call h

add sp, 4

donde rv es el registro en el que vuelve elvalor retornado; las funciones deben ter-minar con ret.

17

Page 18: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Al ejecutar esto, tendremos la siguientetraza.

f

ret

��000

0000

0000

00g

ret

��000

0000

0000

00h

ret

��000

0000

0000

00

main//

call

GG�������������

call

GG�������������

call

GG������������� //

18

Page 19: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Ya que el resultado de una funcion esel argumento de la siguiente, van Wijn-gaarden propuso que dicha funcion no re-tornara, sino que invocara a la siguientepasandole su resultado.

f jump//g

jump//hjump

//

main//

call @@�������

19

Page 20: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Luego de esta transformacion, las fun-ciones han dejado de serlo, ya que no re-

tornan. ¿Esta transformacion es posiblesiempre? Sı, pasandole a toda funcion unparametro extra: la funcion a la que debepasarle lo calculado.

20

Page 21: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Ahora, estas funciones representan el resto

del programa. Si generalizamos esto acualquier expresion, el resto del programaes la continuacion de dicha expresion.

La tecnica para convertir expresiones enfunciones que pasan sus resultados al restodel programa (sin volver) se conoce comoContinuation Passing Style o CPS.

21

Page 22: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Ejemplo: CPS para CBV.

22

Page 23: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Ejemplo: CPS para CBV.

x ≡ λk.k x

23

Page 24: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Ejemplo: CPS para CBV.

x ≡ λk.k xλx.E ≡ λk.k(λx.E)

24

Page 25: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Ejemplo: CPS para CBV.

x ≡ λk.k xλx.E ≡ λk.k (λx.E)M N ≡ λk.M (λf.N (λa.f a k))

25

Page 26: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Esto tiene mucha relacion con la Re-

cursion Posterior o Tail Recursion.Las continuaciones se han usado en com-

piladores (SMLofNJ), interpretes (una versionde Python), sistemas operativos (Mach),etc., con buenos resultados.

La ventaja estriba en que CPS no nece-sita stack o permite reusarlo, por lo queconsume, en gral., menos memoria.

26

Page 27: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Las continuaciones fueron redescubier-tas varias veces, en varios contextos.

• P. Landin (1.965), relacionando ALGOL60y λ–calculo..

• A. W. Mazurkiewicz (1.969), trabajandoen teorıa de automatas.

• F. L. Morris (1.970), con interpretesdefinicionales.

• Ch. Strachey y C. P. Wadsworth (1.970),en semanticas denotacionales.

• J. L. Morris (1.971), en transformacionesde ALGOL.

• J. M. Fisher (1.972), en transforma-ciones de λ–calculo.

• S. K. Abdali (1.973), en traduccionesde ALGOL a λ–calculo.

27

Page 28: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Pero, ¿que puede ocurrir si un lenguajepermite que el programador tenga acceso

a las continuaciones y manipularlas?

28

Page 29: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Entre otros, tres lenguajes que permitenesto son

• Scheme,

• Standard ML of New Jersey y

• (de manera restringida) C.

29

Page 30: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Scheme reifica las continuaciones comofunciones, usandocall-with-current-continuation

ocall/cc;

SMLofNJ lo hace concallcc y throw;

C consetjmp, longjmp y setcontext.

30

Page 31: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Un ejemplo en C.

#include <stdio.h>

#include <setjmp.h>

jmp_buf buf;

void f()

{

puts("entramos! ");

longjmp(buf, 1);

puts("salimos! ");

}

int main()

{

if(setjmp(buf)!=0) {

puts("auch! "); return 0;

}

puts("uno! "); f(); puts("dos! ");

return 0;

}

31

Page 32: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Un ejemplo en C.

#include <stdio.h>

#include <setjmp.h>

jmp_buf buf;

void f()

{

puts("entramos! ");

longjmp(buf, 1);

puts("salimos! ");

}

int main()

{

if(setjmp(buf)!=0) {

puts("auch! "); return 0;

}

puts("uno! "); f(); puts("dos! ");

return 0;

}

Aparece uno! entramos! auch!.

32

Page 33: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Un ejemplo con Scheme. La expresion

(call/cc(lambda(k) (+ 3 (k 4))))

evalua a 4.La continuacion k funciona como un goto

con valores.

33

Page 34: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

La continuacion anterior ha “saltado”hacia adelante (downward continuation).Pero, ¿y si devolvemos la continuacion comovalor (upward continuation)? Pues, ¡te-nemos la posibilidad de iterar!

34

Page 35: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

(Ejemplo MUY oscuro).

35

Page 36: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

(Ejemplo MUY oscuro).

(define call/cc

call-with-current-continuation)

36

Page 37: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

(Ejemplo MUY oscuro).

(define call/cc

call-with-current-continuation)

(define (iter proc)

(let

((vamos (call/cc (lambda(k) k))))

(begin

(proc)

(vamos vamos))))

37

Page 38: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

(Ejemplo MUY oscuro).

(define call/cc

call-with-current-continuation)

(define (iter proc)

(let

((vamos (call/cc (lambda(k) k))))

(begin

(proc)

(vamos vamos))))

(define (kosa) (display "cosa"))

38

Page 39: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

(Ejemplo MUY oscuro).

(define call/cc

call-with-current-continuation)

(define (iter proc)

(let

((vamos (call/cc (lambda(k) k))))

(begin

(proc)

(vamos vamos))))

(define (kosa) (display "cosa"))

(iter kosa)

39

Page 40: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

(Ejemplo MUY oscuro).

(define call/cc

call-with-current-continuation)

(define (iter proc)

(let

((vamos (call/cc (lambda(k) k))))

(begin

(proc)

(vamos vamos))))

(define (kosa) (display "cosa"))

(iter kosa)

Al evaluarse aparece cosacosacosacosa· · ·

40

Page 41: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Las continuaciones permiten implemen-tar pseudoparalelismo facilmente; de he-cho, Concurrent ML lo hace ası.

41

Page 42: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Veamos un ejemplo de yield de Python,para generar secuencias lazy, en C.

42

Page 43: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Primero, las cabeceras.

#include <stdio.h>

#include <stdlib.h>

#include <setjmp.h>

#include <assert.h>

43

Page 44: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Luego algunas definiciones.

#include <stdio.h>

#include <stdlib.h>

#include <setjmp.h>

#include <assert.h>

#define TSTACK 4096

#define FIN ((int*)1)

typedef void *V, (*PF)(int, int, int);

44

Page 45: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Las continuaciones, con setjmp y longjmp.

#include <stdio.h>

#include <stdlib.h>

#include <setjmp.h>

#include <assert.h>

#define TSTACK 4096

#define FIN ((int*)1)

typedef void *V, (*PF)(int, int, int);

#define TRANSFER(o, d, r) \

({ V _ret_; \

((_ret_=(V)setjmp(o))==NULL? \

((longjmp(d, (int)r), NULL)): \

_ret_); })

45

Page 46: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Ahora, el programa. Las variables globa-les y funciones a usar.

jmp_buf t_iter, t_body;

void stack(int iter, jmp_buf buf,

PF f, int b, int e, int inc)

{

if(iter==0) {

alloca(TSTACK);

stack(!iter, buf, f, b, e, inc);

}

else if(setjmp(buf)!=0) {

f(b, e, inc);

assert("return en task!");

}

}

#define ITER(buf, f, b, e, inc) \

stack(0, buf, f, b, e, inc)

46

Page 47: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Finalmente, como se usa esto.

void iter(int b, int e, int inc)

{

static int i;

for(i=b; i<e; i+=inc)

TRANSFER(t_iter, t_body, &i);

TRANSFER(t_iter, t_body, FIN);

}

int main()

{

ITER(t_iter, iter, 700, 1000, 3);

for(;;) {

int *res;

res=TRANSFER(t_body, t_iter, 1);

if(res==FIN) break;

printf("%d\n", *res);

}

return 0;

}

47

Page 48: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Otras Protagonistas: las Logicas Intuicionistas

48

Page 49: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Surgen como reaccion a las paradojasde la Teorıa de Conjuntos, principalmentegracias a L. E. J. Brouwer.

49

Page 50: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Surgen como reaccion a las paradojasde la Teorıa de Conjuntos, principalmentegracias a L. E. J. Brouwer.

Continuadas por matematicos y logicoscomo Poincare, Lebesgue, Heyting, Godel,Gentzen, Kolmogorov, Martin–Lof, etc.

50

Page 51: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Todas toman como base evitar el usodel Principio del Tercero Excluido, axiomafundamental para las demostraciones porel absurdo. Las logicas intuicionistas soloadmiten demostraciones constructivas.

51

Page 52: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Veamos un ejemplo. Existen irracionales

a y b, tales que ab es racional.

52

Page 53: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Veamos un ejemplo. Existen irracionales

a y b, tales que ab es racional.

Demostracion (por el absurdo): conside-

remos√

2√

2. Por el principio del tercero

excluido, este numero sera racional o irra-cional. En el primer caso, basta tomar a =b =

√2; en el segundo caso, basta tomar

a =√

2√

2y b =

√2, pues

√2√

2

√2

= 2.

53

Page 54: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Veamos un ejemplo. Existen irracionales

a y b, tales que ab es racional.

Demostracion (por el absurdo): conside-

remos√

2√

2. Por el principio del tercero

excluido, este numero sera racional o irra-cional. En el primer caso, basta tomar a =b =

√2; en el segundo caso, basta tomar

a =√

2√

2y b =

√2, pues

√2√

2

√2

= 2.La demostracion es impecable, pero no

sabemos si√

2√

2es racional o no.

54

Page 55: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Hay otros ejemplos notables, tales comola paradoja de Banach–Tarski, etc.

55

Page 56: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Un ejemplo de logica intuicionista es ladesarrollada por Gentzen (1.934).

56

Page 57: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Un ejemplo de logica intuicionista es ladesarrollada por Gentzen (1.934).

Usa como reglas

Γ ⊢ A ⇒ A, ID.

Γ, B ⊢ AΓ ⊢ B ⇒ A

,−I.

Γ ⊢ B ⇒ A ∆ ⊢ AΓ, ∆ ⊢ A

,−E.

Γ ⊢ A ∆ ⊢ BΓ, ∆ ⊢ A ∧ B

,∧ − I.

Γ ⊢ A Γ ⊢ BΓ ⊢ A

,∧ − E1.

Γ ⊢ A Γ ⊢ BΓ ⊢ B

,∧ − E2.

57

Page 58: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

El λ–calculo

58

Page 59: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

El λ–calculo es creado por A. Churchen la decada del 30, con el proposito deservir como fundamento para la logica ylas matematicas. Es una teorıa sumamentebasica de las funciones.

59

Page 60: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Sus componentes son las expresiones λ:

• variables x, y, · · · z,

• abstracciones λx.E, y

• aplicaciones E1 E2.

60

Page 61: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Las transformaciones admisibles sobre es-tos terminos son

• α–conversion, λx.E ≡ λy.E, si y 6∈FV (E);

61

Page 62: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Las transformaciones admisibles sobre es-tos terminos son

• α–conversion, λx.E ≡ λy.E, si y 6∈FV (E);

• β–reduccion, (λx.M) N ≡ M [N/x];

62

Page 63: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Las transformaciones admisibles sobre es-tos terminos son

• α–conversion, λx.E ≡ λy.E, si y 6∈FV (E);

• β–reduccion, (λx.M) N ≡ M [N/x];

• η–abstraccion, M ≡ λx.M , si x 6∈FV (M).

63

Page 64: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Las transformaciones admisibles sobre es-tos terminos son

• α–conversion, λx.E ≡ λy.E, si y 6∈FV (E);

• β–reduccion, (λx.M) N ≡ M [N/x];

• η–abstraccion, M ≡ λx.M , si x 6∈FV (M).

Se dice que una expresion lambda esta enforma normal cuando no se pueden llevara cabo mas β–reducciones.

64

Page 65: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

El intento de basar la logica en este calculofallo al ser patente la existencia de expre-siones que nunca llegan a una forma nor-mal; ejemplo

(λx.xx)(λx.xx).

65

Page 66: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

El intento de basar la logica en este calculofallo al ser patente la existencia de expre-siones que nunca llegan a una forma nor-mal; ejemplo

(λx.xx)(λx.xx).

Church uso el mismo metodo que B. Rus-sell empleo para eliminar errores similaresen la teorıa de Frege: imponer a las expre-siones λ un sistema de tipos que impidanconstruir terminos como el anterior.

66

Page 67: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Las reglas del λ–calculo simplemente tipado(1.940).

x : A ⊢ x : A Id

Γ, x : B ⊢ t : AΓ ⊢ λx.t : B → A −I

Γ ⊢ t : B → A ∆ ⊢ u : BΓ, ∆ ⊢ t(u) : A

−E

Γ ⊢ x : A ∆ ⊢ y : BΓ, ∆ ⊢ 〈x, y〉 : A ∧ B ∧I

Γ ⊢ t : A ∧ BΓ ⊢ fst(t) : A

∧E1Γ ⊢ t : A ∧ BΓ ⊢ snd(t) : B

∧E2

La β–reduccion preserva la derivacion de tipos.

67

Page 68: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Habran notado cuan parecidas son lasreglas de la deduccion natural intuicionistacon las reglas del λ–calculo simplementetipado.

68

Page 69: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Habran notado cuan parecidas son lasreglas de la deduccion natural intuicionistacon las reglas del λ–calculo simplementetipado. Esto fue notado por H. Curry en1.956, quien conjeturo una corresponden-cia entre ambos sistemas, corresponden-cia finalmente demostrada por Howard en1.969.

69

Page 70: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

El homomorfismo de Howard–Curry

Proposiciones ↔ TiposDemostraciones ↔ Programas

70

Page 71: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

El homomorfismo de Howard–Curry

Proposiciones ↔ TiposDemostraciones ↔ Programas

o, con mas precision,

p es una prueba de la proposicion Φp es un valor del tipo Φ

p es un programa que cumple la especificacion Φ

71

Page 72: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

¡Esto puede ser la respuesta al problemade adecuacion de las implementaciones alas especificaciones!

De hecho, varias escuelas han hecho grandesprogresos siguiendo esta lınea (Alf, Coq,etc.).

72

Page 73: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

¡Esto puede ser la respuesta al problemade adecuacion de las implementaciones alas especificaciones!

De hecho, varias escuelas han hecho grandesprogresos siguiendo esta lınea (Alf, Coq,etc.).

Subsisten serias dificultades, pero es unavance real.

73

Page 74: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Volvamos a las demostraciones por el ab-surdo. Es evidente que no pueden servirde base para extraer programas...

74

Page 75: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Volvamos a las demostraciones por el ab-surdo. Es evidente que no pueden servirde base para extraer programas...

¿Es realmente evidente?

75

Page 76: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

El fundamento para las demostracionespor el absurdo es el Principio del TerceroExcluido, o lo mismo, la negacion de ne-gacion:

¬¬A ≡ A.

Informalmente, dos negaciones afirman.

76

Page 77: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

En 1.990, Timothy Griffin estudio unaextension, hecha por M. Felleisen, del λ–calculo aumentado con dos operaciones, C(capture) y A (abort), similares a callccy throw de ML.

77

Page 78: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Al λ–calculo definido por

N ::= x | λx.N | NN

le agrega

N ::= · · · | A(N) | C(N).

A fin de darles semantica a A y C, seexplicita el contexto en que operan las ex-presiones λ; si este contexto se denota conE[X ], se tiene

E[C(M)] 7→C Mλz.A(E[z]),

A(M) ≡ C(λd.M)

con d libre en M . Con esto se tiene queE[A(M)] 7→A M .

78

Page 79: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Si queremos un call/cc a la Schemepodemos tomar

(call/cc M) = C(λk.k(Mk)).

79

Page 80: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

¿Que tipos les asociaremos a C y a A?

80

Page 81: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

¿Que tipos les asociaremos a C y a A?Volvamos a la regla

E[C(M)] 7→C Mλz.A(E[z]).

81

Page 82: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

¿Que tipos les asociaremos a C y a A?Volvamos a la regla

E[C(M)] 7→C Mλz.A(E[z]).

Imaginemos que E espera un valor detipo B y E[−] espera otro de tipo A; pode-mos asignar a λz.A(E[z]) el tipo A → B

82

Page 83: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

¿Que tipos les asociaremos a C y a A?Volvamos a la regla

E[C(M)] 7→C Mλz.A(E[z]).

Imaginemos que E espera un valor detipo B y E[−] espera otro de tipo A; pode-mos asignar a λz.A(E[z]) el tipo A → B

Ahora, M debe tener como tipo (A →B) → B; concluımos que C debe tenertipo A.

83

Page 84: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Si N es in termino de tipo B, a A(N) =C(λz.N) le podemos dar cualquier tipo

A.

84

Page 85: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Si N es in termino de tipo B, a A(N) =C(λz.N) le podemos dar cualquier tipo

A.Ahora, si queremos interpretar los tipos

como proposiciones, B debe correspondera una proposicion sin demostracion. Pode-mos asignarle ⊥.

85

Page 86: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Si N es in termino de tipo B, a A(N) =C(λz.N) le podemos dar cualquier tipo

A.Ahora, si queremos interpretar los tipos

como proposiciones, B debe correspondera una proposicion sin demostracion. Pode-mos asignarle ⊥.

Definimos

¬A ≡ A → ⊥.

86

Page 87: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

De aquı, tenemos que, si M tiene tipo¬¬A, C(M) tiene tipo A. Logicamente,corresponde a la regla de eliminacion dedoble negacion

¬¬AA

.

87

Page 88: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Extensiones y profundizaciones fueron hechaspor Ch. Murthy, Parigot, J. Krivine, A.Filinski, H. Thielecke, etc.

88

Page 89: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

No todas son rosas: hay demostracionesque no terminan; esto es, no generan pro-gramas.

Los programas clasicos no son observa-cionalmente congruentes con su traduccionCPS.

89

Page 90: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Un ejemplo: la sucesion de Fibonacci,H. Schwichtenberg, usando MINLOG.

90

Page 91: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Un ejemplo: la sucesion de Fibonacci,H. Schwichtenberg, usando MINLOG.

Usaremos el cuantificador existencial clasico:

∃x.p(x) ≡def ¬(∀x.¬p(x)).

91

Page 92: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

De la prueba de

∀n∃clkG(n, k),

92

Page 93: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

De la prueba de

∀n∃clkG(n, k),

se extrae el siguiente algoritmo (mostradoen Scheme):

93

Page 94: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

(define (fibo n)

(fibo1 n (lambda (k 1) k)))

(define (fibo1 n1 f)

(if (= n1 0)

(f 0 1)

(fibo1 (- n 1)

(lambda (k 1) (f 1 (+ k 1))))))

94

Page 95: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Ahora, con sinceridad...

95

Page 96: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Ahora, con sinceridad...Lo anterior, que puede ser sino

96

Page 97: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Ahora, con sinceridad...Lo anterior, que puede ser sino

LA VENGANZA DEL GOTO

97

Page 98: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

Bibliografıa y URLs de interesJohn Reynolds (1.997), Theories of Programming Languages

Cambridge University Press.Andrew Appel (1.991), Compiling with Continuations Cam-

bridge University Press.Timothy G. Griffin, A formmulæ–as–types notion of control Con-

ference Record of the Seventeenth Anual ACM Symposium on Prin-ciples of Programming Languages (1.990).

Chetan Murthy, Extracting constructive content from classical

proofs Technical Report 90–1151, Dep. of Comp. Science, CornellUniv., Ithaca, NY.

Helmut Schwichtenberg, Program Extraction from Proofs Mathe-matisches Institut der Universitat Munchen, Sommersemester,2002.

Phil Wadler Home Page.

Andrzej Filinski Home Page.

Hayo Thielecke Home Page.

98

Page 99: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

¿Preguntas?

99

Page 100: Guido A. Macchi Departamento de Cs. de la Computaci´on ... fileh(g(f(1))). T´ıpicamente, se implementa como push 1 argumento para f call f vuelve con ret add sp, 4 corrige la pila

¡Muchas gracias!

100