4. FLC: una sem´ antica operacional de bajo nivel
4.2. Relaci´ on con CRWL
5.1.3. Adecuaci´ on de la let reescritura a CRWL
En este apartado probaremos la correcci´on y la completitud de la let -reescritura res- pecto al c´alculo de pruebas de CRWL.
5.1.3 Adecuaci´on de la let-reescritura a CRWL 89
Correcci´on: CRWLlet
Respecto a la correcci´on nos gustar´ıa poder llegar a un resultado como el siguiente: Dados e, e0∈ Exp, si e →le0 entonces [[e0]]CRW L ⊆ [[e]]CRW L
El problema es que los let’s no est´an definidos en CRWL y que, a´un partiendo de una expresi´on sin let’s, la let -reescritura puede introducirlos mediante la regla (LetIn). Para superar esta dificultad extendemos el c´alculo CRWL de la figura3.2a˜nadiendo una nueva regla para tratar con los let’s:
(Let) e1 _ t1 e[X/t1]_ t let X = e1 in e_ t
Llamamos al c´alculo resultante CRWLlet. Escribimos P `CRW Llet e _ t como notaci´on de la CRW Llet derivabilidad, y definimos la denotaci´on de una expresi´on e ∈ LExp⊥res-
pecto al programa P como [[e]]PCRW L
let = {t ∈ CT erm⊥ | P `CRW Llet e_ t}. Omitiremos los super´ındices y/o sub´ındices en las denotaciones de expresiones cuando se deduzcan claramente del contexto.
Es muy f´acil establecer una relaci´on entre CRW L y CRW Llet para expresiones des-
provistas de let’s:
Lema 5.1.4 (Equivalencia de CRWL y CRWLlet). Para cualquier CRWL-program P,
e ∈ Exp⊥ y t ∈ CT erm⊥, se tiene
P `CRWL e_ t sii P `CRWLlet e_ t. Por tanto [[e]]
P
CRW L= [[e]]PCRW Llet
Demostraci´on. Como toda CRW L-prueba es tambi´en una CRW Llet-prueba, es obvio que
P `CRW L e_ t implica P `CRW Llet e_ t. Por otra parte si P `CRW Llet e _ t, como e ∈ Exp⊥ (por tanto no contiene let’s) y ninguna regla de CRWLlet introduce nuevos let’s,
entonces P `CRW Llet e_ t es tambi´en una CRW L-prueba.
Al ser CRWLlet una extensi´on del c´alculo de pruebas de CRWL a˜nadiendo una sola
regla muy sencilla, es muy tambi´en sencillo ampliar los resultados existentes para CRWL al c´alculo de pruebas de CRWLlet. Algunas propiedades de CRWLlet heredadas de CRWL
son las siguientes:
Lema 5.1.5. Sea e ∈ LExp⊥, entonces |e| ∈ [[e]].
Lema 5.1.6 (CRWLlet es cerrado bajo c-sustituciones). Para todo e ∈ LExp⊥,
t ∈ CT erm⊥, θ ∈ CSubst⊥ se tiene que P `CRW Llet e_ t implica P `CRW Llet eθ _ tθ. Demostraci´on. Como esta propiedad ya ha sido comprobada para CRWL (ver lema3.2.2, p´agina 44) solamente nos queda comprobar el caso de la regla (Let), continuando con la inducci´on sobre el tama˜no de la CRWLlet-prueba de P `CRW Llet e _ t. Entonces tendr´ıamos e ≡ let X = e1 in e2 y una prueba de la forma:
e1 _ t1 e2[X/t1]_ t let X = e1 in e2_ t
Let Dada θ ∈ CSubst⊥, eθ ≡ let X = e1θ in e2θ, luego
e1θ_ t1θ HI e 2θ[X/t1θ] ≡ e2[X/t1]θ_ tθ HI let X = e1θ in e2θ_ tθ Let
90 5. Let-reescritura
Podemos afirmar que e2θ[X/t1θ] ≡ e2[X/t1]θ por el lema 5.1.1 (p´agina 81) ya que X 6∈
dom(θ) y X 6∈ vRan(θ) debido a la convenci´on de variables.
Tambi´en podemos formular f´acilmente un lema de monoton´ıa de las CRWLlet pruebas,
ya que ⊥ est´a presente en la sintaxis de CRWLlety por tanto podemos basarnos en ´el para
definir un orden, como hicimos en CRWL. Por tanto extendemos la noci´on de orden de aproximaci´on de CRWL a la sintaxis con let’s de la siguiente manera3:
Definici´on 5.1.6 (Orden de aproximaci´on para LExp⊥). Definimos v⊆ LExp⊥×
LExp⊥ como el menor orden parcial que verifica:
⊥v e, ∀e ∈ LExp⊥
h(e1, . . . , en) v h(e01, . . . , e0n) si h ∈ DC ∪ F S y ∀i ∈ {1, . . . , n} eiv e0i
let X = e1 in e v let X = e2 in e0 si e1v e2 y e v e0
Algunas propiedades del orden de aproximaci´on sobre let -expresiones:
Lema 5.1.7. Dados θ ∈ LSubst⊥, e, e0 ∈ LExp⊥, tal que e v e0 entonces eθ v e0θ.
Demostraci´on. El caso e ≡ e0 es trivial. Probemos el caso en que e @ e0 por inducci´on en la estructura de e.
e ≡⊥: trivial
e ≡ h(e1, . . . , en): entonces e0 ≡ h(e01, . . . , e0n) tal que ∀i ∈ {1, . . . , n} ei v e0i.
Por HI o porque ei ≡ e0i tenemos que ∀i eiθ v e0iθ, luego eθ ≡ h(e1θ, . . . , enθ) v
h(e01θ, . . . , e0nθ) ≡ e0θ.
e ≡ let X = e1 in e2: entonces e0 ≡ let X = e01 in e20 tal que e1 v e01 y e2 v e02.
Por HI o porque ei ≡ e0i tenemos que ∀i ∈ {1, 2} eiθ v e0iθ, luego eθ ≡ let X =
e1θ in e2θ v let X = e01θ in e02θ ≡ e0θ.
Lema 5.1.8. Dados θ, θ0 ∈ LSubst⊥, e ∈ LExp⊥, tal que θ v θ0 entonces eθ v eθ0.
Demostraci´on. Una sencilla inducci´on en la estructura de las let -expresiones.
Lema 5.1.9. Para todo e, e0 ∈ LExp⊥, C ∈ Cntxt, |e| v |e0| implica que |C[e]| v |C[e0]|.
Demostraci´on. Procedemos por inducci´on en la estructura de C: Caso base :
C ≡ []: Entonces C[e] ≡ e, y ya hemos terminado por la hip´otesis Paso inductive :
C ≡ let X = C0 in e1, por tanto C[e] ≡ let X = C0[e] in e1. Entonces:
|C[e]| = |let X = C0[e] in e
1| = |e1|[X/|C0[e]|]
vIH(∗) |e1|[X/|C0[e0]|] = |let X = C0[e0] in e1| = |C[e0]|
(∗) Por HI tenemos que |C0[e]| v |C0[e0]|, por tanto [X/|C0[e]|] v [X/|C0[e0]|]. Finalmente, por el lemma 5.1.8, |e1|[X/|C0[e]|] v |e1|[X/|C0[e0]|].
5.1.3 Adecuaci´on de la let-reescritura a CRWL 91
C ≡ let X = e1 in C0, por tanto C[e] ≡ let X = e1 in C0[e]. Entonces:
|C[e]| = |let X = e1 in C0[e]| = |C0[e]|[X/|e1|]
vIH(∗) |C0[e0]|[X/|e1|] = |let X = e1 in C0[e0]| = |C[e0]|
(∗) Por HI tenemos que |C0[e]| v |C0[e0]|, por tanto por el lemma 5.1.7, |C0[e]| [X/|e1|] v |C0[e0]|[X/|e1|]
C ≡ h(. . . , C0, . . .), por tanto C[e] ≡ h(. . . , C0[e], . . .). Tenemos dos posibilidades:
a) h = f ∈ F S: Entonces |C[e]| =⊥v |C[e0]| b) h = c ∈ DC: Entonces:
|C[e]| = |c(e1, . . . , C0[e], . . . , en)| = c(|e1|, . . . , |C0[e]|, . . . , |en|)
vHI c(|e1|, . . . , |C0[e0]|, . . . , |en|) = |c(e1, . . . , C0[e0], . . . , en)| = |C[e0]|
Lema 5.1.10 (Monoton´ıa de CRWLlet). Sean e, e0∈ LExp⊥, t, t0 ∈ CT erm⊥ tales que
e v e0 y t w t0. Si P `CRW Llet e _ t entonces P `CRW Llet e
0
_ t
0 con una CRWL let
prueba del mismo tama˜no o menor.
Demostraci´on. Podemos hacer una prueba exactamente igual que la del lema 3.2.2, por inducci´on en la estructura de la prueba, a˜nadiendo el caso de la regla (Let). Entonces tenemos e ≡ let X = e1 in e2, e0 ≡ let X = e01 in e20 tal que e1 v e01 y e2 v e02 y una
prueba:
e1 _ t1 e2[X/t1]_ t let X = e1 in e2_ t
Let Como e1 v e01 por HI tenemos P `CRW Llet e
0
1 → t1. Por otra parte como e2v e02 entonces
por el lema 5.1.7 tenemos que e2[X/t1] v e02[X/t1], luego por HI tenemos P `CRW Llet
e02[X/t1] → t0, y por tanto: e01 _ t1 e 0 2[X/t1]_ t 0 let X = e01 in e02_ t0 Let
Utilizando este nuevo c´alculo podemos formular nuestro teorema de correcci´on como: Teorema 5.1.1 (Correcci´on de un paso de let -reescritura). Para todo e, e0 ∈ LExp, si e →l e0 entonces [[e0]]CRW Llet ⊆ [[e]]CRW Llet
Es decir, que cada paso de let -reescritura es correcto respecto a la sem´antica de CRWLlet. N´otese que debido al indeterminismo no podemos reemplazar ⊆ con = en este
teorema.
La demostraci´on del teorema 5.1.1 podr´ıa hacerse directamente mediante una distinci´on de casos sobre las reglas de la let -reescritura si el siguiente resultado de monoton´ıa bajo contextos, fuese cierto para cualquier contexto C:
[[e]]CRW Llet ⊆ [[e
0]]
CRW Llet implica [[C[e]]]CRW Llet ⊆ [[C[e
0]]]
CRW Llet
Desgraciadamente esta propiedad es falsa debida a la posible captura de variables al pasar de e a C[e], como podemos ver en el siguiente contraejemplo:
92 5. Let-reescritura Contraejemplo 5.1.3. P = {f (0) = 1} entonces [[f (Xp)]]CRW Llet = {⊥} ⊆ {0, ⊥} = [[0]]CRW Llet pero
[[let Xp = 0 in f (Xp)]]CRW Llet = {1, ⊥} 6⊆ {0, ⊥} = [[let Xp= 0 in 0]]CRW Llet
El problema es que si e fuese introducido en un contexto de la forma let Xp= a0 in C,
entonces ´este podr´ıa llegar a necesitar informaci´on sobre la ligadura para Xp, para progre-
sar correctamente. Por tanto para probar el teorema 5.1.1 necesitamos un resultado m´as fuerte que muestre que la sem´antica se preserva bajo sustituciones. Para formalizar esta idea debemos introducir algunas nociones nuevas:
Definici´on 5.1.7 (Hipersem´antica).
i) La hipersem´antica [[[e]]]CRW Llet de una expresi´on e ∈ LExp⊥ es una aplicaci´on del
conjunto de c-sustituciones parciales al conjunto de las partes de CT erm⊥, definida
como:
[[[e]]]CRW Lletθ = [[eθ]]CRW Llet.
ii) Las hipersem´anticas de expresiones est´an ordenadas como sigue:
[[[e1]]]CRW Llet b [[[e2]]]CRW Llet sii [[e1θ]]CRW Llet ⊆ [[e2θ]]CRW Llet, ∀θ ∈ CSubst⊥.
En otras palabras, [[[e1]]]CRW Llet b [[[e2]]]CRW Llet sii ∀θ ∈ CSubst⊥, P `CRWLlet e1θ_ t implica P `CRWLlet e2θ_ t.
La propiedad de monoton´ıa deseada s´ı que se cumple para hipersem´anticas:
Lema 5.1.11 (Monoton´ıa bajo contextos de la hipersem´antica). Para cualquier e, e0 ∈ LExp⊥, y cualquier contexto C se tiene:
[[[e]]]CRW Llet b [[[e
0]]]
CRW Llet implica [[[C[e]]]]CRW Llet b [[[C[e
0]]]]
CRW Llet
Demostraci´on. Por inducci´on en la estructura del contexto C. Caso base :
C ≡ []: entonces C[e] ≡ e y C[e0] ≡ e0, por lo que el lema se cumple por la hip´otesis.
5.1.3 Adecuaci´on de la let-reescritura a CRWL 93
C ≡ let X = C0 in e1: por tanto C[e] ≡ let X = C0[e] in e1, C[e0] ≡ let X =
C0[e0] in e
1. Sea θ ∈ CSubst⊥ tal que (let X = C0[e] in e1)θ_ t, entonces debe de ser por la regla Let y por tanto tenemos:
(C0[e])θ_ t1 e1θ[X/t1]_ t let X = (C0[e])θ in e1θ_ t
Let
como [[[e]]] b [[[e0]]], por hip´otesis de inducci´on (ya que C0 es parte de C) tenemos que [[[C0[e]]]] b [[[C0[e0]]]] y por tanto ((C0[e])θ _ t1) implica ((C0[e0])θ _ t1). Entonces: (C0[e0])θ_ t1 HI e1θ[X/t1]_ t Hip let X = (C0[e0])θ in e1θ_ t Let
C ≡ let X = e1 in C0: por tanto C[e] ≡ let X = e1 in C0[e]. Sea θ ∈ CSubst⊥
tal que (let X = e1 in C0[e])θ_ t, entonces debe de ser por la regla Let y por tanto tenemos: e1θ_ t1 (C 0[e])θ[X/t 1]_ t let X = e1θ in (C0[e])θ_ t Let
como [[[e]]] b [[[e0]]] por hip´otesis de inducci´on tenemos que [[[C0[e]]]] b [[[C0[e0]]]], y como ([X/t1] ◦ θ) ∈ CSubst⊥, entonces (C0[e0])θ[X/t1]_ t y por tanto:
e1θ_ t1 Hip (C0[e0])θ[X/t1]_ t HI let X = e1θ in (C0[e0])θ_ t Let C ≡ h(. . . , C0, . . .): por tanto C[e] ≡ h(. . . , C0[e], . . .). Sea θ ∈ CSubst
⊥ tal que
h(. . . , C0[e], . . .)θ_ t. Hay dos posibilidades:
a) h ≡ f ∈ F S: entonces la regla aplicada ha debido de ser OR y tenemos: e1θ_ t1 . . . (C 0[e])θ _ t 0 . . . e nθ_ tn r _ t f (e1θ, . . . , (C0[e])θ, . . . , enθ)_ t OR
donde (f (t1, . . . , t0, . . . , tn) = r) ∈ [P]⊥. Como [[[e]]] b [[[e0]]] por hip´otesis
de inducci´on tenemos que [[[C0[e]]]] b [[[C0[e0]]]], entonces (C0[e0])θ _ t0 y por tanto: e1θ_ t1 Hip . . . (C0[e0])θ_ t 0 HI . . . e nθ_ tn Hip r_ t Hip f (e1θ, . . . , (C0[e0])θ, . . . , enθ)_ t OR b) h ≡ c ∈ CS: entonces la regla aplicada ha debido de ser DC y tenemos:
e1θ_ t1 . . . (C 0[e])θ _ t 0 . . . e nθ_ tn c(e1θ, . . . , (C0[e])θ, . . . , enθ)_ c(t1, . . . , t 0, . . . , t n) DC
Como [[[e]]] b [[[e0]]] por hip´otesis de inducci´on tenemos que [[[C0[e]]]] b [[[C0[e0]]]], entonces (C0[e0])θ_ t 0 y por tanto: e1θ_ t1 Hip . . . (C0[e0])θ_ t0 HI . . . enθ_ tn Hip c(e1θ, . . . , (C0[e0])θ, . . . , enθ)_ c(t1, . . . , t 0, . . . , t n) DC
94 5. Let-reescritura
La idea ahora es probar para hipersem´anticas un resultado an´alogo al del teorema
5.1.1 para que ´este se convierta entonces en un sencillo corolario del nuevo resultado. Dicho resultado podr´ıa formularse de la siguiente manera:
Teorema 5.1.2 (Hipercorrecci´on de un paso de let -reescritura). Para todo e, e0 ∈ LExp
e →le0 implica [[[e0]]]CRWLlet b [[[e]]]CRWLlet
Demostraci´on. Procederemos suponiendo θ ∈ CSubst⊥ tal que P `CRW Llet e
0θ
_ t, y probando entonces que P `CRW Llet eθ_ t. El caso en que P `CRW Llet e
0θ
_⊥ se cumple trivialmente aplicando la regla (B), por lo que en el resto de la demostraci´on supondremos que t 6≡⊥. Procederemos por distinci´on de casos sobre la regla de let -reescritura aplicada en e →le0:
(Contx) Si C[e] →l C[e0] porque e →l e0, siempre supondremos que en e →l e0 no se
ha aplicado (Contx), porque si ´esta hubiera sido aplicada entonces tendr´ıamos e ≡ C0[e1] →l C0[e2] ≡ e0 con e1 →le2, y por tanto podr´ıamos definir C00[] ≡ C[C0[]] y
C00[e
1] ≡ C[C0[e1]] ≡ C[e] →l C[e0] ≡ C[C0[e2]] ≡ C00[e2]. Podemos repetir este proceso
asegurando que (Contx) no fue aplicada en e →le0. Por tanto, por la prueba de los
otros casos, [[[e0]]] b [[[e]]],y por el lema5.1.11, [[[C[e0]]]] b [[[C[e]]]].
(Elim) Supongamos que let X = e1 in e2 →l e2 y θ ∈ CSubst⊥ tal que P `CRW Llet
e2θ_ t. Entonces podemos construir la siguiente CRWLlet prueba: e1θ_⊥ B e2θ[X/ ⊥] ≡ e2θ_ t Hip let X = e1θ in e2θ_ t Let
Por la convenci´on de variables, X 6∈ vRan(θ). Entonces como por la condici´on en (Elim), X 6∈ F V (e2), entonces X 6∈ F V (e2θ) y por tanto e2θ[X/ ⊥] ≡ e2θ.
(Bind) Supongamos que let X = t1 in e →le[X/t1] y θ ∈ CSubst⊥ tal que P `CRWLlet
(e[X/t1])θ_ t. Entonces podemos construir la siguiente CRWLlet prueba: t1θ_ t1θ DC∗ eθ[X/t1θ] ≡ (e[X/t1])θ_ t Hip let X = t1θ in eθ_ t Let
Por la convenci´on de variables tenemos que X 6∈ dom(θ) and X 6∈ vRan(θ)4 , por tanto por el lema5.1.1tenemos que eθ[X/t1θ] ≡ (e[X/t1])θ. Por lo dem´as, la “regla”
[DC∗] se refiere al hecho de que ∀t ∈ CT erm⊥ P `CRW Llet t _ t (muy f´acil de demostrar por inducci´on en la estructura de t).
4En realidad para demostrar este teorema correctamente no nos podemos restringir a cumplir estas
restricciones, as´ı que en realidad renombramos las variables ligadas al estilo de la α-conversion y empleamos la equivalencia e[X/t] ≡ e[X/Y ][Y /t] (con Y la nueva variable ligada), para poder usar la hip´otesis
5.1.3 Adecuaci´on de la let-reescritura a CRWL 95
(Flat) Supongamos que let X = (let Y = e1 in e2) in e3 →l let Y = e1 in (let X =
e2 in e3) y θ ∈ CSubts⊥ tal que P `CRWLlet (let Y = e1 in (let X = e2 in e3))θ _ t. Entonces la prueba debe ser de la forma:
e1θ_ t1 e2θ[Y /t1]_ t2 (e3θ[Y /t1] ≡ e3θ)[X/t2]_ t (let X = e2θ in e3θ)[Y /t1]_ t Let let Y = e1θ in (let X = e2θ in e3θ)_ t Let
para alg´un t1, t2 ∈ CT erm⊥. Por la convenci´on de variables tenemos que Y 6∈
vRan(θ), por tanto, como Y 6∈ F V (e3) por la condici´on en (Flat), entonces Y 6∈
F V (e3θ) y podemos afirmar que e3θ[Y /t1] ≡ e3θ. Por tanto:
e1θ_ t1 Hip e2θ[Y /t1]_ t2 Hip let Y = e1θ in e2θ_ t2 Let e3θ[X/t2]_ t Hip let X = (let Y = e1θ in e2θ) in e3θ_ t Let
(LetIn) Supongamos h(. . . , e, . . .) →l let X = e in h(. . . , X, . . .) y θ ∈ CSubts⊥ tal que
P `CRWLlet (let X = e in h(. . . , X, . . .))θ_ t. Entonces la prueba debe ser: eθ_ t1 h(d1θ, . . . , X, . . . , dnθ)[X/t1] ≡ h(d1θ, . . . , t1, . . . , dnθ)_ t
let X = eθ in h(d1θ, . . . , Xθ ≡ X, . . . , dnθ)_ t
Let para algunas expresiones d1, . . . , dn y alg´un t1 ∈ CT erm⊥. Por la convenci´on de
variables tenemos que X 6∈ dom(θ) y X 6∈ vRan(θ). Entonces podemos afirmar que Xθ ≡ X y adem´as que h(d1θ, . . . , X, . . . , dnθ) [X/t1] ≡ h(d1θ, . . . , t1, . . . , dnθ),
ya que X es fresca y por tanto ∀i.X 6∈ F V (di), luego ∀i.X 6∈ F V (diθ) ya que
X 6∈ vRan(θ). Entonces tenemos dos posibilidades:
a) h = c ∈ CS, entonces h(d1θ, . . . , t1, . . . , dnθ)_ t debe ser: d1θ_ s1 . . . t1 _ t 0 1 . . . dnθ_ sn c(d1θ, . . . , t1, . . . , dnθ)_ c(s1, . . . , t 0 1, . . . , sn) ≡ t DC
para alg´un s1, . . . , sn, t01 ∈ CT erm⊥. Como ∀t ∈ CT erm⊥, t_ t
0 implica t0 v t
(por el lema 3.2.2 ya que con c-t´erminos CRWLlet es igual que CRWL, como
indica el lema 5.1.4), entonces t01 v t1, y como eθ _ t1, por el lema 5.1.10 tenemos eθ_ t01. Por tanto
d1θ_ s1 Hip . . . eθ_ t 0 1 . . . dnθ_ sn Hip c(d1θ, . . . , eθ, . . . , dnθ)_ c(s1, . . . , t 0 1, . . . , sn) ≡ t DC b) h = f ∈ F S, entonces h(d1θ, . . . , t1, . . . , dnθ)_ t debe ser:
d1θ_ s1 . . . t1_ t
0
1 . . . dnθ_ sn r_ t f (d1θ, . . . , t1, . . . , dnθ)_ t
OR
para alg´un s1, . . . , sn, t01 ∈ CT erm⊥, (f (s1, . . . , t01, . . . , sn) → r) ∈ [P]⊥. De
nuevo como ∀t ∈ CT erm⊥, t _ t
0 implica t0 v t, entonces t0
1 v t1, y como
eθ_ t1, por el lema5.1.10 tenemos eθ_ t
0 1. Por tanto d1θ_ s1 Hyp . . . eθ_ t01 . . . dnθ_ sn Hyp r_ t Hyp f (d1θ, . . . , eθ, . . . , dnθ)_ t OR
96 5. Let-reescritura
(Fapp) Supongamos f (t1, . . . , tn) →lr con (f (p1, . . . , pn) → e)σ ∈ [P] tal que ∀i.piσ = ti
y eσ = r, y θ ∈ CSubts⊥ tal que P `CRWLlet rθ _ t. Entonces como θ ◦ σ ∈ CSubts⊥, ∀i.piσθ = tiθ y eσθ = rθ podemos concluir (f (p1, . . . , pn) → e)σθ ∈ [P]⊥
y por tanto: t1θ_ t1θ DC∗ . . . t nθ_ tnθ DC∗ rθ _ t Hip f (t1θ, . . . , tnθ)_ t OR
Con este resultado la demostraci´on del teorema 5.1.1es inmediata:
Demostraci´on. Para el teorema5.1.1. Supongamos e →le0. Entonces por el teorema5.1.2
tenemos que [[[e0]]]CRW Llet b [[[e]]]CRW Llet, y por tanto [[e
0θ]]
CRW Llet ⊆ [[eθ]]CRW Llet para
cualquier θ ∈ CSubst⊥. Eligiendo θ = (la sustituci´on vac´ıa) obtenemos [[e0]]CRW Llet ⊆
[[e]]CRW Llet.
La correcci´on de un paso dada por el teorema 5.1.1 se extiende f´acilmente a varios pasos, es decir, al cierre reflexivo-transitivo de la let -reescritura, →∗l:
Corolario 5.1.1 (Correcci´on de varios pasos de let -reescritura). Para todo e, e0 ∈ LExp
e →∗l e0 implica [[e0]]CRW Llet ⊆ [[e]]CRW Llet
Demostraci´on. Una inducci´on inmediata sobre la longitud de la derivaci´on e →∗l e0. Finalmente, usando estos resultados podemos obtener f´acilmente nuestro resultado principal de correcci´on de la let -reescritura con respecto al c´alculo CRWL original: Teorema 5.1.3 (Correcci´on de la let -reescritura). Para todo CRWL-programa P, e, e0 ∈ Exp y t ∈ CT erm se tiene que:
i) e →∗l e0 implica que P `CRW Le_ |e
0|.
ii) e →∗l t implica que P `CRW Le_ t.
Demostraci´on. i) Supongamos e →∗l e0, entonces por el corolario5.1.1tenemos que [[e0]]CRW Llet ⊆ [[e]]CRW Llet. Pero como |e
0| ∈ [[e0]]
CRW Llet por el lema 5.1.5, entonces |e
0| ∈
[[e]]CRW Llet, es decir, P `CRWLlet e_ |e
0|. As´ı que por el lema5.1.4, podemos concluir que
P `CRWLe_ |e
0|. ii) Consecuencia de i), ya que ∀t ∈ CT erm, |t| ≡ t.
Completitud
Ahora nos queda buscar alg´un tipo de contrapartida del teorema 5.1.3. Para ello ne- cesitaremos algunos resultados previos. El primero de ellos es un resultado local a la let -reescritura:
Lema 5.1.12 (Lema de pelado de las c´ascaras). Para toda e ∈ LExp tal que e 6∈ V tenemos que e →∗l let X = a in g(t) para alg´un g ∈ CS ∪ F S, t ⊆ CT erm y a ⊆ LExp tal que |ai| =⊥ para todo ai ∈ a.
Adem´as, si e ≡ h(e1, . . . , en) con h ∈ CS ∪ F S, entonces e ≡ h(e1, . . . , en) →∗l let X = a
in h(t1, . . . , tn) bajo las condiciones arriba indicadas, y verificando adem´as que ti ≡ ei
siempre que ei ∈ CT erm.
Por ´ultimo, podemos afirmar que en ninguna de estas derivaciones se aplica la regla (Fapp).
5.1.3 Adecuaci´on de la let-reescritura a CRWL 97
Podemos pensar en las let-expresiones como en CRWL-expresiones ordinarias a las que se les ha a˜nadido una cierta informaci´on adicional sobre compartici´on de subexpresiones (sharing), codificada a trav´es de la construcci´on let. Como la regla (Fapp) no se utiliza en las derivaciones de este lema, entonces en ellas no se progresa en la evaluaci´on de la CRWL- expresi´on impl´ıcita correspondiente a e (por tanto no se cambia su CRWL-denotaci´on), sino que lo que se hace es cambiar la representaci´on enriquecida de la CRWL-expresi´on. Se cambia esta representaci´on con el objeto de dejar al descubierto la parte c´alculada de e, concentr´andola en g(t), es decir, mostrando la parte cuya c´ascara es diferente de ⊥. Por eso llamamos a este lema el ‘lema de pelado’.
Demostraci´on. Para el lema5.1.12. Por inducci´on en la estructura de e: Caso base :
e ≡ h: Entonces h →0l h, ok con X ≡ ∅ Paso inductivo :
e ≡ h(e1, . . . , en): Hagamos una primera versi´on de la demostraci´on de este
caso para un solo argumento, para h(e1). Si e1 ∈ CT erm ya hemos terminado
con X ≡ ∅ y h(e1) →0l h(e1), as´ı que supongamos que e1 6∈ CT erm. Entonces
e16∈ V as´ı que por HI, e1 →∗l let X1= a1 in h1(t1) con X1 6≡ ∅, por tanto:
h(e1) →∗l h(let X1 = a1 in h1(t1)) por HI
→∗l let Y1 = (let X1 = a1 in h1(t1)) in h(Y1) por (LetIn)
→∗
l let X1 = a1 in let Y1 = h1(t1) in h(Y1) por (Flat∗)
Entonces tenemos dos posibilidades:
a) h1 = f1 ∈ F S: Entonces hemos acabado ya que ∀ai ∈ a.|ai| =⊥, por la HI,
y |f1(t1)| =⊥
b) h1 = c1 ∈ CS: Entonces let X1 = a1 in let Y1 = c1(t1) in h(Y1) →l
let X1= a1 in h(c1(t1)) por (Bind), y hemos acabado ya que ∀ai ∈
a.|ai| =⊥ por HI
Usando estas t´ecnicas podemos extender esta demostraci´on a los casos en que h tiene m´as de un argumento.
e = let X = e1 in e2: Supongamos que e1 6∈ V y e2 6∈ V, entonces podemos
aplicar la HI a e1 y e2 obteniendo:
let X = e1 in e2
→∗
l let X = (let X1= a1 in h1(t1)) in (let X2= a2 in h2(t2)) por HI
→∗l let X1 = a1 in let X = h1(t1) in let X2= a2 in h2(t2) por (Flat∗)
98 5. Let-reescritura
a) h1 = f1 ∈ F S: Entonces hemos acabado ya que ∀ai ∈ a1∪ a2.|ai| =⊥ por
HI, y |f1(t1)| =⊥
b) h1 = c1 ∈ CS: Entonces:
let X1 = a1 in let X = c1(t1) in let X2 = a2 in h2(t2)
→∗l let X1 = a1 in let X2 = a2[X/c1(t1)] in h2(t2)[X/c1(t1)]
por (Bind), y ya hemos acabado ya que para cualquier θ ∈ CSubst, |e| =⊥ implica |eθ| =⊥ (muy sencillo de demostrar).
Usando estas t´ecnicas podemos extender esta demostraci´on a los casos en que e1 o e2 son variables.
El siguiente resultado es ya un resultado t´ecnico de completitud que allana el camino para formular m´as adelante nuestro teorema de completitud:
Lema 5.1.13 (Lema de completitud para la let -reescritura). Sea P un CRWL- programa, e ∈ Exp y t ∈ CT erm⊥ tal que t 6=⊥. Entonces
P `CRW Le_ t implica e →∗l let X = a in t0
para alg´un t0 ∈ CT erm y a ⊆ LExp tales que t v |let X = a in t0| y |ai| =⊥ para todo
ai ∈ a. A consecuencia de esto, t v t0[X/ ⊥].
Demostraci´on. Por inducci´on en el tama˜no s de la CRWL-prueba, que mediremos como el n´umero de CRWL reglas aplicadas:
Caso base : s = 1. Veamos que regla fue aplicada en la CRWL-prueba en cuesti´on:
B Esto contradice la hip´otesis porque entonces t ≡⊥, por lo que ya hemos termi- nado. En el resto de la demostraci´on supondremos que t 6≡⊥ porque de otra forma la hip´otesis estar´ıa contradicha.
RR Entonces tenemos P `CRW L X_ X . Pero entonces X →
0
l X y X v X ≡ |X|,
por lo que hemos acabado con X = ∅.
DC Entonces tenemos P `CRW L c_ c. Pero entonces c →
0
l c y c v c ≡ |c|, por lo
que hemos acabado con X = ∅.
Paso inductivo : s > 1. Vemos cual fue la regla aplicada:
DC Entonces tenemos e ≡ c(e1, . . . , en) y la CRWL-prueba es de la forma:
e1 _ t1, . . . , en_ tn c(e1, . . . , en)_ c(t1, . . . , tn)
5.1.3 Adecuaci´on de la let-reescritura a CRWL 99
En el caso m´as general algunos ti ser´an ⊥ y otros no. Por simplicidad conside-
raremos el caso en que n = 2 con t1 = ⊥ and t2 6≡ ⊥, pero esta demostraci´on
es f´acilmente ampliable al caso general. Entonces tenemos la prueba: e1_⊥ e2 _ t26≡⊥
c(e1, e2)_ c(⊥, t2) DC Por HI sobre P `CRW L e2 _ t2 tenemos e2 →
∗
l let X2 = a2 in t 0
2, con t02 ∈
CT erm, |a2i| =⊥ para todo a2i y |let X2 = a2 in t
0
2| = t02[X2/ ⊥] w t2. Por
tanto:
c(e1, e2) →∗l c(e1, let X2 = a2 in t02) por HI
→∗
l let Y = (let X2 = a2 in t02) in c(e1, Y ) por (LetIn)
→∗l let X2 = a2 in let Y = t02 in c(e1, Y )) por (Flat∗)
→∗l let X2 = a2 in c(e1, t02) por (Bind)
Entonces tenemos varias posibilidades:
a) e1 = f1(e1): Entonces let X2 = a2in c(f1(e1), t02) →llet X2 = a2in let Z =
f1(e1) in c(Z, t02), por (LetIn). Por tanto hemos terminado ya que |a2i| =⊥
para todo a2ipor HI, |f1(e1)| =⊥ y |let X2 = a2in let Z = f1(e1) in c(Z, t
0 2)|
= c(Z, t02)[X2/ ⊥, Z/ ⊥] w c(⊥, t2), ya que t02[X2/ ⊥] w t2 por HI, y Z es
fresca y por tanto no aparece en t02.
b) e1 = t01 ∈ CT erm: Entonces hemos terminado ya que |a2i| =⊥ para todo
a2i por HI, y |let X2 = a2 in c(t
0
1, t02)| = c(t01, t02)[X2/ ⊥] w c(⊥, t2), porque
t02[X2/ ⊥] w t2 por HI.
c) e1 = c1(e1) 6∈ CT erm: Entonces por el lema 5.1.12, c1(e1) →∗l let X1 = a1
in c1(t1) tal que |a1i| =⊥ para todo a1i. Pero entonces:
let X2 = a2 in c(c1(e1), t02)
→∗
l let X2 = a2 in c(let X1 = a1 in c1(t1), t02) lema5.1.12
→∗l let X2 = a2 in let Y = (let X1 = a1 in c1(t1)) in c(Y, t02) por (LetIn)
→∗
l let X2 = a2 in let X1= a1 in let Y = c1(t1) in c(Y, t02) por (Flat∗)
→∗l let X2 = a2 in let X1= a1 in c(c1(t1), t02) por (Bind)
, ya que Y es fresca Entonces hemos terminado ya que |a1i| =⊥ para todo a1ipor el lema5.1.12,
|a2i| =⊥ para todo a2i por HI, y |let X2 = a2in let X1= a1in c(c1(t1), t02)| =
c(c1(t1), t02)[X1/ ⊥][X2/ ⊥] w c(⊥, t2), porque t02[X2/ ⊥] w t2 por HI, y X1
son frescas y por tanto no aparecen en t02.
d) e1 = let X = e11 in e12: este caso no puede darse ya que en las premisas
del lema 5.1.13se supone que e ∈ Exp, por tanto en ´el no puede aparecer ninguna construcci´on let.
OR Si f no tiene argumentos (n = 0) entonces tenemos: rθ_ t
100 5. Let-reescritura
con (f _ rθ) ∈ [P ]⊥. Podemos definir θ0 ∈ CSubst como la sustituci´on que es
igual a θ excepto porque cada ⊥ introducido por θ es reemplazado con alg´un s´ımbolo de constructora o variable. Entonces θ v θ0, por tanto por el lema
3.2.2 se tiene que P `CRW L rθ0 _ t con una prueba del mismo tama˜no. Pero entonces, aplicando la HI a esta prueba obtenemos que rθ0 →∗
l let X = a in t0
bajo las condiciones del lema5.1.13. Pero entonces f →leθ0 →∗l let X = a in t0
aplicando (Fapp) en el primer paso.
Si n > 0, procedemos como en el caso para (DC), haci´endo una versi´on preli- minar para P `CRW L f (e1, e2) _ t, que puede extenderse f´acilmente al caso m´as general. Entonces tenemos:
e1 _⊥ e2_ t2 6≡⊥ r _ t f (e1, e2)_ t
OR
tal que t2 6≡⊥, y con (f (p1, p2) = e)θ ∈ [P]⊥ tal que p1θ =⊥, p2θ = t2
y eθ = r. Entonces aplicando la HI a P `CRW L e2 _ t2 obtenemos que e2 →∗l let X2= a2 in t20 tal que |a2i| =⊥ para todo a2i y |let X2= a2 in t
0 2| =
t02[X2/ ⊥] w t2. Por tanto:
f (e1, e2) →∗l f (e1, let X2 = a2 in t02) por HI
→∗
l let Y = (let X2= a2 in t02) in f (e1, Y ) por (LetIn)
→∗l let X2 = a2 in let Y = t02 in f (e1, Y ) por (Flat∗)
→∗l let X2 = a2 in f (e1, t02) por (Bind)
Aplicando el lema 5.1.12 obtenemos que f (e1, t02) →∗l let X1 = a1 in f (t 0 1, t02)
tal que |a1i| =⊥ para todo a1i. Ahora como t
0
2[X2/ ⊥] w t2 entonces (t01, t02) w
(⊥, t2), por tanto por el lema3.2.2debe existir una θ0∈ CSubst tal que θ v θ0
y (p1, p2)θ0 = (t01, t02). Entonces por el lema 3.2.2, ya que P `CRW Lr ≡ eθ _ t entonces P `CRW L eθ0 _ t con una prueba del mismo tama˜no. Ya que θ
0 ∈
CSubst y e ∈ Exp (al ser parte del programa) se tiene que eθ0∈ Exp y podemos aplicar la HI a esa CRWL-prueba obteniendo que eθ0 →∗l let X = a in t0 tal que |ai| =⊥ para todo ai y que |let X = a in t0| = t0[X/ ⊥] w t. Por tanto:
let X2= a2 in f (e1, t02)
→∗l let X2= a2 in let X1= a1 in f (t01, t02) por el lema 5.1.12
→∗
l let X2= a2 in let X1= a1 in eθ0 por (Fapp)
→∗l let X2= a2 in let X1= a1 in let X = a in t0 por la 2a HI
Entonces |a2i| =⊥ para todo a2i por la HI, |a1i| =⊥ para todo a1i por el
lema 5.1.12 y |ai| =⊥ para todo ai por la HI. Como las variables en X1∪ X2
son variables frescas introducidas por la let -reescritura, ninguna de ellas puede aparecer en t. Por tanto t0[X/ ⊥] w t implica que ∀p ∈ O(t0) tal que t0|p = Y
tal que Y ∈ X1∪ X2 se tiene que t|p =⊥. Por tanto: