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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

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!