diff --git a/testcases/verification/case-studies/LambdaSound.scala b/testcases/verification/case-studies/LambdaSound.scala new file mode 100644 index 0000000000000000000000000000000000000000..32a301eda3371bc0f846fa4d5edcd5ae7c0c2165 --- /dev/null +++ b/testcases/verification/case-studies/LambdaSound.scala @@ -0,0 +1,76 @@ +import leon.lang._ +import leon.annotation._ +import leon.collection._ +import leon.lang.synthesis._ +import leon._ +import leon.lang.string._ + +object Lambda { + case class Id(v: BigInt) + + abstract class Expr + case class Var(id: Id) extends Expr + case class App(f: Expr, arg: Expr) extends Expr + case class Abs(b: Id, tpe: Type, e: Expr) extends Expr + + case class Env(binds: Map[Id, Expr]) + + abstract class Type + case object Tind extends Type + case object Tbool extends Type + case class Arrow(from: Type, to: Type) extends Type + + case class TEnv(binds: Map[Id, Type]) + + def fv(e: Expr): Set[Id] = e match { + case Var(id) => Set(id) + case App(f, arg) => fv(f) ++ fv(arg) + case Abs(b, _, e) => fv(e) -- Set(b) + } + + def subst(in: Expr, v: Id, by: Expr): Expr = { + in match { + case Var(id) => { + if (id==v) by + else in + } + case App(f, arg) => App(subst(f, v, by), subst(arg, v, by)) + case Abs(b, tpe, e) => { + if (b==v) in + else { // ADD CHECK FOR CAPTURE HERE + Abs(b, tpe, subst(e, v, by)) + } + } + } + } + + def id1 = Id(BigInt(1)) + def id2 = Id(BigInt(2)) + def exprId = Abs(id1, Tind, Var(id1)) + + abstract class Outcome + case class Ok(v: Expr) extends Outcome + case class Err(s: String, sub: Expr) extends Outcome + + def CBV(env: Env, e: Expr): Outcome = { + e match { + case Var(id) => { env.binds.get(id) match { + case None() => Err("Unknown identifier in environment", e) + case Some(expr) => Ok(expr) + }} + case Abs(b, tpe, body) => Ok(e) + case App(f, arg) => { CBV(env, f) match { + case Ok(Abs(b, t, fbody)) => { CBV(env, arg) match { + case Ok(argv) => CBV(env, subst(fbody, b, argv)) + case err => err + }} + case Ok(expr) => Err("Tried to apply non-function value", expr) + case err => err + }} + } + } + + def env1 : Env = Env(Map[Id,Expr](id2 -> Var(id2))) + def r1 = CBV(env1, App(exprId, Var(id2))) +} +