Skip to content
Snippets Groups Projects
Commit 40454b13 authored by Octavian-Eugen Ganea's avatar Octavian-Eugen Ganea
Browse files

No commit message

No commit message
parent 55e2e943
Branches
Tags
No related merge requests found
...@@ -68,27 +68,37 @@ object ExprComp { ...@@ -68,27 +68,37 @@ object ExprComp {
case class Ok(v : ValueStack) extends Outcome case class Ok(v : ValueStack) extends Outcome
case class Fail(v : ValueStack, i : Instruction) extends Outcome case class Fail(v : ValueStack, i : Instruction) extends Outcome
// Running programs on a given initial stack // Running programs on a given initial stack
def run(p : Program, vs : ValueStack) : Outcome = p match { def run(p : Program, vs : ValueStack) : Outcome = p match {
case EProgram() => Ok(vs) case EProgram() => Ok(vs)
case NProgram(i,rest) => case NProgram(i,rest) =>
val oRest = run(rest, vs) val oRest = run(rest, vs)
oRest match { oRest match {
case Fail(_,_) => oRest case Fail(_,_) => oRest
case Ok(vRest) => case Ok(vRest) =>
i match { i match {
case PushVal(v) => Ok(NStack(v,vRest)) case PushVal(v) => Ok(NStack(v,vRest))
case ApplyBinOp(op) => vRest match { case ApplyBinOp(op) => vRest match {
case EStack() => Fail(vRest, i) case EStack() => Fail(vRest, i)
case NStack(v1,vs1) => vs1 match { case NStack(v1,vs1) => vs1 match {
case EStack() => Fail(vRest, i) case EStack() => Fail(vRest, i)
case NStack(v2,vs2) => Ok(NStack(evalOp(v1,op,v2),vs2)) case NStack(v2,vs2) => Ok(NStack(evalOp(v1,op,v2),vs2))
} }
} }
} }
} }
} }
// --- this does not work; do not know why
def property_trivial() : Boolean = {
run(EProgram() , EStack() ) == Ok(EStack())
} holds
def run0(p : Program) = run(p, EStack()) def run0(p : Program) = run(p, EStack())
// Compiling expressions to programs // Compiling expressions to programs
...@@ -108,6 +118,10 @@ object ExprComp { ...@@ -108,6 +118,10 @@ object ExprComp {
} holds } holds
*/ */
/// --- here it goes bad
def property0() : Boolean = { def property0() : Boolean = {
val e = Binary(Constant(Value(3)), Plus(), Constant(Value(5))) val e = Binary(Constant(Value(3)), Plus(), Constant(Value(5)))
val vs = EStack() val vs = EStack()
...@@ -115,6 +129,21 @@ object ExprComp { ...@@ -115,6 +129,21 @@ object ExprComp {
run(compile(e, acc), vs) == Ok(NStack(eval(e), vs)) run(compile(e, acc), vs) == Ok(NStack(eval(e), vs))
} holds } holds
//this induction should work (at least on paper it goes ok)
@induct
def property_general(e: Expr, prog:Program) : Boolean = {
val vs = EStack()
val result = run(prog, vs)
result match{
case Ok(vv) => run(compile(e, prog), vs) == Ok(NStack(eval(e), vv))
case _ => true
}
} holds
@induct @induct
def property1(e: Expr) : Boolean = { def property1(e: Expr) : Boolean = {
val vs = EStack() val vs = EStack()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment