diff --git a/pldi2011-testcases/NNF.scala b/pldi2011-testcases/NNF.scala
index d4b83e58bb46ff135d212c4d5a969ff74dccfc07..19ea0b37f20404a3b913c4f7b32af29f860957ef 100644
--- a/pldi2011-testcases/NNF.scala
+++ b/pldi2011-testcases/NNF.scala
@@ -9,7 +9,15 @@ object NNF {
   case class Not(f: Formula) extends Formula
   case class Literal(id: Int) extends Formula
 
-  def nnf(formula: Formula): Formula = formula match {
+  def isNNF(f: Formula): Boolean = f match {
+    case And(lhs, rhs) => isNNF(lhs) && isNNF(rhs)
+    case Or(lhs, rhs) => isNNF(lhs) && isNNF(rhs)
+    case Not(Literal(_)) => true
+    case Not(_) => false
+    case Literal(_) => true
+  }
+
+  def nnf(formula: Formula): Formula = (formula match {
     case And(lhs, rhs) => And(nnf(lhs), nnf(rhs))
     case Or(lhs, rhs) => Or(nnf(lhs), nnf(rhs))
     case Not(And(lhs, rhs)) => Or(nnf(Not(lhs)), nnf(Not(rhs)))
@@ -17,10 +25,10 @@ object NNF {
     case Not(Not(f)) => nnf(f)
     case Not(Literal(_)) => formula
     case Literal(_) => formula
-  }
+  }) ensuring(f => isNNF(f))
 
   def freeVars(f: Formula): Set[Int] = {
-    require(isNNF(f))
+  require(isNNF(f))
     f match {
       case And(lhs, rhs) => freeVars(lhs) ++ freeVars(rhs)
       case Or(lhs, rhs) => freeVars(lhs) ++ freeVars(rhs)
@@ -28,12 +36,5 @@ object NNF {
       case Literal(i) => Set[Int](i)
     }
   }
-
-  def isNNF(f: Formula): Boolean = f match {
-    case And(lhs, rhs) => isNNF(lhs) && isNNF(rhs)
-    case Or(lhs, rhs) => isNNF(lhs) && isNNF(rhs)
-    case Not(Literal(_)) => true
-    case Not(_) => false
-    case Literal(_) => true
-  }
+  def fv(f : Formula) = { freeVars(nnf(f)) }
 }