Stuck in proof of trivial compiler

Trying to prove a trivial compiler with respect to a corresponding interpreter --------------- Code ------------------ +-* Expression tree data Exp = Lf Int | Add Exp Exp | Mul Exp Exp eval (Lf x) = x eval (Add el er) = eval el + eval er eval (Mul el er) = eval el * eval er Simple stack machine instructions (LC is load constant) data Instr = LC Int | AddI | MulI compile (Lf x) = [LC x] compile (Add el er) = compile el ++ compile er ++ [AddI] compile (Mul el er) = compile el ++ compile er ++ [MulI] mac [] stk = stk mac (LC x : is) stk = mac is (x:stk) mac (AddI : is) (r : l : stk) = mac is (l+r : stk) mac (MulI : is) (r : l : stk) = mac is (l*r : stk) ------------ Proof Attempt ----------------------- Theorem mac(compile e).s = eval.e : s Base case mac(compile (Lf x)) s = eval (Lf x) : s LHS = mac (compile (Lf x)) s mac [LC x] s mac [] (x: s) x: s RHS = eval (Lf x) : s x: s Induction Step: Assumption l: mac (comp el).s = eval el : s Assumption r: mac (comp er).s = eval er : s LHS = mac (Add el er) s = mac (comp el ++ comp er ++ [AddI]) RHS = eval (Add el er) : s = (eval el + eval er) : s Now What???

How about trying to prove the following: mac (compile e ++ x) s = mac x (eval e : s) You can then just break down your term into pieces, build up the stack and evaluate it in your prove. On 09/09/2015 06:13 AM, Rustom Mody wrote:
Trying to prove a trivial compiler with respect to a corresponding interpreter --------------- Code ------------------ +-* Expression tree data Exp = Lf Int | Add Exp Exp | Mul Exp Exp
eval (Lf x) = x eval (Add el er) = eval el + eval er eval (Mul el er) = eval el * eval er
Simple stack machine instructions (LC is load constant) data Instr = LC Int | AddI | MulI
compile (Lf x) = [LC x] compile (Add el er) = compile el ++ compile er ++ [AddI] compile (Mul el er) = compile el ++ compile er ++ [MulI]
mac [] stk = stk mac (LC x : is) stk = mac is (x:stk) mac (AddI : is) (r : l : stk) = mac is (l+r : stk) mac (MulI : is) (r : l : stk) = mac is (l*r : stk)
------------ Proof Attempt ----------------------- Theorem mac(compile e).s = eval.e : s
Base case mac(compile (Lf x)) s = eval (Lf x) : s
LHS = mac (compile (Lf x)) s mac [LC x] s mac [] (x: s) x: s
RHS = eval (Lf x) : s x: s
Induction Step: Assumption l: mac (comp el).s = eval el : s Assumption r: mac (comp er).s = eval er : s
LHS = mac (Add el er) s = mac (comp el ++ comp er ++ [AddI])
RHS = eval (Add el er) : s = (eval el + eval er) : s
Now What???
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe

On Wed, Sep 9, 2015 at 3:24 PM, Jonas Scholl
How about trying to prove the following:
mac (compile e ++ x) s = mac x (eval e : s)
You can then just break down your term into pieces, build up the stack and evaluate it in your prove.
Thanks Jonas, Janis I knew I had to generalize it but not in '2 dimensions' -- x and s ! Seems obvious on further reflection I wonder though what is the moral for formulating theorems of right generality?
participants (2)
-
Jonas Scholl
-
Rustom Mody