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 ...
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