| 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
- sCaseExpr :: (Mergeable result, SymVal nm, SymVal val) => SBV (Expr nm val) -> (SBV nm -> result) -> (SBV val -> result) -> (SBV (Expr nm val) -> result) -> (SBV (Expr nm val) -> result) -> (SBV (Expr nm val) -> SBV (Expr nm val) -> result) -> (SBV (Expr nm val) -> SBV (Expr nm val) -> result) -> (SBV nm -> SBV (Expr nm val) -> SBV (Expr nm val) -> result) -> result
- isVar :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBool
- sVar :: (SymVal nm, SymVal val) => SBV nm -> SBV (Expr nm val)
- getVar_1 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV nm
- svar :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV nm
- isCon :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBool
- sCon :: (SymVal nm, SymVal val) => SBV val -> SBV (Expr nm val)
- getCon_1 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV val
- scon :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV val
- isSqr :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBool
- sSqr :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- getSqr_1 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- ssqrVal :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- isInc :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBool
- sInc :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- getInc_1 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- sincVal :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- isAdd :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBool
- sAdd :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) -> SBV (Expr nm val)
- getAdd_1 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- getAdd_2 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- sadd1 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- sadd2 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- isMul :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBool
- sMul :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) -> SBV (Expr nm val)
- getMul_1 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- getMul_2 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- smul1 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- smul2 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- isLet :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBool
- sLet :: (SymVal nm, SymVal val) => SBV nm -> SBV (Expr nm val) -> SBV (Expr nm val) -> SBV (Expr nm val)
- getLet_1 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV nm
- getLet_2 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- getLet_3 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- slvar :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV nm
- slval :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- slbody :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val)
- 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 | Variables |
Fields
| |
| Con | Constants |
Fields
| |
| Sqr | Squaring |
| Inc | Increment |
| Add | Addition |
| Mul | Addition |
| Let | Let expression |
Instances
size :: (SymVal nm, SymVal val) => SExpr nm val -> SInteger Source #
Size of an expression. Used in strong induction.
Symbolic accessors
sCaseExpr :: (Mergeable result, SymVal nm, SymVal val) => SBV (Expr nm val) -> (SBV nm -> result) -> (SBV val -> result) -> (SBV (Expr nm val) -> result) -> (SBV (Expr nm val) -> result) -> (SBV (Expr nm val) -> SBV (Expr nm val) -> result) -> (SBV (Expr nm val) -> SBV (Expr nm val) -> result) -> (SBV nm -> SBV (Expr nm val) -> SBV (Expr nm val) -> result) -> result Source #
Case analyzer for the type Expr.
sVar :: (SymVal nm, SymVal val) => SBV nm -> SBV (Expr nm val) Source #
Symbolic version of the constructor Var.
sCon :: (SymVal nm, SymVal val) => SBV val -> SBV (Expr nm val) Source #
Symbolic version of the constructor Con.
getCon_1 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV val Source #
Field accessor function.
sSqr :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Symbolic version of the constructor Sqr.
getSqr_1 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Field accessor function.
ssqrVal :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Field accessor function.
sInc :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Symbolic version of the constructor Inc.
getInc_1 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Field accessor function.
sincVal :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Field accessor function.
sAdd :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) -> SBV (Expr nm val) Source #
Symbolic version of the constructor Add.
getAdd_1 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Field accessor function.
getAdd_2 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Field accessor function.
sadd1 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Field accessor function.
sadd2 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Field accessor function.
sMul :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) -> SBV (Expr nm val) Source #
Symbolic version of the constructor Mul.
getMul_1 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Field accessor function.
getMul_2 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Field accessor function.
smul1 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Field accessor function.
smul2 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Field accessor function.
sLet :: (SymVal nm, SymVal val) => SBV nm -> SBV (Expr nm val) -> SBV (Expr nm val) -> SBV (Expr nm val) Source #
Symbolic version of the constructor Let.
getLet_2 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Field accessor function.
getLet_3 :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Field accessor function.
slval :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Field accessor function.
slbody :: (SymVal nm, SymVal val) => SBV (Expr nm val) -> SBV (Expr nm val) Source #
Field accessor function.
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 | Push the value of nm from the environment on to the stack |
Fields
| |
| IPushV | Push a value on to the stack |
Fields
| |
| 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