15.11.2014 Views

con Isabelle/Isar - Dpto. Ciencias de la Computación e Inteligencia ...

con Isabelle/Isar - Dpto. Ciencias de la Computación e Inteligencia ...

con Isabelle/Isar - Dpto. Ciencias de la Computación e Inteligencia ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

6.3. El compi<strong>la</strong>dor 51<br />

ejec [ILoad 2, IConst 3] (λx. x+4) [7] = [3,6,7] ∧<br />

ejec [ILoad 2, IConst 3, IApp (op +)] (λx. x+4) [7] = [9,7]<br />

by simp<br />

6.3 El compi<strong>la</strong>dor<br />

Definición 6.3.1. El compi<strong>la</strong>dor comp traduce una expresión en una lista <strong>de</strong> instrucciones.<br />

primrec comp :: ′ v expr ⇒ ′ v instr list where<br />

comp (Const v) = [IConst v]<br />

| comp (Var x) = [ILoad x]<br />

| comp (App f e1 e2) = (comp e2) @ (comp e1) @ [IApp f ]<br />

Ejemplo 6.3.2. A <strong>con</strong>tinuación se muestran ejemplos <strong>de</strong> compi<strong>la</strong>ción.<br />

lemma<br />

comp (Const 3) = [IConst 3] ∧<br />

comp (Var 2) = [ILoad 2] ∧<br />

comp (App (op +) (Const 3) (Var 2)) = [ILoad 2, IConst 3, IApp (op +)]<br />

by simp<br />

6.4 Corrección <strong>de</strong>l compi<strong>la</strong>dor<br />

Para <strong>de</strong>mostrar que el compi<strong>la</strong>dor es correcto, probamos que el resultado <strong>de</strong> compi<strong>la</strong>r<br />

una expresión y a <strong>con</strong>tinuación ejecutar<strong>la</strong> es lo mismo que interpretar<strong>la</strong>; es <strong>de</strong>cir,<br />

theorem ejec (comp e) ent [] = [valor e ent]<br />

oops<br />

El teorema anterior no pue<strong>de</strong> <strong>de</strong>mostrarse por inducción en e. Para <strong>de</strong>mostrarlo por<br />

inducción, lo generalizamos a<br />

theorem ∀ vs. ejec (comp e) ent vs = (valor e ent)#vs<br />

oops<br />

En <strong>la</strong> <strong>de</strong>mostración <strong>de</strong>l teorema anterior usaremos el siguiente lema.<br />

lemma ejec-append:<br />

∀ vs. ejec (xs@ys) ent vs = ejec ys ent (ejec xs ent vs) (is ?P xs)<br />

proof (induct xs)<br />

show ?P [] by simp<br />

next

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!