| Copyright | (c) Levent Erkok |
|---|---|
| License | BSD3 |
| Maintainer | erkokl@gmail.com |
| Stability | experimental |
| Safe Haskell | None |
| Language | Haskell2010 |
Documentation.SBV.Examples.TP.VM
Description
Correctness of a simple interpreter vs virtual-machine interpretation of a language.
Synopsis
- data Expr nm val
- type SExpr nm val = SBV (Expr nm val)
- size :: (SymVal nm, SymVal val) => SExpr nm val -> SInteger
- type Env nm val = SList (nm, val)
- type Stack val = SList val
- interpInEnv :: (SymVal nm, SymVal val, Num (SBV val)) => Env nm val -> SExpr nm val -> SBV val
- interp :: (SymVal nm, SymVal val, Num (SBV val)) => SExpr nm val -> SBV val
- data Instr nm val
- type SInstr nm val = SBV (Instr nm val)
- compile :: (SymVal nm, SymVal val, Num (SBV val)) => SExpr nm val -> SList (Instr nm val)
- compileAndRun :: (SymVal nm, SymVal val, Num (SBV val)) => SExpr nm val -> SBV val
- correctness :: (SymVal nm, SymVal val, Num (SBV val)) => TP (Proof (Forall "expr" (Expr nm val) -> SBool))
Language
Basic expression language.
Constructors
| Var nm | Variables |
| Con val | Constants |
| Sqr (Expr nm val) | Squaring |
| Inc (Expr nm val) | Increment |
| Add (Expr nm val) (Expr nm val) | Addition |
| Mul (Expr nm val) (Expr nm val) | Multiplication |
| Let nm (Expr nm val) (Expr nm val) | Let expression |
Instances
size :: (SymVal nm, SymVal val) => SExpr nm val -> SInteger Source #
Size of an expression. Used in strong induction.
Environment and the stack
Interpretation
interpInEnv :: (SymVal nm, SymVal val, Num (SBV val)) => Env nm val -> SExpr nm val -> SBV val Source #
Interpreter, in the usual functional style, taking an arbitrary environment.
interp :: (SymVal nm, SymVal val, Num (SBV val)) => SExpr nm val -> SBV val Source #
Interpret starting from empty environment.
Virtual machine
Instructions
Constructors
| IPushN nm | Push the value of nm from the environment on to the stack |
| IPushV val | Push a value on to the stack |
| IDup | Duplicate the top of the stack |
| IAdd | Add the top two elements and push back |
| IMul | Multiply the top two elements and push back |
| IBind nm | Bind the value on top of stack to name |
| IForget | Pop and ignore the binding on the environment |
Instances
Compilation
compile :: (SymVal nm, SymVal val, Num (SBV val)) => SExpr nm val -> SList (Instr nm val) Source #
Convert an expression to a sequence of instructions for our virtual machine.
compileAndRun :: (SymVal nm, SymVal val, Num (SBV val)) => SExpr nm val -> SBV val Source #
Compile and run an expression.
Correctness of the compiler
correctness :: (SymVal nm, SymVal val, Num (SBV val)) => TP (Proof (Forall "expr" (Expr nm val) -> SBool)) Source #
The property we're after is that interpreting an expression is the same as first compiling it to virtual-machine instructions, and then running them.
>>>runTP (correctness @String @Integer)Inductive lemma: runSeq Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Lemma: runOne Q.E.D. Lemma: runTwo Step: 1 Q.E.D. Step: 2 Q.E.D. Result: Q.E.D. Lemma: runMul Q.E.D. Lemma: measureNonNeg Q.E.D. Inductive lemma (strong): helper Step: Measure is non-negative Q.E.D. Step: 1 (7 way case split) Step: 1.1.1 (case Var) Q.E.D. Step: 1.1.2 Q.E.D. Step: 1.2.1 (case Con) Q.E.D. Step: 1.2.2 Q.E.D. Step: 1.2.3 Q.E.D. Step: 1.3.1 (case Sqr) Q.E.D. Step: 1.3.2 Q.E.D. Step: 1.3.3 Q.E.D. Step: 1.3.4 Q.E.D. Step: 1.3.5 Q.E.D. Step: 1.3.6 Q.E.D. Step: 1.3.7 Q.E.D. Step: 1.4.1 (case Inc) Q.E.D. Step: 1.4.2 Q.E.D. Step: 1.4.3 Q.E.D. Step: 1.4.4 Q.E.D. Step: 1.4.5 Q.E.D. Step: 1.4.6 Q.E.D. Step: 1.4.7 Q.E.D. Step: 1.5.1 (case sAdd) Q.E.D. Step: 1.5.2 Q.E.D. Step: 1.5.3 Q.E.D. Step: 1.5.4 Q.E.D. Step: 1.5.5 Q.E.D. Step: 1.5.6 Q.E.D. Step: 1.5.7 Q.E.D. Step: 1.5.8 Q.E.D. Step: 1.5.9 Q.E.D. Step: 1.6.1 (case sMul) Q.E.D. Step: 1.6.2 Q.E.D. Step: 1.6.3 Q.E.D. Step: 1.6.4 Q.E.D. Step: 1.6.5 Q.E.D. Step: 1.6.6 Q.E.D. Step: 1.6.7 Q.E.D. Step: 1.6.8 Q.E.D. Step: 1.6.9 Q.E.D. Step: 1.7.1 (case Let) Q.E.D. Step: 1.7.2 Q.E.D. Step: 1.7.3 Q.E.D. Step: 1.7.4 Q.E.D. Step: 1.7.5 Q.E.D. Step: 1.7.6 Q.E.D. Step: 1.7.7 Q.E.D. Step: 1.7.8 Q.E.D. Step: 1.7.9 Q.E.D. Step: 1.7.10 Q.E.D. Step: 1.7.11 Q.E.D. Step: 1.Completeness Q.E.D. Result: Q.E.D. Lemma: correctness Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Result: Q.E.D. [Proven] correctness :: Ɐexpr ∷ (Expr [Char] Integer) → Bool