diff --git a/testcases/ExprComp.scala b/testcases/ExprComp.scala index b466776633951ee4a368ac04734f168d98d1c1d2..ed3e9eb6d8b4a254a6d8c64addf2d6762011a156 100644 --- a/testcases/ExprComp.scala +++ b/testcases/ExprComp.scala @@ -68,27 +68,37 @@ object ExprComp { case class Ok(v : ValueStack) extends Outcome case class Fail(v : ValueStack, i : Instruction) extends Outcome + // Running programs on a given initial stack def run(p : Program, vs : ValueStack) : Outcome = p match { case EProgram() => Ok(vs) case NProgram(i,rest) => val oRest = run(rest, vs) oRest match { - case Fail(_,_) => oRest - case Ok(vRest) => - i match { - case PushVal(v) => Ok(NStack(v,vRest)) - case ApplyBinOp(op) => vRest match { - case EStack() => Fail(vRest, i) - case NStack(v1,vs1) => vs1 match { - case EStack() => Fail(vRest, i) - case NStack(v2,vs2) => Ok(NStack(evalOp(v1,op,v2),vs2)) - } - } - } + case Fail(_,_) => oRest + case Ok(vRest) => + i match { + case PushVal(v) => Ok(NStack(v,vRest)) + case ApplyBinOp(op) => vRest match { + case EStack() => Fail(vRest, i) + case NStack(v1,vs1) => vs1 match { + case EStack() => Fail(vRest, i) + 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()) // Compiling expressions to programs @@ -108,6 +118,10 @@ object ExprComp { } holds */ + + + +/// --- here it goes bad def property0() : Boolean = { val e = Binary(Constant(Value(3)), Plus(), Constant(Value(5))) val vs = EStack() @@ -115,6 +129,21 @@ object ExprComp { run(compile(e, acc), vs) == Ok(NStack(eval(e), vs)) } 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 def property1(e: Expr) : Boolean = { val vs = EStack()