Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Departamento de Computaci
on, FCEyN, UBA
25 de agosto de 2016
Mas extensiones
I Registros
I Declaraciones locales
I Referencias
Programacion Imperativa = Progr. Funcional + Efectos
I Recursion
I Ninguna de las extensiones vistas permite definir funciones
recursivas.
I Todas las funciones definibles hasta el momento son totales.
Tipos y terminos de ...r
Descripcion informal:
I El registro {li = Mi i1..n } eval
ua a {li = Vi i1..n } donde Vi
ua Mi , i 1..n
es el valor al que eval
I M.l: evaluar M hasta que arroje {li = Vi i1..n }, luego
proyectar el campo correspondiente
Ejemplos
M : {li : i i1..n
} j 1..n
(T-Proj)
M.lj : j
Semantica operacional de ...r
Valores
j 1..n
(E-ProjRcd)
i1..n
{li = Vi }.lj Vj
M M0
(E-Proj)
M.l M 0 .l
Mj Mj0
(E-Rcd)
i1..j1 ij+1..n
{li = Vi , lj = Mj , li = Mi }
{li = Vi i1..j1 , lj = Mj0 , li = Mi ij+1..n
}
Tipos y terminos de ...let
M ::= . . . | let x : = M in N
Descripcion informal:
I let x : = M in N: evaluar M a un valor V , ligar x a V y
evaluar N
I Mejora la legibilidad
I La extension con let no implica agregar nuevos tipos
Ejemplo
M : 1 , x : 1 N : 2
(T-Let)
let x : 1 = M in N : 2
Semantica operacional de ...let
M1 M10
(E-Let)
let x : = M1 in M2 let x : = M10 in M2
(E-LetV)
let x : = V1 in M2 M2 {x V1 }
Referencias - Motivacion
Derreferenciacion (Lectura)
!x sigue la referencia x y retorna su contenido.
Asignacion
x := M almacena en la referencia x el valor de M.
Comandos = Expresiones con efectos
Comando
Expresion que se eval
ua para causar un efecto; lo expresamos con
un nuevo valor unit.
I Un lenguaje funcional puro es uno en el que las expresiones
son puras en el sentido de carecer de efectos.
Tipos y terminos de bnu
M ::= . . . | unit
Descripcion informal:
I Unit es un tipo unitario y el u
nico valor posible de una
expresion de ese tipo es unit.
I Cumple rol similar a void en C o Java
Tipado de bnu
(T-Unit)
unit : Unit
NB:
I No hay reglas de evaluaci
on nuevas
I Extendemos el conjunto de valores V con unit
V ::= . . . | unit
Utilidad
def
M1 ; M2 = (x : Unit.M2 ) M1 x
/ FV (M2 )
I La evaluaci
on de M1 ; M2 consiste en primero evaluar M1 y
luego M2
I Con la definici
on dada, este comportamiento se logra con las
reglas de evaluaci
on definidas previamente
Expresiones de tipos
Descripcion informal:
I Ref es el tipo de las referencias a valores de tipo .
I Ej. Ref (Bool Nat) es el tipo de las referencias a funciones
de Bool en Nat.
Terminos
M ::= x
| x : .M
| MN
| unit
| ref M
| !M
| M := N
| ...
M1 :
(T-Ref)
ref M1 : Ref
M1 : Ref
(T-DeRef)
!M1 :
M1 : Ref 1 M2 : 1
(T-Assign)
M1 := M2 : Unit
Ejemplos
Recordemos que:
def
M1 ; M2 = (x : Unit.M2 ) M1 x
/ FV (M2 )
Motivacion
M | M 0 | 0
Valores
Intuicion:
l
/ Dom()
(E-RefV)
ref V | l | (l 7 V )
Los valores posibles ahora incluyen las direcciones.
V ::= unit | x : .M | l
M ::= x
| x : .M
| MN
| unit
| ref M
| !M
| M := N
| l
| ...
Juicios de tipado
l :?
| M :
Reglas de tipado - Definitivas
| M1 :
(T-Ref)
| ref M1 : Ref
| M1 : Ref
(T-DeRef)
|!M1 :
| M1 : Ref 1 | M2 : 1
(T-Assign)
| M1 := M2 : Unit
(l) =
(T-Loc)
| l : Ref
Juicios de evaluacion en un paso
M | M 0 | 0
M1 | M10 | 0
(E-App1)
M1 M2 | M10 M2 | 0
M2 | M20 | 0
(E-App2)
V1 M2 | V1 M20 | 0
(E-AppAbs)
(x : .M) V | M{x V } |
M1 | M10 | 0
(E-Deref)
!M1 | !M10 | 0
(l) = V
(E-DerefLoc)
!l | V |
Juicios de evaluacion en un paso (3/4)
M1 | M10 | 0
(E-Assign1)
M1 := M2 | M10 := M2 | 0
M2 | M20 | 0
(E-Assign2)
V := M2 | V := M20 | 0
(E-Assign)
l := V | unit | [l 7 V ]
Juicios de evaluacion en un paso (4/4)
M1 | M10 | 0
(E-Ref)
ref M1 | ref M10 | 0
l
/ Dom()
(E-RefV)
ref V | l | (l 7 V )
Ejemplo
M (ref (x : Unit.x)) |
M l1 | (l1 7 x : Unit.x)
let f =!l1 in (l1 := x : Unit.f x); (!l1 ) unit | ...
let f = x : Unit.x in (l1 := x : Unit.f x); (!l1 ) unit | ...
(l1 := x : Unit.(x : Unit.x) x); (!l1 ) unit | ...
unit; (!l1 ) unit | (l1 7 x : Unit.(x : Unit.x) x)
(!l1 ) unit | (l1 7 x : Unit.(x : Unit.x) x)
(x : Unit.(x : Unit.x) x) unit | ...
(x : Unit.x) unit | ...
unit | ...
Ejemplo
Sea
M = r : Ref (Unit Unit).
let f =!r
in (r := x : Unit.f x); (!r ) unit
Reemplazamos f por !r y nos queda
M 0 = r : Ref (Unit Unit).
(r := x : Unit.(!r ) x); (!r ) unit
M 0 (ref (x : Unit.x)) |
M 0 l1 | (l1 7 x : Unit.x)
(l1 := x : Unit.(!l1 ) x); (!l1 ) unit | ...
unit; (!l1 ) unit | (l1 7 x : Unit.(!l1 ) x)
(!l1 ) unit | ...
(x : Unit.(!l1 ) x) unit | ...
(!l1 ) unit | ...
...
Correcci
on = Progreso + Preservacion
Progreso
Si M es cerrado y bien tipado entonces
1. M es un valor
2. o bien existe M 0 tal que M M 0
Preservacion
Si M : y M N, entonces N :
Debemos reformular estos resultados en el marco de referencias.
Preservacion - Formulacion ingenua
| M : y M | M 0 | 0 implica | M 0 :
| M : y M | M 0 | 0 implica | M 0 :
Supongamos que
I M =!l
I =
I (l) = Nat
I (l) = true
Observar que
I | M : Nat y
I M | true |
I pero | true : Nat no vale.
Preservacion - Formulacion ingenua
Formulacion ingenua
| M : y M | M 0 | 0 implica | M 0 :
Supongamos que
I M =!l
I =
I (l) = Nat
I (l) = true
Observar que
I | M : Nat y
I M | true |
I pero | true : Nat no vale.
Preservacion - Reformulada
Reformulamos preservaci
on del siguiente modo.
Si | M : y M | N | 0 y | ,
entonces | N : .
Si
I | M :
I M | N | 0
I |
implica que existe 0 tal que
I |0 N :
I |0 0
Progreso - Reformulado
Ecuacion recursiva
M ::= . . . | fix M
M : 1 1
(T-Fix)
fix M : 1
Semantica operacional small-step
M1 M10
(E-Fix)
fix M1 fix M10
(E-FixBeta)
fix (x : .M) M{x fix (x : .M)}
Ejemplos
Sea M el termino
f : Nat Nat.
x : Nat.
if iszero(x) then 1 else x f (pred(x))
en
fix (x : Nat.x + 1)
Ejemplos
Sea M el termino
s : Nat Nat Nat.
x : Nat.
y : Nat.
if iszero(x) then y else succ(s pred(x) y )
en
letrec f : = x : .M in N
Por ejemplo,
letrec
fact : Nat Nat =
x : Nat.if x = 0 then 1 else x fact(pred(x))
in fact 3
letrec puede escribirse en terminos de fix del siguiente modo: