diff --git a/testcases/SatFun.scala b/testcases/SatFun.scala
index 6bc9ed4e259e0acbc478d989cee163423f6eb910..063312f81c682963b0ab142c8713b98661b4ed2b 100644
--- a/testcases/SatFun.scala
+++ b/testcases/SatFun.scala
@@ -1,5 +1,3 @@
-import scala.collection.Map
-
 object SatFun {
 
   sealed abstract class Formula
@@ -19,30 +17,41 @@ object SatFun {
   case class ClauseNil() extends ClauseList
   case class ClauseLit(value: Boolean) extends ClauseList
 
-  def eval(formula: Formula, assignment: Map[Int, Boolean]): Boolean = formula match {
-    case Var(n) => assignment(n)
-    case Not(f) => !eval(f, assignment)
-    case And(f1, f2) => eval(f1, assignment) && eval(f2, assignment)
-    case Or(f1, f2) => eval(f1, assignment) || eval(f2, assignment)
+  def eval(formula: Formula, trueVars: Set[Int]): Boolean = formula match {
+    case Var(n) => trueVars.contains(n)
+    case Not(f) => !eval(f, trueVars)
+    case And(f1, f2) => eval(f1, trueVars) && eval(f2, trueVars)
+    case Or(f1, f2) => eval(f1, trueVars) || eval(f2, trueVars)
   }
 
-  def evalCnf(clauses: ClauseList, assignment: Map[Int, Boolean]): Boolean = clauses match {
-    case ClauseCons(cl, cls) => evalClauseCnf(cl, assignment) && evalCnf(cls, assignment)
+  def evalCnf(clauses: ClauseList, trueVars: Set[Int]): Boolean = clauses match {
+    case ClauseCons(cl, cls) => evalClauseCnf(cl, trueVars) && evalCnf(cls, trueVars)
     case ClauseNil() => false
     case ClauseLit(b) => b
   }
-  def evalDnf(clauses: ClauseList, assignment: Map[Int, Boolean]): Boolean = clauses match {
-    case ClauseCons(cl, cls) => evalClauseDnf(cl, assignment) || evalDnf(cls, assignment)
+  def evalDnf(clauses: ClauseList, trueVars: Set[Int]): Boolean = clauses match {
+    case ClauseCons(cl, cls) => evalClauseDnf(cl, trueVars) || evalDnf(cls, trueVars)
     case ClauseNil() => true
     case ClauseLit(b) => b
   }
-  def evalClauseCnf(clause: VarList, assignment: Map[Int, Boolean]): Boolean = clause match {
-    case VarCons(v, vs) => (if(v < 0) assignment(-v) else assignment(v)) || evalClauseCnf(vs, assignment)
+  def evalClauseCnf(clause: VarList, trueVars: Set[Int]): Boolean = clause match {
+    case VarCons(v, vs) => (if(v < 0) trueVars.contains(-v) else trueVars.contains(v)) || evalClauseCnf(vs, trueVars)
+      if(v == 1) true
+      else if(v == -1) evalClauseCnf(vs, trueVars)
+      else if(v < -1) trueVars.contains(-v) || evalClauseCnf(vs, trueVars)
+      else if(v > 1) trueVars.contains(v) || evalClauseCnf(vs, trueVars)
+      else false
     case VarNil() => false
     case VarLit(b) => b
   }
-  def evalClauseDnf(clause: VarList, assignment: Map[Int, Boolean]): Boolean = clause match {
-    case VarCons(v, vs) => (if(v < 0) assignment(-v) else assignment(v)) && evalClauseDnf(vs, assignment)
+  def evalClauseDnf(clause: VarList, trueVars: Set[Int]): Boolean = clause match {
+    case VarCons(v, vs) => {
+      if(v == 1) evalClauseDnf(vs, trueVars)
+      else if(v == -1) false
+      else if(v < -1) trueVars.contains(-v) && evalClauseDnf(vs, trueVars)
+      else if(v > 1) trueVars.contains(v) && evalClauseDnf(vs, trueVars)
+      else false
+    }
     case VarNil() => true
     case VarLit(b) => b
   }
@@ -117,9 +126,9 @@ object SatFun {
     case Not(Var(n)) => ClauseCons(VarCons(-n, VarNil()), ClauseNil())
     case Var(n) => ClauseCons(VarCons(n, VarNil()), ClauseNil())
   }
-  def property1(formula: Formula, assignment: Map[Int, Boolean]): Boolean = {
+  def property1(formula: Formula, trueVars: Set[Int]): Boolean = {
     val dnfFormula = dnfNaive(formula)
-    eval(formula, assignment) == evalDnf(dnfFormula, assignment)
+    eval(formula, trueVars) == evalDnf(dnfFormula, trueVars)
   } ensuring(_ == true)
 
 
@@ -193,34 +202,34 @@ object SatFun {
 //  }
 
   //some non-leon functions to test the program with scala
-  object False {
-    def apply(): Formula = And(Var(1), Not(Var(1)))
-  }
-  object True {
-    def apply(): Formula = Or(Var(1), Not(Var(1)))
-  }
-  object Or {
-    def apply(fs: Formula*): Formula = fs match {
-      case Seq() => False()
-      case Seq(f) => f
-      case fs => fs.reduceLeft((f1, f2) => Or(f1, f2))
-    }
-  }
-  object And {
-    def apply(fs: Formula*): Formula = fs match {
-      case Seq() => True()
-      case Seq(f) => f
-      case fs => fs.reduceLeft((f1, f2) => And(f1, f2))
-    }
-  }
-  def clause2list(cl: VarList): List[Int] = cl match {
-    case VarCons(v, vs) => v :: clause2list(vs)
-    case VarNil() => Nil
-    case VarLit(b) => if(b) List(1) else List(-1)
-  }
-  def clauses2list(cll: ClauseList): List[List[Int]] = cll match {
-    case ClauseCons(cl, cls) => clause2list(cl) :: clauses2list(cls)
-    case ClauseNil() => Nil
-    case ClauseLit(b) => if(b) List(List(1)) else List(List(-1))
-  }
+//  object False {
+//    def apply(): Formula = And(Var(1), Not(Var(1)))
+//  }
+//  object True {
+//    def apply(): Formula = Or(Var(1), Not(Var(1)))
+//  }
+//  object Or {
+//    def apply(fs: Formula*): Formula = fs match {
+//      case Seq() => False()
+//      case Seq(f) => f
+//      case fs => fs.reduceLeft((f1, f2) => Or(f1, f2))
+//    }
+//  }
+//  object And {
+//    def apply(fs: Formula*): Formula = fs match {
+//      case Seq() => True()
+//      case Seq(f) => f
+//      case fs => fs.reduceLeft((f1, f2) => And(f1, f2))
+//    }
+//  }
+//  def clause2list(cl: VarList): List[Int] = cl match {
+//    case VarCons(v, vs) => v :: clause2list(vs)
+//    case VarNil() => Nil
+//    case VarLit(b) => if(b) List(1) else List(-1)
+//  }
+//  def clauses2list(cll: ClauseList): List[List[Int]] = cll match {
+//    case ClauseCons(cl, cls) => clause2list(cl) :: clauses2list(cls)
+//    case ClauseNil() => Nil
+//    case ClauseLit(b) => if(b) List(List(1)) else List(List(-1))
+//  }
 }