diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -75,16 +75,16 @@
 passing the function name, the partial definition and the list of primitives:
 
 	factorial :: Int -> Int
-	-- testing 4 combinations of argument values
-	-- pruning with 27/65 rules
-	-- looking through 3 candidates of size 1
-	-- looking through 3 candidates of size 2
-	-- looking through 7 candidates of size 3
-	-- looking through 8 candidates of size 4
-	-- looking through 28 candidates of size 5
-	-- looking through 35 candidates of size 6
-	-- looking through 167 candidates of size 7
-	-- tested 95 candidates
+	-- 0.1s, testing 4 combinations of argument values
+	-- 0.8s, pruning with 27/65 rules
+	-- 0.8s, 3 candidates of size 1
+	-- 0.9s, 3 candidates of size 2
+	-- 0.9s, 7 candidates of size 3
+	-- 0.9s, 8 candidates of size 4
+	-- 0.9s, 28 candidates of size 5
+	-- 0.9s, 35 candidates of size 6
+	-- 0.9s, 167 candidates of size 7
+	-- 0.9s, tested 95 candidates
 	factorial 0  =  1
 	factorial x  =  x * factorial (x - 1)
 
@@ -128,11 +128,11 @@
 	>   , prim "-" ((-) :: Int -> Int -> Int)
 	>   ]
 	take :: Int -> [A] -> [A]
-	-- testing 153 combinations of argument values
-	-- pruning with 4/7 rules
-	-- ...  ...  ...
-	-- looking through 58 candidates of size 9
-	-- tested 104 candidates
+	-- 0.2s, testing 153 combinations of argument values
+	-- 0.2s, pruning with 4/7 rules
+	-- ...   ...   ...   ...   ...
+	-- 0.4s, 5 candidates of size 9
+	-- 0.4s, tested 15 candidates
 	take 0 xs  =  []
 	take x []  =  []
 	take x (y:xs)  =  y:take (x - 1) xs
@@ -181,13 +181,13 @@
 	duplicates' [1,2,3,3,3]  =  [3]
 	duplicates' [1,2,2,3,3]  =  [2,3]
 
-Here is what [`conjureWith`] prints:
+Here is what [`conjure`] prints:
 
-	> conjureWith args{maxSize=18} "duplicates" duplicates primitives
+	> conjure "duplicates" duplicates primitives
 	duplicates :: [Int] -> [Int]
 	-- testing 1 combinations of argument values
 	-- pruning with 21/26 rules
-	-- looking through 2 candidates of size 1
+	-- ...  ...  ...
 	duplicates xs  =  xs
 
 The generated function clearly does not follow our specification.
@@ -204,14 +204,13 @@
 	duplicates [0,1]  =  []
 	duplicates [1,0,1]  =  [1]
 
-Here is what [`conjureWith`] now prints:
+Here is what [`conjure`] now prints:
 
-	> conjureWith args{maxSize=18} "duplicates" duplicates primitives
+	> conjure "duplicates" duplicates primitives
 	duplicates :: [Int] -> [Int]
 	-- testing 3 combinations of argument values
 	-- pruning with 21/26 rules
-	-- ...
-	-- looking through 16 candidates of size 9
+	-- ...  ...  ...
 	duplicates []  =  []
 	duplicates (x:xs)  =  if elem x xs then [x] else []
 
@@ -247,14 +246,17 @@
 
 Now Conjure prints a correct implementation:
 
-	> conjureWith args{maxSize=18} "duplicates" duplicates primitives
+	> conjure "duplicates" duplicates primitives
 	duplicates :: [Int] -> [Int]
-	-- testing 6 combinations of argument values
-	-- ...
-	-- looking through 2189 candidates of size 17
+	-- 0.2s, testing 6 combinations of argument values
+	-- 0.3s, pruning with 21/26 rules
+	-- ...   ...   ...   ...   ...
+	-- 2.1s, 1723 candidates of size 17
+	-- 2.1s, tested 1705 candidates
 	duplicates []  =  []
-	duplicates (x:xs)  =  if elem x xs && not (elem x (duplicates xs)) then x:duplicates xs else duplicates xs
-	(in 1.5s)
+	duplicates (x:xs)  =  if elem x xs && not (elem x (duplicates xs))
+	                      then x:duplicates xs
+	                      else duplicates xs
 
 In this case,
 specifying the function with specific argument-result bindings
diff --git a/TODO.md b/TODO.md
--- a/TODO.md
+++ b/TODO.md
@@ -3,10 +3,6 @@
 
 A non-exhaustive list of things TO DO for Conjure.
 
-* fix targetiers' lazyness
-
-* rewrite after filling in recursions
-
 * Better error reporting when `Listable` is out-of-scope when using `deriveConjurable`.
   This needs to be implemented on LeanCheck itself.
 
@@ -15,50 +11,6 @@
 * consider the size of patterns to thin-out each size partition
 
 * consider non top-level cases
-
-
-## Rewrite after filling in recursions
-
-When Conjure conjures length, it does it like so:
-
-	length []  =  0
-	length (x:xs)  =  length xs + 1
-
-However, the following would precede in term-rewriting order:
-
-	length []  =  0
-	length (x:xs)  =  1 + length xs
-
-The problem is that `_ + 1` precedes `1 + _` in our term rewriting order,
-so when we do the recursion fillings, we get the first version not the second.
-
-Rewriting after filling in recursions would make it so that we get the wanted
-second.
-
-There's an opportunity for a late pruning rule here:
-
-If we rewrite any of the RHS to a smaller expression.  We can prune away that
-candidate.  Considering sub from `eg/colin/ListFuns.hs`:
-
-We encounter the following candidate:
-
-	sub xs []  =  True
-	sub xs (x:ys)  =  sub ys ys && sub ys ys
-
-It can be pruned away by simplifying the last RHS to `sub ys ys`:
-`p && p` is `p`!
-We need to do this pruning in the `fillingsFor` for the most performance gain.
-
-Beware,
-we can't really just check for normality: as we can have:
-
-	length xs + 1
-
-without having
-
-	1 + length xs
-
-We may rewrite to a term of the same size that would not be generated!
 
 
 ## Forbid recursion into negatives
diff --git a/bench/carry-on.txt b/bench/carry-on.txt
--- a/bench/carry-on.txt
+++ b/bench/carry-on.txt
@@ -28,20 +28,20 @@
 factorial 1  =  1
 factorial x  =  x * factorial (x - 1)
 
--- 1301 candidates of size 10
--- 7201 candidates of size 11
--- tested 3216 candidates
+-- 1299 candidates of size 10
+-- 7200 candidates of size 11
+-- tested 3213 candidates
 factorial 0  =  1
 factorial x  =  x + x * (factorial (x - 1) - 1)
 
--- tested 3396 candidates
+-- tested 3393 candidates
 factorial 0  =  1
 factorial x  =  x - x * (1 - factorial (x - 1))
 
--- tested 3519 candidates
+-- tested 3516 candidates
 factorial 0  =  1
 factorial x  =  (0 - x) * (0 - factorial (x - 1))
 
--- tested 10004 candidates
+-- tested 10001 candidates
 cannot conjure
 
diff --git a/bench/gps.txt b/bench/gps.txt
--- a/bench/gps.txt
+++ b/bench/gps.txt
@@ -39,7 +39,7 @@
 -- 0 candidates of size 5
 -- 1248 candidates of size 6
 -- 0 candidates of size 7
--- 18672 candidates of size 8
+-- 17008 candidates of size 8
 -- tested 12358 candidates
 gps3 x y z  =  enumFromThenTo x (x + z) (y - 1)
 
@@ -68,22 +68,22 @@
 -- 0 candidates of size 6
 -- 0 candidates of size 7
 -- 0 candidates of size 8
--- 102 candidates of size 9
--- 30 candidates of size 10
+-- 51 candidates of size 9
+-- 0 candidates of size 10
 -- 15 candidates of size 11
--- tested 141 candidates
+-- tested 60 candidates
 gps4 cs ds es  =  length cs < length ds && length ds < length es
 
 gps5 :: [Char] -> [Char]
 -- testing 5 combinations of argument values
 -- pruning with 2/3 rules
 -- 2 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 2 candidates of size 3
--- 6 candidates of size 4
+-- 0 candidates of size 4
 -- 4 candidates of size 5
--- 13 candidates of size 6
--- tested 28 candidates
+-- 0 candidates of size 6
+-- tested 8 candidates
 cannot conjure
 
 gps6 :: Int -> Int
@@ -147,12 +147,12 @@
 -- 1 candidates of size 1
 -- 0 candidates of size 2
 -- 3 candidates of size 3
--- 15 candidates of size 4
+-- 0 candidates of size 4
 -- 4 candidates of size 5
--- 86 candidates of size 6
+-- 0 candidates of size 6
 -- 5 candidates of size 7
--- 513 candidates of size 8
--- tested 564 candidates
+-- 1 candidates of size 8
+-- tested 14 candidates
 wallisNext (x % y)  =  (y + 1) % (x + 1)
 
 wallisNext :: Ratio Integer -> Ratio Integer
@@ -161,12 +161,12 @@
 -- 1 candidates of size 1
 -- 0 candidates of size 2
 -- 4 candidates of size 3
--- 16 candidates of size 4
+-- 0 candidates of size 4
 -- 3 candidates of size 5
--- 71 candidates of size 6
+-- 0 candidates of size 6
 -- 5 candidates of size 7
--- 393 candidates of size 8
--- tested 451 candidates
+-- 1 candidates of size 8
+-- tested 14 candidates
 wallisNext (x % y)  =  (y + 1) % (x + 1)
 
 gps10 :: Int -> Ratio Integer
@@ -200,11 +200,11 @@
 -- 0 candidates of size 2
 -- 0 candidates of size 3
 -- 0 candidates of size 4
--- 1 candidates of size 5
+-- 0 candidates of size 5
 -- 2 candidates of size 6
 -- 0 candidates of size 7
--- 2 candidates of size 8
--- tested 5 candidates
+-- 1 candidates of size 8
+-- tested 4 candidates
 gps11 []  =  []
 gps11 (cs:css)  =  gps11 css ++ [length cs]
 
@@ -212,31 +212,31 @@
 -- testing 6 combinations of argument values
 -- pruning with 13/27 rules
 -- 2 candidates of size 1
--- 5 candidates of size 2
--- 2 candidates of size 3
--- 9 candidates of size 4
--- 22 candidates of size 5
--- 41 candidates of size 6
--- 125 candidates of size 7
--- 262 candidates of size 8
--- 816 candidates of size 9
--- 1996 candidates of size 10
--- 5925 candidates of size 11
--- tested 6320 candidates
+-- 1 candidates of size 2
+-- 0 candidates of size 3
+-- 3 candidates of size 4
+-- 12 candidates of size 5
+-- 13 candidates of size 6
+-- 65 candidates of size 7
+-- 102 candidates of size 8
+-- 416 candidates of size 9
+-- 956 candidates of size 10
+-- 3073 candidates of size 11
+-- tested 4404 candidates
 gps12 xs  =  (length xs - fromJust (findIndex (0 ==) (reverse xs))) - 1
 
 gps13 :: [Ratio Integer] -> Ratio Integer
 -- testing 3 combinations of argument values
 -- pruning with 4/8 rules
 -- 1 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 2 candidates of size 3
--- 10 candidates of size 4
--- 13 candidates of size 5
--- 51 candidates of size 6
--- 103 candidates of size 7
--- 360 candidates of size 8
--- tested 267 candidates
+-- 2 candidates of size 4
+-- 9 candidates of size 5
+-- 12 candidates of size 6
+-- 67 candidates of size 7
+-- 97 candidates of size 8
+-- tested 179 candidates
 gps13 qs  =  foldr (+) 0 qs / fromIntegral (length qs)
 
 odd :: Int -> Bool
@@ -264,13 +264,13 @@
 -- testing 3 combinations of argument values
 -- pruning with 39/58 rules
 -- 3 candidates of size 1
--- 9 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
--- 27 candidates of size 4
+-- 0 candidates of size 4
 -- 30 candidates of size 5
--- 240 candidates of size 6
--- 453 candidates of size 7
--- tested 353 candidates
+-- 6 candidates of size 6
+-- 345 candidates of size 7
+-- tested 83 candidates
 gps14 []  =  0
 gps14 (x:xs)  =  x + gps14 xs `mod` 2
 
@@ -315,15 +315,15 @@
 -- testing 3 combinations of argument values
 -- pruning with 2/6 rules
 -- 3 candidates of size 1
--- 8 candidates of size 2
--- 11 candidates of size 3
--- 23 candidates of size 4
--- 86 candidates of size 5
--- 84 candidates of size 6
--- 354 candidates of size 7
--- 353 candidates of size 8
--- 1528 candidates of size 9
--- tested 1409 candidates
+-- 0 candidates of size 2
+-- 0 candidates of size 3
+-- 10 candidates of size 4
+-- 25 candidates of size 5
+-- 34 candidates of size 6
+-- 138 candidates of size 7
+-- 126 candidates of size 8
+-- 743 candidates of size 9
+-- tested 767 candidates
 gps18 [] xs  =  xs
 gps18 (x:xs) []  =  xs
 gps18 (x:xs) (y:ys)  =  x + y:gps18 xs ys
@@ -332,10 +332,10 @@
 -- testing 3 combinations of argument values
 -- pruning with 2/7 rules
 -- 2 candidates of size 1
--- 2 candidates of size 2
--- 1 candidates of size 3
+-- 0 candidates of size 2
+-- 0 candidates of size 3
 -- 10 candidates of size 4
--- tested 13 candidates
+-- tested 10 candidates
 gps18 xs ys  =  zipWith (+) xs ys
 
 gps19 :: Int -> [Char] -> [Char]
@@ -389,14 +389,14 @@
 -- 13 candidates of size 5
 -- 28 candidates of size 6
 -- 46 candidates of size 7
--- 126 candidates of size 8
+-- 125 candidates of size 8
 -- 200 candidates of size 9
--- 631 candidates of size 10
--- 1068 candidates of size 11
--- 3495 candidates of size 12
--- 6381 candidates of size 13
--- 20409 candidates of size 14
--- tested 27895 candidates
+-- 625 candidates of size 10
+-- 1066 candidates of size 11
+-- 3459 candidates of size 12
+-- 6361 candidates of size 13
+-- 20207 candidates of size 14
+-- tested 27628 candidates
 pig1 ""  =  "ay"
 pig1 (c:cs)  =  if isVowel c
                 then (c:cs) ++ "ay"
@@ -416,16 +416,16 @@
 -- testing 4 combinations of argument values
 -- pruning with 4/4 rules
 -- 2 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 2 candidates of size 3
--- 6 candidates of size 4
+-- 0 candidates of size 4
 -- 4 candidates of size 5
--- 13 candidates of size 6
+-- 0 candidates of size 6
 -- 8 candidates of size 7
--- 30 candidates of size 8
--- 24 candidates of size 9
--- 65 candidates of size 10
--- tested 92 candidates
+-- 0 candidates of size 8
+-- 16 candidates of size 9
+-- 4 candidates of size 10
+-- tested 34 candidates
 gps21 []  =  []
 gps21 (x:xs)  =  (if x < 0 then 0 else x):gps21 xs
 
@@ -452,16 +452,16 @@
 -- testing 4 combinations of argument values
 -- pruning with 15/19 rules
 -- 1 candidates of size 1
--- 2 candidates of size 2
--- 3 candidates of size 3
+-- 1 candidates of size 2
+-- 0 candidates of size 3
 -- 2 candidates of size 4
--- 8 candidates of size 5
--- 13 candidates of size 6
--- 30 candidates of size 7
--- 75 candidates of size 8
--- 194 candidates of size 9
--- 470 candidates of size 10
--- tested 456 candidates
+-- 2 candidates of size 5
+-- 2 candidates of size 6
+-- 14 candidates of size 7
+-- 25 candidates of size 8
+-- 71 candidates of size 9
+-- 176 candidates of size 10
+-- tested 245 candidates
 gps24 cs  =  chr (ord ' ' + sum (map ord cs) `mod` 64)
 
 gps25 :: Int -> [Int]
@@ -531,9 +531,9 @@
 -- 2 candidates of size 5
 -- 6 candidates of size 6
 -- 10 candidates of size 7
--- 10 candidates of size 8
+-- 8 candidates of size 8
 -- 24 candidates of size 9
--- tested 38 candidates
+-- tested 36 candidates
 gps29 ""  =  0
 gps29 (c:cs)  =  gps29 cs + (if isVowel c then 1 else 0)
 
diff --git a/bench/gps2.txt b/bench/gps2.txt
--- a/bench/gps2.txt
+++ b/bench/gps2.txt
@@ -32,10 +32,10 @@
 -- testing 6 combinations of argument values
 -- pruning with 8/9 rules
 -- 4 candidates of size 1
--- 24 candidates of size 2
--- 75 candidates of size 3
--- 216 candidates of size 4
--- tested 319 candidates
+-- 0 candidates of size 2
+-- 11 candidates of size 3
+-- 29 candidates of size 4
+-- tested 44 candidates
 cannot conjure
 
 gps2 :: Double -> Double -> Int -> Double
@@ -43,11 +43,11 @@
 -- pruning with 2/6 rules
 -- 2 candidates of size 1
 -- 2 candidates of size 2
--- 18 candidates of size 3
--- 66 candidates of size 4
--- 316 candidates of size 5
--- 1376 candidates of size 6
--- tested 1780 candidates
+-- 16 candidates of size 3
+-- 64 candidates of size 4
+-- 256 candidates of size 5
+-- 1252 candidates of size 6
+-- tested 1592 candidates
 cannot conjure
 
 gps3 :: [Char] -> Int
@@ -121,8 +121,8 @@
 -- testing 360 combinations of argument values
 -- pruning with 0/0 rules
 -- 0 candidates of size 1
--- 1 candidates of size 2
--- tested 1 candidates
+-- 0 candidates of size 2
+-- tested 0 candidates
 cannot conjure
 
 gps7 :: Integer -> Integer -> Ratio Integer
@@ -151,15 +151,15 @@
 -- testing 7 combinations of argument values
 -- pruning with 67/100 rules
 -- 4 candidates of size 1
--- 16 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
--- 68 candidates of size 4
+-- 0 candidates of size 4
 -- 80 candidates of size 5
--- 980 candidates of size 6
+-- 8 candidates of size 6
 -- 1428 candidates of size 7
--- 17324 candidates of size 8
--- 30724 candidates of size 9
--- tested 25024 candidates
+-- 432 candidates of size 8
+-- 30712 candidates of size 9
+-- tested 7064 candidates
 gps10 []  =  0
 gps10 (x:xs)  =  gps10 xs + (x `div` 3 - 2)
 
@@ -191,18 +191,18 @@
 -- testing 4 combinations of argument values
 -- pruning with 5/5 rules
 -- 2 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
--- 2 candidates of size 4
+-- 0 candidates of size 4
 -- 1 candidates of size 5
--- 2 candidates of size 6
+-- 0 candidates of size 6
 -- 1 candidates of size 7
--- 4 candidates of size 8
+-- 0 candidates of size 8
 -- 7 candidates of size 9
--- 21 candidates of size 10
--- 34 candidates of size 11
--- 67 candidates of size 12
--- tested 82 candidates
+-- 4 candidates of size 10
+-- 33 candidates of size 11
+-- 18 candidates of size 12
+-- tested 53 candidates
 gps13_leaders []  =  []
 gps13_leaders (x:xs)  =  if all (x >) xs
                          then x:gps13_leaders xs
@@ -225,18 +225,18 @@
 -- testing 7 combinations of argument values
 -- pruning with 10/11 rules
 -- 2 candidates of size 1
--- 3 candidates of size 2
--- 6 candidates of size 3
--- 10 candidates of size 4
--- 19 candidates of size 5
--- 32 candidates of size 6
--- 59 candidates of size 7
--- 124 candidates of size 8
--- 305 candidates of size 9
--- 822 candidates of size 10
--- 2276 candidates of size 11
--- 6273 candidates of size 12
--- tested 3956 candidates
+-- 2 candidates of size 2
+-- 2 candidates of size 3
+-- 3 candidates of size 4
+-- 6 candidates of size 5
+-- 11 candidates of size 6
+-- 23 candidates of size 7
+-- 62 candidates of size 8
+-- 175 candidates of size 9
+-- 489 candidates of size 10
+-- 1346 candidates of size 11
+-- 3709 candidates of size 12
+-- tested 2390 candidates
 gps16_middle ""  =  ""
 gps16_middle (c:cs)  =  if length cs <= 1
                         then c:cs
@@ -246,35 +246,35 @@
 -- testing 5 combinations of argument values
 -- pruning with 29/40 rules
 -- 1 candidates of size 1
--- 2 candidates of size 2
--- 1 candidates of size 3
--- 1 candidates of size 4
--- 3 candidates of size 5
--- tested 8 candidates
+-- 1 candidates of size 2
+-- 0 candidates of size 3
+-- 0 candidates of size 4
+-- 2 candidates of size 5
+-- tested 4 candidates
 cannot conjure
 
 gps18_price :: [Double] -> [Double] -> Double
 -- testing 4 combinations of argument values
 -- pruning with 26/35 rules
 -- 2 candidates of size 1
--- 8 candidates of size 2
--- 32 candidates of size 3
--- 74 candidates of size 4
--- 433 candidates of size 5
--- 1218 candidates of size 6
--- tested 1767 candidates
+-- 0 candidates of size 2
+-- 2 candidates of size 3
+-- 0 candidates of size 4
+-- 33 candidates of size 5
+-- 176 candidates of size 6
+-- tested 213 candidates
 cannot conjure
 
 gps19_snowday :: Int -> Double -> Double -> Double -> Double
 -- testing 7 combinations of argument values
 -- pruning with 6/19 rules
 -- 3 candidates of size 1
--- 6 candidates of size 2
--- 27 candidates of size 3
--- 138 candidates of size 4
--- 435 candidates of size 5
--- 2715 candidates of size 6
--- tested 3324 candidates
+-- 2 candidates of size 2
+-- 21 candidates of size 3
+-- 39 candidates of size 4
+-- 312 candidates of size 5
+-- 659 candidates of size 6
+-- tested 1036 candidates
 cannot conjure
 
 gps20 :: [Char] -> Bool
@@ -362,10 +362,10 @@
 -- 10 candidates of size 7
 -- 48 candidates of size 8
 -- 134 candidates of size 9
--- 224 candidates of size 10
--- 314 candidates of size 11
--- 479 candidates of size 12
--- tested 908 candidates
+-- 216 candidates of size 10
+-- 308 candidates of size 11
+-- 466 candidates of size 12
+-- tested 881 candidates
 gps24 ""  =  Empty
 gps24 (c:cs)  =  if 140 > length cs
                  then Tweet (length (c:cs))
@@ -375,11 +375,11 @@
 -- testing 6 combinations of argument values
 -- pruning with 31/59 rules
 -- 2 candidates of size 1
--- 9 candidates of size 2
--- 49 candidates of size 3
--- 200 candidates of size 4
--- 1104 candidates of size 5
--- 5170 candidates of size 6
--- tested 6534 candidates
+-- 1 candidates of size 2
+-- 5 candidates of size 3
+-- 10 candidates of size 4
+-- 76 candidates of size 5
+-- 438 candidates of size 6
+-- tested 532 candidates
 cannot conjure
 
diff --git a/bench/ill-hit.txt b/bench/ill-hit.txt
--- a/bench/ill-hit.txt
+++ b/bench/ill-hit.txt
@@ -2,11 +2,11 @@
 -- testing 4 combinations of argument values
 -- pruning with 14/25 rules
 -- 2 candidates of size 1
--- 3 candidates of size 2
--- 2 candidates of size 3
--- 6 candidates of size 4
--- 11 candidates of size 5
--- tested 14 candidates
+-- 1 candidates of size 2
+-- 1 candidates of size 3
+-- 2 candidates of size 4
+-- 7 candidates of size 5
+-- tested 7 candidates
 sum []  =  0
 sum (x:xs)  =  x + sum xs
 
diff --git a/bench/lowtests.txt b/bench/lowtests.txt
--- a/bench/lowtests.txt
+++ b/bench/lowtests.txt
@@ -19,19 +19,19 @@
 -- 4 candidates of size 4
 -- 0 candidates of size 5
 -- 0 candidates of size 6
--- 10 candidates of size 7
--- 10 candidates of size 8
+-- 3 candidates of size 7
+-- 2 candidates of size 8
 -- 0 candidates of size 9
--- 6 candidates of size 10
--- 20 candidates of size 11
--- 15 candidates of size 12
+-- 4 candidates of size 10
+-- 8 candidates of size 11
+-- 4 candidates of size 12
 -- 0 candidates of size 13
 -- 0 candidates of size 14
 -- 0 candidates of size 15
 -- 0 candidates of size 16
 -- 0 candidates of size 17
 -- 0 candidates of size 18
--- tested 67 candidates
+-- tested 27 candidates
 cannot conjure
 
 subset :: [Int] -> [Int] -> Bool
diff --git a/bench/runtime/zero/bench/candidates.runtime b/bench/runtime/zero/bench/candidates.runtime
--- a/bench/runtime/zero/bench/candidates.runtime
+++ b/bench/runtime/zero/bench/candidates.runtime
@@ -1,1 +1,1 @@
-16.4
+17.7
diff --git a/bench/runtime/zero/bench/carry-on.runtime b/bench/runtime/zero/bench/carry-on.runtime
--- a/bench/runtime/zero/bench/carry-on.runtime
+++ b/bench/runtime/zero/bench/carry-on.runtime
@@ -1,1 +1,1 @@
-4.3
+4.7
diff --git a/bench/runtime/zero/bench/erroneous.runtime b/bench/runtime/zero/bench/erroneous.runtime
--- a/bench/runtime/zero/bench/erroneous.runtime
+++ b/bench/runtime/zero/bench/erroneous.runtime
@@ -1,1 +1,1 @@
-4.9
+5.7
diff --git a/bench/runtime/zero/bench/gps.runtime b/bench/runtime/zero/bench/gps.runtime
--- a/bench/runtime/zero/bench/gps.runtime
+++ b/bench/runtime/zero/bench/gps.runtime
@@ -1,1 +1,1 @@
-25.8
+28.4
diff --git a/bench/runtime/zero/bench/gps2.runtime b/bench/runtime/zero/bench/gps2.runtime
--- a/bench/runtime/zero/bench/gps2.runtime
+++ b/bench/runtime/zero/bench/gps2.runtime
@@ -1,1 +1,1 @@
-21.1
+23.2
diff --git a/bench/runtime/zero/bench/ill-hit.runtime b/bench/runtime/zero/bench/ill-hit.runtime
--- a/bench/runtime/zero/bench/ill-hit.runtime
+++ b/bench/runtime/zero/bench/ill-hit.runtime
@@ -1,1 +1,1 @@
-0.8
+0.9
diff --git a/bench/runtime/zero/bench/lowtests.runtime b/bench/runtime/zero/bench/lowtests.runtime
--- a/bench/runtime/zero/bench/lowtests.runtime
+++ b/bench/runtime/zero/bench/lowtests.runtime
@@ -1,1 +1,1 @@
-0.5
+0.8
diff --git a/bench/runtime/zero/bench/p12.runtime b/bench/runtime/zero/bench/p12.runtime
--- a/bench/runtime/zero/bench/p12.runtime
+++ b/bench/runtime/zero/bench/p12.runtime
@@ -1,1 +1,1 @@
-2.9
+3.0
diff --git a/bench/runtime/zero/bench/redundants.runtime b/bench/runtime/zero/bench/redundants.runtime
--- a/bench/runtime/zero/bench/redundants.runtime
+++ b/bench/runtime/zero/bench/redundants.runtime
@@ -1,1 +1,1 @@
-5.6
+6.4
diff --git a/bench/runtime/zero/bench/strategies.runtime b/bench/runtime/zero/bench/strategies.runtime
--- a/bench/runtime/zero/bench/strategies.runtime
+++ b/bench/runtime/zero/bench/strategies.runtime
@@ -1,1 +1,1 @@
-8.0
+8.9
diff --git a/bench/runtime/zero/bench/terpret.runtime b/bench/runtime/zero/bench/terpret.runtime
--- a/bench/runtime/zero/bench/terpret.runtime
+++ b/bench/runtime/zero/bench/terpret.runtime
@@ -1,1 +1,1 @@
-13.5
+14.2
diff --git a/bench/runtime/zero/bench/unique.runtime b/bench/runtime/zero/bench/unique.runtime
--- a/bench/runtime/zero/bench/unique.runtime
+++ b/bench/runtime/zero/bench/unique.runtime
@@ -1,1 +1,1 @@
-4.0
+4.8
diff --git a/bench/runtime/zero/eg/arith.runtime b/bench/runtime/zero/eg/arith.runtime
--- a/bench/runtime/zero/eg/arith.runtime
+++ b/bench/runtime/zero/eg/arith.runtime
@@ -1,1 +1,1 @@
-1.7
+2.0
diff --git a/bench/runtime/zero/eg/bits.runtime b/bench/runtime/zero/eg/bits.runtime
--- a/bench/runtime/zero/eg/bits.runtime
+++ b/bench/runtime/zero/eg/bits.runtime
@@ -1,1 +1,1 @@
-5.6
+6.3
diff --git a/bench/runtime/zero/eg/bools.runtime b/bench/runtime/zero/eg/bools.runtime
--- a/bench/runtime/zero/eg/bools.runtime
+++ b/bench/runtime/zero/eg/bools.runtime
@@ -1,1 +1,1 @@
-2.6
+3.1
diff --git a/bench/runtime/zero/eg/bst.runtime b/bench/runtime/zero/eg/bst.runtime
--- a/bench/runtime/zero/eg/bst.runtime
+++ b/bench/runtime/zero/eg/bst.runtime
@@ -1,1 +1,1 @@
-8.8
+7.4
diff --git a/bench/runtime/zero/eg/count.runtime b/bench/runtime/zero/eg/count.runtime
--- a/bench/runtime/zero/eg/count.runtime
+++ b/bench/runtime/zero/eg/count.runtime
@@ -1,1 +1,1 @@
-0.5
+0.7
diff --git a/bench/runtime/zero/eg/dupos.runtime b/bench/runtime/zero/eg/dupos.runtime
--- a/bench/runtime/zero/eg/dupos.runtime
+++ b/bench/runtime/zero/eg/dupos.runtime
@@ -1,1 +1,1 @@
-6.3
+6.0
diff --git a/bench/runtime/zero/eg/either.runtime b/bench/runtime/zero/eg/either.runtime
--- a/bench/runtime/zero/eg/either.runtime
+++ b/bench/runtime/zero/eg/either.runtime
@@ -1,1 +1,1 @@
-0.2
+0.3
diff --git a/bench/runtime/zero/eg/factorial.runtime b/bench/runtime/zero/eg/factorial.runtime
--- a/bench/runtime/zero/eg/factorial.runtime
+++ b/bench/runtime/zero/eg/factorial.runtime
@@ -1,1 +1,1 @@
-2.2
+2.6
diff --git a/bench/runtime/zero/eg/fib01.runtime b/bench/runtime/zero/eg/fib01.runtime
--- a/bench/runtime/zero/eg/fib01.runtime
+++ b/bench/runtime/zero/eg/fib01.runtime
@@ -1,1 +1,1 @@
-1.4
+1.0
diff --git a/bench/runtime/zero/eg/fibonacci.runtime b/bench/runtime/zero/eg/fibonacci.runtime
--- a/bench/runtime/zero/eg/fibonacci.runtime
+++ b/bench/runtime/zero/eg/fibonacci.runtime
@@ -1,1 +1,1 @@
-5.9
+6.2
diff --git a/bench/runtime/zero/eg/gcd.runtime b/bench/runtime/zero/eg/gcd.runtime
--- a/bench/runtime/zero/eg/gcd.runtime
+++ b/bench/runtime/zero/eg/gcd.runtime
@@ -1,1 +1,1 @@
-0.2
+0.3
diff --git a/bench/runtime/zero/eg/higher.runtime b/bench/runtime/zero/eg/higher.runtime
--- a/bench/runtime/zero/eg/higher.runtime
+++ b/bench/runtime/zero/eg/higher.runtime
@@ -1,1 +1,1 @@
-1.1
+1.7
diff --git a/bench/runtime/zero/eg/ints.runtime b/bench/runtime/zero/eg/ints.runtime
--- a/bench/runtime/zero/eg/ints.runtime
+++ b/bench/runtime/zero/eg/ints.runtime
@@ -1,1 +1,1 @@
-0.9
+1.0
diff --git a/bench/runtime/zero/eg/list.runtime b/bench/runtime/zero/eg/list.runtime
--- a/bench/runtime/zero/eg/list.runtime
+++ b/bench/runtime/zero/eg/list.runtime
@@ -1,1 +1,1 @@
-1.0
+1.1
diff --git a/bench/runtime/zero/eg/maybe.runtime b/bench/runtime/zero/eg/maybe.runtime
--- a/bench/runtime/zero/eg/maybe.runtime
+++ b/bench/runtime/zero/eg/maybe.runtime
@@ -1,1 +1,1 @@
-0.5
+0.6
diff --git a/bench/runtime/zero/eg/peano.runtime b/bench/runtime/zero/eg/peano.runtime
--- a/bench/runtime/zero/eg/peano.runtime
+++ b/bench/runtime/zero/eg/peano.runtime
@@ -1,1 +1,1 @@
-0.5
+0.6
diff --git a/bench/runtime/zero/eg/pow.runtime b/bench/runtime/zero/eg/pow.runtime
--- a/bench/runtime/zero/eg/pow.runtime
+++ b/bench/runtime/zero/eg/pow.runtime
@@ -1,1 +1,1 @@
-7.3
+5.3
diff --git a/bench/runtime/zero/eg/replicate.runtime b/bench/runtime/zero/eg/replicate.runtime
--- a/bench/runtime/zero/eg/replicate.runtime
+++ b/bench/runtime/zero/eg/replicate.runtime
@@ -1,1 +1,1 @@
-0.3
+0.4
diff --git a/bench/runtime/zero/eg/sort.runtime b/bench/runtime/zero/eg/sort.runtime
--- a/bench/runtime/zero/eg/sort.runtime
+++ b/bench/runtime/zero/eg/sort.runtime
@@ -1,1 +1,1 @@
-6.2
+5.3
diff --git a/bench/runtime/zero/eg/spec.runtime b/bench/runtime/zero/eg/spec.runtime
--- a/bench/runtime/zero/eg/spec.runtime
+++ b/bench/runtime/zero/eg/spec.runtime
@@ -1,1 +1,1 @@
-1.1
+1.5
diff --git a/bench/runtime/zero/eg/subset.runtime b/bench/runtime/zero/eg/subset.runtime
--- a/bench/runtime/zero/eg/subset.runtime
+++ b/bench/runtime/zero/eg/subset.runtime
@@ -1,1 +1,1 @@
-0.8
+1.1
diff --git a/bench/runtime/zero/eg/take-drop.runtime b/bench/runtime/zero/eg/take-drop.runtime
--- a/bench/runtime/zero/eg/take-drop.runtime
+++ b/bench/runtime/zero/eg/take-drop.runtime
@@ -1,1 +1,1 @@
-0.5
+0.6
diff --git a/bench/runtime/zero/eg/these.runtime b/bench/runtime/zero/eg/these.runtime
--- a/bench/runtime/zero/eg/these.runtime
+++ b/bench/runtime/zero/eg/these.runtime
@@ -1,1 +1,1 @@
-1.3
+1.7
diff --git a/bench/runtime/zero/eg/tree.runtime b/bench/runtime/zero/eg/tree.runtime
--- a/bench/runtime/zero/eg/tree.runtime
+++ b/bench/runtime/zero/eg/tree.runtime
@@ -1,1 +1,1 @@
-2.5
+2.7
diff --git a/bench/runtime/zero/eg/tri.runtime b/bench/runtime/zero/eg/tri.runtime
--- a/bench/runtime/zero/eg/tri.runtime
+++ b/bench/runtime/zero/eg/tri.runtime
@@ -1,1 +1,1 @@
-0.4
+0.5
diff --git a/bench/self.txt b/bench/self.txt
--- a/bench/self.txt
+++ b/bench/self.txt
@@ -2,18 +2,18 @@
 -- testing 360 combinations of argument values
 -- pruning with 0/0 rules
 -- 4 candidates of size 1
--- 16 candidates of size 2
--- 56 candidates of size 3
--- tested 22 candidates
+-- 6 candidates of size 2
+-- 26 candidates of size 3
+-- tested 12 candidates
 x ? y  =  x + y
 
 (?) :: Int -> Int -> Int
 -- testing 360 combinations of argument values
 -- pruning with 0/0 rules
 -- 4 candidates of size 1
--- 16 candidates of size 2
--- 56 candidates of size 3
--- tested 34 candidates
+-- 4 candidates of size 2
+-- 31 candidates of size 3
+-- tested 22 candidates
 x ? y  =  x * y
 
 i :: Int -> Int
diff --git a/bench/strategies.txt b/bench/strategies.txt
--- a/bench/strategies.txt
+++ b/bench/strategies.txt
@@ -64,12 +64,12 @@
 -- pruning with 27/65 rules
 -- 3 candidates of size 1
 -- 6 candidates of size 2
--- 12 candidates of size 3
--- 24 candidates of size 4
--- 37 candidates of size 5
--- 72 candidates of size 6
--- 196 candidates of size 7
--- tested 165 candidates
+-- 9 candidates of size 3
+-- 18 candidates of size 4
+-- 31 candidates of size 5
+-- 59 candidates of size 6
+-- 171 candidates of size 7
+-- tested 137 candidates
 factorial 0  =  1
 factorial x  =  x * factorial (x - 1)
 
@@ -79,12 +79,12 @@
 -- pruning with 27/65 rules
 -- 3 candidates of size 1
 -- 6 candidates of size 2
--- 12 candidates of size 3
--- 24 candidates of size 4
--- 47 candidates of size 5
--- 82 candidates of size 6
--- 342 candidates of size 7
--- tested 284 candidates
+-- 9 candidates of size 3
+-- 18 candidates of size 4
+-- 41 candidates of size 5
+-- 64 candidates of size 6
+-- 307 candidates of size 7
+-- tested 251 candidates
 factorial 0  =  1
 factorial x  =  x * factorial (x - 1)
 
@@ -94,12 +94,12 @@
 -- pruning with 27/65 rules
 -- 3 candidates of size 1
 -- 6 candidates of size 2
--- 21 candidates of size 3
--- 42 candidates of size 4
--- 302 candidates of size 5
--- 602 candidates of size 6
--- 6115 candidates of size 7
--- tested 1001 candidates
+-- 18 candidates of size 3
+-- 36 candidates of size 4
+-- 287 candidates of size 5
+-- 571 candidates of size 6
+-- 5843 candidates of size 7
+-- tested 946 candidates
 factorial 0  =  1
 factorial x  =  x * factorial (x - 1)
 
@@ -124,12 +124,12 @@
 -- pruning with 27/65 rules
 -- 3 candidates of size 1
 -- 6 candidates of size 2
--- 21 candidates of size 3
--- 42 candidates of size 4
--- 330 candidates of size 5
--- 630 candidates of size 6
--- 7215 candidates of size 7
--- tested 1945 candidates
+-- 18 candidates of size 3
+-- 36 candidates of size 4
+-- 315 candidates of size 5
+-- 585 candidates of size 6
+-- 6915 candidates of size 7
+-- tested 1876 candidates
 factorial 0  =  1
 factorial x  =  x * factorial (x - 1)
 
diff --git a/bench/terpret.txt b/bench/terpret.txt
--- a/bench/terpret.txt
+++ b/bench/terpret.txt
@@ -4,12 +4,12 @@
 -- testing 4 combinations of argument values
 -- pruning with 41/51 rules
 -- 2 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 4 candidates of size 3
--- 10 candidates of size 4
--- 15 candidates of size 5
--- 41 candidates of size 6
--- tested 33 candidates
+-- 0 candidates of size 4
+-- 11 candidates of size 5
+-- 5 candidates of size 6
+-- tested 18 candidates
 invert []  =  []
 invert (p:ps)  =  not p:invert ps
 
@@ -19,9 +19,9 @@
 -- testing 3 combinations of argument values
 -- pruning with 41/51 rules
 -- 2 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 4 candidates of size 3
--- tested 4 candidates
+-- tested 3 candidates
 prependZero ps  =  False:ps
 
 TerpreT benchmark #3: binary decrement
@@ -30,15 +30,15 @@
 -- testing 3 combinations of argument values
 -- pruning with 41/51 rules
 -- 2 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 4 candidates of size 3
--- 10 candidates of size 4
--- 15 candidates of size 5
--- 41 candidates of size 6
--- 82 candidates of size 7
--- 202 candidates of size 8
--- 479 candidates of size 9
--- tested 411 candidates
+-- 0 candidates of size 4
+-- 11 candidates of size 5
+-- 5 candidates of size 6
+-- 31 candidates of size 7
+-- 52 candidates of size 8
+-- 128 candidates of size 9
+-- tested 154 candidates
 decrement []  =  []
 decrement (p:ps)  =  not p:(if p then ps else decrement ps)
 
@@ -52,14 +52,14 @@
 -- 0 candidates of size 2
 -- 0 candidates of size 3
 -- 10 candidates of size 4
--- 125 candidates of size 5
--- 225 candidates of size 6
--- 625 candidates of size 7
--- 1242 candidates of size 8
--- 3087 candidates of size 9
--- 8937 candidates of size 10
--- 102200 candidates of size 11
--- tested 39710 candidates
+-- 0 candidates of size 5
+-- 0 candidates of size 6
+-- 40 candidates of size 7
+-- 0 candidates of size 8
+-- 0 candidates of size 9
+-- 360 candidates of size 10
+-- 4 candidates of size 11
+-- tested 412 candidates
 cshift (p,q,r)  =  if p
                    then (p,r,q)
                    else (p,q,r)
@@ -75,8 +75,8 @@
 -- 225 candidates of size 5
 -- 585 candidates of size 6
 -- 1242 candidates of size 7
--- 15183 candidates of size 8
--- tested 15459 candidates
+-- 3088 candidates of size 8
+-- tested 5265 candidates
 cshift False p q  =  (False,p,q)
 cshift True p q  =  (True,q,p)
 
@@ -90,10 +90,10 @@
 -- 9 candidates of size 3
 -- 18 candidates of size 4
 -- 27 candidates of size 5
--- 72 candidates of size 6
--- 245 candidates of size 7
--- 663 candidates of size 8
--- tested 1034 candidates
+-- 36 candidates of size 6
+-- 45 candidates of size 7
+-- 271 candidates of size 8
+-- tested 406 candidates
 fadder False False False  =  (False,False)
 fadder False False True  =  (False,True)
 fadder False True False  =  (False,True)
@@ -113,9 +113,9 @@
 -- 0 candidates of size 2
 -- 0 candidates of size 3
 -- 8 candidates of size 4
--- 128 candidates of size 5
--- 408 candidates of size 6
--- tested 544 candidates
+-- 0 candidates of size 5
+-- 0 candidates of size 6
+-- tested 8 candidates
 cannot conjure
 
 TerpreT benchmark #7: access
@@ -133,13 +133,13 @@
 -- testing 5 combinations of argument values
 -- pruning with 4/7 rules
 -- 1 candidates of size 1
--- 1 candidates of size 2
--- 1 candidates of size 3
--- 1 candidates of size 4
--- 6 candidates of size 5
--- 5 candidates of size 6
--- 19 candidates of size 7
--- tested 18 candidates
+-- 0 candidates of size 2
+-- 0 candidates of size 3
+-- 0 candidates of size 4
+-- 3 candidates of size 5
+-- 0 candidates of size 6
+-- 3 candidates of size 7
+-- tested 5 candidates
 [] `access` x  =  undefined
 (x:xs) `access` 0  =  x
 (x:xs) `access` y  =  xs `access` (y - 1)
@@ -150,13 +150,13 @@
 -- testing 3 combinations of argument values
 -- pruning with 3/23 rules
 -- 2 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 2 candidates of size 3
--- 7 candidates of size 4
--- 8 candidates of size 5
--- 29 candidates of size 6
--- 39 candidates of size 7
--- tested 51 candidates
+-- 1 candidates of size 4
+-- 6 candidates of size 5
+-- 6 candidates of size 6
+-- 19 candidates of size 7
+-- tested 19 candidates
 decrelements []  =  []
 decrelements (x:xs)  =  x - 1:decrelements xs
 
@@ -164,9 +164,9 @@
 -- testing 3 combinations of argument values
 -- pruning with 5/26 rules
 -- 2 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 2 candidates of size 3
--- 8 candidates of size 4
--- tested 7 candidates
+-- 2 candidates of size 4
+-- tested 6 candidates
 decrelements xs  =  map (subtract 1) xs
 
diff --git a/bench/weird.txt b/bench/weird.txt
--- a/bench/weird.txt
+++ b/bench/weird.txt
@@ -2,9 +2,9 @@
 -- testing 360 combinations of argument values
 -- pruning with 56/91 rules
 -- 4 candidates of size 1
--- 16 candidates of size 2
--- 40 candidates of size 3
--- tested 37 candidates
+-- 6 candidates of size 2
+-- 10 candidates of size 3
+-- tested 19 candidates
 0 ^^^ x  =  x
 x ^^^ 0  =  x
 x ^^^ y  =  0
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -2,6 +2,19 @@
 ============================
 
 
+v0.6.6 (February 2025)
+----------------------
+
+* (pruning) test candidate cases earlier and indepentently
+  (can be disabled with `earlyTests=False`);
+* (pruning) rewrite after filling in recursions;
+* improve showing of test values;
+* some internal refactoring and code cleanup;
+* update documentation of new interfaces
+  with runtimes in examples
+  and removal of uneeded uses of maxSize.
+
+
 v0.6.4 (February 2025)
 ----------------------
 
diff --git a/code-conjure.cabal b/code-conjure.cabal
--- a/code-conjure.cabal
+++ b/code-conjure.cabal
@@ -3,7 +3,7 @@
 -- Copyright (C) 2021-2025 Rudy Matela
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 name:                code-conjure
-version:             0.6.4
+version:             0.6.6
 synopsis:            synthesize Haskell functions out of partial definitions
 description:
   Conjure is a tool that synthesizes Haskell functions out of partial definitions.
@@ -69,7 +69,7 @@
 source-repository this
   type:            git
   location:        https://github.com/rudymatela/conjure
-  tag:             v0.6.4
+  tag:             v0.6.6
 
 library
   exposed-modules: Conjure
diff --git a/eg/arith.txt b/eg/arith.txt
--- a/eg/arith.txt
+++ b/eg/arith.txt
@@ -22,9 +22,9 @@
 -- testing 4 combinations of argument values
 -- pruning with 14/25 rules
 -- 4 candidates of size 1
--- 16 candidates of size 2
--- 40 candidates of size 3
--- tested 22 candidates
+-- 6 candidates of size 2
+-- 10 candidates of size 3
+-- tested 12 candidates
 add x y  =  x + y
 
 square :: Int -> Int
diff --git a/eg/bools.txt b/eg/bools.txt
--- a/eg/bools.txt
+++ b/eg/bools.txt
@@ -2,11 +2,11 @@
 -- testing 14 combinations of argument values
 -- pruning with 37/47 rules
 -- 2 candidates of size 1
--- 4 candidates of size 2
--- 2 candidates of size 3
+-- 0 candidates of size 2
+-- 0 candidates of size 3
 -- 2 candidates of size 4
 -- 4 candidates of size 5
--- tested 14 candidates
+-- tested 8 candidates
 and []  =  True
 and (p:ps)  =  p && and ps
 
@@ -14,11 +14,11 @@
 -- testing 14 combinations of argument values
 -- pruning with 37/47 rules
 -- 2 candidates of size 1
--- 4 candidates of size 2
--- 2 candidates of size 3
+-- 0 candidates of size 2
+-- 0 candidates of size 3
 -- 2 candidates of size 4
 -- 4 candidates of size 5
--- tested 11 candidates
+-- tested 5 candidates
 or []  =  False
 or (p:ps)  =  p || or ps
 
@@ -26,19 +26,19 @@
 -- testing 14 combinations of argument values
 -- pruning with 39/49 rules
 -- 2 candidates of size 1
--- 4 candidates of size 2
--- 2 candidates of size 3
+-- 0 candidates of size 2
+-- 0 candidates of size 3
 -- 4 candidates of size 4
--- tested 12 candidates
+-- tested 6 candidates
 and ps  =  foldr (&&) True ps
 
 or :: [Bool] -> Bool
 -- testing 14 combinations of argument values
 -- pruning with 39/49 rules
 -- 2 candidates of size 1
--- 4 candidates of size 2
--- 2 candidates of size 3
+-- 0 candidates of size 2
+-- 0 candidates of size 3
 -- 4 candidates of size 4
--- tested 11 candidates
+-- tested 5 candidates
 or ps  =  foldr (||) False ps
 
diff --git a/eg/bst.txt b/eg/bst.txt
--- a/eg/bst.txt
+++ b/eg/bst.txt
@@ -4,16 +4,16 @@
 -- 1 candidates of size 1
 -- 0 candidates of size 2
 -- 0 candidates of size 3
--- 3 candidates of size 4
+-- 0 candidates of size 4
 -- 0 candidates of size 5
 -- 0 candidates of size 6
 -- 0 candidates of size 7
--- 31 candidates of size 8
--- 92 candidates of size 9
+-- 24 candidates of size 8
+-- 72 candidates of size 9
 -- 0 candidates of size 10
--- 304 candidates of size 11
--- 151 candidates of size 12
--- tested 497 candidates
+-- 240 candidates of size 11
+-- 96 candidates of size 12
+-- tested 362 candidates
 mem x Leaf  =  False
 mem x (Node t1 y t2)  =  mem x t1 || (mem x t2 || x == y)
 
@@ -21,18 +21,18 @@
 -- testing 360 combinations of argument values
 -- pruning with 1/2 rules
 -- 2 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
 -- 0 candidates of size 4
 -- 0 candidates of size 5
 -- 0 candidates of size 6
 -- 6 candidates of size 7
--- 24 candidates of size 8
+-- 0 candidates of size 8
 -- 0 candidates of size 9
 -- 192 candidates of size 10
 -- 0 candidates of size 11
 -- 384 candidates of size 12
--- tested 371 candidates
+-- tested 346 candidates
 mem x Leaf  =  False
 mem x (Node t1 y t2)  =  case x `compare` y of
                          LT -> mem x t1
@@ -43,18 +43,18 @@
 -- testing 360 combinations of argument values
 -- pruning with 2/3 rules
 -- 2 candidates of size 1
--- 2 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
 -- 4 candidates of size 4
--- 21 candidates of size 5
+-- 0 candidates of size 5
 -- 0 candidates of size 6
--- 74 candidates of size 7
--- 335 candidates of size 8
--- 32 candidates of size 9
--- 1504 candidates of size 10
--- 6708 candidates of size 11
--- 1760 candidates of size 12
--- tested 10442 candidates
+-- 26 candidates of size 7
+-- 0 candidates of size 8
+-- 0 candidates of size 9
+-- 200 candidates of size 10
+-- 0 candidates of size 11
+-- 32 candidates of size 12
+-- tested 264 candidates
 cannot conjure
 
 before :: Int -> Tree -> Tree
@@ -69,9 +69,9 @@
 -- 239 candidates of size 8
 -- 104 candidates of size 9
 -- 1558 candidates of size 10
--- 3555 candidates of size 11
+-- 3543 candidates of size 11
 -- 4028 candidates of size 12
--- tested 9599 candidates
+-- tested 9587 candidates
 cannot conjure
 
 before :: Int -> Tree -> Tree
@@ -112,13 +112,14 @@
 -- testing 360 combinations of argument values
 -- pruning with 6/8 rules
 -- 3 candidates of size 1
--- 12 candidates of size 2
--- 32 candidates of size 3
--- 58 candidates of size 4
--- 434 candidates of size 5
--- 922 candidates of size 6
--- 3088 candidates of size 7
--- 14022 candidates of size 8
--- tested 18571 candidates
+-- 0 candidates of size 2
+-- 0 candidates of size 3
+-- 22 candidates of size 4
+-- 0 candidates of size 5
+-- 68 candidates of size 6
+-- 240 candidates of size 7
+-- 82 candidates of size 8
+-- 3018 candidates of size 9
+-- tested 3433 candidates
 cannot conjure
 
diff --git a/eg/colin/ListFuns.hs b/eg/colin/ListFuns.hs
--- a/eg/colin/ListFuns.hs
+++ b/eg/colin/ListFuns.hs
@@ -1,6 +1,6 @@
---- 2021, 2025  Colin Runciman
+-- 2021, 2025  Colin Runciman
 import Conjure
-import Prelude hiding (sum, take, drop)
+import Prelude hiding (sum, take, drop, zip)
 
 sum :: [Int] -> Int
 sum []       =  0
@@ -65,7 +65,7 @@
 -- sub :: [Int] -> [Int] -> Bool
 -- sub []     _       =  True
 -- sub _      []      =  False
--- sub (x:xs) (y:ys)  =  x == y && sub xs ys || sub (x:xs) ys
+-- sub (x:xs) (y:ys)  =  if x == y then sub xs ys else sub (x:xs) ys
 
 subBackground :: [Prim]
 subBackground  =
@@ -73,8 +73,7 @@
   , pr False
   , prim ":" ((:) :: Int -> [Int] -> [Int])
   , prim "==" ((==) :: Int -> Int -> Bool)
-  , prim "&&" ((&&) :: Bool -> Bool -> Bool)
-  , prim "||" ((||) :: Bool -> Bool -> Bool)
+  , prif (undefined :: Bool)
   ]
 
 set :: [Int] -> Bool
@@ -112,7 +111,7 @@
 -- take x (y:ys)  =  y : take (x-1) ys
 
 takeBackground :: [Prim]
-takeBackground =
+takeBackground  =
   [ pr (0 :: Int)
   , pr (1 :: Int)
   , pr ([] :: [A])
@@ -134,20 +133,105 @@
 -- drop x (y:ys)  =  drop (x-1) ys
 
 dropBackground :: [Prim]
-dropBackground =
+dropBackground  =
   [ pr (0 :: Int)
   , pr (1 :: Int)
   , pr ([] :: [A])
   , prim "-" ((-) :: Int -> Int -> Int)
   ]
 
+ord :: [Int] -> Bool
+ord []       =  True
+ord [0]      =  True
+ord [0,1]    =  True
+ord [1,0]    =  False
+ord [0,1,0]  =  False
+ord [0,1,1]  =  True
+
+-- hoping for something like
+-- ord []   =  True
+-- ord [x]  =  True
+-- ord (x:y:ys)  =  x <= y && ord (y:ys)
+
+ordBackground :: [Prim]
+ordBackground  =
+  [ pr True
+  , prim "null" (null :: [Int] -> Bool)
+  , prim "head" (head :: [Int] -> Int)
+  , prim "<=" ((<=) :: Int -> Int -> Bool)
+  , prim "&&" (&&)
+  , prim "||" (||)
+  ]
+
+merge :: [Int] -> [Int] -> [Int]
+merge []    [0,1]  =  [0,1]
+merge [0,1] []     =  [0,1]
+merge [0,2] [1,3]  =  [0,1,2,3]
+merge [1,3] [0,2]  =  [0,1,2,3]
+
+-- hoping for something like
+merge [] ys  =  ys
+merge xs []  =  xs
+merge (x:xs) (y:ys)  =  if x <= y
+                        then x : merge xs (y:ys)
+                        else y : merge (x:xs) ys
+
+mergeBackground :: [Prim]
+mergeBackground  =
+  [ prim "<=" ((<=) :: Int -> Int -> Bool)
+  , pr ([] :: [Int])
+  , prim ":" ((:) :: Int -> [Int] -> [Int])
+  , prif (undefined :: [Int])
+  ]
+
+zip :: [A] -> [B] -> [(A,B)]
+zip []    []     =  []
+zip []    [x,y]  =  []
+zip [v,w] []     =  []
+zip [v,w] [x,y]  =  [(v,x),(w,y)]
+
+-- hoping for something like
+-- zip []     _       =  []
+-- zip (x:xs) []      =  []
+-- zip (x:xs) (y:ys)  =  (x,y) : zip xs ys
+
+zipBackground :: [Prim]
+zipBackground  =
+  [ pr ([] :: [(A,B)])
+  , prim "(,)" ((,) :: A -> B -> (A,B))
+  , prim ":" ((:) :: (A,B) -> [(A,B)] -> [(A,B)])
+  ]
+
+assocs :: Int -> [(Int,A)] -> [A]
+assocs 1 []             =  []
+assocs 0 [(0,x),(1,y)]  =  [x]
+assocs 1 [(0,x),(1,y)]  =  [y]
+assocs 2 [(2,x),(2,y)]  =  [x,y]
+
+-- hoping for something like
+-- assocs _ []      =  []
+-- assocs n (x:xs)  =  if fst x == n then snd x : assocs n xs else assocs n xs
+
+assocsBackground :: [Prim]
+assocsBackground  =
+  [ pr ([] :: [A])
+  , prim "==" ((==) :: Int -> Int -> Bool)
+  , prim ":" ((:) :: A -> [A] -> [A])
+  , prim "fst" (fst :: (Int,A) -> Int)
+  , prim "snd" (snd :: (Int,A) -> A)
+  , prif (undefined :: [A])
+  ]
+
 main :: IO ()
 main = do
   conjure "sum" sum sumBackground
   conjure "app" app appBackground
   conjure "mem" mem memBackground
-  conjureWith args{maxSize=15,showCandidates=False} "sub" sub subBackground
+  conjure "sub" sub subBackground
   conjure "set" set setBackground
   conjure "take" take takeBackground
   conjure "drop" drop dropBackground
-
+  conjure "ord" ord ordBackground
+  conjure "merge" merge mergeBackground
+  conjure "zip" zip zipBackground
+  conjure "assocs" assocs assocsBackground
diff --git a/eg/colin/ListFuns.txt b/eg/colin/ListFuns.txt
--- a/eg/colin/ListFuns.txt
+++ b/eg/colin/ListFuns.txt
@@ -2,11 +2,11 @@
 -- testing 3 combinations of argument values
 -- pruning with 4/8 rules
 -- 1 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
--- 1 candidates of size 4
+-- 0 candidates of size 4
 -- 1 candidates of size 5
--- tested 4 candidates
+-- tested 2 candidates
 sum []  =  0
 sum (x:xs)  =  x + sum xs
 
@@ -14,12 +14,12 @@
 -- testing 3 combinations of argument values
 -- pruning with 0/0 rules
 -- 2 candidates of size 1
--- 2 candidates of size 2
--- 1 candidates of size 3
--- 10 candidates of size 4
--- 12 candidates of size 5
--- 14 candidates of size 6
--- tested 32 candidates
+-- 0 candidates of size 2
+-- 0 candidates of size 3
+-- 6 candidates of size 4
+-- 0 candidates of size 5
+-- 10 candidates of size 6
+-- tested 13 candidates
 app xs []  =  xs
 app xs (x:ys)  =  x:app xs ys
 
@@ -29,37 +29,38 @@
 -- 1 candidates of size 1
 -- 0 candidates of size 2
 -- 0 candidates of size 3
--- 1 candidates of size 4
+-- 0 candidates of size 4
 -- 0 candidates of size 5
 -- 0 candidates of size 6
 -- 0 candidates of size 7
--- 12 candidates of size 8
--- tested 13 candidates
+-- 8 candidates of size 8
+-- tested 8 candidates
 mem x []  =  False
 mem x (y:xs)  =  mem x xs || x == y
 
 sub :: [Int] -> [Int] -> Bool
 -- testing 9 combinations of argument values
--- pruning with 29/42 rules
+-- pruning with 9/18 rules
 -- 2 candidates of size 1
--- 4 candidates of size 2
--- 6 candidates of size 3
--- 1 candidates of size 4
--- 18 candidates of size 5
--- 7 candidates of size 6
--- 26 candidates of size 7
--- 95 candidates of size 8
--- 228 candidates of size 9
--- 191 candidates of size 10
--- 954 candidates of size 11
--- 957 candidates of size 12
--- 4260 candidates of size 13
--- 2687 candidates of size 14
--- 17846 candidates of size 15
--- tested 25802 candidates
+-- 0 candidates of size 2
+-- 0 candidates of size 3
+-- 0 candidates of size 4
+-- 4 candidates of size 5
+-- 0 candidates of size 6
+-- 16 candidates of size 7
+-- 12 candidates of size 8
+-- 68 candidates of size 9
+-- 214 candidates of size 10
+-- 184 candidates of size 11
+-- 1400 candidates of size 12
+-- 987 candidates of size 13
+-- 5970 candidates of size 14
+-- tested 8437 candidates
 sub [] xs  =  True
 sub (x:xs) []  =  False
-sub (x:xs) (y:ys)  =  sub xs ys && (sub (x:xs) ys || x == y)
+sub (x:xs) (y:ys)  =  if x == y
+                      then sub xs ys
+                      else sub (x:xs) ys
 
 set :: [Int] -> Bool
 -- testing 8 combinations of argument values
@@ -67,12 +68,12 @@
 -- 0 candidates of size 1
 -- 0 candidates of size 2
 -- 0 candidates of size 3
--- 2 candidates of size 4
--- 1 candidates of size 5
--- 1 candidates of size 6
--- 3 candidates of size 7
--- 5 candidates of size 8
--- tested 11 candidates
+-- 1 candidates of size 4
+-- 0 candidates of size 5
+-- 0 candidates of size 6
+-- 1 candidates of size 7
+-- 3 candidates of size 8
+-- tested 4 candidates
 set []  =  True
 set (x:xs)  =  set xs && not (elem x xs)
 
@@ -80,15 +81,15 @@
 -- testing 143 combinations of argument values
 -- pruning with 4/7 rules
 -- 2 candidates of size 1
--- 3 candidates of size 2
--- 4 candidates of size 3
--- 6 candidates of size 4
--- 8 candidates of size 5
--- 13 candidates of size 6
--- 24 candidates of size 7
--- 31 candidates of size 8
--- 59 candidates of size 9
--- tested 111 candidates
+-- 1 candidates of size 2
+-- 0 candidates of size 3
+-- 0 candidates of size 4
+-- 0 candidates of size 5
+-- 3 candidates of size 6
+-- 2 candidates of size 7
+-- 6 candidates of size 8
+-- 5 candidates of size 9
+-- tested 15 candidates
 take 0 xs  =  []
 take x []  =  []
 take x (y:xs)  =  y:take (x - 1) xs
@@ -97,14 +98,94 @@
 -- testing 143 combinations of argument values
 -- pruning with 4/7 rules
 -- 2 candidates of size 1
--- 3 candidates of size 2
--- 4 candidates of size 3
--- 4 candidates of size 4
--- 4 candidates of size 5
--- 4 candidates of size 6
--- 12 candidates of size 7
--- tested 24 candidates
+-- 1 candidates of size 2
+-- 0 candidates of size 3
+-- 0 candidates of size 4
+-- 2 candidates of size 5
+-- 2 candidates of size 6
+-- 3 candidates of size 7
+-- tested 8 candidates
 drop 0 xs  =  xs
 drop x []  =  []
 drop x (y:xs)  =  drop (x - 1) xs
+
+ord :: [Int] -> Bool
+-- testing 6 combinations of argument values
+-- pruning with 29/39 rules
+-- 1 candidates of size 1
+-- 1 candidates of size 2
+-- 0 candidates of size 3
+-- 0 candidates of size 4
+-- 0 candidates of size 5
+-- 2 candidates of size 6
+-- 0 candidates of size 7
+-- 4 candidates of size 8
+-- 0 candidates of size 9
+-- 0 candidates of size 10
+-- 20 candidates of size 11
+-- tested 12 candidates
+ord []  =  True
+ord (x:xs)  =  ord xs && (null xs || x <= head xs)
+
+merge :: [Int] -> [Int] -> [Int]
+-- testing 360 combinations of argument values
+-- pruning with 4/4 rules
+-- 3 candidates of size 1
+-- 0 candidates of size 2
+-- 0 candidates of size 3
+-- 10 candidates of size 4
+-- 0 candidates of size 5
+-- 16 candidates of size 6
+-- 13 candidates of size 7
+-- 22 candidates of size 8
+-- 114 candidates of size 9
+-- 36 candidates of size 10
+-- 472 candidates of size 11
+-- 604 candidates of size 12
+-- 1442 candidates of size 13
+-- 5188 candidates of size 14
+-- 5474 candidates of size 15
+-- tested 13394 candidates
+cannot conjure
+
+zip :: [A] -> [B] -> [(A,B)]
+-- testing 360 combinations of argument values
+-- pruning with 0/0 rules
+-- 1 candidates of size 1
+-- 0 candidates of size 2
+-- 0 candidates of size 3
+-- 0 candidates of size 4
+-- 0 candidates of size 5
+-- 0 candidates of size 6
+-- 0 candidates of size 7
+-- 0 candidates of size 8
+-- 1 candidates of size 9
+-- tested 2 candidates
+zip [] xs  =  []
+zip (x:xs) []  =  []
+zip (x:xs) (y:ys)  =  (,) x y:zip xs ys
+
+assocs :: Int -> [(Int,A)] -> [A]
+-- testing 67 combinations of argument values
+-- pruning with 4/5 rules
+-- 1 candidates of size 1
+-- 0 candidates of size 2
+-- 0 candidates of size 3
+-- 0 candidates of size 4
+-- 0 candidates of size 5
+-- 0 candidates of size 6
+-- 1 candidates of size 7
+-- 1 candidates of size 8
+-- 0 candidates of size 9
+-- 3 candidates of size 10
+-- 3 candidates of size 11
+-- 0 candidates of size 12
+-- 9 candidates of size 13
+-- 7 candidates of size 14
+-- 2 candidates of size 15
+-- tested 26 candidates
+assocs x []  =  []
+assocs x (xy:xys)  =  if x == fst xy
+                      then snd xy:assocs x xys
+                      else assocs x xys
 
diff --git a/eg/count.txt b/eg/count.txt
--- a/eg/count.txt
+++ b/eg/count.txt
@@ -13,17 +13,17 @@
 -- testing 13 combinations of argument values
 -- pruning with 8/13 rules
 -- 2 candidates of size 1
--- 2 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
 -- 0 candidates of size 4
 -- 0 candidates of size 5
 -- 4 candidates of size 6
--- 4 candidates of size 7
+-- 0 candidates of size 7
 -- 12 candidates of size 8
--- 20 candidates of size 9
+-- 16 candidates of size 9
 -- 20 candidates of size 10
--- 52 candidates of size 11
--- tested 79 candidates
+-- 44 candidates of size 11
+-- tested 65 candidates
 count x []  =  0
 count x (y:xs)  =  count x xs + (if x == y then 1 else 0)
 
diff --git a/eg/dupos.txt b/eg/dupos.txt
--- a/eg/dupos.txt
+++ b/eg/dupos.txt
@@ -2,23 +2,23 @@
 -- testing 6 combinations of argument values
 -- pruning with 21/26 rules
 -- 2 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
--- 2 candidates of size 4
+-- 0 candidates of size 4
 -- 1 candidates of size 5
--- 2 candidates of size 6
--- 3 candidates of size 7
--- 8 candidates of size 8
--- 16 candidates of size 9
--- 25 candidates of size 10
--- 36 candidates of size 11
--- 63 candidates of size 12
--- 133 candidates of size 13
--- 299 candidates of size 14
--- 602 candidates of size 15
--- 1116 candidates of size 16
--- 2031 candidates of size 17
--- tested 2450 candidates
+-- 0 candidates of size 6
+-- 1 candidates of size 7
+-- 6 candidates of size 8
+-- 5 candidates of size 9
+-- 22 candidates of size 10
+-- 15 candidates of size 11
+-- 48 candidates of size 12
+-- 93 candidates of size 13
+-- 188 candidates of size 14
+-- 505 candidates of size 15
+-- 706 candidates of size 16
+-- 1723 candidates of size 17
+-- tested 1705 candidates
 duplicates []  =  []
 duplicates (x:xs)  =  if elem x xs && not (elem x (duplicates xs))
                       then x:duplicates xs
@@ -34,16 +34,16 @@
 -- 2 candidates of size 6
 -- 3 candidates of size 7
 -- 8 candidates of size 8
--- 16 candidates of size 9
--- 25 candidates of size 10
--- 36 candidates of size 11
--- 63 candidates of size 12
--- 133 candidates of size 13
--- 299 candidates of size 14
--- 602 candidates of size 15
--- 1116 candidates of size 16
--- 2031 candidates of size 17
--- tested 2450 candidates
+-- 15 candidates of size 9
+-- 24 candidates of size 10
+-- 35 candidates of size 11
+-- 62 candidates of size 12
+-- 129 candidates of size 13
+-- 282 candidates of size 14
+-- 559 candidates of size 15
+-- 1036 candidates of size 16
+-- 1899 candidates of size 17
+-- tested 2274 candidates
 duplicates []  =  []
 duplicates (x:xs)  =  if elem x xs && not (elem x (duplicates xs))
                       then x:duplicates xs
@@ -55,18 +55,18 @@
 -- 1 candidates of size 1
 -- 0 candidates of size 2
 -- 2 candidates of size 3
--- 5 candidates of size 4
--- 9 candidates of size 5
--- 16 candidates of size 6
--- 43 candidates of size 7
--- 73 candidates of size 8
--- 185 candidates of size 9
--- 285 candidates of size 10
--- 722 candidates of size 11
--- 1157 candidates of size 12
--- 2847 candidates of size 13
--- 4505 candidates of size 14
--- tested 5484 candidates
+-- 0 candidates of size 4
+-- 7 candidates of size 5
+-- 0 candidates of size 6
+-- 34 candidates of size 7
+-- 0 candidates of size 8
+-- 133 candidates of size 9
+-- 0 candidates of size 10
+-- 510 candidates of size 11
+-- 16 candidates of size 12
+-- 1947 candidates of size 13
+-- 104 candidates of size 14
+-- tested 2653 candidates
 positionsFrom x y []  =  []
 positionsFrom x y (z:xs)  =  (if y == z then (x :) else id) (positionsFrom (x + 1) y xs)
 
diff --git a/eg/either.txt b/eg/either.txt
--- a/eg/either.txt
+++ b/eg/either.txt
@@ -2,8 +2,8 @@
 -- testing 4 combinations of argument values
 -- pruning with 0/0 rules
 -- 2 candidates of size 1
--- 2 candidates of size 2
--- tested 4 candidates
+-- 1 candidates of size 2
+-- tested 3 candidates
 isLeft (Left x)  =  True
 isLeft (Right x)  =  False
 
@@ -11,7 +11,7 @@
 -- testing 4 combinations of argument values
 -- pruning with 0/0 rules
 -- 2 candidates of size 1
--- 2 candidates of size 2
+-- 1 candidates of size 2
 -- tested 3 candidates
 isRight (Left x)  =  False
 isRight (Right x)  =  True
@@ -20,8 +20,8 @@
 -- testing 5 combinations of argument values
 -- pruning with 0/0 rules
 -- 1 candidates of size 1
--- 3 candidates of size 2
--- tested 3 candidates
+-- 1 candidates of size 2
+-- tested 2 candidates
 fromLeft x (Left y)  =  y
 fromLeft x (Right y)  =  x
 
@@ -29,7 +29,7 @@
 -- testing 5 combinations of argument values
 -- pruning with 0/0 rules
 -- 1 candidates of size 1
--- 3 candidates of size 2
+-- 1 candidates of size 2
 -- tested 2 candidates
 fromLeft x (Left y)  =  x
 fromLeft x (Right y)  =  y
diff --git a/eg/fib01.txt b/eg/fib01.txt
--- a/eg/fib01.txt
+++ b/eg/fib01.txt
@@ -2,11 +2,11 @@
 -- testing 8 combinations of argument values
 -- pruning with 6/10 rules
 -- 4 candidates of size 1
--- 27 candidates of size 2
--- 117 candidates of size 3
--- 464 candidates of size 4
--- 1564 candidates of size 5
--- tested 2176 candidates
+-- 14 candidates of size 2
+-- 38 candidates of size 3
+-- 111 candidates of size 4
+-- 255 candidates of size 5
+-- tested 422 candidates
 cannot conjure
 
 fib01 :: Int -> Int -> Int -> Int
diff --git a/eg/fibonacci.txt b/eg/fibonacci.txt
--- a/eg/fibonacci.txt
+++ b/eg/fibonacci.txt
@@ -10,10 +10,10 @@
 -- 116 candidates of size 7
 -- 120 candidates of size 8
 -- 552 candidates of size 9
--- 540 candidates of size 10
--- 2663 candidates of size 11
--- 2675 candidates of size 12
--- tested 4147 candidates
+-- 538 candidates of size 10
+-- 2661 candidates of size 11
+-- 2661 candidates of size 12
+-- tested 4133 candidates
 fibonacci 0  =  1
 fibonacci 1  =  1
 fibonacci x  =  fibonacci (x - 1) + fibonacci (x - 2)
diff --git a/eg/higher.txt b/eg/higher.txt
--- a/eg/higher.txt
+++ b/eg/higher.txt
@@ -58,10 +58,10 @@
 -- 0 candidates of size 7
 -- 17 candidates of size 8
 -- 0 candidates of size 9
--- 44 candidates of size 10
+-- 43 candidates of size 10
 -- 0 candidates of size 11
--- 142 candidates of size 12
--- tested 72 candidates
+-- 141 candidates of size 12
+-- tested 71 candidates
 filter f []  =  []
 filter f (x:xs)  =  if f x
                     then x:filter f xs
diff --git a/eg/ints.txt b/eg/ints.txt
--- a/eg/ints.txt
+++ b/eg/ints.txt
@@ -21,11 +21,11 @@
 -- testing 360 combinations of argument values
 -- pruning with 14/25 rules
 -- 2 candidates of size 1
--- 4 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
--- 6 candidates of size 4
+-- 0 candidates of size 4
 -- 6 candidates of size 5
--- tested 13 candidates
+-- tested 3 candidates
 sum []  =  0
 sum (x:xs)  =  x + sum xs
 
@@ -33,11 +33,11 @@
 -- testing 360 combinations of argument values
 -- pruning with 14/25 rules
 -- 2 candidates of size 1
--- 4 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
--- 6 candidates of size 4
+-- 0 candidates of size 4
 -- 6 candidates of size 5
--- tested 18 candidates
+-- tested 8 candidates
 product []  =  1
 product (x:xs)  =  x * product xs
 
@@ -45,19 +45,19 @@
 -- testing 360 combinations of argument values
 -- pruning with 15/26 rules
 -- 2 candidates of size 1
--- 4 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
--- 9 candidates of size 4
--- tested 7 candidates
+-- 3 candidates of size 4
+-- tested 3 candidates
 sum xs  =  foldr (+) 0 xs
 
 product :: [Int] -> Int
 -- testing 360 combinations of argument values
 -- pruning with 15/26 rules
 -- 2 candidates of size 1
--- 4 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
--- 9 candidates of size 4
--- tested 9 candidates
+-- 3 candidates of size 4
+-- tested 5 candidates
 product xs  =  foldr (*) 1 xs
 
diff --git a/eg/list.txt b/eg/list.txt
--- a/eg/list.txt
+++ b/eg/list.txt
@@ -2,11 +2,11 @@
 -- testing 360 combinations of argument values
 -- pruning with 4/8 rules
 -- 2 candidates of size 1
--- 2 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
--- 2 candidates of size 4
+-- 0 candidates of size 4
 -- 2 candidates of size 5
--- tested 8 candidates
+-- tested 4 candidates
 length []  =  0
 length (x:xs)  =  length xs + 1
 
@@ -14,13 +14,13 @@
 -- testing 360 combinations of argument values
 -- pruning with 4/4 rules
 -- 2 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 1 candidates of size 3
--- 3 candidates of size 4
+-- 0 candidates of size 4
 -- 4 candidates of size 5
--- 7 candidates of size 6
+-- 1 candidates of size 6
 -- 10 candidates of size 7
--- tested 26 candidates
+-- tested 16 candidates
 reverse []  =  []
 reverse (x:xs)  =  reverse xs ++ [x]
 
@@ -28,12 +28,12 @@
 -- testing 360 combinations of argument values
 -- pruning with 0/0 rules
 -- 3 candidates of size 1
--- 8 candidates of size 2
--- 11 candidates of size 3
--- 23 candidates of size 4
--- 86 candidates of size 5
--- 72 candidates of size 6
--- tested 149 candidates
+-- 0 candidates of size 2
+-- 0 candidates of size 3
+-- 10 candidates of size 4
+-- 25 candidates of size 5
+-- 34 candidates of size 6
+-- tested 56 candidates
 [] ++ xs  =  xs
 (x:xs) ++ ys  =  x:(xs ++ ys)
 
@@ -41,23 +41,23 @@
 -- testing 360 combinations of argument values
 -- pruning with 2/2 rules
 -- 3 candidates of size 1
--- 8 candidates of size 2
--- 11 candidates of size 3
--- 27 candidates of size 4
--- tested 35 candidates
+-- 0 candidates of size 2
+-- 0 candidates of size 3
+-- 14 candidates of size 4
+-- tested 16 candidates
 xs ++ ys  =  foldr (:) ys xs
 
 last :: [Int] -> Int
 -- testing 360 combinations of argument values
 -- pruning with 5/5 rules
 -- 1 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
 -- 0 candidates of size 4
 -- 0 candidates of size 5
--- 2 candidates of size 6
+-- 0 candidates of size 6
 -- 4 candidates of size 7
--- tested 5 candidates
+-- tested 2 candidates
 last []  =  undefined
 last (x:xs)  =  if null xs
                 then x
@@ -71,11 +71,11 @@
 -- 0 candidates of size 3
 -- 0 candidates of size 4
 -- 0 candidates of size 5
--- 2 candidates of size 6
--- 6 candidates of size 7
+-- 0 candidates of size 6
+-- 0 candidates of size 7
 -- 6 candidates of size 8
--- 30 candidates of size 9
--- tested 25 candidates
+-- 23 candidates of size 9
+-- tested 13 candidates
 zip [] xs  =  []
 zip (x:xs) []  =  []
 zip (x:xs) (y:ys)  =  (x,y):zip xs ys
@@ -84,12 +84,12 @@
 -- testing 360 combinations of argument values
 -- pruning with 0/0 rules
 -- 3 candidates of size 1
--- 8 candidates of size 2
--- 11 candidates of size 3
--- 23 candidates of size 4
--- 86 candidates of size 5
--- 72 candidates of size 6
--- tested 151 candidates
+-- 0 candidates of size 2
+-- 0 candidates of size 3
+-- 10 candidates of size 4
+-- 25 candidates of size 5
+-- 34 candidates of size 6
+-- tested 58 candidates
 [] \/ xs  =  xs
 (x:xs) \/ ys  =  x:ys \/ xs
 
@@ -97,17 +97,17 @@
 -- testing 360 combinations of argument values
 -- pruning with 29/39 rules
 -- 2 candidates of size 1
--- 2 candidates of size 2
--- 2 candidates of size 3
--- 2 candidates of size 4
--- 4 candidates of size 5
--- 12 candidates of size 6
--- 20 candidates of size 7
--- 30 candidates of size 8
--- 56 candidates of size 9
--- 112 candidates of size 10
--- 200 candidates of size 11
--- tested 319 candidates
+-- 1 candidates of size 2
+-- 1 candidates of size 3
+-- 1 candidates of size 4
+-- 1 candidates of size 5
+-- 7 candidates of size 6
+-- 13 candidates of size 7
+-- 17 candidates of size 8
+-- 25 candidates of size 9
+-- 65 candidates of size 10
+-- 115 candidates of size 11
+-- tested 172 candidates
 ordered []  =  True
 ordered (x:xs)  =  ordered xs && (null xs || x <= head xs)
 
diff --git a/eg/peano.txt b/eg/peano.txt
--- a/eg/peano.txt
+++ b/eg/peano.txt
@@ -2,11 +2,11 @@
 -- testing 6 combinations of argument values
 -- pruning with 0/0 rules
 -- 3 candidates of size 1
--- 11 candidates of size 2
--- 38 candidates of size 3
--- 87 candidates of size 4
--- 218 candidates of size 5
--- tested 140 candidates
+-- 3 candidates of size 2
+-- 3 candidates of size 3
+-- 13 candidates of size 4
+-- 19 candidates of size 5
+-- tested 23 candidates
 p + Z  =  p
 p + S q  =  S p + q
 
@@ -14,12 +14,12 @@
 -- testing 7 combinations of argument values
 -- pruning with 6/10 rules
 -- 3 candidates of size 1
--- 11 candidates of size 2
--- 41 candidates of size 3
--- 108 candidates of size 4
--- 291 candidates of size 5
--- 746 candidates of size 6
--- tested 537 candidates
+-- 3 candidates of size 2
+-- 6 candidates of size 3
+-- 6 candidates of size 4
+-- 35 candidates of size 5
+-- 86 candidates of size 6
+-- tested 71 candidates
 p * Z  =  Z
 p * S q  =  p + p * q
 
diff --git a/eg/pow.txt b/eg/pow.txt
--- a/eg/pow.txt
+++ b/eg/pow.txt
@@ -2,14 +2,14 @@
 -- testing 5 combinations of argument values
 -- pruning with 14/30 rules
 -- 4 candidates of size 1
--- 16 candidates of size 2
--- 46 candidates of size 3
--- 159 candidates of size 4
--- 433 candidates of size 5
--- 1382 candidates of size 6
--- 4136 candidates of size 7
--- 13292 candidates of size 8
--- tested 6383 candidates
+-- 11 candidates of size 2
+-- 31 candidates of size 3
+-- 92 candidates of size 4
+-- 244 candidates of size 5
+-- 730 candidates of size 6
+-- 2221 candidates of size 7
+-- 6950 candidates of size 8
+-- tested 3356 candidates
 pow x 0  =  1
 pow x y  =  x * pow x (y - 1)
 
@@ -17,11 +17,11 @@
 -- testing 5 combinations of argument values
 -- pruning with 15/19 rules
 -- 4 candidates of size 1
--- 18 candidates of size 2
--- 58 candidates of size 3
--- 174 candidates of size 4
--- 485 candidates of size 5
--- 1387 candidates of size 6
--- tested 2126 candidates
+-- 13 candidates of size 2
+-- 40 candidates of size 3
+-- 103 candidates of size 4
+-- 259 candidates of size 5
+-- 750 candidates of size 6
+-- tested 1169 candidates
 cannot conjure
 
diff --git a/eg/replicate.txt b/eg/replicate.txt
--- a/eg/replicate.txt
+++ b/eg/replicate.txt
@@ -5,11 +5,11 @@
 -- 0 candidates of size 2
 -- 1 candidates of size 3
 -- 1 candidates of size 4
--- 3 candidates of size 5
--- 2 candidates of size 6
--- 3 candidates of size 7
--- 3 candidates of size 8
--- tested 12 candidates
+-- 2 candidates of size 5
+-- 1 candidates of size 6
+-- 1 candidates of size 7
+-- 2 candidates of size 8
+-- tested 8 candidates
 replicate 0 c  =  ""
 replicate x c  =  c:replicate (x - 1) c
 
@@ -39,14 +39,14 @@
 -- testing 360 combinations of argument values
 -- pruning with 4/4 rules
 -- 2 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 1 candidates of size 3
--- 4 candidates of size 4
+-- 0 candidates of size 4
 -- 1 candidates of size 5
--- 12 candidates of size 6
+-- 3 candidates of size 6
 -- 1 candidates of size 7
--- 34 candidates of size 8
--- tested 24 candidates
+-- 12 candidates of size 8
+-- tested 10 candidates
 replicates "" x  =  ""
 replicates (c:cs) x  =  replicate x c ++ replicates cs x
 
diff --git a/eg/setelem.txt b/eg/setelem.txt
--- a/eg/setelem.txt
+++ b/eg/setelem.txt
@@ -2,14 +2,14 @@
 -- testing 360 combinations of argument values
 -- pruning with 40/53 rules
 -- 2 candidates of size 1
--- 2 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
--- 2 candidates of size 4
--- 6 candidates of size 5
+-- 0 candidates of size 4
+-- 4 candidates of size 5
 -- 0 candidates of size 6
 -- 0 candidates of size 7
--- 24 candidates of size 8
--- tested 33 candidates
+-- 16 candidates of size 8
+-- tested 19 candidates
 elem x []  =  False
 elem x (y:xs)  =  elem x xs || x == y
 
@@ -17,14 +17,14 @@
 -- testing 360 combinations of argument values
 -- pruning with 41/52 rules
 -- 2 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
--- 2 candidates of size 4
--- 1 candidates of size 5
--- 2 candidates of size 6
--- 4 candidates of size 7
--- 6 candidates of size 8
--- tested 15 candidates
+-- 1 candidates of size 4
+-- 0 candidates of size 5
+-- 0 candidates of size 6
+-- 2 candidates of size 7
+-- 4 candidates of size 8
+-- tested 6 candidates
 set []  =  True
 set (x:xs)  =  set xs && not (elem x xs)
 
diff --git a/eg/sort.txt b/eg/sort.txt
--- a/eg/sort.txt
+++ b/eg/sort.txt
@@ -2,11 +2,11 @@
 -- testing 360 combinations of argument values
 -- pruning with 6/7 rules
 -- 2 candidates of size 1
--- 3 candidates of size 2
--- 4 candidates of size 3
--- 11 candidates of size 4
--- 23 candidates of size 5
--- tested 22 candidates
+-- 2 candidates of size 2
+-- 2 candidates of size 3
+-- 7 candidates of size 4
+-- 14 candidates of size 5
+-- tested 15 candidates
 sort []  =  []
 sort (x:xs)  =  insert x (sort xs)
 
@@ -14,33 +14,33 @@
 -- testing 360 combinations of argument values
 -- pruning with 1/2 rules
 -- 2 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
--- 4 candidates of size 4
--- tested 5 candidates
+-- 2 candidates of size 4
+-- tested 4 candidates
 sort xs  =  foldr insert [] xs
 
 insert :: Int -> [Int] -> [Int]
 -- testing 4 combinations of argument values
 -- pruning with 4/4 rules
 -- 2 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 2 candidates of size 3
--- 6 candidates of size 4
+-- 0 candidates of size 4
 -- 2 candidates of size 5
--- 19 candidates of size 6
--- 6 candidates of size 7
--- 44 candidates of size 8
--- 62 candidates of size 9
--- 91 candidates of size 10
--- 334 candidates of size 11
--- 220 candidates of size 12
--- 1358 candidates of size 13
--- 1019 candidates of size 14
--- 4638 candidates of size 15
--- 6332 candidates of size 16
--- 14550 candidates of size 17
--- tested 14943 candidates
+-- 2 candidates of size 6
+-- 2 candidates of size 7
+-- 4 candidates of size 8
+-- 2 candidates of size 9
+-- 8 candidates of size 10
+-- 18 candidates of size 11
+-- 16 candidates of size 12
+-- 102 candidates of size 13
+-- 32 candidates of size 14
+-- 426 candidates of size 15
+-- 224 candidates of size 16
+-- 1450 candidates of size 17
+-- tested 991 candidates
 insert x []  =  [x]
 insert x (y:xs)  =  if x <= y
                     then x:insert y xs
@@ -50,20 +50,20 @@
 -- testing 360 combinations of argument values
 -- pruning with 8/8 rules
 -- 2 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 1 candidates of size 3
--- 3 candidates of size 4
--- 6 candidates of size 5
--- 9 candidates of size 6
--- 22 candidates of size 7
--- 37 candidates of size 8
--- 84 candidates of size 9
--- 169 candidates of size 10
--- 352 candidates of size 11
--- 767 candidates of size 12
--- 1600 candidates of size 13
--- 3499 candidates of size 14
--- tested 3667 candidates
+-- 0 candidates of size 4
+-- 4 candidates of size 5
+-- 3 candidates of size 6
+-- 10 candidates of size 7
+-- 21 candidates of size 8
+-- 36 candidates of size 9
+-- 105 candidates of size 10
+-- 182 candidates of size 11
+-- 471 candidates of size 12
+-- 988 candidates of size 13
+-- 2183 candidates of size 14
+-- tested 2437 candidates
 qsort []  =  []
 qsort (x:xs)  =  filter (x >) (qsort xs) ++ (x:filter (x <=) (qsort xs))
 
@@ -71,20 +71,20 @@
 -- testing 360 combinations of argument values
 -- pruning with 8/8 rules
 -- 2 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 1 candidates of size 3
--- 3 candidates of size 4
--- 6 candidates of size 5
--- 9 candidates of size 6
--- 28 candidates of size 7
--- 51 candidates of size 8
--- 128 candidates of size 9
--- 303 candidates of size 10
--- 648 candidates of size 11
--- 1621 candidates of size 12
--- 3592 candidates of size 13
--- 8475 candidates of size 14
--- tested 7794 candidates
+-- 0 candidates of size 4
+-- 4 candidates of size 5
+-- 3 candidates of size 6
+-- 16 candidates of size 7
+-- 35 candidates of size 8
+-- 80 candidates of size 9
+-- 239 candidates of size 10
+-- 478 candidates of size 11
+-- 1325 candidates of size 12
+-- 2980 candidates of size 13
+-- 7159 candidates of size 14
+-- tested 6564 candidates
 qsort []  =  []
 qsort (x:xs)  =  qsort (filter (x >) xs) ++ (x:qsort (filter (x <=) xs))
 
@@ -92,31 +92,36 @@
 -- testing 360 combinations of argument values
 -- pruning with 4/4 rules
 -- 3 candidates of size 1
--- 8 candidates of size 2
--- 11 candidates of size 3
--- 23 candidates of size 4
--- 86 candidates of size 5
--- 72 candidates of size 6
--- 297 candidates of size 7
--- 322 candidates of size 8
--- 939 candidates of size 9
--- tested 1761 candidates
+-- 0 candidates of size 2
+-- 0 candidates of size 3
+-- 10 candidates of size 4
+-- 0 candidates of size 5
+-- 16 candidates of size 6
+-- 13 candidates of size 7
+-- 22 candidates of size 8
+-- 114 candidates of size 9
+-- 36 candidates of size 10
+-- 472 candidates of size 11
+-- 604 candidates of size 12
+-- tested 1290 candidates
 cannot conjure
 
 merge :: [Int] -> [Int] -> [Int]
 -- testing 360 combinations of argument values
 -- pruning with 1/2 rules
 -- 2 candidates of size 1
--- 2 candidates of size 2
--- 3 candidates of size 3
--- 10 candidates of size 4
--- 21 candidates of size 5
--- 26 candidates of size 6
--- 61 candidates of size 7
--- 92 candidates of size 8
--- 203 candidates of size 9
--- 430 candidates of size 10
--- 1086 candidates of size 11
--- tested 1936 candidates
+-- 0 candidates of size 2
+-- 0 candidates of size 3
+-- 6 candidates of size 4
+-- 0 candidates of size 5
+-- 10 candidates of size 6
+-- 7 candidates of size 7
+-- 14 candidates of size 8
+-- 41 candidates of size 9
+-- 106 candidates of size 10
+-- 144 candidates of size 11
+-- 588 candidates of size 12
+-- 958 candidates of size 13
+-- tested 1876 candidates
 cannot conjure
 
diff --git a/eg/subset.txt b/eg/subset.txt
--- a/eg/subset.txt
+++ b/eg/subset.txt
@@ -2,14 +2,14 @@
 -- testing 44 combinations of argument values
 -- pruning with 29/39 rules
 -- 2 candidates of size 1
--- 4 candidates of size 2
--- 8 candidates of size 3
--- 10 candidates of size 4
--- 64 candidates of size 5
--- 40 candidates of size 6
--- 64 candidates of size 7
--- 522 candidates of size 8
--- tested 553 candidates
+-- 0 candidates of size 2
+-- 0 candidates of size 3
+-- 0 candidates of size 4
+-- 13 candidates of size 5
+-- 0 candidates of size 6
+-- 6 candidates of size 7
+-- 176 candidates of size 8
+-- tested 176 candidates
 subset [] xs  =  True
 subset (x:xs) ys  =  subset xs ys && elem x ys
 
diff --git a/eg/take-drop.txt b/eg/take-drop.txt
--- a/eg/take-drop.txt
+++ b/eg/take-drop.txt
@@ -2,13 +2,13 @@
 -- testing 360 combinations of argument values
 -- pruning with 4/7 rules
 -- 2 candidates of size 1
--- 3 candidates of size 2
--- 4 candidates of size 3
--- 6 candidates of size 4
--- 8 candidates of size 5
--- 13 candidates of size 6
--- 24 candidates of size 7
--- tested 39 candidates
+-- 1 candidates of size 2
+-- 0 candidates of size 3
+-- 0 candidates of size 4
+-- 2 candidates of size 5
+-- 5 candidates of size 6
+-- 5 candidates of size 7
+-- tested 11 candidates
 drop 0 xs  =  xs
 drop x []  =  []
 drop x (y:xs)  =  drop (x - 1) xs
@@ -17,15 +17,15 @@
 -- testing 153 combinations of argument values
 -- pruning with 4/7 rules
 -- 2 candidates of size 1
--- 3 candidates of size 2
--- 4 candidates of size 3
--- 6 candidates of size 4
--- 8 candidates of size 5
--- 13 candidates of size 6
--- 24 candidates of size 7
--- 31 candidates of size 8
--- 59 candidates of size 9
--- tested 111 candidates
+-- 1 candidates of size 2
+-- 0 candidates of size 3
+-- 0 candidates of size 4
+-- 0 candidates of size 5
+-- 3 candidates of size 6
+-- 2 candidates of size 7
+-- 6 candidates of size 8
+-- 5 candidates of size 9
+-- tested 15 candidates
 take 0 xs  =  []
 take x []  =  []
 take x (y:xs)  =  y:take (x - 1) xs
diff --git a/eg/tapps.txt b/eg/tapps.txt
--- a/eg/tapps.txt
+++ b/eg/tapps.txt
@@ -2,21 +2,21 @@
 -- testing 360 combinations of argument values
 -- pruning with 14/25 rules
 -- 2 candidates of size 1
--- 5 candidates of size 2
--- 3 candidates of size 3
--- 10 candidates of size 4
--- tested 12 candidates
+-- 1 candidates of size 2
+-- 1 candidates of size 3
+-- 4 candidates of size 4
+-- tested 6 candidates
 third xs  =  head (tail (tail xs))
 
 product :: [Int] -> Int
 -- testing 360 combinations of argument values
 -- pruning with 14/25 rules
 -- 2 candidates of size 1
--- 5 candidates of size 2
--- 3 candidates of size 3
--- 10 candidates of size 4
--- 18 candidates of size 5
--- tested 26 candidates
+-- 1 candidates of size 2
+-- 1 candidates of size 3
+-- 2 candidates of size 4
+-- 10 candidates of size 5
+-- tested 12 candidates
 product []  =  1
 product (x:xs)  =  x * product xs
 
@@ -24,9 +24,9 @@
 -- testing 360 combinations of argument values
 -- pruning with 15/26 rules
 -- 2 candidates of size 1
--- 5 candidates of size 2
--- 3 candidates of size 3
--- 13 candidates of size 4
--- tested 14 candidates
+-- 1 candidates of size 2
+-- 1 candidates of size 3
+-- 5 candidates of size 4
+-- tested 8 candidates
 product xs  =  foldr (*) 1 xs
 
diff --git a/eg/these.txt b/eg/these.txt
--- a/eg/these.txt
+++ b/eg/these.txt
@@ -10,8 +10,8 @@
 -- 0 candidates of size 7
 -- 0 candidates of size 8
 -- 0 candidates of size 9
--- 15 candidates of size 10
--- tested 16 candidates
+-- 1 candidates of size 10
+-- tested 2 candidates
 fromThese x y None  =  (x,y)
 fromThese x y (This z)  =  (z,y)
 fromThese x y (That z)  =  (x,z)
@@ -23,14 +23,14 @@
 -- 1 candidates of size 1
 -- 0 candidates of size 2
 -- 0 candidates of size 3
--- 4 candidates of size 4
+-- 0 candidates of size 4
 -- 0 candidates of size 5
--- 11 candidates of size 6
+-- 0 candidates of size 6
 -- 0 candidates of size 7
--- 26 candidates of size 8
+-- 0 candidates of size 8
 -- 0 candidates of size 9
--- 57 candidates of size 10
--- tested 83 candidates
+-- 1 candidates of size 10
+-- tested 2 candidates
 listhese None  =  []
 listhese (This x)  =  [x]
 listhese (That x)  =  [x]
@@ -43,14 +43,14 @@
 -- 0 candidates of size 2
 -- 0 candidates of size 3
 -- 0 candidates of size 4
--- 1 candidates of size 5
+-- 0 candidates of size 5
 -- 1 candidates of size 6
 -- 2 candidates of size 7
--- 2 candidates of size 8
--- 3 candidates of size 9
+-- 0 candidates of size 8
+-- 1 candidates of size 9
 -- 6 candidates of size 10
--- 8 candidates of size 11
--- tested 17 candidates
+-- 6 candidates of size 11
+-- tested 12 candidates
 cathis []  =  []
 cathis (t:ts)  =  if isThis t
                   then fromThis t:cathis ts
@@ -63,14 +63,14 @@
 -- 0 candidates of size 2
 -- 0 candidates of size 3
 -- 0 candidates of size 4
--- 1 candidates of size 5
+-- 0 candidates of size 5
 -- 1 candidates of size 6
 -- 2 candidates of size 7
--- 2 candidates of size 8
--- 3 candidates of size 9
+-- 0 candidates of size 8
+-- 1 candidates of size 9
 -- 6 candidates of size 10
--- 8 candidates of size 11
--- tested 17 candidates
+-- 6 candidates of size 11
+-- tested 12 candidates
 cathat []  =  []
 cathat (t:ts)  =  if isThat t
                   then fromThat t:cathat ts
@@ -83,17 +83,17 @@
 -- 0 candidates of size 2
 -- 0 candidates of size 3
 -- 0 candidates of size 4
--- 2 candidates of size 5
+-- 0 candidates of size 5
 -- 3 candidates of size 6
 -- 4 candidates of size 7
--- 8 candidates of size 8
--- 17 candidates of size 9
+-- 2 candidates of size 8
+-- 9 candidates of size 9
 -- 36 candidates of size 10
--- 54 candidates of size 11
--- 119 candidates of size 12
--- 268 candidates of size 13
--- 490 candidates of size 14
--- 985 candidates of size 15
--- tested 1987 candidates
+-- 38 candidates of size 11
+-- 75 candidates of size 12
+-- 224 candidates of size 13
+-- 422 candidates of size 14
+-- 753 candidates of size 15
+-- tested 1567 candidates
 cannot conjure
 
diff --git a/eg/tree.txt b/eg/tree.txt
--- a/eg/tree.txt
+++ b/eg/tree.txt
@@ -2,13 +2,13 @@
 -- testing 360 combinations of argument values
 -- pruning with 3/3 rules
 -- 1 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
 -- 0 candidates of size 4
 -- 0 candidates of size 5
--- 4 candidates of size 6
+-- 0 candidates of size 6
 -- 16 candidates of size 7
--- tested 7 candidates
+-- tested 2 candidates
 leftmost Leaf  =  undefined
 leftmost (Node t1 x t2)  =  if nil t1
                             then x
@@ -18,13 +18,13 @@
 -- testing 360 combinations of argument values
 -- pruning with 3/3 rules
 -- 1 candidates of size 1
--- 1 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
 -- 0 candidates of size 4
 -- 0 candidates of size 5
--- 4 candidates of size 6
+-- 0 candidates of size 6
 -- 16 candidates of size 7
--- tested 16 candidates
+-- tested 11 candidates
 rightmost Leaf  =  undefined
 rightmost (Node t1 x t2)  =  if nil t2
                              then x
@@ -34,14 +34,14 @@
 -- testing 360 combinations of argument values
 -- pruning with 4/8 rules
 -- 2 candidates of size 1
--- 2 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
--- 2 candidates of size 4
+-- 0 candidates of size 4
 -- 4 candidates of size 5
--- 8 candidates of size 6
+-- 4 candidates of size 6
 -- 12 candidates of size 7
--- 24 candidates of size 8
--- tested 40 candidates
+-- 16 candidates of size 8
+-- tested 32 candidates
 size Leaf  =  0
 size (Node t1 x t2)  =  size t1 + (size t2 + 1)
 
@@ -49,14 +49,14 @@
 -- testing 360 combinations of argument values
 -- pruning with 49/65 rules
 -- 3 candidates of size 1
--- 3 candidates of size 2
+-- 0 candidates of size 2
 -- 0 candidates of size 3
--- 6 candidates of size 4
+-- 0 candidates of size 4
 -- 14 candidates of size 5
--- 34 candidates of size 6
+-- 6 candidates of size 6
 -- 98 candidates of size 7
--- 274 candidates of size 8
--- tested 200 candidates
+-- 86 candidates of size 8
+-- tested 160 candidates
 height Leaf  =  -1
 height (Node t1 x t2)  =  1 + max (height t1) (height t2)
 
@@ -66,16 +66,16 @@
 -- 1 candidates of size 1
 -- 0 candidates of size 2
 -- 0 candidates of size 3
--- 1 candidates of size 4
+-- 0 candidates of size 4
 -- 0 candidates of size 5
 -- 0 candidates of size 6
 -- 0 candidates of size 7
--- 20 candidates of size 8
+-- 16 candidates of size 8
 -- 0 candidates of size 9
 -- 0 candidates of size 10
 -- 0 candidates of size 11
--- 80 candidates of size 12
--- tested 88 candidates
+-- 36 candidates of size 12
+-- tested 42 candidates
 mem x Leaf  =  False
 mem x (Node t1 y t2)  =  mem x t1 || (mem x t2 || x == y)
 
@@ -83,18 +83,18 @@
 -- testing 360 combinations of argument values
 -- pruning with 29/39 rules
 -- 2 candidates of size 1
--- 2 candidates of size 2
--- 2 candidates of size 3
+-- 1 candidates of size 2
+-- 0 candidates of size 3
 -- 0 candidates of size 4
--- 10 candidates of size 5
--- 30 candidates of size 6
+-- 2 candidates of size 5
+-- 12 candidates of size 6
 -- 0 candidates of size 7
--- 68 candidates of size 8
--- 216 candidates of size 9
--- 56 candidates of size 10
--- 802 candidates of size 11
--- 2077 candidates of size 12
--- tested 3265 candidates
+-- 36 candidates of size 8
+-- 104 candidates of size 9
+-- 0 candidates of size 10
+-- 418 candidates of size 11
+-- 1064 candidates of size 12
+-- tested 1639 candidates
 cannot conjure
 
 ordered :: Tree -> Bool
@@ -112,12 +112,12 @@
 -- 1 candidates of size 1
 -- 0 candidates of size 2
 -- 0 candidates of size 3
--- 1 candidates of size 4
+-- 0 candidates of size 4
 -- 2 candidates of size 5
--- 5 candidates of size 6
+-- 4 candidates of size 6
 -- 4 candidates of size 7
--- 9 candidates of size 8
--- tested 15 candidates
+-- 8 candidates of size 8
+-- tested 13 candidates
 preorder Leaf  =  []
 preorder (Node t1 x t2)  =  x:(preorder t1 ++ preorder t2)
 
@@ -127,12 +127,12 @@
 -- 1 candidates of size 1
 -- 0 candidates of size 2
 -- 0 candidates of size 3
--- 1 candidates of size 4
+-- 0 candidates of size 4
 -- 2 candidates of size 5
--- 5 candidates of size 6
+-- 4 candidates of size 6
 -- 4 candidates of size 7
--- 9 candidates of size 8
--- tested 19 candidates
+-- 8 candidates of size 8
+-- tested 17 candidates
 inorder Leaf  =  []
 inorder (Node t1 x t2)  =  inorder t1 ++ (x:inorder t2)
 
@@ -142,14 +142,14 @@
 -- 1 candidates of size 1
 -- 0 candidates of size 2
 -- 0 candidates of size 3
--- 1 candidates of size 4
+-- 0 candidates of size 4
 -- 2 candidates of size 5
--- 5 candidates of size 6
+-- 4 candidates of size 6
 -- 4 candidates of size 7
--- 9 candidates of size 8
+-- 8 candidates of size 8
 -- 14 candidates of size 9
--- 17 candidates of size 10
--- tested 50 candidates
+-- 16 candidates of size 10
+-- tested 47 candidates
 posorder Leaf  =  []
 posorder (Node t1 x t2)  =  posorder t1 ++ (posorder t2 ++ [x])
 
diff --git a/src/Conjure.hs b/src/Conjure.hs
--- a/src/Conjure.hs
+++ b/src/Conjure.hs
@@ -30,16 +30,16 @@
 --
 -- > > conjure "factorial" factorial primitives
 -- > factorial :: Int -> Int
--- > -- testing 3 combinations of argument values
--- > -- pruning with 27/65 rules
--- > -- looking through 3 candidates of size 1
--- > -- looking through 3 candidates of size 2
--- > -- looking through 9 candidates of size 3
--- > -- looking through 10 candidates of size 4
--- > -- looking through 32 candidates of size 5
--- > -- looking through 39 candidates of size 6
--- > -- looking through 185 candidates of size 7
--- > -- tested 107 candidates
+-- > -- 0.1s, testing 4 combinations of argument values
+-- > -- 0.8s, pruning with 27/65 rules
+-- > -- 0.8s, 3 candidates of size 1
+-- > -- 0.9s, 3 candidates of size 2
+-- > -- 0.9s, 7 candidates of size 3
+-- > -- 0.9s, 8 candidates of size 4
+-- > -- 0.9s, 28 candidates of size 5
+-- > -- 0.9s, 35 candidates of size 6
+-- > -- 0.9s, 167 candidates of size 7
+-- > -- 0.9s, tested 95 candidates
 -- > factorial 0  =  1
 -- > factorial x  =  x * factorial (x - 1)
 --
@@ -71,9 +71,10 @@
 -- > take :: Int -> [A] -> [A]
 -- > -- testing 153 combinations of argument values
 -- > -- pruning with 4/7 rules
--- > -- ...  ...  ...
--- > -- looking through 58 candidates of size 9
--- > -- tested 104 candidates
+-- > -- ...  ...  ...  ...  ...  ...
+-- > -- 0.4s, 6 candidates of size 8
+-- > -- 0.4s, 5 candidates of size 9
+-- > -- 0.4s, tested 15 candidates
 -- > take 0 xs  =  []
 -- > take x []  =  []
 -- > take x (y:xs)  =  y:take (x - 1) xs
diff --git a/src/Conjure/Conjurable.hs b/src/Conjure/Conjurable.hs
--- a/src/Conjure/Conjurable.hs
+++ b/src/Conjure/Conjurable.hs
@@ -28,6 +28,7 @@
   , conjureGrounds
   , conjureAreEqual
   , conjureMkEquation
+  , conjureTestDefn
   , A, B, C, D, E, F
   , conjureIsUnbreakable
   , conjureReification
@@ -187,7 +188,14 @@
 --
 -- This is used in the implementation of 'conjureReification'.
 conjureReification1 :: Conjurable a => a -> Reification1
-conjureReification1 x  =  (hole x, conjureEquality x, conjureTiers x, names x, conjureCases x, value "conjureSize" (conjureSize -:> x))
+conjureReification1 x  =
+  ( hole x
+  , conjureEquality x
+  , conjureTiers x
+  , names x
+  , conjureCases x
+  , value "conjureSize" (conjureSize -:> x)
+  )
 
 -- | Conjures a list of 'Reification1'
 --   for a 'Conjurable' type, its subtypes and 'Bool'.
@@ -249,9 +257,11 @@
   where
   exprE  =  value "expr" (expr -:> a)
 
+
 mkExprTiers :: (Listable a, Show a, Typeable a) => a -> [[Expr]]
 mkExprTiers a  =  mapT val (tiers -: [[a]])
 
+
 -- | Computes a list of holes encoded as 'Expr's
 --   from a 'Conjurable' functional value.
 --
@@ -259,10 +269,12 @@
 conjureHoles :: Conjurable f => f -> [Expr]
 conjureHoles f  =  [eh | (eh,_,Just _,_,_,_) <- conjureReification f]
 
+
 -- | Computes a function that makes an equation between two expressions.
 conjureMkEquation :: Conjurable f => f -> Expr -> Expr -> Expr
 conjureMkEquation f  =  mkEquation [eq | (_,Just eq,_,_,_,_) <- conjureReification f]
 
+
 conjureDynamicEq :: Conjurable f => f -> Dynamic
 conjureDynamicEq f  =  case conjureMkEquation f efxs efxs of
                        (Value "==" deq :$ _ :$ _) -> deq
@@ -280,6 +292,99 @@
   e1 === e2  =  isTrue $ e1 -==- e2
   isTrue  =  all (errorToFalse . eval False) . gs
   gs  =  take maxTests . conjureGrounds f
+
+
+-- | Compute a 'Defn' from the given partial definition.
+--
+-- With:
+--
+-- > fact :: Int -> Int
+-- > fact 1  =  1
+-- > fact 3  =  6
+-- > fact 4  =  24
+--
+-- Then:
+--
+-- > > putStrLn $ showDefn $ conjureTestDefn 60 360 "fact n" fact
+-- > fact :: Int -> Int
+-- > fact 1  =  1
+-- > fact 3  =  6
+-- > fact 4  =  24
+--
+-- > > putStrLn $ showDefn $ conjureTestDefn 3 4 "-:-" ((:) :: Int -> [Int] -> [Int])
+-- > 0 -:- []  =  [0]
+-- > 0 -:- [0]  =  [0,0]
+-- > 1 -:- []  =  [1]
+conjureTestDefn :: Conjurable f => Int -> Int -> String -> f -> Defn
+conjureTestDefn maxTests maxSearchTests nm f  =
+  [(fxys, exprExpr fxys) | fxys <- conjureTestApps maxTests maxSearchTests nm f]
+  where
+  -- the use of conjureExpress here is sort of a hack
+  -- we "only" would need a conjureRevl :: Conjurable f => f -> Expr -> Expr
+  -- which would generate (val . evl) for supported types
+  exprExpr  =  conjureExpress f
+
+
+-- | Compute a test applications that yield non-undefined values.
+--
+-- With:
+--
+-- > fact :: Int -> Int
+-- > fact 1  =  1
+-- > fact 3  =  6
+-- > fact 4  =  24
+--
+-- Then:
+--
+-- > > putStrLn $ showDefn $ conjureTestApps 60 360 "fact n" fact
+-- > [fact 1 :: Int, fact 3 :: Int, fact 4 :: Int]
+--
+-- This function is internal and used in the implementation of 'conjureTestDefn'.
+conjureTestApps :: Conjurable f => Int -> Int -> String -> f -> [Expr]
+conjureTestApps maxTests maxSearchTests nm f  =
+  [fxys //- bs | bs <- conjureTestBinds maxTests maxSearchTests nm f]
+  where
+  fxys  =  conjureApplication nm f
+
+
+-- | Compute test bindings based on a partially defined function.
+--
+-- With:
+--
+-- > fact 1  =  1
+-- > fact 3  =  6
+-- > fact 4  =  24
+--
+-- Then:
+--
+-- > > conjureTestBinds 6 12 "factorial n" fact
+-- > [ [(n :: Int,1 :: Int)]
+-- > , [(n :: Int,3 :: Int)]
+-- > , [(n :: Int,4 :: Int)]
+-- > ]
+--
+-- Multiple arguments yield multiple bindins:
+--
+-- > > conjureTestBinds 3 4 ":" ((:) :: Int -> [Int] -> [Int])
+-- > [ [(x :: Int,0 :: Int),(xs :: [Int],[] :: [Int])]
+-- > , [(x :: Int,0 :: Int),(xs :: [Int],[0] :: [Int])]
+-- > , [(x :: Int,1 :: Int),(xs :: [Int],[] :: [Int])]
+-- > ]
+--
+-- The variable naming is consistent with 'conjureApplication' and 'conjureVarApplication'.
+--
+-- This function is internal and used in the implementation of 'conjureTestDefn'.
+conjureTestBinds :: Conjurable f => Int -> Int -> String -> f -> [[(Expr,Expr)]]
+conjureTestBinds maxTests maxSearchTests nm f  =  take maxTests
+  [ bs
+  | bs <- take maxSearchTests $ groundBinds tiersFor fxys
+  , errorToFalse . eval False $ fxys -==- fxys //- bs
+  ]
+  where
+  (-==-)    =  conjureMkEquation f
+  tiersFor  =  conjureTiersFor f
+  fxys      =  conjureApplication nm f
+
 
 -- | Compute 'tiers' of values encoded as 'Expr's
 --   of the type of the given 'Expr'.
diff --git a/src/Conjure/Engine.hs b/src/Conjure/Engine.hs
--- a/src/Conjure/Engine.hs
+++ b/src/Conjure/Engine.hs
@@ -85,11 +85,12 @@
 --
 -- > > conjure "factorial" factorial primitives
 -- > factorial :: Int -> Int
--- > -- testing 3 combinations of argument values
--- > -- pruning with 27/65 rules
--- > -- ...  ...  ...
--- > -- looking through 185 candidates of size 7
--- > -- tested 107 candidates
+-- > -- 0.1s, testing 4 combinations of argument values
+-- > -- 0.8s, pruning with 27/65 rules
+-- > -- ...  ...  ...  ...  ...  ...
+-- > -- 0.9s, 35 candidates of size 6
+-- > -- 0.9s, 167 candidates of size 7
+-- > -- 0.9s, tested 95 candidates
 -- > factorial 0  =  1
 -- > factorial x  =  x * factorial (x - 1)
 --
@@ -112,12 +113,13 @@
 --
 -- Then:
 --
--- > > conjureFromSpec "square" squareSpec primitives
+-- > > conjureFromSpec "square" squareSpec [prim "*" ((*) :: Int -> Int -> Int)]
 -- > square :: Int -> Int
--- > -- pruning with 14/25 rules
--- > -- looking through 3 candidates of size 1
--- > -- looking through 4 candidates of size 2
--- > -- looking through 9 candidates of size 3
+-- > -- 0.1s, pruning with 2/6 rules
+-- > -- 0.1s, 1 candidates of size 1
+-- > -- 0.1s, 0 candidates of size 2
+-- > -- 0.1s, 1 candidates of size 3
+-- > -- 0.1s, tested 2 candidates
 -- > square x  =  x * x
 --
 -- This allows users to specify QuickCheck-style properties,
@@ -144,39 +146,12 @@
 
 
 -- | Like 'conjure' but allows setting the maximum size of considered expressions
---   instead of the default value of 12.
---
--- > conjureWithMaxSize 18 "function" function [...]
---
--- For example, given the following partial definition for 'Data.List.insert':
---
--- > insert' :: Int -> [Int] -> [Int]
--- > insert' 0 []  =  [0]
--- > insert' 0 [1,2]  =  [0,1,2]
--- > insert' 1 [0,2]  =  [0,1,2]
--- > insert' 2 [0,1]  =  [0,1,2]
---
--- Conjure is able to find an appropriate definition at size 17
--- with the following primitives:
+--   instead of the default value of 24.
 --
--- > > conjureWithMaxSize 18 "insert" insert'
--- > >   [ prim "[]" ([] :: [Int])
--- > >   , prim ":" ((:) :: Int -> [Int] -> [Int])
--- > >   , prim "<=" ((<=) :: Int -> Int -> Bool)
--- > >   , prif (undefined :: [Int])
--- > >   ]
--- > insert :: Int -> [Int] -> [Int]
--- > -- testing 4 combinations of argument values
--- > -- pruning with 4/4 rules
--- > -- ...  ...  ...
--- > -- looking through 14550 candidates of size 17
--- > -- tested 14943 candidates
--- > insert x []  =  [x]
--- > insert x (y:xs)  =  if x <= y
--- >                     then x:insert y xs
--- >                     else y:insert x xs
+-- > conjureWithMaxSize 12 "function" function [...]
 --
--- The default maximum size of 12 would not be enough for the above definition.
+-- This function is a candidate for going away.
+-- Please set maxSize in Args instead.
 conjureWithMaxSize :: Conjurable f => Int -> String -> f -> [Prim] -> IO ()
 conjureWithMaxSize sz  =  conjureWith args
                        {  maxSize = sz
@@ -212,6 +187,7 @@
   , requireDescent        :: Bool -- ^ require recursive calls to deconstruct arguments
   , adHocRedundancy       :: Bool -- ^ ad-hoc redundancy checks
   , copyBindings          :: Bool -- ^ copy partial definition bindings in candidates
+  , earlyTests            :: Bool -- ^ perform tests early-and-independently on each binding
   , atomicNumbers         :: Bool -- ^ restrict constant/ground numeric expressions to atoms
   , requireZero           :: Bool -- ^ require 0 as base case for Num recursions
   , uniqueCandidates      :: Bool -- ^ unique-modulo-testing candidates
@@ -258,6 +234,7 @@
   , requireDescent         =  True
   , adHocRedundancy        =  True
   , copyBindings           =  True
+  , earlyTests             =  True
   , atomicNumbers          =  True
   , requireZero            =  False
   , uniqueCandidates       =  False
@@ -292,7 +269,7 @@
     putWithTimeSince t0 $ "testing " ++ show (length ts) ++ " combinations of argument values"
     when (showTests args) $ do
       putStrLn $ "{-"
-      putStr $ unlines $ map show ts
+      putStr $ showDefn ts
       putStrLn $ "-}"
   putWithTimeSince t0 $ "pruning with " ++ show nRules ++ "/" ++ show nREs ++ " rules"
   when (showTheory args) $ do
@@ -356,7 +333,7 @@
 data Results = Results
   { implementationss :: [[Defn]] -- ^ tiers of implementations
   , candidatess :: [[Defn]]      -- ^ tiers of candidates
-  , bindings :: [Expr]           -- ^ test bindings used to verify candidates
+  , bindings :: Defn             -- ^ test bindings used to verify candidates
   , theory :: Thy                -- ^ the underlying theory
   , patternss :: [[Defn]]        -- ^ tiers of allowed patterns
   , deconstructions :: [Expr]    -- ^ the list of allowed deconstructions
@@ -402,32 +379,22 @@
   , deconstructions  =  deconstructions
   }
   where
-  tests  =  [ffxx //- bs | bs <- dbss]
   implementationsT  =  filterT implements candidatesT
   implements fx  =  defnApparentlyTerminates fx
-                 && requal fx ffxx vffxx
+                 && test fx
                  && errorToFalse (p (cevl maxEvalRecursions fx))
   candidatesT  =  (if uniqueCandidates then nubCandidates args nm f else id)
                $  (if target > 0 then targetiers target else id)
                $  (if maxSize > 0 then take maxSize else id)
                $  candidatesTT
   (candidatesTT, thy, patternss, deconstructions)  =  candidateDefns args nm f es
-  ffxx   =  conjureApplication nm f
-  vffxx  =  conjureVarApplication nm f
 
-  requal dfn e1 e2  =  isTrueWhenDefined dfn (e1 -==- e2)
+  test dfn  =  all (errorToFalse . deval (conjureExpress f) maxEvalRecursions dfn False)
+            $  [funToVar lhs -==- rhs | (lhs, rhs) <- tests]
+  tests  =  conjureTestDefn maxTests maxSearchTests nm f
   (-==-)  =  conjureMkEquation f
 
-  isTrueWhenDefined dfn e  =  all (errorToFalse . deval (conjureExpress f) maxEvalRecursions dfn False)
-                           $  map (e //-) dbss
 
-  bss, dbss :: [[(Expr,Expr)]]
-  bss  =  take maxSearchTests $ groundBinds (conjureTiersFor f) ffxx
-  dbss  =  take maxTests [bs | bs <- bss, errorToFalse . eval False $ e //- bs]
-    where
-    e  =  ffxx -==- ffxx
-
-
 -- | Just prints the underlying theory found by "Test.Speculate"
 --   without actually synthesizing a function.
 conjureTheory :: Conjurable f => String -> f -> [Prim] -> IO ()
@@ -544,6 +511,9 @@
   keep | rewriting  =  isRootNormalC thy . fastMostGeneralVariation
        | otherwise  =  const True
 
+  keepBndn | rewriting  =  \b@(_,rhs) -> isBaseCase b || size (normalize thy rhs) >= size rhs
+           | otherwise  =  const True
+
   appsWith :: Expr -> [Expr] -> [[Expr]]
   appsWith eh vs  =  enumerateAppsFor eh k $ vs ++ es
     where
@@ -563,6 +533,10 @@
 
   isNumeric  =  conjureIsNumeric f
 
+  (-==-)  =  conjureMkEquation f
+  tests  =  conjureTestDefn maxTests maxSearchTests nm f
+  exprExpr  =  conjureExpress f
+
   ps2fss :: [Expr] -> [[Defn]]
   ps2fss pats  =  discardT isRedundant
                .  products  -- alt: use delayedProducts
@@ -575,10 +549,24 @@
     -- simply use its return value as the only possible result
     p2eess pat | copyBindings && isGroundPat f pat  =  [[(pat, toValPat f pat)]]
     p2eess pat  =  mapT (pat,)
+                .  filterT keepBase
                 .  appsWith pat
                 .  drop 1 -- this excludes the function name itself
                 $  vars pat ++ [eh | any (uncurry should) (zip aess aes)]
       where
+      keepBase
+        | not earlyTests  =  const True
+        | all isVar (unfoldApp pat)  =  const True
+        | otherwise  =  \e -> hasHole e || reallyKeepBase e
+      reallyKeepBase e  =  and
+        [ errorToFalse $ eval False $ (e //- bs) -==- rhs
+        | (lhs,rhs) <- tests
+        -- filter test bindings that match the current pattern:
+        , Just bs <- [lhs `matchArgs` pat]
+        ]
+      matchArgs efxs efys  =  fold (map exprExpr (drop 1 (unfoldApp efxs)))
+                      `match` fold               (drop 1 (unfoldApp efys))
+
       -- computes whether we should include a recurse for this given argument
       -- numeric arguments additionally require 0 to be present as a case
       -- for recursion
@@ -588,7 +576,8 @@
       aess  =  transpose $ map (tail . unfoldApp . rehole) pats
 
   fillingsFor1 :: Bndn -> [[Bndn]]
-  fillingsFor1 (ep,er)  =  mapT (\es -> (ep,fill er es))
+  fillingsFor1 (ep,er)  =  filterT keepBndn
+                        .  mapT (\es -> (ep,fill er es))
                         .  products
                         .  replicate (length $ holes er)
                         $  recs' ep
diff --git a/src/Conjure/Prim.hs b/src/Conjure/Prim.hs
--- a/src/Conjure/Prim.hs
+++ b/src/Conjure/Prim.hs
@@ -87,9 +87,11 @@
 -- > >                      , prim "undefined" (undefined :: Int)
 -- > >                      ]
 -- > last :: [Int] -> Int
--- > -- ...  ...  ...
--- > -- looking through 4 candidates of size 7
--- > -- tested 5 candidates
+-- > -- 0.0s, testing 360 combinations of argument values
+-- > -- 0.0s, pruning with 5/5 rules
+-- > -- ...   ...   ...   ...   ...
+-- > -- 0.0s, 4 candidates of size 7
+-- > -- 0.0s, tested 2 candidates
 -- > last []  =  undefined
 -- > last (x:xs)  =  if null xs
 -- >                 then x
@@ -109,16 +111,14 @@
 -- > >   , primOrdCaseFor (undefined :: Bool)
 -- > >   ]
 -- > mem :: Int -> Tree -> Bool
--- > -- ...  ...  ...
--- > -- looking through 384 candidates of size 12
--- > -- tested 371 candidates
+-- > -- ...   ...   ...   ...   ...
+-- > -- 0.0s, 384 candidates of size 12
+-- > -- 0.0s, tested 346 candidates
 -- > mem x Leaf  =  False
 -- > mem x (Node t1 y t2)  =  case x `compare` y of
 -- >                          LT -> mem x t1
 -- >                          EQ -> True
 -- >                          GT -> mem x t2
-
-
 primOrdCaseFor :: Conjurable a => a -> Prim
 primOrdCaseFor x  =  (caseForOrd x, conjureType x)
 
diff --git a/test/conjurable.hs b/test/conjurable.hs
--- a/test/conjurable.hs
+++ b/test/conjurable.hs
@@ -293,6 +293,26 @@
   -- little sanity check (conjurableOK should catch it anyway)
   , take 6 (conjureListFor (undefined :: Int) i_)
     == [zero, one, minusOne, two, minusTwo, three]
+
+  , conjureTestDefn 6 12 "factorial n" fact
+    == [ (value "factorial" fact :$ one,   one)
+       , (value "factorial" fact :$ two,   two)
+       , (value "factorial" fact :$ three, six)
+       , (value "factorial" fact :$ four,  val (24 :: Int))
+       ]
+
+  , conjureTestDefn 4 6 "sum" (sum :: [Int] -> Int)
+    == [ (sum' nil, zero)
+       , (sum' (val [0 :: Int]),    zero)
+       , (sum' (val [0, 0 :: Int]), zero)
+       , (sum' (val [1 :: Int]),    one)
+       ]
+
+  , conjureTestDefn 3 4 ":" ((:) :: Int -> [Int] -> [Int])
+    == [ (zero -:- nil,          zero -:- nil)
+       , (zero -:- val [0::Int], zero -:- zero -:- nil)
+       , (one -:- nil,           one -:- nil)
+       ]
   ]
 
 isNumeric :: Expr -> Bool
@@ -321,3 +341,11 @@
   (==)  =  eval err . fromMaybe err $ conjureEquality x
   err  =  error "<==>: could not conjure"
 infix 4 <==>
+
+
+-- to be used in the test of conjureTestBinds and related functions
+fact :: Int -> Int
+fact 1  =  1
+fact 2  =  2
+fact 3  =  6
+fact 4  =  24
