From 954287265bc84fa7ba96f740782fbc4d84bcc393 Mon Sep 17 00:00:00 2001 From: Etienne Kneuss <colder@php.net> Date: Fri, 14 Mar 2014 14:15:19 +0100 Subject: [PATCH] Fix case-study --- testcases/case-studies/Lambda.scala | 64 +++++++++++++++++++---------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/testcases/case-studies/Lambda.scala b/testcases/case-studies/Lambda.scala index f268a9c2f..ecc82053d 100644 --- a/testcases/case-studies/Lambda.scala +++ b/testcases/case-studies/Lambda.scala @@ -9,26 +9,21 @@ object Lang { def isLiteral(l: Expr) = l match { case _: Var => true case _: Abs => true - case _: BoolLit => true - case _: IntLit => true //case _: Record => true case _ => false } abstract class Expr case class Var(id: Id) extends Expr - case class IntLit(v: Int) extends Expr - case class BoolLit(v: Boolean) extends Expr case class App(f: Expr, arg: Expr) extends Expr case class Abs(b: Id, tpe: Type, e: Expr) extends Expr //case class Record(fields: Map[Id, Expr]) extends Expr //case class Select(r: Expr, f: Var) extends Expr abstract class Type - case object TBool extends Type - case object TInt extends Type - case class TApp(from: Type, to: Type) extends Type - //case class TRecord(fields: Map[Id, Type]) extends Type + case class Param(k : Int) extends Type + case class TFunction(from: Type, to: Type) extends Type + //case class TRecord(fields: Map[Id, Type]) extends Type } @@ -45,15 +40,9 @@ object TypeChecker { None() } - case _: IntLit => - Some(TInt) - - case _: BoolLit => - Some(TBool) - case App(f, arg) => typeOf(f, None(), env) match { - case Some(TApp(from, to)) => + case Some(TFunction(from, to)) => typeOf(arg, Some(from), env) match { case Some(_) => Some(to) case _ => None() @@ -63,10 +52,10 @@ object TypeChecker { case Abs(id, tpe, e) => val nenv = env.updated(id, tpe) (exp, typeOf(e, None(), nenv)) match { - case (Some(TApp(from, to)), Some(to2)) if (from == tpe) && (to == to2) => - Some(TApp(tpe, to2)) + case (Some(TFunction(from, to)), Some(to2)) if (from == tpe) && (to == to2) => + Some(TFunction(tpe, to2)) case (None(), Some(to2)) => - Some(TApp(tpe, to2)) + Some(TFunction(tpe, to2)) case _ => None() } @@ -82,6 +71,10 @@ object TypeChecker { def typeChecks(e: Expr): Boolean = { typeOf(e, None(), Map[Id, Type]()).isDefined } + + def typeOf(e: Expr): Option[Type] = { + typeOf(e, None(), Map[Id, Type]()) + } } object Evaluator { @@ -111,11 +104,38 @@ object Evaluator { object Main { import Lang._ import Evaluator._ + import TypeChecker._ + + def synthesize_identity() : Expr = { + choose { (e : Expr) => + val t_identity : Type = TFunction(Param(1), Param(1)) + typeOf(e) == Some(t_identity) + } + } + + def synthesize_K() : Expr = { + choose { (e : Expr) => + val t1 : Type = TFunction(Param(1), TFunction(Param(2), Param(1))) + typeOf(e) == Some(t1) + } + } + def synthesize_K2() : Expr = { + choose { (e : Expr) => + val t1 : Type = TFunction(Param(1), TFunction(Param(2), Param(2))) + typeOf(e) == Some(t1) + } + } - def test() : Expr = { - val x = Var(Id(0)) - val y = Var(Id(1)) - eval(App(Abs(Id(0), TInt, x), IntLit(42))) + def synthesize_S() : Expr = { + choose { (e : Expr) => + val tz = Param(1) + val ty = TFunction(Param(1), Param(2)) + val tx = TFunction(Param(1), TFunction(Param(2), Param(3))) + val t1 : Type = TFunction(tx, + TFunction(ty, + TFunction(tz, Param(3)))) + typeOf(e) == Some(t1) + } } } -- GitLab