diff --git a/cp-demo/Assuming.scala b/cp-demo/Assuming.scala
index 75bb2631ef6b2eb6bcea1f87721fce4537496b01..eadd00cfe71bd7c77c30d33b14d1b5acd8d4b235 100644
--- a/cp-demo/Assuming.scala
+++ b/cp-demo/Assuming.scala
@@ -1,12 +1,19 @@
 import cp.Definitions._
+import cp.Terms._
 
 object Assuming {
+  def assuming(c: Constraint0)(block: => Unit) : Unit = {
+    for (u <- c.lazyFindAll) {
+      block
+    }
+  }
+
   def main(args: Array[String]): Unit = {
     for (x <- ((x: Int) => x >= 0 && x < 4).lazyFindAll) {
-      for (b <- ((b: Boolean) => b && x <= 1).lazyFindAll) {
+      assuming(() => x <= 1) {
         println("hey!")
       }
-      for (b <- ((b: Boolean) => b && x > 1).lazyFindAll) {
+      assuming(() => x > 1) {
         println("ho!")
       }
     }
diff --git a/src/cp/Converter.scala b/src/cp/Converter.scala
index ae68a22ad362b493e1ba869463330f7fa4758b42..aa2644b93ecb1e15e3c6b65bfeb1fec6dcf03b8e 100644
--- a/src/cp/Converter.scala
+++ b/src/cp/Converter.scala
@@ -5,6 +5,9 @@ import purescala.Trees._
 /** A converter has functions for converting FunCheck expressions into Scala
  * values */
 class Converter(val expr2scala : (Expr => Any)) {
+  def exprSeq2scala0(exprs : Seq[Expr]) : Unit =
+    () 
+
   def exprSeq2scala1[T1](exprs : Seq[Expr]) : (T1) =
     (expr2scala(exprs(0)).asInstanceOf[T1])
 
diff --git a/src/cp/Definitions.scala b/src/cp/Definitions.scala
index 909b3797df37fccc79abae898972e91b138d09ad..9caa35be3a44caff6a82c75e14473d5ca37d66f1 100644
--- a/src/cp/Definitions.scala
+++ b/src/cp/Definitions.scala
@@ -11,6 +11,7 @@ object Definitions {
   final class UnsatisfiableConstraintException extends Exception
   final class UnknownConstraintException extends Exception
 
+  implicit def func2term0[R](func : () => R) : Term0[R] = throw new NotImplementedException
   implicit def func2term1[T1,R](func : T1 => R) : Term1[T1,R] = throw new NotImplementedException
   implicit def func2term2[T1,T2,R](func : (T1,T2) => R) : Term2[T1,T2,R] = throw new NotImplementedException
   implicit def func2term3[T1,T2,T3,R](func : (T1,T2,T3) => R) : Term3[T1,T2,T3,R] = throw new NotImplementedException
diff --git a/src/cp/Terms.scala b/src/cp/Terms.scala
index 75d539799cb7bbdd7d183657a261fc4bfe3c291b..37c5906396edf75c95acea532a5c730501094189 100644
--- a/src/cp/Terms.scala
+++ b/src/cp/Terms.scala
@@ -142,6 +142,7 @@ object Terms {
   /** GENERATED CODE: */
   /** Type aliases for terms with boolean and integer range */
   type Constraint[T] = Term[T,Boolean]
+  type Constraint0 = Term0[Boolean]
   type Constraint1[T1] = Term1[T1,Boolean]
   type Constraint2[T1,T2] = Term2[T1,T2,Boolean]
   type Constraint3[T1,T2,T3] = Term3[T1,T2,T3,Boolean]
@@ -152,6 +153,7 @@ object Terms {
   type Constraint8[T1,T2,T3,T4,T5,T6,T7,T8] = Term8[T1,T2,T3,T4,T5,T6,T7,T8,Boolean]
   type Constraint9[T1,T2,T3,T4,T5,T6,T7,T8,T9] = Term9[T1,T2,T3,T4,T5,T6,T7,T8,T9,Boolean]
   type IntTerm[T] = Term[T,Int]
+  type IntTerm0[T1] = Term0[Int]
   type IntTerm1[T1] = Term1[T1,Int]
   type IntTerm2[T1,T2] = Term2[T1,T2,Int]
   type IntTerm3[T1,T2,T3] = Term3[T1,T2,T3,Int]
@@ -162,6 +164,15 @@ object Terms {
   type IntTerm8[T1,T2,T3,T4,T5,T6,T7,T8] = Term8[T1,T2,T3,T4,T5,T6,T7,T8,Int]
   type IntTerm9[T1,T2,T3,T4,T5,T6,T7,T8,T9] = Term9[T1,T2,T3,T4,T5,T6,T7,T8,T9,Int]
   
+  trait Term0[R] extends Term[Unit,R] with Function0[R] {
+    val convertingFunction = converterOf(this).exprSeq2scala0 _
+    type t2c = (Term0[R]) => Term0[Boolean]
+    val scalaFunction : () => R
+    lazy val evaluator : (Seq[Expr]) => R = (s : Seq[Expr]) => scalaFunction()
+
+    override def apply() : R = scalaFunction()
+  }
+
   trait Term1[T1,R] extends Term[(T1),R] with Function1[T1,R] {
     val convertingFunction = converterOf(this).exprSeq2scala1[T1] _
     type t2c = (Term1[T1,R]) => Term1[T1,Boolean]
@@ -1239,6 +1250,20 @@ object Terms {
     }
   }
   
+  object Term0 {
+    def apply[R](conv : Converter, serializedProg : Serialized, serializedInputVars: Serialized, serializedLVars: Serialized, serializedOutputVars : Serialized, serializedExpr : Serialized, inputVarValues : Seq[Expr], lVarValues : Seq[Expr], lVars : Seq[L[_]], scalaExpr : () => R) = {
+      val (converter, program, expr, types) = Term.processArgs(conv, serializedProg, serializedInputVars, serializedLVars, serializedOutputVars, serializedExpr, inputVarValues, lVarValues)
+      new Term[Unit,R](program, expr, types, converter, lVars.toSet) with Term0[R] {
+        val scalaFunction = scalaExpr
+      }
+    }
+    
+    def apply[R](program : Program, expr : Expr, scalaExpr : () => R, types : Seq[TypeTree], converter : Converter, lVars: Set[L[_]]) =
+      new Term[Unit,R](program, expr, types, converter, lVars) with Term0[R] {
+        val scalaFunction = scalaExpr
+      }
+  }
+  
   object Term1 {
     def apply[T1,R](conv : Converter, serializedProg : Serialized, serializedInputVars: Serialized, serializedLVars: Serialized, serializedOutputVars : Serialized, serializedExpr : Serialized, inputVarValues : Seq[Expr], lVarValues : Seq[Expr], lVars : Seq[L[_]], scalaExpr : (T1) => R) = {
       val (converter, program, expr, types) = Term.processArgs(conv, serializedProg, serializedInputVars, serializedLVars, serializedOutputVars, serializedExpr, inputVarValues, lVarValues)