Está en la página 1de 3

Características de Lenguajes de Programación

Segundo parcial
Licenciatura en Informática • Universidad Nacional de Quilmes

28 de noviembre de 2018

Nombre y apellido: Jano & Juan

1. Compilar el siguiente término a código de la máquina abstracta vista en clase. Luego, dar la
traza del código resultante.
(λx.x)2
Solución:
El término compila de la siguiente manera:

|(λy.y)2|∅ = Pushenv; Ldi 2; Push; Mkclos (Search 1); Apply; Popenv

La traza es la siguiente:

(0, [], [], Pushenv; Ldi 2; Push; Mkclos (Search 1); Apply; Popenv)
→ (0, [[]], [], Ldi 2; ; Push; Mkclos (Search 1); Apply; Popenv)
→ (2, [[]], [], Push; Mkclos (Search 1); Apply; Popenv)
→ (2, [2, []], [], Mkclos (Search 1); Apply; Popenv)
→ (hSearch 1, []i, [2, []], [], Apply; Popenv)
→ (hSearch 1, []i, [[]], [hSearch 1, []i, 2], Search 1; Popenv)
→ (2, [[]], [hSearch 1, []i, 2], Popenv)
→ (2, [], [], ∅)

2. El siguiente término está expresado en PCF con registros:

{libre = λx.ifz x · lugares then 0 else 1, lugares = 100}

a) Reescribir el término en PCF con objetos.


b) Usar el término resultante del punto anterior en un término que tome el objeto, y reserve
un lugar en caso de haber uno.

Solución:
El término en PCF con objetos es:

O = {libre = σs.ifz s]lugares then 0 else 1, lugares = σs.100}

El término que reserva un lugar es:

reserva = λo.ifz o]libre then o(lugares ← σs.(o]lugares − 1))


3. Dar la semántica denotacional del siguiente término:

λx : nat.fix f : nat ⇒ nat.λn : nat.n + f (n − 1)

Nota: Si aparece ⊥A , tener en cuenta su tipo.


Solución:
Notar que la función λb.λc.c + b(c − 1) tiene a ⊥N→N como punto fijo, ya que (λb.λc.c + b(c −
1))⊥N→N = λc.c + ⊥N→N (c − 1) = λc.c + ⊥N = λc.⊥N = ⊥N→N , y por lo tanto, ese es el mínimo
punto fijo.
Entonces,

Jλx : nat.fix f : nat ⇒ nat.λn : nat.n + f (n − 1)K∅ = λa : N.F IX(λb : N → N.λc : N.c + b(c − 1))
= λa : N.⊥N→N
= ⊥N→N→N

4. Supongamos que tenemos un sistema de tipos para PCF (o alguna extensión al mismo) tal que
existe algún t que reduce a r, donde ` t : A pero 0 r : A. Es decir: el sistema de tipos no tiene la
propiedad de Subject Reduction. Sin embargo, supongamos que tenemos la siguiente propiedad:

Γ`t:A
Si entonces Γ ` r : B con B ≤ A (1)
t→r
Donde ≤ está definido para tipos de alguna manera que no es importante para el ejercicio.
En ese caso, podemos agregar una regla al sistema de tipos que diga:
Γ`t:B B≤A

Γ`t:A

Usar la propiedad (1) y la regla (≤) para demostrar Subject Reduction en este sistema.
Solución:
Si Γ ` t : A y t → r, por propiedad (1), tenemos que Γ ` r : B con B ≤ A. Por lo tanto, por
regla ≤, podemos deducir Γ ` r : A.

5. Considerar la siguiente fórmula lógica:

A⇒B ⇒A∧B

a) Dar un árbol de derivación en deducción natural para esa fórmula lógica.


b) Dar un término de lambda cálculo en forma normal y que tenga esa fórmula como tipo.
Luego pasarle ese término como argumento a la función identidad.
c) Dar un árbol de derivación de tipo para el término completo del punto anterior (es decir,
precedido con la identidad).
d ) Dar el árbol de derivación en deducción natural correspondiente al árbol del punto anterior.
e) Simplificar el árbol de derivación en deducción natural del ejercicio anterior, usando las
reglas provenientes de las reglas de reescritura de lambda cálculo (β y η).

Solución:

a)
[x : A] [y : B]
A B
A∧B y
B ⇒A∧B x
A⇒B ⇒A∧B

2
b) λxA .λy B .hx, yi (λz A⇒B⇒A∧B .z)λxA .λy B .hx, yi
c)

x : A, y : B ` x : A x : A, y : B ` y : B
x : A, y : B ` hx, yi : A ∧ B
z :A⇒B ⇒A∧B `z :A⇒B ⇒A∧B x : A ` λy B .hx, yi : B ⇒ A ∧ B
` λz A⇒B⇒A∧B .z : (A ⇒ B ⇒ A ∧ B) ⇒ (A ⇒ B ⇒ A ∧ B) ` λxA .λy B .hx, yi : A ⇒ B ⇒ A ∧ B
` (λz A⇒B⇒A∧B .z)λxA .λy B .hx, yi : A ⇒ B ⇒ A ∧ B

d)
[x : A] [y : B]
A B
[z : A ⇒ B ⇒ A ∧ B] A∧B y
A⇒B ⇒A∧B z B ⇒A∧B x
(A ⇒ B ⇒ A ∧ B) ⇒ (A ⇒ B ⇒ A ∧ B) A⇒B ⇒A∧B
A⇒B ⇒A∧B

e)
[x : A] [y : B]
A B
A∧B y
B ⇒A∧B x
A⇒B ⇒A∧B

6. La fórmula del ejercicio anterior es lineal, en el sentido de que cada recurso se utiliza una vez y
exactamente una vez. Si queremos escribir la versión linal de dicha fórmula, escribimos

A(B (A⊗B

O, lo que es lo mismo, ¬A ` (¬B ` (A ⊗ B)) (usando que A ( B := ¬A ` B). Demostrar que


esta fórmula es válida en Lógica Lineal.
Solución:
ax ax
A`A B`B ⊗
r
A, B ` A ⊗ B
¬r
A ` ¬B, A ⊗ B
`r
A ` ¬B ` (A ⊗ B)
¬r
` ¬A, ¬B ` (A ⊗ B)
`r
` ¬A ` (¬B ` (A ⊗ B))