diff --git a/.gitignore b/.gitignore
--- a/.gitignore
+++ b/.gitignore
@@ -36,6 +36,8 @@
 eg/factorial
 eg/fibonacci
 eg/fib01
+eg/higher
+eg/id
 eg/ints
 eg/gcd
 eg/list
@@ -61,6 +63,7 @@
 bench/gps2
 bench/lowtests
 bench/terpret
+bench/weird
 proto/u-conjure
 test/expr
 test/conjurable
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@
   -i $(shell find /usr/share/doc/ghc/html/libraries -name template-haskell.haddock | tail -1) \
   $(shell grep -q "Arch Linux" /etc/lsb-release && echo --optghc=-dynamic) \
   | grep -v "^Warning: Couldn't find .haddock for export [A-Z]$$"
-INSTALL_DEPS = leancheck express speculate
+INSTALL_DEPS = leancheck express speculate template-haskell
 
 EG = \
   eg/arith \
@@ -17,6 +17,8 @@
   eg/factorial \
   eg/fibonacci \
   eg/fib01 \
+  eg/higher \
+  eg/id \
   eg/ints \
   eg/bools \
   eg/gcd \
@@ -42,6 +44,7 @@
   bench/gps \
   bench/gps2 \
   bench/terpret \
+  bench/weird \
   proto/u-conjure
 
 TESTS = \
diff --git a/TODO.md b/TODO.md
--- a/TODO.md
+++ b/TODO.md
@@ -3,36 +3,31 @@
 
 A non-exhaustive list of things TO DO for Conjure.
 
+* Review `bench/redundants.out` and prune redundant candidates.
+  See sections below for ideas.
 
-### for later
 
-* pretty-print top-level if and case expressions?
-
-* consider not breaking arguments in some cases
-  (increased crossproduct of patterns).
-  but which cases?
+## Prune modulo rewriting
 
-* exclude magic numbers?  e.g.: `1+1`?
+The following is redundant, as only the second equation is necessary:
 
-* allow conjuring from partially defined implementations?
+	foo 0  =  0
+	foo x  =  x + x
 
-        partial :: ((Int -> Int) -> Int -> Int) -> (Int -> Int)
-        partial impl  =  f
-          where
-          f n  =  if n == 0
-                  then 1
-                  else impl f n
+Another example is:
 
-* consider discover orderings on arguments?
+	foo 0  =  1
+	foo x  =  x + 1
 
-* consider leveraging lazyness somehow?
-  (related to allowing recursion under any lazy functions)
+The tricky part is when dealing with multiple arguments:
 
-* consider leveraging polymorphism somehow?
+	x ? 0  =  x
+	x ? y  =  x + y
 
-* consider allowing lambdas that introduce free variables?
+One possible path would be to replace 0 in the second equation
+then use the Theory to discover x + 0 is equal to 0.
 
 
 This file is part of Conjure,
-(C) 2021-2022 Rudy Matela,
+(C) 2021-2024 Rudy Matela,
 Distribued under the 3-Clause BSD license.
diff --git a/bench/candidates.out b/bench/candidates.out
--- a/bench/candidates.out
+++ b/bench/candidates.out
@@ -1,12054 +1,6739 @@
 Candidates for: foo :: Int -> Int
   pruning with 15/35 rules
-  [3,0,7,0,20,0,75,0,297] direct candidates, 0 duplicates
-  [3,4,12,32,54,139,287,691,1713] pattern candidates, 0 duplicates
-
-rules:
-x * y == x + y
-x * y == y + x
-x - x == 0
-x + 0 == x
-0 + x == x
-x - 0 == x
-(x + y) + z == x + (y + z)
-(x + y) + z == y + (x + z)
-x - (y - z) == z + (x - y)
-(x - y) - z == x - (y + z)
-(x - y) - z == x - (z + y)
-(x + y) - z == x + (y - z)
-(x + y) - z == y + (x - z)
-x + (y - x) == y
-(x - y) + y == x
-equations:
-y + x == x + y
-y + (x + z) == x + (y + z)
-z + (x + y) == x + (y + z)
-z + (y + x) == x + (y + z)
-y + (x - z) == x + (y - z)
-(x - z) + y == x + (y - z)
-(z - y) + x == (x - y) + z
-y - (x + y) == 0 - x
-y - (y + x) == 0 - x
-z - (y + z) == x - (x + y)
-z - (y + z) == x - (y + x)
-z - (z + y) == x - (x + y)
-z - (z + y) == x - (y + x)
-x + (0 - y) == x - y
-(0 - y) + x == x - y
-x - (x + 1) == 0 - 1
-x - (1 + x) == 0 - 1
-y - (y + 1) == x - (x + 1)
-y - (y + 1) == x - (1 + x)
-y - (1 + y) == x - (1 + x)
-
-direct candidates:
-
-foo x  =  x
-
-foo x  =  0
-
-foo x  =  1
-
-foo x  =  x + x
-
-foo x  =  x + 1
-
-foo x  =  1 + x
-
-foo x  =  1 + 1
-
-foo x  =  x - 1
-
-foo x  =  0 - x
-
-foo x  =  0 - 1
-
-foo x  =  (0 - 1) + x
-
-foo x  =  x + (x + x)
-
-foo x  =  x + (x + 1)
-
-foo x  =  x + (1 + x)
-
-foo x  =  x + (1 + 1)
-
-foo x  =  x + (x - 1)
-
-foo x  =  x + (0 - 1)
-
-foo x  =  1 + (x + x)
-
-foo x  =  1 + (x + 1)
-
-foo x  =  1 + (1 + x)
-
-foo x  =  1 + (1 + 1)
-
-foo x  =  1 + (0 - x)
-
-foo x  =  x - (x + x)
-
-foo x  =  x - (x + 1)
-
-foo x  =  x - (1 + x)
-
-foo x  =  x - (1 + 1)
-
-foo x  =  0 - (x + x)
-
-foo x  =  0 - (x + 1)
-
-foo x  =  0 - (1 + x)
-
-foo x  =  0 - (1 + 1)
-
-
-pattern candidates:
-
-foo x  =  x
-
-foo x  =  0
-
-foo x  =  1
-
-foo 0  =  0
-foo x  =  x
-
-foo 0  =  0
-foo x  =  1
-
-foo 0  =  1
-foo x  =  x
-
-foo 0  =  1
-foo x  =  0
-
-foo x  =  x + x
-
-foo x  =  x + 1
-
-foo x  =  1 + x
-
-foo x  =  1 + 1
-
-foo x  =  x - 1
-
-foo x  =  0 - x
-
-foo x  =  0 - 1
-
-foo x  =  1 - x
-
-foo 1  =  0
-foo x  =  x
-
-foo 1  =  0
-foo x  =  1
-
-foo 1  =  1
-foo x  =  x
-
-foo 1  =  1
-foo x  =  0
-
-foo 0  =  0
-foo x  =  x + x
-
-foo 0  =  0
-foo x  =  x + 1
-
-foo 0  =  0
-foo x  =  1 + x
-
-foo 0  =  0
-foo x  =  1 + 1
-
-foo 0  =  0
-foo x  =  x - 1
-
-foo 0  =  0
-foo x  =  0 - x
-
-foo 0  =  0
-foo x  =  0 - 1
-
-foo 0  =  0
-foo x  =  1 - x
-
-foo 0  =  1
-foo x  =  x + x
-
-foo 0  =  1
-foo x  =  x + 1
-
-foo 0  =  1
-foo x  =  1 + x
-
-foo 0  =  1
-foo x  =  1 + 1
-
-foo 0  =  1
-foo x  =  x - 1
-
-foo 0  =  1
-foo x  =  0 - x
-
-foo 0  =  1
-foo x  =  0 - 1
-
-foo 0  =  1
-foo x  =  1 - x
-
-foo 0  =  1 + 1
-foo x  =  x
-
-foo 0  =  1 + 1
-foo x  =  0
-
-foo 0  =  1 + 1
-foo x  =  1
-
-foo 0  =  0 - 1
-foo x  =  x
-
-foo 0  =  0 - 1
-foo x  =  0
-
-foo 0  =  0 - 1
-foo x  =  1
-
-foo 0  =  0
-foo 1  =  0
-foo x  =  x
-
-foo 0  =  0
-foo 1  =  0
-foo x  =  1
-
-foo 0  =  0
-foo 1  =  1
-foo x  =  x
-
-foo 0  =  0
-foo 1  =  1
-foo x  =  0
-
-foo 0  =  0
-foo 1  =  1
-foo x  =  1
-
-foo 0  =  1
-foo 1  =  0
-foo x  =  x
-
-foo 0  =  1
-foo 1  =  0
-foo x  =  0
-
-foo 0  =  1
-foo 1  =  0
-foo x  =  1
-
-foo 0  =  1
-foo 1  =  1
-foo x  =  x
-
-foo 0  =  1
-foo 1  =  1
-foo x  =  0
-
-foo 0  =  0
-foo x  =  foo (x - 1)
-
-foo 0  =  0
-foo x  =  foo (1 - x)
-
-foo 0  =  1
-foo x  =  foo (x - 1)
-
-foo 0  =  1
-foo x  =  foo (1 - x)
-
-foo x  =  (x - 1) + x
-
-foo x  =  (0 - x) + 1
-
-foo x  =  (0 - 1) + x
-
-foo x  =  (1 - x) + 1
-
-foo x  =  x + (x + x)
-
-foo x  =  x + (x + 1)
-
-foo x  =  x + (1 + x)
-
-foo x  =  x + (1 + 1)
-
-foo x  =  x + (x - 1)
-
-foo x  =  x + (0 - 1)
-
-foo x  =  1 + (x + x)
-
-foo x  =  1 + (x + 1)
-
-foo x  =  1 + (1 + x)
-
-foo x  =  1 + (1 + 1)
-
-foo x  =  1 + (0 - x)
-
-foo x  =  1 + (1 - x)
-
-foo x  =  x - (x + x)
-
-foo x  =  x - (x + 1)
-
-foo x  =  x - (1 + x)
-
-foo x  =  x - (1 + 1)
-
-foo x  =  0 - (x + x)
-
-foo x  =  0 - (x + 1)
-
-foo x  =  0 - (1 + x)
-
-foo x  =  0 - (1 + 1)
-
-foo x  =  1 - (x + x)
-
-foo x  =  1 - (x + 1)
-
-foo x  =  1 - (1 + x)
-
-foo x  =  1 - (1 + 1)
-
-foo 1  =  0
-foo x  =  x + x
-
-foo 1  =  0
-foo x  =  x + 1
-
-foo 1  =  0
-foo x  =  1 + x
-
-foo 1  =  0
-foo x  =  1 + 1
-
-foo 1  =  0
-foo x  =  x - 1
-
-foo 1  =  0
-foo x  =  0 - x
-
-foo 1  =  0
-foo x  =  0 - 1
-
-foo 1  =  0
-foo x  =  1 - x
-
-foo 1  =  1
-foo x  =  x + x
-
-foo 1  =  1
-foo x  =  x + 1
-
-foo 1  =  1
-foo x  =  1 + x
-
-foo 1  =  1
-foo x  =  1 + 1
-
-foo 1  =  1
-foo x  =  x - 1
-
-foo 1  =  1
-foo x  =  0 - x
-
-foo 1  =  1
-foo x  =  0 - 1
-
-foo 1  =  1
-foo x  =  1 - x
-
-foo 1  =  1 + 1
-foo x  =  x
-
-foo 1  =  1 + 1
-foo x  =  0
-
-foo 1  =  1 + 1
-foo x  =  1
-
-foo 1  =  0 - 1
-foo x  =  x
-
-foo 1  =  0 - 1
-foo x  =  0
-
-foo 1  =  0 - 1
-foo x  =  1
-
-foo 1  =  0
-foo x  =  foo (x - 1)
-
-foo 1  =  0
-foo x  =  foo (1 - x)
-
-foo 1  =  1
-foo x  =  foo (x - 1)
-
-foo 1  =  1
-foo x  =  foo (1 - x)
-
-foo 0  =  0
-foo x  =  (x - 1) + x
-
-foo 0  =  0
-foo x  =  (0 - x) + 1
-
-foo 0  =  0
-foo x  =  (0 - 1) + x
-
-foo 0  =  0
-foo x  =  (1 - x) + 1
-
-foo 0  =  0
-foo x  =  x + (x + x)
-
-foo 0  =  0
-foo x  =  x + (x + 1)
-
-foo 0  =  0
-foo x  =  x + (1 + x)
-
-foo 0  =  0
-foo x  =  x + (1 + 1)
-
-foo 0  =  0
-foo x  =  x + (x - 1)
-
-foo 0  =  0
-foo x  =  x + (0 - 1)
-
-foo 0  =  0
-foo x  =  1 + (x + x)
-
-foo 0  =  0
-foo x  =  1 + (x + 1)
-
-foo 0  =  0
-foo x  =  1 + (1 + x)
-
-foo 0  =  0
-foo x  =  1 + (1 + 1)
-
-foo 0  =  0
-foo x  =  1 + (0 - x)
-
-foo 0  =  0
-foo x  =  1 + (1 - x)
-
-foo 0  =  0
-foo x  =  x - (x + x)
-
-foo 0  =  0
-foo x  =  x - (x + 1)
-
-foo 0  =  0
-foo x  =  x - (1 + x)
-
-foo 0  =  0
-foo x  =  x - (1 + 1)
-
-foo 0  =  0
-foo x  =  0 - (x + x)
-
-foo 0  =  0
-foo x  =  0 - (x + 1)
-
-foo 0  =  0
-foo x  =  0 - (1 + x)
-
-foo 0  =  0
-foo x  =  0 - (1 + 1)
-
-foo 0  =  0
-foo x  =  1 - (x + x)
-
-foo 0  =  0
-foo x  =  1 - (x + 1)
-
-foo 0  =  0
-foo x  =  1 - (1 + x)
-
-foo 0  =  0
-foo x  =  1 - (1 + 1)
-
-foo 0  =  1
-foo x  =  (x - 1) + x
-
-foo 0  =  1
-foo x  =  (0 - x) + 1
-
-foo 0  =  1
-foo x  =  (0 - 1) + x
-
-foo 0  =  1
-foo x  =  (1 - x) + 1
-
-foo 0  =  1
-foo x  =  x + (x + x)
-
-foo 0  =  1
-foo x  =  x + (x + 1)
-
-foo 0  =  1
-foo x  =  x + (1 + x)
-
-foo 0  =  1
-foo x  =  x + (1 + 1)
-
-foo 0  =  1
-foo x  =  x + (x - 1)
-
-foo 0  =  1
-foo x  =  x + (0 - 1)
-
-foo 0  =  1
-foo x  =  1 + (x + x)
-
-foo 0  =  1
-foo x  =  1 + (x + 1)
-
-foo 0  =  1
-foo x  =  1 + (1 + x)
-
-foo 0  =  1
-foo x  =  1 + (1 + 1)
-
-foo 0  =  1
-foo x  =  1 + (0 - x)
-
-foo 0  =  1
-foo x  =  1 + (1 - x)
-
-foo 0  =  1
-foo x  =  x - (x + x)
-
-foo 0  =  1
-foo x  =  x - (x + 1)
-
-foo 0  =  1
-foo x  =  x - (1 + x)
-
-foo 0  =  1
-foo x  =  x - (1 + 1)
-
-foo 0  =  1
-foo x  =  0 - (x + x)
-
-foo 0  =  1
-foo x  =  0 - (x + 1)
-
-foo 0  =  1
-foo x  =  0 - (1 + x)
-
-foo 0  =  1
-foo x  =  0 - (1 + 1)
-
-foo 0  =  1
-foo x  =  1 - (x + x)
-
-foo 0  =  1
-foo x  =  1 - (x + 1)
-
-foo 0  =  1
-foo x  =  1 - (1 + x)
-
-foo 0  =  1
-foo x  =  1 - (1 + 1)
-
-foo 0  =  1 + 1
-foo x  =  x + x
-
-foo 0  =  1 + 1
-foo x  =  x + 1
-
-foo 0  =  1 + 1
-foo x  =  1 + x
-
-foo 0  =  1 + 1
-foo x  =  x - 1
-
-foo 0  =  1 + 1
-foo x  =  0 - x
-
-foo 0  =  1 + 1
-foo x  =  0 - 1
-
-foo 0  =  1 + 1
-foo x  =  1 - x
-
-foo 0  =  0 - 1
-foo x  =  x + x
-
-foo 0  =  0 - 1
-foo x  =  x + 1
-
-foo 0  =  0 - 1
-foo x  =  1 + x
-
-foo 0  =  0 - 1
-foo x  =  1 + 1
-
-foo 0  =  0 - 1
-foo x  =  x - 1
-
-foo 0  =  0 - 1
-foo x  =  0 - x
-
-foo 0  =  0 - 1
-foo x  =  1 - x
-
-foo 0  =  1 + (1 + 1)
-foo x  =  x
-
-foo 0  =  1 + (1 + 1)
-foo x  =  0
-
-foo 0  =  1 + (1 + 1)
-foo x  =  1
-
-foo 0  =  0 - (1 + 1)
-foo x  =  x
-
-foo 0  =  0 - (1 + 1)
-foo x  =  0
-
-foo 0  =  0 - (1 + 1)
-foo x  =  1
-
-foo 0  =  1 - (1 + 1)
-foo x  =  x
-
-foo 0  =  1 - (1 + 1)
-foo x  =  0
-
-foo 0  =  1 - (1 + 1)
-foo x  =  1
-
-foo 0  =  0
-foo 1  =  0
-foo x  =  x + x
-
-foo 0  =  0
-foo 1  =  0
-foo x  =  x + 1
-
-foo 0  =  0
-foo 1  =  0
-foo x  =  1 + x
-
-foo 0  =  0
-foo 1  =  0
-foo x  =  1 + 1
-
-foo 0  =  0
-foo 1  =  0
-foo x  =  x - 1
-
-foo 0  =  0
-foo 1  =  0
-foo x  =  0 - x
-
-foo 0  =  0
-foo 1  =  0
-foo x  =  0 - 1
-
-foo 0  =  0
-foo 1  =  0
-foo x  =  1 - x
-
-foo 0  =  0
-foo 1  =  1
-foo x  =  x + x
-
-foo 0  =  0
-foo 1  =  1
-foo x  =  x + 1
-
-foo 0  =  0
-foo 1  =  1
-foo x  =  1 + x
-
-foo 0  =  0
-foo 1  =  1
-foo x  =  1 + 1
-
-foo 0  =  0
-foo 1  =  1
-foo x  =  x - 1
-
-foo 0  =  0
-foo 1  =  1
-foo x  =  0 - x
-
-foo 0  =  0
-foo 1  =  1
-foo x  =  0 - 1
-
-foo 0  =  0
-foo 1  =  1
-foo x  =  1 - x
-
-foo 0  =  0
-foo 1  =  1 + 1
-foo x  =  x
-
-foo 0  =  0
-foo 1  =  1 + 1
-foo x  =  0
-
-foo 0  =  0
-foo 1  =  1 + 1
-foo x  =  1
-
-foo 0  =  0
-foo 1  =  0 - 1
-foo x  =  x
-
-foo 0  =  0
-foo 1  =  0 - 1
-foo x  =  0
-
-foo 0  =  0
-foo 1  =  0 - 1
-foo x  =  1
-
-foo 0  =  1
-foo 1  =  0
-foo x  =  x + x
-
-foo 0  =  1
-foo 1  =  0
-foo x  =  x + 1
-
-foo 0  =  1
-foo 1  =  0
-foo x  =  1 + x
-
-foo 0  =  1
-foo 1  =  0
-foo x  =  1 + 1
-
-foo 0  =  1
-foo 1  =  0
-foo x  =  x - 1
-
-foo 0  =  1
-foo 1  =  0
-foo x  =  0 - x
-
-foo 0  =  1
-foo 1  =  0
-foo x  =  0 - 1
-
-foo 0  =  1
-foo 1  =  0
-foo x  =  1 - x
-
-foo 0  =  1
-foo 1  =  1
-foo x  =  x + x
-
-foo 0  =  1
-foo 1  =  1
-foo x  =  x + 1
-
-foo 0  =  1
-foo 1  =  1
-foo x  =  1 + x
-
-foo 0  =  1
-foo 1  =  1
-foo x  =  1 + 1
-
-foo 0  =  1
-foo 1  =  1
-foo x  =  x - 1
-
-foo 0  =  1
-foo 1  =  1
-foo x  =  0 - x
-
-foo 0  =  1
-foo 1  =  1
-foo x  =  0 - 1
-
-foo 0  =  1
-foo 1  =  1
-foo x  =  1 - x
-
-foo 0  =  1
-foo 1  =  1 + 1
-foo x  =  x
-
-foo 0  =  1
-foo 1  =  1 + 1
-foo x  =  0
-
-foo 0  =  1
-foo 1  =  1 + 1
-foo x  =  1
-
-foo 0  =  1
-foo 1  =  0 - 1
-foo x  =  x
-
-foo 0  =  1
-foo 1  =  0 - 1
-foo x  =  0
-
-foo 0  =  1
-foo 1  =  0 - 1
-foo x  =  1
-
-foo 0  =  1 + 1
-foo 1  =  0
-foo x  =  x
-
-foo 0  =  1 + 1
-foo 1  =  0
-foo x  =  0
-
-foo 0  =  1 + 1
-foo 1  =  0
-foo x  =  1
-
-foo 0  =  1 + 1
-foo 1  =  1
-foo x  =  x
-
-foo 0  =  1 + 1
-foo 1  =  1
-foo x  =  0
-
-foo 0  =  1 + 1
-foo 1  =  1
-foo x  =  1
-
-foo 0  =  0 - 1
-foo 1  =  0
-foo x  =  x
-
-foo 0  =  0 - 1
-foo 1  =  0
-foo x  =  0
-
-foo 0  =  0 - 1
-foo 1  =  0
-foo x  =  1
-
-foo 0  =  0 - 1
-foo 1  =  1
-foo x  =  x
-
-foo 0  =  0 - 1
-foo 1  =  1
-foo x  =  0
-
-foo 0  =  0 - 1
-foo 1  =  1
-foo x  =  1
-
-
-Candidates for: ? :: Int -> Int -> Int
-  pruning with 10/23 rules
-  [3,3,4,10,17,26,54,93,162] direct candidates, 0 duplicates
-  [3,10,40,116,338,953,2702,7505,20728] pattern candidates, 0 duplicates
-
-rules:
-x * y == x + y
-x * y == y + x
-x + 0 == x
-0 + x == x
-dec (x + y) == x + dec y
-dec (x + y) == y + dec x
-dec (x + y) == dec x + y
-dec (x + y) == dec y + x
-(x + y) + z == x + (y + z)
-(x + y) + z == y + (x + z)
-equations:
-y + x == x + y
-y + dec x == x + dec y
-dec x + y == x + dec y
-dec y + x == dec x + y
-x + dec 0 == dec x
-dec 0 + x == dec x
-y + (x + z) == x + (y + z)
-z + (x + y) == x + (y + z)
-z + (y + x) == x + (y + z)
-y + dec (dec x) == x + dec (dec y)
-dec (dec x) + y == x + dec (dec y)
-x + dec (dec 0) == dec (dec x)
-dec (dec 0) + x == dec (dec x)
-
-direct candidates:
-
-x ? y  =  x
-
-x ? y  =  y
-
-x ? y  =  0
-
-x ? y  =  dec x
-
-x ? y  =  dec y
-
-x ? y  =  dec 0
-
-x ? y  =  x + x
-
-x ? y  =  x + y
-
-x ? y  =  y + x
-
-x ? y  =  y + y
-
-x ? y  =  dec x + y
-
-x ? y  =  dec y + x
-
-x ? y  =  dec 0 + x
-
-x ? y  =  dec 0 + y
-
-x ? y  =  x + dec x
-
-x ? y  =  x + dec y
-
-x ? y  =  x + dec 0
-
-x ? y  =  y + dec x
-
-x ? y  =  y + dec y
-
-x ? y  =  y + dec 0
-
-x ? y  =  x + (x + x)
-
-x ? y  =  x + (x + y)
-
-x ? y  =  x + (y + x)
-
-x ? y  =  x + (y + y)
-
-x ? y  =  y + (x + x)
-
-x ? y  =  y + (x + y)
-
-x ? y  =  y + (y + x)
-
-x ? y  =  y + (y + y)
-
-x ? y  =  dec x + dec x
-
-x ? y  =  dec x + dec y
-
-x ? y  =  dec x + dec 0
-
-x ? y  =  dec y + dec x
-
-x ? y  =  dec y + dec y
-
-x ? y  =  dec y + dec 0
-
-x ? y  =  dec 0 + dec x
-
-x ? y  =  dec 0 + dec y
-
-x ? y  =  dec 0 + dec 0
-
-x ? y  =  x + (dec x + y)
-
-x ? y  =  x + (dec y + x)
-
-x ? y  =  x + (dec 0 + x)
-
-x ? y  =  x + (dec 0 + y)
-
-x ? y  =  x + (x + dec x)
-
-x ? y  =  x + (x + dec y)
-
-x ? y  =  x + (x + dec 0)
-
-x ? y  =  x + (y + dec x)
-
-x ? y  =  x + (y + dec y)
-
-x ? y  =  x + (y + dec 0)
-
-x ? y  =  y + (dec x + y)
-
-x ? y  =  y + (dec y + x)
-
-x ? y  =  y + (dec 0 + x)
-
-x ? y  =  y + (dec 0 + y)
-
-x ? y  =  y + (x + dec x)
-
-x ? y  =  y + (x + dec y)
-
-x ? y  =  y + (x + dec 0)
-
-x ? y  =  y + (y + dec x)
-
-x ? y  =  y + (y + dec y)
-
-x ? y  =  y + (y + dec 0)
-
-x ? y  =  dec x + (y + y)
-
-x ? y  =  dec y + (x + x)
-
-x ? y  =  dec 0 + (x + x)
-
-x ? y  =  dec 0 + (x + y)
-
-x ? y  =  dec 0 + (y + x)
-
-x ? y  =  dec 0 + (y + y)
-
-
-pattern candidates:
-
-x ? y  =  x
-
-x ? y  =  y
-
-x ? y  =  0
-
-x ? y  =  dec x
-
-x ? y  =  dec y
-
-x ? y  =  dec 0
-
-x ? 0  =  x
-x ? y  =  y
-
-x ? 0  =  x
-x ? y  =  0
-
-x ? 0  =  0
-x ? y  =  x
-
-x ? 0  =  0
-x ? y  =  y
-
-0 ? x  =  x
-x ? y  =  0
-
-0 ? x  =  0
-x ? y  =  x
-
-0 ? x  =  0
-x ? y  =  y
-
-x ? y  =  x + x
-
-x ? y  =  x + y
-
-x ? y  =  y + x
-
-x ? y  =  y + y
-
-x ? y  =  dec (dec x)
-
-x ? y  =  dec (dec y)
-
-x ? y  =  dec (dec 0)
-
-x ? 0  =  x
-x ? y  =  dec x
-
-x ? 0  =  x
-x ? y  =  dec y
-
-x ? 0  =  x
-x ? y  =  dec 0
-
-x ? 0  =  0
-x ? y  =  dec x
-
-x ? 0  =  0
-x ? y  =  dec y
-
-x ? 0  =  0
-x ? y  =  dec 0
-
-x ? 0  =  dec x
-x ? y  =  x
-
-x ? 0  =  dec x
-x ? y  =  y
-
-x ? 0  =  dec x
-x ? y  =  0
-
-x ? 0  =  dec 0
-x ? y  =  x
-
-x ? 0  =  dec 0
-x ? y  =  y
-
-x ? 0  =  dec 0
-x ? y  =  0
-
-0 ? x  =  x
-x ? y  =  dec x
-
-0 ? x  =  x
-x ? y  =  dec y
-
-0 ? x  =  x
-x ? y  =  dec 0
-
-0 ? x  =  0
-x ? y  =  dec x
-
-0 ? x  =  0
-x ? y  =  dec y
-
-0 ? x  =  0
-x ? y  =  dec 0
-
-0 ? x  =  dec x
-x ? y  =  x
-
-0 ? x  =  dec x
-x ? y  =  y
-
-0 ? x  =  dec x
-x ? y  =  0
-
-0 ? x  =  dec 0
-x ? y  =  x
-
-0 ? x  =  dec 0
-x ? y  =  y
-
-0 ? x  =  dec 0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  y
-
-x ? y  =  dec x + x
-
-x ? y  =  dec x + y
-
-x ? y  =  dec y + x
-
-x ? y  =  dec y + y
-
-x ? y  =  dec 0 + x
-
-x ? y  =  dec 0 + y
-
-x ? y  =  dec (dec (dec x))
-
-x ? y  =  dec (dec (dec y))
-
-x ? y  =  dec (dec (dec 0))
-
-x ? y  =  x + dec x
-
-x ? y  =  x + dec y
-
-x ? y  =  x + dec 0
-
-x ? y  =  y + dec x
-
-x ? y  =  y + dec y
-
-x ? y  =  y + dec 0
-
-x ? 0  =  x
-x ? y  =  x + x
-
-x ? 0  =  x
-x ? y  =  x + y
-
-x ? 0  =  x
-x ? y  =  y + x
-
-x ? 0  =  x
-x ? y  =  y + y
-
-x ? 0  =  x
-x ? y  =  dec (dec x)
-
-x ? 0  =  x
-x ? y  =  dec (dec y)
-
-x ? 0  =  x
-x ? y  =  dec (dec 0)
-
-x ? 0  =  0
-x ? y  =  x + x
-
-x ? 0  =  0
-x ? y  =  x + y
-
-x ? 0  =  0
-x ? y  =  y + x
-
-x ? 0  =  0
-x ? y  =  y + y
-
-x ? 0  =  0
-x ? y  =  dec (dec x)
-
-x ? 0  =  0
-x ? y  =  dec (dec y)
-
-x ? 0  =  0
-x ? y  =  dec (dec 0)
-
-x ? 0  =  dec x
-x ? y  =  dec y
-
-x ? 0  =  dec x
-x ? y  =  dec 0
-
-x ? 0  =  dec 0
-x ? y  =  dec x
-
-x ? 0  =  dec 0
-x ? y  =  dec y
-
-x ? 0  =  x + x
-x ? y  =  x
-
-x ? 0  =  x + x
-x ? y  =  y
-
-x ? 0  =  x + x
-x ? y  =  0
-
-x ? 0  =  dec (dec x)
-x ? y  =  x
-
-x ? 0  =  dec (dec x)
-x ? y  =  y
-
-x ? 0  =  dec (dec x)
-x ? y  =  0
-
-x ? 0  =  dec (dec 0)
-x ? y  =  x
-
-x ? 0  =  dec (dec 0)
-x ? y  =  y
-
-x ? 0  =  dec (dec 0)
-x ? y  =  0
-
-0 ? x  =  x
-x ? y  =  x + x
-
-0 ? x  =  x
-x ? y  =  x + y
-
-0 ? x  =  x
-x ? y  =  y + x
-
-0 ? x  =  x
-x ? y  =  y + y
-
-0 ? x  =  x
-x ? y  =  dec (dec x)
-
-0 ? x  =  x
-x ? y  =  dec (dec y)
-
-0 ? x  =  x
-x ? y  =  dec (dec 0)
-
-0 ? x  =  0
-x ? y  =  x + x
-
-0 ? x  =  0
-x ? y  =  x + y
-
-0 ? x  =  0
-x ? y  =  y + x
-
-0 ? x  =  0
-x ? y  =  y + y
-
-0 ? x  =  0
-x ? y  =  dec (dec x)
-
-0 ? x  =  0
-x ? y  =  dec (dec y)
-
-0 ? x  =  0
-x ? y  =  dec (dec 0)
-
-0 ? x  =  dec x
-x ? y  =  dec 0
-
-0 ? x  =  dec 0
-x ? y  =  dec x
-
-0 ? x  =  dec 0
-x ? y  =  dec y
-
-0 ? x  =  x + x
-x ? y  =  x
-
-0 ? x  =  x + x
-x ? y  =  y
-
-0 ? x  =  x + x
-x ? y  =  0
-
-0 ? x  =  dec (dec x)
-x ? y  =  x
-
-0 ? x  =  dec (dec x)
-x ? y  =  y
-
-0 ? x  =  dec (dec x)
-x ? y  =  0
-
-0 ? x  =  dec (dec 0)
-x ? y  =  x
-
-0 ? x  =  dec (dec 0)
-x ? y  =  y
-
-0 ? x  =  dec (dec 0)
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  0
-
-x ? 0  =  x
-x ? y  =  x ? dec y
-
-x ? 0  =  x
-x ? y  =  y ? dec y
-
-x ? 0  =  x
-x ? y  =  0 ? dec y
-
-x ? 0  =  x
-x ? y  =  dec x ? x
-
-x ? 0  =  x
-x ? y  =  dec x ? y
-
-x ? 0  =  x
-x ? y  =  dec x ? 0
-
-x ? 0  =  0
-x ? y  =  x ? dec y
-
-x ? 0  =  0
-x ? y  =  y ? dec y
-
-x ? 0  =  0
-x ? y  =  0 ? dec y
-
-x ? 0  =  0
-x ? y  =  dec x ? x
-
-x ? 0  =  0
-x ? y  =  dec x ? y
-
-x ? 0  =  0
-x ? y  =  dec x ? 0
-
-0 ? x  =  x
-x ? y  =  x ? dec y
-
-0 ? x  =  x
-x ? y  =  y ? dec y
-
-0 ? x  =  x
-x ? y  =  0 ? dec y
-
-0 ? x  =  x
-x ? y  =  dec x ? x
-
-0 ? x  =  x
-x ? y  =  dec x ? y
-
-0 ? x  =  x
-x ? y  =  dec x ? 0
-
-0 ? x  =  0
-x ? y  =  x ? dec y
-
-0 ? x  =  0
-x ? y  =  y ? dec y
-
-0 ? x  =  0
-x ? y  =  0 ? dec y
-
-0 ? x  =  0
-x ? y  =  dec x ? x
-
-0 ? x  =  0
-x ? y  =  dec x ? y
-
-0 ? x  =  0
-x ? y  =  dec x ? 0
-
-x ? y  =  dec (dec x) + x
-
-x ? y  =  dec (dec x) + y
-
-x ? y  =  dec (dec y) + x
-
-x ? y  =  dec (dec y) + y
-
-x ? y  =  dec (dec 0) + x
-
-x ? y  =  dec (dec 0) + y
-
-x ? y  =  dec (dec (dec (dec x)))
-
-x ? y  =  dec (dec (dec (dec y)))
-
-x ? y  =  dec (dec (dec (dec 0)))
-
-x ? y  =  x + (x + x)
-
-x ? y  =  x + (x + y)
-
-x ? y  =  x + (y + x)
-
-x ? y  =  x + (y + y)
-
-x ? y  =  x + dec (dec x)
-
-x ? y  =  x + dec (dec y)
-
-x ? y  =  x + dec (dec 0)
-
-x ? y  =  y + (x + x)
-
-x ? y  =  y + (x + y)
-
-x ? y  =  y + (y + x)
-
-x ? y  =  y + (y + y)
-
-x ? y  =  y + dec (dec x)
-
-x ? y  =  y + dec (dec y)
-
-x ? y  =  y + dec (dec 0)
-
-x ? y  =  dec x + dec x
-
-x ? y  =  dec x + dec y
-
-x ? y  =  dec x + dec 0
-
-x ? y  =  dec y + dec x
-
-x ? y  =  dec y + dec y
-
-x ? y  =  dec y + dec 0
-
-x ? y  =  dec 0 + dec x
-
-x ? y  =  dec 0 + dec y
-
-x ? y  =  dec 0 + dec 0
-
-x ? 0  =  x
-x ? y  =  dec x + x
-
-x ? 0  =  x
-x ? y  =  dec x + y
-
-x ? 0  =  x
-x ? y  =  dec y + x
-
-x ? 0  =  x
-x ? y  =  dec y + y
-
-x ? 0  =  x
-x ? y  =  dec 0 + x
-
-x ? 0  =  x
-x ? y  =  dec 0 + y
-
-x ? 0  =  x
-x ? y  =  dec (dec (dec x))
-
-x ? 0  =  x
-x ? y  =  dec (dec (dec y))
-
-x ? 0  =  x
-x ? y  =  dec (dec (dec 0))
-
-x ? 0  =  x
-x ? y  =  x + dec x
-
-x ? 0  =  x
-x ? y  =  x + dec y
-
-x ? 0  =  x
-x ? y  =  x + dec 0
-
-x ? 0  =  x
-x ? y  =  y + dec x
-
-x ? 0  =  x
-x ? y  =  y + dec y
-
-x ? 0  =  x
-x ? y  =  y + dec 0
-
-x ? 0  =  0
-x ? y  =  dec x + x
-
-x ? 0  =  0
-x ? y  =  dec x + y
-
-x ? 0  =  0
-x ? y  =  dec y + x
-
-x ? 0  =  0
-x ? y  =  dec y + y
-
-x ? 0  =  0
-x ? y  =  dec 0 + x
-
-x ? 0  =  0
-x ? y  =  dec 0 + y
-
-x ? 0  =  0
-x ? y  =  dec (dec (dec x))
-
-x ? 0  =  0
-x ? y  =  dec (dec (dec y))
-
-x ? 0  =  0
-x ? y  =  dec (dec (dec 0))
-
-x ? 0  =  0
-x ? y  =  x + dec x
-
-x ? 0  =  0
-x ? y  =  x + dec y
-
-x ? 0  =  0
-x ? y  =  x + dec 0
-
-x ? 0  =  0
-x ? y  =  y + dec x
-
-x ? 0  =  0
-x ? y  =  y + dec y
-
-x ? 0  =  0
-x ? y  =  y + dec 0
-
-x ? 0  =  dec x
-x ? y  =  x + x
-
-x ? 0  =  dec x
-x ? y  =  x + y
-
-x ? 0  =  dec x
-x ? y  =  y + x
-
-x ? 0  =  dec x
-x ? y  =  y + y
-
-x ? 0  =  dec x
-x ? y  =  dec (dec x)
-
-x ? 0  =  dec x
-x ? y  =  dec (dec y)
-
-x ? 0  =  dec x
-x ? y  =  dec (dec 0)
-
-x ? 0  =  dec 0
-x ? y  =  x + x
-
-x ? 0  =  dec 0
-x ? y  =  x + y
-
-x ? 0  =  dec 0
-x ? y  =  y + x
-
-x ? 0  =  dec 0
-x ? y  =  y + y
-
-x ? 0  =  dec 0
-x ? y  =  dec (dec x)
-
-x ? 0  =  dec 0
-x ? y  =  dec (dec y)
-
-x ? 0  =  dec 0
-x ? y  =  dec (dec 0)
-
-x ? 0  =  x + x
-x ? y  =  dec x
-
-x ? 0  =  x + x
-x ? y  =  dec y
-
-x ? 0  =  x + x
-x ? y  =  dec 0
-
-x ? 0  =  dec (dec x)
-x ? y  =  dec x
-
-x ? 0  =  dec (dec x)
-x ? y  =  dec y
-
-x ? 0  =  dec (dec x)
-x ? y  =  dec 0
-
-x ? 0  =  dec (dec 0)
-x ? y  =  dec x
-
-x ? 0  =  dec (dec 0)
-x ? y  =  dec y
-
-x ? 0  =  dec (dec 0)
-x ? y  =  dec 0
-
-x ? 0  =  dec x + x
-x ? y  =  x
-
-x ? 0  =  dec x + x
-x ? y  =  y
-
-x ? 0  =  dec x + x
-x ? y  =  0
-
-x ? 0  =  dec 0 + x
-x ? y  =  x
-
-x ? 0  =  dec 0 + x
-x ? y  =  y
-
-x ? 0  =  dec 0 + x
-x ? y  =  0
-
-x ? 0  =  dec (dec (dec x))
-x ? y  =  x
-
-x ? 0  =  dec (dec (dec x))
-x ? y  =  y
-
-x ? 0  =  dec (dec (dec x))
-x ? y  =  0
-
-x ? 0  =  dec (dec (dec 0))
-x ? y  =  x
-
-x ? 0  =  dec (dec (dec 0))
-x ? y  =  y
-
-x ? 0  =  dec (dec (dec 0))
-x ? y  =  0
-
-x ? 0  =  x + dec x
-x ? y  =  x
-
-x ? 0  =  x + dec x
-x ? y  =  y
-
-x ? 0  =  x + dec x
-x ? y  =  0
-
-x ? 0  =  x + dec 0
-x ? y  =  x
-
-x ? 0  =  x + dec 0
-x ? y  =  y
-
-x ? 0  =  x + dec 0
-x ? y  =  0
-
-0 ? x  =  x
-x ? y  =  dec x + x
-
-0 ? x  =  x
-x ? y  =  dec x + y
-
-0 ? x  =  x
-x ? y  =  dec y + x
-
-0 ? x  =  x
-x ? y  =  dec y + y
-
-0 ? x  =  x
-x ? y  =  dec 0 + x
-
-0 ? x  =  x
-x ? y  =  dec 0 + y
-
-0 ? x  =  x
-x ? y  =  dec (dec (dec x))
-
-0 ? x  =  x
-x ? y  =  dec (dec (dec y))
-
-0 ? x  =  x
-x ? y  =  dec (dec (dec 0))
-
-0 ? x  =  x
-x ? y  =  x + dec x
-
-0 ? x  =  x
-x ? y  =  x + dec y
-
-0 ? x  =  x
-x ? y  =  x + dec 0
-
-0 ? x  =  x
-x ? y  =  y + dec x
-
-0 ? x  =  x
-x ? y  =  y + dec y
-
-0 ? x  =  x
-x ? y  =  y + dec 0
-
-0 ? x  =  0
-x ? y  =  dec x + x
-
-0 ? x  =  0
-x ? y  =  dec x + y
-
-0 ? x  =  0
-x ? y  =  dec y + x
-
-0 ? x  =  0
-x ? y  =  dec y + y
-
-0 ? x  =  0
-x ? y  =  dec 0 + x
-
-0 ? x  =  0
-x ? y  =  dec 0 + y
-
-0 ? x  =  0
-x ? y  =  dec (dec (dec x))
-
-0 ? x  =  0
-x ? y  =  dec (dec (dec y))
-
-0 ? x  =  0
-x ? y  =  dec (dec (dec 0))
-
-0 ? x  =  0
-x ? y  =  x + dec x
-
-0 ? x  =  0
-x ? y  =  x + dec y
-
-0 ? x  =  0
-x ? y  =  x + dec 0
-
-0 ? x  =  0
-x ? y  =  y + dec x
-
-0 ? x  =  0
-x ? y  =  y + dec y
-
-0 ? x  =  0
-x ? y  =  y + dec 0
-
-0 ? x  =  dec x
-x ? y  =  x + x
-
-0 ? x  =  dec x
-x ? y  =  x + y
-
-0 ? x  =  dec x
-x ? y  =  y + x
-
-0 ? x  =  dec x
-x ? y  =  y + y
-
-0 ? x  =  dec x
-x ? y  =  dec (dec x)
-
-0 ? x  =  dec x
-x ? y  =  dec (dec y)
-
-0 ? x  =  dec x
-x ? y  =  dec (dec 0)
-
-0 ? x  =  dec 0
-x ? y  =  x + x
-
-0 ? x  =  dec 0
-x ? y  =  x + y
-
-0 ? x  =  dec 0
-x ? y  =  y + x
-
-0 ? x  =  dec 0
-x ? y  =  y + y
-
-0 ? x  =  dec 0
-x ? y  =  dec (dec x)
-
-0 ? x  =  dec 0
-x ? y  =  dec (dec y)
-
-0 ? x  =  dec 0
-x ? y  =  dec (dec 0)
-
-0 ? x  =  x + x
-x ? y  =  dec x
-
-0 ? x  =  x + x
-x ? y  =  dec y
-
-0 ? x  =  x + x
-x ? y  =  dec 0
-
-0 ? x  =  dec (dec x)
-x ? y  =  dec x
-
-0 ? x  =  dec (dec x)
-x ? y  =  dec y
-
-0 ? x  =  dec (dec x)
-x ? y  =  dec 0
-
-0 ? x  =  dec (dec 0)
-x ? y  =  dec x
-
-0 ? x  =  dec (dec 0)
-x ? y  =  dec y
-
-0 ? x  =  dec (dec 0)
-x ? y  =  dec 0
-
-0 ? x  =  dec x + x
-x ? y  =  x
-
-0 ? x  =  dec x + x
-x ? y  =  y
-
-0 ? x  =  dec x + x
-x ? y  =  0
-
-0 ? x  =  dec 0 + x
-x ? y  =  x
-
-0 ? x  =  dec 0 + x
-x ? y  =  y
-
-0 ? x  =  dec 0 + x
-x ? y  =  0
-
-0 ? x  =  dec (dec (dec x))
-x ? y  =  x
-
-0 ? x  =  dec (dec (dec x))
-x ? y  =  y
-
-0 ? x  =  dec (dec (dec x))
-x ? y  =  0
-
-0 ? x  =  dec (dec (dec 0))
-x ? y  =  x
-
-0 ? x  =  dec (dec (dec 0))
-x ? y  =  y
-
-0 ? x  =  dec (dec (dec 0))
-x ? y  =  0
-
-0 ? x  =  x + dec x
-x ? y  =  x
-
-0 ? x  =  x + dec x
-x ? y  =  y
-
-0 ? x  =  x + dec x
-x ? y  =  0
-
-0 ? x  =  x + dec 0
-x ? y  =  x
-
-0 ? x  =  x + dec 0
-x ? y  =  y
-
-0 ? x  =  x + dec 0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  x + x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  x + y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  y + x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  y + y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec (dec x)
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec (dec y)
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec (dec 0)
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  x + x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  x + y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  y + x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  y + y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec (dec x)
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec (dec y)
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec (dec 0)
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x + x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x + x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x + x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec x)
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec x)
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec x)
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec 0)
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec 0)
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec 0)
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  x + x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  x + y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  y + x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  y + y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec (dec x)
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec (dec y)
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec (dec 0)
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  x + x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  x + y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  y + x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  y + y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec (dec x)
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec (dec y)
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec (dec 0)
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x + x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x + x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x + x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec x)
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec x)
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec x)
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec 0)
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec 0)
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec 0)
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec 0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec 0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec 0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec 0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec 0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec 0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec x
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec y
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec 0
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec x
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec y
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec 0
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec x
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec y
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec 0
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec x
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec y
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec 0
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  0
-
-x ? 0  =  x
-x ? y  =  x ? dec (dec y)
-
-x ? 0  =  x
-x ? y  =  y ? dec (dec y)
-
-x ? 0  =  x
-x ? y  =  0 ? dec (dec y)
-
-x ? 0  =  x
-x ? y  =  dec x ? dec x
-
-x ? 0  =  x
-x ? y  =  dec x ? dec y
-
-x ? 0  =  x
-x ? y  =  dec x ? dec 0
-
-x ? 0  =  x
-x ? y  =  dec y ? dec y
-
-x ? 0  =  x
-x ? y  =  dec 0 ? dec y
-
-x ? 0  =  x
-x ? y  =  dec (dec x) ? x
-
-x ? 0  =  x
-x ? y  =  dec (dec x) ? y
-
-x ? 0  =  x
-x ? y  =  dec (dec x) ? 0
-
-x ? 0  =  0
-x ? y  =  x ? dec (dec y)
-
-x ? 0  =  0
-x ? y  =  y ? dec (dec y)
-
-x ? 0  =  0
-x ? y  =  0 ? dec (dec y)
-
-x ? 0  =  0
-x ? y  =  dec x ? dec x
-
-x ? 0  =  0
-x ? y  =  dec x ? dec y
-
-x ? 0  =  0
-x ? y  =  dec x ? dec 0
-
-x ? 0  =  0
-x ? y  =  dec y ? dec y
-
-x ? 0  =  0
-x ? y  =  dec 0 ? dec y
-
-x ? 0  =  0
-x ? y  =  dec (dec x) ? x
-
-x ? 0  =  0
-x ? y  =  dec (dec x) ? y
-
-x ? 0  =  0
-x ? y  =  dec (dec x) ? 0
-
-0 ? x  =  x
-x ? y  =  x ? dec (dec y)
-
-0 ? x  =  x
-x ? y  =  y ? dec (dec y)
-
-0 ? x  =  x
-x ? y  =  0 ? dec (dec y)
-
-0 ? x  =  x
-x ? y  =  dec x ? dec x
-
-0 ? x  =  x
-x ? y  =  dec x ? dec y
-
-0 ? x  =  x
-x ? y  =  dec x ? dec 0
-
-0 ? x  =  x
-x ? y  =  dec y ? dec y
-
-0 ? x  =  x
-x ? y  =  dec 0 ? dec y
-
-0 ? x  =  x
-x ? y  =  dec (dec x) ? x
-
-0 ? x  =  x
-x ? y  =  dec (dec x) ? y
-
-0 ? x  =  x
-x ? y  =  dec (dec x) ? 0
-
-0 ? x  =  0
-x ? y  =  x ? dec (dec y)
-
-0 ? x  =  0
-x ? y  =  y ? dec (dec y)
-
-0 ? x  =  0
-x ? y  =  0 ? dec (dec y)
-
-0 ? x  =  0
-x ? y  =  dec x ? dec x
-
-0 ? x  =  0
-x ? y  =  dec x ? dec y
-
-0 ? x  =  0
-x ? y  =  dec x ? dec 0
-
-0 ? x  =  0
-x ? y  =  dec y ? dec y
-
-0 ? x  =  0
-x ? y  =  dec 0 ? dec y
-
-0 ? x  =  0
-x ? y  =  dec (dec x) ? x
-
-0 ? x  =  0
-x ? y  =  dec (dec x) ? y
-
-0 ? x  =  0
-x ? y  =  dec (dec x) ? 0
-
-x ? 0  =  x
-x ? y  =  dec (x ? dec y)
-
-x ? 0  =  x
-x ? y  =  dec (y ? dec y)
-
-x ? 0  =  x
-x ? y  =  dec (0 ? dec y)
-
-x ? 0  =  x
-x ? y  =  dec (dec x ? x)
-
-x ? 0  =  x
-x ? y  =  dec (dec x ? y)
-
-x ? 0  =  x
-x ? y  =  dec (dec x ? 0)
-
-x ? 0  =  0
-x ? y  =  dec (x ? dec y)
-
-x ? 0  =  0
-x ? y  =  dec (y ? dec y)
-
-x ? 0  =  0
-x ? y  =  dec (0 ? dec y)
-
-x ? 0  =  0
-x ? y  =  dec (dec x ? x)
-
-x ? 0  =  0
-x ? y  =  dec (dec x ? y)
-
-x ? 0  =  0
-x ? y  =  dec (dec x ? 0)
-
-x ? 0  =  dec x
-x ? y  =  x ? dec y
-
-x ? 0  =  dec x
-x ? y  =  y ? dec y
-
-x ? 0  =  dec x
-x ? y  =  0 ? dec y
-
-x ? 0  =  dec x
-x ? y  =  dec x ? x
-
-x ? 0  =  dec x
-x ? y  =  dec x ? y
-
-x ? 0  =  dec x
-x ? y  =  dec x ? 0
-
-x ? 0  =  dec 0
-x ? y  =  x ? dec y
-
-x ? 0  =  dec 0
-x ? y  =  y ? dec y
-
-x ? 0  =  dec 0
-x ? y  =  0 ? dec y
-
-x ? 0  =  dec 0
-x ? y  =  dec x ? x
-
-x ? 0  =  dec 0
-x ? y  =  dec x ? y
-
-x ? 0  =  dec 0
-x ? y  =  dec x ? 0
-
-0 ? x  =  x
-x ? y  =  dec (x ? dec y)
-
-0 ? x  =  x
-x ? y  =  dec (y ? dec y)
-
-0 ? x  =  x
-x ? y  =  dec (0 ? dec y)
-
-0 ? x  =  x
-x ? y  =  dec (dec x ? x)
-
-0 ? x  =  x
-x ? y  =  dec (dec x ? y)
-
-0 ? x  =  x
-x ? y  =  dec (dec x ? 0)
-
-0 ? x  =  0
-x ? y  =  dec (x ? dec y)
-
-0 ? x  =  0
-x ? y  =  dec (y ? dec y)
-
-0 ? x  =  0
-x ? y  =  dec (0 ? dec y)
-
-0 ? x  =  0
-x ? y  =  dec (dec x ? x)
-
-0 ? x  =  0
-x ? y  =  dec (dec x ? y)
-
-0 ? x  =  0
-x ? y  =  dec (dec x ? 0)
-
-0 ? x  =  dec x
-x ? y  =  x ? dec y
-
-0 ? x  =  dec x
-x ? y  =  y ? dec y
-
-0 ? x  =  dec x
-x ? y  =  0 ? dec y
-
-0 ? x  =  dec x
-x ? y  =  dec x ? x
-
-0 ? x  =  dec x
-x ? y  =  dec x ? y
-
-0 ? x  =  dec x
-x ? y  =  dec x ? 0
-
-0 ? x  =  dec 0
-x ? y  =  x ? dec y
-
-0 ? x  =  dec 0
-x ? y  =  y ? dec y
-
-0 ? x  =  dec 0
-x ? y  =  0 ? dec y
-
-0 ? x  =  dec 0
-x ? y  =  dec x ? x
-
-0 ? x  =  dec 0
-x ? y  =  dec x ? y
-
-0 ? x  =  dec 0
-x ? y  =  dec x ? 0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  x ? dec y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  y ? dec y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  0 ? dec y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec x ? x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec x ? y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec x ? 0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x ? x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x ? 0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x ? x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x ? 0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x ? x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x ? 0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  x ? dec y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  y ? dec y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  0 ? dec y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec x ? x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec x ? y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec x ? 0
-
-0 ? 0  =  0
-0 ? x  =  x ? dec x
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  0 ? dec x
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x ? dec x
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  0 ? dec x
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x ? dec x
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0 ? dec x
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x ? dec x
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  0 ? dec x
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x ? dec x
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  0 ? dec x
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x ? dec x
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0 ? dec x
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  x ? dec y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  y ? dec y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  0 ? dec y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec x ? x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec x ? y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec x ? 0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x ? x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x ? 0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x ? x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x ? 0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x ? x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x ? 0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  x ? dec y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  y ? dec y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  0 ? dec y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec x ? x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec x ? y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec x ? 0
-
-x ? y  =  dec (dec (dec x)) + x
-
-x ? y  =  dec (dec (dec x)) + y
-
-x ? y  =  dec (dec (dec y)) + x
-
-x ? y  =  dec (dec (dec y)) + y
-
-x ? y  =  dec (dec (dec 0)) + x
-
-x ? y  =  dec (dec (dec 0)) + y
-
-x ? y  =  dec (dec (dec (dec (dec x))))
-
-x ? y  =  dec (dec (dec (dec (dec y))))
-
-x ? y  =  dec (dec (dec (dec (dec 0))))
-
-x ? y  =  x + (dec x + x)
-
-x ? y  =  x + (dec x + y)
-
-x ? y  =  x + (dec y + x)
-
-x ? y  =  x + (dec y + y)
-
-x ? y  =  x + (dec 0 + x)
-
-x ? y  =  x + (dec 0 + y)
-
-x ? y  =  x + dec (dec (dec x))
-
-x ? y  =  x + dec (dec (dec y))
-
-x ? y  =  x + dec (dec (dec 0))
-
-x ? y  =  x + (x + dec x)
-
-x ? y  =  x + (x + dec y)
-
-x ? y  =  x + (x + dec 0)
-
-x ? y  =  x + (y + dec x)
-
-x ? y  =  x + (y + dec y)
-
-x ? y  =  x + (y + dec 0)
-
-x ? y  =  y + (dec x + x)
-
-x ? y  =  y + (dec x + y)
-
-x ? y  =  y + (dec y + x)
-
-x ? y  =  y + (dec y + y)
-
-x ? y  =  y + (dec 0 + x)
-
-x ? y  =  y + (dec 0 + y)
-
-x ? y  =  y + dec (dec (dec x))
-
-x ? y  =  y + dec (dec (dec y))
-
-x ? y  =  y + dec (dec (dec 0))
-
-x ? y  =  y + (x + dec x)
-
-x ? y  =  y + (x + dec y)
-
-x ? y  =  y + (x + dec 0)
-
-x ? y  =  y + (y + dec x)
-
-x ? y  =  y + (y + dec y)
-
-x ? y  =  y + (y + dec 0)
-
-x ? y  =  dec x + (x + x)
-
-x ? y  =  dec x + (x + y)
-
-x ? y  =  dec x + (y + x)
-
-x ? y  =  dec x + (y + y)
-
-x ? y  =  dec x + dec (dec x)
-
-x ? y  =  dec x + dec (dec y)
-
-x ? y  =  dec x + dec (dec 0)
-
-x ? y  =  dec y + (x + x)
-
-x ? y  =  dec y + (x + y)
-
-x ? y  =  dec y + (y + x)
-
-x ? y  =  dec y + (y + y)
-
-x ? y  =  dec y + dec (dec x)
-
-x ? y  =  dec y + dec (dec y)
-
-x ? y  =  dec y + dec (dec 0)
-
-x ? y  =  dec 0 + (x + x)
-
-x ? y  =  dec 0 + (x + y)
-
-x ? y  =  dec 0 + (y + x)
-
-x ? y  =  dec 0 + (y + y)
-
-x ? y  =  dec 0 + dec (dec x)
-
-x ? y  =  dec 0 + dec (dec y)
-
-x ? y  =  dec 0 + dec (dec 0)
-
-x ? y  =  dec (dec x) + dec x
-
-x ? y  =  dec (dec x) + dec y
-
-x ? y  =  dec (dec x) + dec 0
-
-x ? y  =  dec (dec y) + dec x
-
-x ? y  =  dec (dec y) + dec y
-
-x ? y  =  dec (dec y) + dec 0
-
-x ? y  =  dec (dec 0) + dec x
-
-x ? y  =  dec (dec 0) + dec y
-
-x ? y  =  dec (dec 0) + dec 0
-
-x ? 0  =  x
-x ? y  =  dec (dec x) + x
-
-x ? 0  =  x
-x ? y  =  dec (dec x) + y
-
-x ? 0  =  x
-x ? y  =  dec (dec y) + x
-
-x ? 0  =  x
-x ? y  =  dec (dec y) + y
-
-x ? 0  =  x
-x ? y  =  dec (dec 0) + x
-
-x ? 0  =  x
-x ? y  =  dec (dec 0) + y
-
-x ? 0  =  x
-x ? y  =  dec (dec (dec (dec x)))
-
-x ? 0  =  x
-x ? y  =  dec (dec (dec (dec y)))
-
-x ? 0  =  x
-x ? y  =  dec (dec (dec (dec 0)))
-
-x ? 0  =  x
-x ? y  =  x + (x + x)
-
-x ? 0  =  x
-x ? y  =  x + (x + y)
-
-x ? 0  =  x
-x ? y  =  x + (y + x)
-
-x ? 0  =  x
-x ? y  =  x + (y + y)
-
-x ? 0  =  x
-x ? y  =  x + dec (dec x)
-
-x ? 0  =  x
-x ? y  =  x + dec (dec y)
-
-x ? 0  =  x
-x ? y  =  x + dec (dec 0)
-
-x ? 0  =  x
-x ? y  =  y + (x + x)
-
-x ? 0  =  x
-x ? y  =  y + (x + y)
-
-x ? 0  =  x
-x ? y  =  y + (y + x)
-
-x ? 0  =  x
-x ? y  =  y + (y + y)
-
-x ? 0  =  x
-x ? y  =  y + dec (dec x)
-
-x ? 0  =  x
-x ? y  =  y + dec (dec y)
-
-x ? 0  =  x
-x ? y  =  y + dec (dec 0)
-
-x ? 0  =  x
-x ? y  =  dec x + dec x
-
-x ? 0  =  x
-x ? y  =  dec x + dec y
-
-x ? 0  =  x
-x ? y  =  dec x + dec 0
-
-x ? 0  =  x
-x ? y  =  dec y + dec x
-
-x ? 0  =  x
-x ? y  =  dec y + dec y
-
-x ? 0  =  x
-x ? y  =  dec y + dec 0
-
-x ? 0  =  x
-x ? y  =  dec 0 + dec x
-
-x ? 0  =  x
-x ? y  =  dec 0 + dec y
-
-x ? 0  =  x
-x ? y  =  dec 0 + dec 0
-
-x ? 0  =  0
-x ? y  =  dec (dec x) + x
-
-x ? 0  =  0
-x ? y  =  dec (dec x) + y
-
-x ? 0  =  0
-x ? y  =  dec (dec y) + x
-
-x ? 0  =  0
-x ? y  =  dec (dec y) + y
-
-x ? 0  =  0
-x ? y  =  dec (dec 0) + x
-
-x ? 0  =  0
-x ? y  =  dec (dec 0) + y
-
-x ? 0  =  0
-x ? y  =  dec (dec (dec (dec x)))
-
-x ? 0  =  0
-x ? y  =  dec (dec (dec (dec y)))
-
-x ? 0  =  0
-x ? y  =  dec (dec (dec (dec 0)))
-
-x ? 0  =  0
-x ? y  =  x + (x + x)
-
-x ? 0  =  0
-x ? y  =  x + (x + y)
-
-x ? 0  =  0
-x ? y  =  x + (y + x)
-
-x ? 0  =  0
-x ? y  =  x + (y + y)
-
-x ? 0  =  0
-x ? y  =  x + dec (dec x)
-
-x ? 0  =  0
-x ? y  =  x + dec (dec y)
-
-x ? 0  =  0
-x ? y  =  x + dec (dec 0)
-
-x ? 0  =  0
-x ? y  =  y + (x + x)
-
-x ? 0  =  0
-x ? y  =  y + (x + y)
-
-x ? 0  =  0
-x ? y  =  y + (y + x)
-
-x ? 0  =  0
-x ? y  =  y + (y + y)
-
-x ? 0  =  0
-x ? y  =  y + dec (dec x)
-
-x ? 0  =  0
-x ? y  =  y + dec (dec y)
-
-x ? 0  =  0
-x ? y  =  y + dec (dec 0)
-
-x ? 0  =  0
-x ? y  =  dec x + dec x
-
-x ? 0  =  0
-x ? y  =  dec x + dec y
-
-x ? 0  =  0
-x ? y  =  dec x + dec 0
-
-x ? 0  =  0
-x ? y  =  dec y + dec x
-
-x ? 0  =  0
-x ? y  =  dec y + dec y
-
-x ? 0  =  0
-x ? y  =  dec y + dec 0
-
-x ? 0  =  0
-x ? y  =  dec 0 + dec x
-
-x ? 0  =  0
-x ? y  =  dec 0 + dec y
-
-x ? 0  =  0
-x ? y  =  dec 0 + dec 0
-
-x ? 0  =  dec x
-x ? y  =  dec x + x
-
-x ? 0  =  dec x
-x ? y  =  dec x + y
-
-x ? 0  =  dec x
-x ? y  =  dec y + x
-
-x ? 0  =  dec x
-x ? y  =  dec y + y
-
-x ? 0  =  dec x
-x ? y  =  dec 0 + x
-
-x ? 0  =  dec x
-x ? y  =  dec 0 + y
-
-x ? 0  =  dec x
-x ? y  =  dec (dec (dec x))
-
-x ? 0  =  dec x
-x ? y  =  dec (dec (dec y))
-
-x ? 0  =  dec x
-x ? y  =  dec (dec (dec 0))
-
-x ? 0  =  dec x
-x ? y  =  x + dec x
-
-x ? 0  =  dec x
-x ? y  =  x + dec y
-
-x ? 0  =  dec x
-x ? y  =  x + dec 0
-
-x ? 0  =  dec x
-x ? y  =  y + dec x
-
-x ? 0  =  dec x
-x ? y  =  y + dec y
-
-x ? 0  =  dec x
-x ? y  =  y + dec 0
-
-x ? 0  =  dec 0
-x ? y  =  dec x + x
-
-x ? 0  =  dec 0
-x ? y  =  dec x + y
-
-x ? 0  =  dec 0
-x ? y  =  dec y + x
-
-x ? 0  =  dec 0
-x ? y  =  dec y + y
-
-x ? 0  =  dec 0
-x ? y  =  dec 0 + x
-
-x ? 0  =  dec 0
-x ? y  =  dec 0 + y
-
-x ? 0  =  dec 0
-x ? y  =  dec (dec (dec x))
-
-x ? 0  =  dec 0
-x ? y  =  dec (dec (dec y))
-
-x ? 0  =  dec 0
-x ? y  =  dec (dec (dec 0))
-
-x ? 0  =  dec 0
-x ? y  =  x + dec x
-
-x ? 0  =  dec 0
-x ? y  =  x + dec y
-
-x ? 0  =  dec 0
-x ? y  =  x + dec 0
-
-x ? 0  =  dec 0
-x ? y  =  y + dec x
-
-x ? 0  =  dec 0
-x ? y  =  y + dec y
-
-x ? 0  =  dec 0
-x ? y  =  y + dec 0
-
-x ? 0  =  x + x
-x ? y  =  x + y
-
-x ? 0  =  x + x
-x ? y  =  y + x
-
-x ? 0  =  x + x
-x ? y  =  y + y
-
-x ? 0  =  x + x
-x ? y  =  dec (dec x)
-
-x ? 0  =  x + x
-x ? y  =  dec (dec y)
-
-x ? 0  =  x + x
-x ? y  =  dec (dec 0)
-
-x ? 0  =  dec (dec x)
-x ? y  =  x + x
-
-x ? 0  =  dec (dec x)
-x ? y  =  x + y
-
-x ? 0  =  dec (dec x)
-x ? y  =  y + x
-
-x ? 0  =  dec (dec x)
-x ? y  =  y + y
-
-x ? 0  =  dec (dec x)
-x ? y  =  dec (dec y)
-
-x ? 0  =  dec (dec x)
-x ? y  =  dec (dec 0)
-
-x ? 0  =  dec (dec 0)
-x ? y  =  x + x
-
-x ? 0  =  dec (dec 0)
-x ? y  =  x + y
-
-x ? 0  =  dec (dec 0)
-x ? y  =  y + x
-
-x ? 0  =  dec (dec 0)
-x ? y  =  y + y
-
-x ? 0  =  dec (dec 0)
-x ? y  =  dec (dec x)
-
-x ? 0  =  dec (dec 0)
-x ? y  =  dec (dec y)
-
-x ? 0  =  dec x + x
-x ? y  =  dec x
-
-x ? 0  =  dec x + x
-x ? y  =  dec y
-
-x ? 0  =  dec x + x
-x ? y  =  dec 0
-
-x ? 0  =  dec 0 + x
-x ? y  =  dec x
-
-x ? 0  =  dec 0 + x
-x ? y  =  dec y
-
-x ? 0  =  dec 0 + x
-x ? y  =  dec 0
-
-x ? 0  =  dec (dec (dec x))
-x ? y  =  dec x
-
-x ? 0  =  dec (dec (dec x))
-x ? y  =  dec y
-
-x ? 0  =  dec (dec (dec x))
-x ? y  =  dec 0
-
-x ? 0  =  dec (dec (dec 0))
-x ? y  =  dec x
-
-x ? 0  =  dec (dec (dec 0))
-x ? y  =  dec y
-
-x ? 0  =  dec (dec (dec 0))
-x ? y  =  dec 0
-
-x ? 0  =  x + dec x
-x ? y  =  dec x
-
-x ? 0  =  x + dec x
-x ? y  =  dec y
-
-x ? 0  =  x + dec x
-x ? y  =  dec 0
-
-x ? 0  =  x + dec 0
-x ? y  =  dec x
-
-x ? 0  =  x + dec 0
-x ? y  =  dec y
-
-x ? 0  =  x + dec 0
-x ? y  =  dec 0
-
-x ? 0  =  dec (dec x) + x
-x ? y  =  x
-
-x ? 0  =  dec (dec x) + x
-x ? y  =  y
-
-x ? 0  =  dec (dec x) + x
-x ? y  =  0
-
-x ? 0  =  dec (dec 0) + x
-x ? y  =  x
-
-x ? 0  =  dec (dec 0) + x
-x ? y  =  y
-
-x ? 0  =  dec (dec 0) + x
-x ? y  =  0
-
-x ? 0  =  dec (dec (dec (dec x)))
-x ? y  =  x
-
-x ? 0  =  dec (dec (dec (dec x)))
-x ? y  =  y
-
-x ? 0  =  dec (dec (dec (dec x)))
-x ? y  =  0
-
-x ? 0  =  dec (dec (dec (dec 0)))
-x ? y  =  x
-
-x ? 0  =  dec (dec (dec (dec 0)))
-x ? y  =  y
-
-x ? 0  =  dec (dec (dec (dec 0)))
-x ? y  =  0
-
-x ? 0  =  x + (x + x)
-x ? y  =  x
-
-x ? 0  =  x + (x + x)
-x ? y  =  y
-
-x ? 0  =  x + (x + x)
-x ? y  =  0
-
-x ? 0  =  x + dec (dec x)
-x ? y  =  x
-
-x ? 0  =  x + dec (dec x)
-x ? y  =  y
-
-x ? 0  =  x + dec (dec x)
-x ? y  =  0
-
-x ? 0  =  x + dec (dec 0)
-x ? y  =  x
-
-x ? 0  =  x + dec (dec 0)
-x ? y  =  y
-
-x ? 0  =  x + dec (dec 0)
-x ? y  =  0
-
-x ? 0  =  dec x + dec x
-x ? y  =  x
-
-x ? 0  =  dec x + dec x
-x ? y  =  y
-
-x ? 0  =  dec x + dec x
-x ? y  =  0
-
-x ? 0  =  dec x + dec 0
-x ? y  =  x
-
-x ? 0  =  dec x + dec 0
-x ? y  =  y
-
-x ? 0  =  dec x + dec 0
-x ? y  =  0
-
-x ? 0  =  dec 0 + dec x
-x ? y  =  x
-
-x ? 0  =  dec 0 + dec x
-x ? y  =  y
-
-x ? 0  =  dec 0 + dec x
-x ? y  =  0
-
-x ? 0  =  dec 0 + dec 0
-x ? y  =  x
-
-x ? 0  =  dec 0 + dec 0
-x ? y  =  y
-
-x ? 0  =  dec 0 + dec 0
-x ? y  =  0
-
-0 ? x  =  x
-x ? y  =  dec (dec x) + x
-
-0 ? x  =  x
-x ? y  =  dec (dec x) + y
-
-0 ? x  =  x
-x ? y  =  dec (dec y) + x
-
-0 ? x  =  x
-x ? y  =  dec (dec y) + y
-
-0 ? x  =  x
-x ? y  =  dec (dec 0) + x
-
-0 ? x  =  x
-x ? y  =  dec (dec 0) + y
-
-0 ? x  =  x
-x ? y  =  dec (dec (dec (dec x)))
-
-0 ? x  =  x
-x ? y  =  dec (dec (dec (dec y)))
-
-0 ? x  =  x
-x ? y  =  dec (dec (dec (dec 0)))
-
-0 ? x  =  x
-x ? y  =  x + (x + x)
-
-0 ? x  =  x
-x ? y  =  x + (x + y)
-
-0 ? x  =  x
-x ? y  =  x + (y + x)
-
-0 ? x  =  x
-x ? y  =  x + (y + y)
-
-0 ? x  =  x
-x ? y  =  x + dec (dec x)
-
-0 ? x  =  x
-x ? y  =  x + dec (dec y)
-
-0 ? x  =  x
-x ? y  =  x + dec (dec 0)
-
-0 ? x  =  x
-x ? y  =  y + (x + x)
-
-0 ? x  =  x
-x ? y  =  y + (x + y)
-
-0 ? x  =  x
-x ? y  =  y + (y + x)
-
-0 ? x  =  x
-x ? y  =  y + (y + y)
-
-0 ? x  =  x
-x ? y  =  y + dec (dec x)
-
-0 ? x  =  x
-x ? y  =  y + dec (dec y)
-
-0 ? x  =  x
-x ? y  =  y + dec (dec 0)
-
-0 ? x  =  x
-x ? y  =  dec x + dec x
-
-0 ? x  =  x
-x ? y  =  dec x + dec y
-
-0 ? x  =  x
-x ? y  =  dec x + dec 0
-
-0 ? x  =  x
-x ? y  =  dec y + dec x
-
-0 ? x  =  x
-x ? y  =  dec y + dec y
-
-0 ? x  =  x
-x ? y  =  dec y + dec 0
-
-0 ? x  =  x
-x ? y  =  dec 0 + dec x
-
-0 ? x  =  x
-x ? y  =  dec 0 + dec y
-
-0 ? x  =  x
-x ? y  =  dec 0 + dec 0
-
-0 ? x  =  0
-x ? y  =  dec (dec x) + x
-
-0 ? x  =  0
-x ? y  =  dec (dec x) + y
-
-0 ? x  =  0
-x ? y  =  dec (dec y) + x
-
-0 ? x  =  0
-x ? y  =  dec (dec y) + y
-
-0 ? x  =  0
-x ? y  =  dec (dec 0) + x
-
-0 ? x  =  0
-x ? y  =  dec (dec 0) + y
-
-0 ? x  =  0
-x ? y  =  dec (dec (dec (dec x)))
-
-0 ? x  =  0
-x ? y  =  dec (dec (dec (dec y)))
-
-0 ? x  =  0
-x ? y  =  dec (dec (dec (dec 0)))
-
-0 ? x  =  0
-x ? y  =  x + (x + x)
-
-0 ? x  =  0
-x ? y  =  x + (x + y)
-
-0 ? x  =  0
-x ? y  =  x + (y + x)
-
-0 ? x  =  0
-x ? y  =  x + (y + y)
-
-0 ? x  =  0
-x ? y  =  x + dec (dec x)
-
-0 ? x  =  0
-x ? y  =  x + dec (dec y)
-
-0 ? x  =  0
-x ? y  =  x + dec (dec 0)
-
-0 ? x  =  0
-x ? y  =  y + (x + x)
-
-0 ? x  =  0
-x ? y  =  y + (x + y)
-
-0 ? x  =  0
-x ? y  =  y + (y + x)
-
-0 ? x  =  0
-x ? y  =  y + (y + y)
-
-0 ? x  =  0
-x ? y  =  y + dec (dec x)
-
-0 ? x  =  0
-x ? y  =  y + dec (dec y)
-
-0 ? x  =  0
-x ? y  =  y + dec (dec 0)
-
-0 ? x  =  0
-x ? y  =  dec x + dec x
-
-0 ? x  =  0
-x ? y  =  dec x + dec y
-
-0 ? x  =  0
-x ? y  =  dec x + dec 0
-
-0 ? x  =  0
-x ? y  =  dec y + dec x
-
-0 ? x  =  0
-x ? y  =  dec y + dec y
-
-0 ? x  =  0
-x ? y  =  dec y + dec 0
-
-0 ? x  =  0
-x ? y  =  dec 0 + dec x
-
-0 ? x  =  0
-x ? y  =  dec 0 + dec y
-
-0 ? x  =  0
-x ? y  =  dec 0 + dec 0
-
-0 ? x  =  dec x
-x ? y  =  dec x + x
-
-0 ? x  =  dec x
-x ? y  =  dec x + y
-
-0 ? x  =  dec x
-x ? y  =  dec y + x
-
-0 ? x  =  dec x
-x ? y  =  dec y + y
-
-0 ? x  =  dec x
-x ? y  =  dec 0 + x
-
-0 ? x  =  dec x
-x ? y  =  dec 0 + y
-
-0 ? x  =  dec x
-x ? y  =  dec (dec (dec x))
-
-0 ? x  =  dec x
-x ? y  =  dec (dec (dec y))
-
-0 ? x  =  dec x
-x ? y  =  dec (dec (dec 0))
-
-0 ? x  =  dec x
-x ? y  =  x + dec x
-
-0 ? x  =  dec x
-x ? y  =  x + dec y
-
-0 ? x  =  dec x
-x ? y  =  x + dec 0
-
-0 ? x  =  dec x
-x ? y  =  y + dec x
-
-0 ? x  =  dec x
-x ? y  =  y + dec y
-
-0 ? x  =  dec x
-x ? y  =  y + dec 0
-
-0 ? x  =  dec 0
-x ? y  =  dec x + x
-
-0 ? x  =  dec 0
-x ? y  =  dec x + y
-
-0 ? x  =  dec 0
-x ? y  =  dec y + x
-
-0 ? x  =  dec 0
-x ? y  =  dec y + y
-
-0 ? x  =  dec 0
-x ? y  =  dec 0 + x
-
-0 ? x  =  dec 0
-x ? y  =  dec 0 + y
-
-0 ? x  =  dec 0
-x ? y  =  dec (dec (dec x))
-
-0 ? x  =  dec 0
-x ? y  =  dec (dec (dec y))
-
-0 ? x  =  dec 0
-x ? y  =  dec (dec (dec 0))
-
-0 ? x  =  dec 0
-x ? y  =  x + dec x
-
-0 ? x  =  dec 0
-x ? y  =  x + dec y
-
-0 ? x  =  dec 0
-x ? y  =  x + dec 0
-
-0 ? x  =  dec 0
-x ? y  =  y + dec x
-
-0 ? x  =  dec 0
-x ? y  =  y + dec y
-
-0 ? x  =  dec 0
-x ? y  =  y + dec 0
-
-0 ? x  =  x + x
-x ? y  =  x + y
-
-0 ? x  =  x + x
-x ? y  =  y + x
-
-0 ? x  =  x + x
-x ? y  =  dec (dec x)
-
-0 ? x  =  x + x
-x ? y  =  dec (dec y)
-
-0 ? x  =  x + x
-x ? y  =  dec (dec 0)
-
-0 ? x  =  dec (dec x)
-x ? y  =  x + x
-
-0 ? x  =  dec (dec x)
-x ? y  =  x + y
-
-0 ? x  =  dec (dec x)
-x ? y  =  y + x
-
-0 ? x  =  dec (dec x)
-x ? y  =  y + y
-
-0 ? x  =  dec (dec x)
-x ? y  =  dec (dec 0)
-
-0 ? x  =  dec (dec 0)
-x ? y  =  x + x
-
-0 ? x  =  dec (dec 0)
-x ? y  =  x + y
-
-0 ? x  =  dec (dec 0)
-x ? y  =  y + x
-
-0 ? x  =  dec (dec 0)
-x ? y  =  y + y
-
-0 ? x  =  dec (dec 0)
-x ? y  =  dec (dec x)
-
-0 ? x  =  dec (dec 0)
-x ? y  =  dec (dec y)
-
-0 ? x  =  dec x + x
-x ? y  =  dec x
-
-0 ? x  =  dec x + x
-x ? y  =  dec y
-
-0 ? x  =  dec x + x
-x ? y  =  dec 0
-
-0 ? x  =  dec 0 + x
-x ? y  =  dec x
-
-0 ? x  =  dec 0 + x
-x ? y  =  dec y
-
-0 ? x  =  dec 0 + x
-x ? y  =  dec 0
-
-0 ? x  =  dec (dec (dec x))
-x ? y  =  dec x
-
-0 ? x  =  dec (dec (dec x))
-x ? y  =  dec y
-
-0 ? x  =  dec (dec (dec x))
-x ? y  =  dec 0
-
-0 ? x  =  dec (dec (dec 0))
-x ? y  =  dec x
-
-0 ? x  =  dec (dec (dec 0))
-x ? y  =  dec y
-
-0 ? x  =  dec (dec (dec 0))
-x ? y  =  dec 0
-
-0 ? x  =  x + dec x
-x ? y  =  dec x
-
-0 ? x  =  x + dec x
-x ? y  =  dec y
-
-0 ? x  =  x + dec x
-x ? y  =  dec 0
-
-0 ? x  =  x + dec 0
-x ? y  =  dec x
-
-0 ? x  =  x + dec 0
-x ? y  =  dec y
-
-0 ? x  =  x + dec 0
-x ? y  =  dec 0
-
-0 ? x  =  dec (dec x) + x
-x ? y  =  x
-
-0 ? x  =  dec (dec x) + x
-x ? y  =  y
-
-0 ? x  =  dec (dec x) + x
-x ? y  =  0
-
-0 ? x  =  dec (dec 0) + x
-x ? y  =  x
-
-0 ? x  =  dec (dec 0) + x
-x ? y  =  y
-
-0 ? x  =  dec (dec 0) + x
-x ? y  =  0
-
-0 ? x  =  dec (dec (dec (dec x)))
-x ? y  =  x
-
-0 ? x  =  dec (dec (dec (dec x)))
-x ? y  =  y
-
-0 ? x  =  dec (dec (dec (dec x)))
-x ? y  =  0
-
-0 ? x  =  dec (dec (dec (dec 0)))
-x ? y  =  x
-
-0 ? x  =  dec (dec (dec (dec 0)))
-x ? y  =  y
-
-0 ? x  =  dec (dec (dec (dec 0)))
-x ? y  =  0
-
-0 ? x  =  x + (x + x)
-x ? y  =  x
-
-0 ? x  =  x + (x + x)
-x ? y  =  y
-
-0 ? x  =  x + (x + x)
-x ? y  =  0
-
-0 ? x  =  x + dec (dec x)
-x ? y  =  x
-
-0 ? x  =  x + dec (dec x)
-x ? y  =  y
-
-0 ? x  =  x + dec (dec x)
-x ? y  =  0
-
-0 ? x  =  x + dec (dec 0)
-x ? y  =  x
-
-0 ? x  =  x + dec (dec 0)
-x ? y  =  y
-
-0 ? x  =  x + dec (dec 0)
-x ? y  =  0
-
-0 ? x  =  dec x + dec x
-x ? y  =  x
-
-0 ? x  =  dec x + dec x
-x ? y  =  y
-
-0 ? x  =  dec x + dec x
-x ? y  =  0
-
-0 ? x  =  dec x + dec 0
-x ? y  =  x
-
-0 ? x  =  dec x + dec 0
-x ? y  =  y
-
-0 ? x  =  dec x + dec 0
-x ? y  =  0
-
-0 ? x  =  dec 0 + dec x
-x ? y  =  x
-
-0 ? x  =  dec 0 + dec x
-x ? y  =  y
-
-0 ? x  =  dec 0 + dec x
-x ? y  =  0
-
-0 ? x  =  dec 0 + dec 0
-x ? y  =  x
-
-0 ? x  =  dec 0 + dec 0
-x ? y  =  y
-
-0 ? x  =  dec 0 + dec 0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec x + x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec x + y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec y + x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec y + y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec 0 + x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec 0 + y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec (dec (dec x))
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec (dec (dec y))
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec (dec (dec 0))
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  x + dec x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  x + dec y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  x + dec 0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  y + dec x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  y + dec y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  y + dec 0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec x + x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec x + y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec y + x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec y + y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec 0 + x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec 0 + y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec (dec (dec x))
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec (dec (dec y))
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec (dec (dec 0))
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  x + dec x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  x + dec y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  x + dec 0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  y + dec x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  y + dec y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  y + dec 0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  x + x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  x + y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  y + x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  y + y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  dec (dec x)
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  dec (dec y)
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  dec (dec 0)
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  x + x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  x + y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  y + x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  y + y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  dec (dec x)
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  dec (dec y)
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  dec (dec 0)
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x + x
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x + x
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x + x
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec x)
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec x)
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec x)
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec 0)
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec 0)
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec 0)
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x + x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x + x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec x + x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec 0 + x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec 0 + x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec 0 + x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec (dec x))
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec (dec x))
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec (dec x))
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec (dec 0))
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec (dec 0))
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  dec (dec (dec 0))
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x + dec x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x + dec x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x + dec x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x + dec 0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x + dec 0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x
-x ? 0  =  x + dec 0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec x + x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec x + y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec y + x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec y + y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec 0 + x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec 0 + y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec (dec (dec x))
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec (dec (dec y))
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec (dec (dec 0))
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  x + dec x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  x + dec y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  x + dec 0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  y + dec x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  y + dec y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  y + dec 0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec x + x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec x + y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec y + x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec y + y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec 0 + x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec 0 + y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec (dec (dec x))
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec (dec (dec y))
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec (dec (dec 0))
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  x + dec x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  x + dec y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  x + dec 0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  y + dec x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  y + dec y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  y + dec 0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  x + x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  x + y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  y + x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  y + y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  dec (dec x)
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  dec (dec y)
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  dec (dec 0)
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  x + x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  x + y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  y + x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  y + y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  dec (dec x)
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  dec (dec y)
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  dec (dec 0)
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x + x
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x + x
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x + x
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec x)
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec x)
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec x)
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec 0)
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec 0)
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec 0)
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x + x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x + x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec x + x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec 0 + x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec 0 + x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec 0 + x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec (dec x))
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec (dec x))
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec (dec x))
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec (dec 0))
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec (dec 0))
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  dec (dec (dec 0))
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x + dec x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x + dec x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x + dec x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x + dec 0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x + dec 0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  0
-x ? 0  =  x + dec 0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  x + x
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  x + y
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  y + x
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  y + y
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  dec (dec x)
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  dec (dec y)
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  dec (dec 0)
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  x + x
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  x + y
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  y + x
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  y + y
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  dec (dec x)
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  dec (dec y)
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  dec (dec 0)
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec x
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec x
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec x
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec 0
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec 0
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec 0
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  x + x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  x + x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  x + x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec (dec x)
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec (dec x)
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec (dec x)
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec (dec 0)
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec (dec 0)
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec x
-x ? 0  =  dec (dec 0)
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  x + x
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  x + y
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  y + x
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  y + y
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  dec (dec x)
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  dec (dec y)
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  dec (dec 0)
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  x + x
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  x + y
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  y + x
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  y + y
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  dec (dec x)
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  dec (dec y)
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  dec (dec 0)
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec x
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec x
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec x
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec 0
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec 0
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec 0
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  x + x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  x + x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  x + x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec (dec x)
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec (dec x)
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec (dec x)
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec (dec 0)
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec (dec 0)
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec 0
-x ? 0  =  dec (dec 0)
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  x
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  x
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  x
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  0
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  0
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  0
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  dec x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  dec x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  dec x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  dec 0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  dec 0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x + x
-x ? 0  =  dec 0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  x
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  x
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  x
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  0
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  0
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  0
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  dec x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  dec x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  dec x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  dec 0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  dec 0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec (dec x)
-x ? 0  =  dec 0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  x
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  x
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  x
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  0
-x ? y  =  dec x
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  0
-x ? y  =  dec y
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  0
-x ? y  =  dec 0
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  dec x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  dec x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  dec x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  dec 0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  dec 0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec (dec 0)
-x ? 0  =  dec 0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec x + x
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec x + x
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec x + x
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec x + x
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec x + x
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec x + x
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec 0 + x
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec 0 + x
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec 0 + x
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec 0 + x
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec 0 + x
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec 0 + x
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec (dec (dec x))
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec (dec (dec x))
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec (dec (dec x))
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec (dec (dec x))
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec (dec (dec x))
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec (dec (dec x))
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec (dec (dec 0))
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec (dec (dec 0))
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec (dec (dec 0))
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  dec (dec (dec 0))
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  dec (dec (dec 0))
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  dec (dec (dec 0))
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x + dec x
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x + dec x
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x + dec x
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x + dec x
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x + dec x
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x + dec x
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x + dec 0
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x + dec 0
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x + dec 0
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  0
-0 ? x  =  x + dec 0
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  0
-0 ? x  =  x + dec 0
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  0
-0 ? x  =  x + dec 0
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  x + x
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  x + y
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  y + x
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  y + y
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec (dec x)
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec (dec y)
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec (dec 0)
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  x + x
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  x + y
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  y + x
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  y + y
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec (dec x)
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec (dec y)
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec (dec 0)
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  dec x
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  dec y
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  dec 0
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  dec x
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  dec y
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  dec 0
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  x + x
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  x + x
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  x + x
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  dec (dec x)
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  dec (dec x)
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  dec (dec x)
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  dec (dec 0)
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  dec (dec 0)
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  x
-x ? 0  =  dec (dec 0)
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  x + x
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  x + y
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  y + x
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  y + y
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec (dec x)
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec (dec y)
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec (dec 0)
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  x + x
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  x + y
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  y + x
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  y + y
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec (dec x)
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec (dec y)
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec (dec 0)
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  dec x
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  dec y
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  dec 0
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  dec x
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  dec y
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  dec 0
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  x + x
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  x + x
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  x + x
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  dec (dec x)
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  dec (dec x)
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  dec (dec x)
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  dec (dec 0)
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  dec (dec 0)
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  0
-x ? 0  =  dec (dec 0)
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  dec x
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  dec y
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  dec 0
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  dec x
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  dec y
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  dec 0
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  dec x
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  dec x
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  dec x
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  dec 0
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  dec 0
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  dec x
-x ? 0  =  dec 0
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  dec x
-
-0 ? 0  =  dec 0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  dec y
-
-0 ? 0  =  dec 0
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  dec 0
-
-0 ? 0  =  dec 0
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  dec x
-
-0 ? 0  =  dec 0
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  dec y
-
-0 ? 0  =  dec 0
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  dec 0
-
-0 ? 0  =  dec 0
-0 ? x  =  dec 0
-x ? 0  =  dec x
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  dec 0
-x ? 0  =  dec x
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  dec 0
-x ? 0  =  dec x
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  dec 0
-x ? 0  =  dec 0
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  dec 0
-x ? 0  =  dec 0
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  dec 0
-x ? 0  =  dec 0
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  x + x
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  x + x
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  x + x
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  x + x
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  x + x
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  x + x
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  dec (dec x)
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  dec (dec x)
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  dec (dec x)
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  dec (dec x)
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  dec (dec x)
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  dec (dec x)
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  dec (dec 0)
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  dec (dec 0)
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  dec (dec 0)
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  dec 0
-0 ? x  =  dec (dec 0)
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  dec 0
-0 ? x  =  dec (dec 0)
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  dec 0
-0 ? x  =  dec (dec 0)
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec x
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec y
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  dec 0
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec x
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec y
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  dec 0
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  x
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  y
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  dec x
-x ? y  =  0
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  x
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  y
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  x
-x ? 0  =  dec 0
-x ? y  =  0
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec x
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec y
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  dec 0
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec x
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec y
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  dec 0
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  x
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  y
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  dec x
-x ? y  =  0
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  x
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  y
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  0
-x ? 0  =  dec 0
-x ? y  =  0
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  dec x
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  dec x
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  dec 0
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  dec (dec 0)
-0 ? x  =  dec 0
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  dec (dec (dec 0))
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  dec (dec (dec 0))
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  dec (dec (dec 0))
-0 ? x  =  x
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  dec (dec (dec 0))
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  dec (dec (dec 0))
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  dec (dec (dec 0))
-0 ? x  =  x
-x ? 0  =  0
-x ? y  =  0
-
-0 ? 0  =  dec (dec (dec 0))
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  x
-
-0 ? 0  =  dec (dec (dec 0))
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  y
-
-0 ? 0  =  dec (dec (dec 0))
-0 ? x  =  0
-x ? 0  =  x
-x ? y  =  0
-
-0 ? 0  =  dec (dec (dec 0))
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  x
-
-0 ? 0  =  dec (dec (dec 0))
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  y
-
-0 ? 0  =  dec (dec (dec 0))
-0 ? x  =  0
-x ? 0  =  0
-x ? y  =  0
-
-
-Candidates for: goo :: [Int] -> [Int]
-  pruning with 4/4 rules
-  [2,0,1,0,1,0,1,0,1] direct candidates, 0 duplicates
-  [2,1,2,3,4,7,10,17,26] pattern candidates, 0 duplicates
-
-rules:
-xs ++ [] == xs
-[] ++ xs == xs
-(xs ++ ys) ++ zs == xs ++ (ys ++ zs)
-(x:xs) ++ ys == x:(xs ++ ys)
-
-direct candidates:
-
-goo xs  =  xs
-
-goo xs  =  []
-
-goo xs  =  xs ++ xs
-
-goo xs  =  xs ++ (xs ++ xs)
-
-
-pattern candidates:
-
-goo xs  =  xs
-
-goo xs  =  []
-
-goo []  =  []
-goo (x:xs)  =  xs
-
-goo []  =  []
-goo (x:xs)  =  goo xs
-
-goo xs  =  xs ++ xs
-
-goo []  =  []
-goo (x:xs)  =  x:xs
-
-goo []  =  []
-goo (x:xs)  =  [x]
-
-goo []  =  []
-goo (x:xs)  =  xs ++ xs
-
-goo []  =  []
-goo (x:xs)  =  x:goo xs
-
-goo []  =  []
-goo (x:xs)  =  xs ++ goo xs
-
-goo []  =  []
-goo (x:xs)  =  goo xs ++ xs
-
-goo xs  =  xs ++ (xs ++ xs)
-
-goo []  =  []
-goo (x:xs)  =  goo xs ++ goo xs
-
-goo []  =  []
-goo (x:xs)  =  x:x:xs
-
-goo []  =  []
-goo (x:xs)  =  [x,x]
-
-goo []  =  []
-goo (x:xs)  =  x:(xs ++ xs)
-
-goo []  =  []
-goo (x:xs)  =  xs ++ (x:xs)
-
-goo []  =  []
-goo (x:xs)  =  xs ++ [x]
-
-goo []  =  []
-goo (x:xs)  =  xs ++ (xs ++ xs)
-
-
-Candidates for: ?? :: [Int] -> [Int] -> [Int]
-  pruning with 4/4 rules
-  [3,0,4,0,8,0,16,0,32] direct candidates, 0 duplicates
-  [3,7,13,66,152,361,1394,2084,11820] pattern candidates, 0 duplicates
-
-rules:
-xs ++ [] == xs
-[] ++ xs == xs
-(xs ++ ys) ++ zs == xs ++ (ys ++ zs)
-(x:xs) ++ ys == x:(xs ++ ys)
-
-direct candidates:
-
-xs ?? ys  =  xs
-
-xs ?? ys  =  ys
-
-xs ?? ys  =  []
-
-xs ?? ys  =  xs ++ xs
-
-xs ?? ys  =  xs ++ ys
-
-xs ?? ys  =  ys ++ xs
-
-xs ?? ys  =  ys ++ ys
-
-xs ?? ys  =  xs ++ (xs ++ xs)
-
-xs ?? ys  =  xs ++ (xs ++ ys)
-
-xs ?? ys  =  xs ++ (ys ++ xs)
-
-xs ?? ys  =  xs ++ (ys ++ ys)
-
-xs ?? ys  =  ys ++ (xs ++ xs)
-
-xs ?? ys  =  ys ++ (xs ++ ys)
-
-xs ?? ys  =  ys ++ (ys ++ xs)
-
-xs ?? ys  =  ys ++ (ys ++ ys)
-
-
-pattern candidates:
-
-xs ?? ys  =  xs
-
-xs ?? ys  =  ys
-
-xs ?? ys  =  []
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  []
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  []
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys
-
-xs ?? ys  =  xs ++ xs
-
-xs ?? ys  =  xs ++ ys
-
-xs ?? ys  =  ys ++ xs
-
-xs ?? ys  =  ys ++ ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ?? []
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ?? []
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  [] ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  [] ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ?? []
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ?? []
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  [] ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  [] ?? ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ?? xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ?? ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ?? []
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ?? xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ?? ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ?? []
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  [] ?? xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  [] ?? ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ?? xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ?? ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ?? []
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ?? xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ?? ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ?? []
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  [] ?? xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  [] ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  x:xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  x:ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  [x]
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ++ xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ++ ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ++ xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ++ ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  x:xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  x:ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  [x]
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ++ xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ++ ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ++ xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ++ ys
-
-xs ?? []  =  xs ++ xs
-xs ?? (x:ys)  =  xs
-
-xs ?? []  =  xs ++ xs
-xs ?? (x:ys)  =  ys
-
-xs ?? []  =  xs ++ xs
-xs ?? (x:ys)  =  []
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  x:xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  x:ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  [x]
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ++ xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ++ ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ++ xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ++ ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  x:xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  x:ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  [x]
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ++ xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ++ ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ++ xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ++ ys
-
-[] ?? xs  =  xs ++ xs
-(x:xs) ?? ys  =  xs
-
-[] ?? xs  =  xs ++ xs
-(x:xs) ?? ys  =  ys
-
-[] ?? xs  =  xs ++ xs
-(x:xs) ?? ys  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  xs ?? xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  xs ?? ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  xs ?? []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys ?? xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys ?? ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys ?? []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  [] ?? xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  [] ?? ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs ?? xs
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs ?? []
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  [] ?? xs
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs ?? xs
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs ?? []
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  [] ?? xs
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs ?? xs
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs ?? []
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  [] ?? xs
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs ?? xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs ?? ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs ?? []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  ys ?? xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  ys ?? ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  ys ?? []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  [] ?? xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  [] ?? ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ?? xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ?? []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  [] ?? xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ?? xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ?? []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  [] ?? xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ?? xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ?? []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  [] ?? xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ?? xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ?? []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  [] ?? xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ?? xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ?? []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  [] ?? xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ?? xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ?? []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  [] ?? xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  xs ?? xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  xs ?? ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  xs ?? []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys ?? xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys ?? ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys ?? []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  [] ?? xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  [] ?? ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs ?? xs
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs ?? []
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  [] ?? xs
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs ?? xs
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs ?? []
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  [] ?? xs
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs ?? xs
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs ?? []
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  [] ?? xs
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs ?? xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs ?? ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs ?? []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  ys ?? xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  ys ?? ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  ys ?? []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  [] ?? xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  [] ?? ys
-
-xs ?? ys  =  xs ++ (xs ++ xs)
-
-xs ?? ys  =  xs ++ (xs ++ ys)
-
-xs ?? ys  =  xs ++ (ys ++ xs)
-
-xs ?? ys  =  xs ++ (ys ++ ys)
-
-xs ?? ys  =  ys ++ (xs ++ xs)
-
-xs ?? ys  =  ys ++ (xs ++ ys)
-
-xs ?? ys  =  ys ++ (ys ++ xs)
-
-xs ?? ys  =  ys ++ (ys ++ ys)
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  x:xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  x:ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  [x]
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  y:xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  y:ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  [y]
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  xs ++ xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  xs ++ ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys ++ xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys ++ ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  x:xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  x:ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  [x]
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  y:xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  y:ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  [y]
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs ++ xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs ++ ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  ys ++ xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  ys ++ ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  x:xs
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  x:xs
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  x:xs
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  [x]
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  [x]
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  [x]
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs ++ xs
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs ++ xs
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs
-(x:xs) ?? []  =  xs ++ xs
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  x:xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  x:ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  [x]
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  y:xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  y:ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  [y]
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  xs ++ xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  xs ++ ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys ++ xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys ++ ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  x:xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  x:ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  [x]
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  y:xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  y:ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  [y]
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs ++ xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs ++ ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  ys ++ xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  ys ++ ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  x:xs
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  x:xs
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  x:xs
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  [x]
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  [x]
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  [x]
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs ++ xs
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs ++ xs
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  []
-(x:xs) ?? []  =  xs ++ xs
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  x:xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  x:xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  x:xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  x:xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  x:xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  x:xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  [x]
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  [x]
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  [x]
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  [x]
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  [x]
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  [x]
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ++ xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ++ xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ++ xs
-(x:xs) ?? []  =  xs
-(x:xs) ?? (y:ys)  =  []
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ++ xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  xs
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ++ xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  ys
-
-[] ?? []  =  []
-[] ?? (x:xs)  =  xs ++ xs
-(x:xs) ?? []  =  []
-(x:xs) ?? (y:ys)  =  []
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (x:xs) ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (x:xs) ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (x:xs) ?? []
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (x:ys) ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (x:ys) ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (x:ys) ?? []
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  [x] ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  [x] ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  [x] ?? []
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (xs ++ xs) ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (xs ++ xs) ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (xs ++ xs) ?? []
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (xs ++ ys) ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (xs ++ ys) ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (xs ++ ys) ?? []
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (ys ++ xs) ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (ys ++ xs) ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (ys ++ xs) ?? []
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (ys ++ ys) ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (ys ++ ys) ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  (ys ++ ys) ?? []
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (x:xs) ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (x:xs) ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (x:xs) ?? []
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (x:ys) ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (x:ys) ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (x:ys) ?? []
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  [x] ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  [x] ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  [x] ?? []
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (xs ++ xs) ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (xs ++ xs) ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (xs ++ xs) ?? []
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (xs ++ ys) ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (xs ++ ys) ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (xs ++ ys) ?? []
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (ys ++ xs) ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (ys ++ xs) ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (ys ++ xs) ?? []
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (ys ++ ys) ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (ys ++ ys) ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  (ys ++ ys) ?? []
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ?? (x:xs)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ?? (x:ys)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ?? [x]
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ?? (xs ++ xs)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ?? (xs ++ ys)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ?? (ys ++ xs)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ?? (ys ++ ys)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ?? (x:xs)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ?? (x:ys)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ?? [x]
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ?? (xs ++ xs)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ?? (xs ++ ys)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ?? (ys ++ xs)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ?? (ys ++ ys)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  [] ?? (x:xs)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  [] ?? (x:ys)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  [] ?? [x]
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  [] ?? (xs ++ xs)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  [] ?? (xs ++ ys)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  [] ?? (ys ++ xs)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  [] ?? (ys ++ ys)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ?? (x:xs)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ?? (x:ys)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ?? [x]
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ?? (xs ++ xs)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ?? (xs ++ ys)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ?? (ys ++ xs)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ?? (ys ++ ys)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ?? (x:xs)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ?? (x:ys)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ?? [x]
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ?? (xs ++ xs)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ?? (xs ++ ys)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ?? (ys ++ xs)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ?? (ys ++ ys)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  [] ?? (x:xs)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  [] ?? (x:ys)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  [] ?? [x]
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  [] ?? (xs ++ xs)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  [] ?? (xs ++ ys)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  [] ?? (ys ++ xs)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  [] ?? (ys ++ ys)
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  x:xs ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  x:xs ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  x:xs ?? []
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  x:ys ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  x:ys ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  x:ys ?? []
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  [x,] ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  [x,] ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ++ xs ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ++ xs ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ++ xs ?? []
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ++ ys ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ++ ys ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ++ ys ?? []
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ++ [] ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ++ [] ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ++ xs ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ++ xs ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ++ xs ?? []
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ++ ys ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ++ ys ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ++ ys ?? []
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ++ [] ?? xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ++ [] ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ?? xs ++ xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ?? ys ++ xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ?? [] ++ xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ?? xs ++ xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ?? ys ++ xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ?? [] ++ xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  [] ?? xs ++ xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  [] ?? ys ++ xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ?? xs ++ ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ?? ys ++ ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ?? [] ++ ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ?? xs ++ ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ?? ys ++ ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ?? [] ++ ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  [] ?? xs ++ ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  [] ?? ys ++ ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  x:xs ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  x:xs ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  x:xs ?? []
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  x:ys ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  x:ys ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  x:ys ?? []
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  [x,] ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  [x,] ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ++ xs ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ++ xs ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ++ xs ?? []
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ++ ys ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ++ ys ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ++ ys ?? []
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ++ [] ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ++ [] ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ++ xs ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ++ xs ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ++ xs ?? []
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ++ ys ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ++ ys ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ++ ys ?? []
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ++ [] ?? xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ++ [] ?? ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ?? xs ++ xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ?? ys ++ xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ?? [] ++ xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ?? xs ++ xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ?? ys ++ xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ?? [] ++ xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  [] ?? xs ++ xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  [] ?? ys ++ xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ?? xs ++ ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ?? ys ++ ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ?? [] ++ ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ?? xs ++ ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ?? ys ++ ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ?? [] ++ ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  [] ?? xs ++ ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  [] ?? ys ++ ys
-
-xs ?? []  =  xs ++ xs
-xs ?? (x:ys)  =  xs ?? xs
-
-xs ?? []  =  xs ++ xs
-xs ?? (x:ys)  =  xs ?? ys
-
-xs ?? []  =  xs ++ xs
-xs ?? (x:ys)  =  xs ?? []
-
-xs ?? []  =  xs ++ xs
-xs ?? (x:ys)  =  ys ?? xs
-
-xs ?? []  =  xs ++ xs
-xs ?? (x:ys)  =  ys ?? ys
-
-xs ?? []  =  xs ++ xs
-xs ?? (x:ys)  =  ys ?? []
-
-xs ?? []  =  xs ++ xs
-xs ?? (x:ys)  =  [] ?? xs
-
-xs ?? []  =  xs ++ xs
-xs ?? (x:ys)  =  [] ?? ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  x:xs ?? xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  x:xs ?? ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  x:xs ?? []
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  x:ys ?? xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  x:ys ?? ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  x:ys ?? []
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  [x,] ?? xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  [x,] ?? ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ++ xs ?? xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ++ xs ?? ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ++ xs ?? []
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ++ ys ?? xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ++ ys ?? ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ++ ys ?? []
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ++ [] ?? xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ++ [] ?? ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ++ xs ?? xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ++ xs ?? ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ++ xs ?? []
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ++ ys ?? xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ++ ys ?? ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ++ ys ?? []
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ++ [] ?? xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ++ [] ?? ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ?? xs ++ xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ?? ys ++ xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ?? [] ++ xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ?? xs ++ xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ?? ys ++ xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ?? [] ++ xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  [] ?? xs ++ xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  [] ?? ys ++ xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ?? xs ++ ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ?? ys ++ ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ?? [] ++ ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ?? xs ++ ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ?? ys ++ ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ?? [] ++ ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  [] ?? xs ++ ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  [] ?? ys ++ ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  x:xs ?? xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  x:xs ?? ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  x:xs ?? []
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  x:ys ?? xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  x:ys ?? ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  x:ys ?? []
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  [x,] ?? xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  [x,] ?? ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ++ xs ?? xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ++ xs ?? ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ++ xs ?? []
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ++ ys ?? xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ++ ys ?? ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ++ ys ?? []
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ++ [] ?? xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ++ [] ?? ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ++ xs ?? xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ++ xs ?? ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ++ xs ?? []
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ++ ys ?? xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ++ ys ?? ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ++ ys ?? []
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ++ [] ?? xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ++ [] ?? ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ?? xs ++ xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ?? ys ++ xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ?? [] ++ xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ?? xs ++ xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ?? ys ++ xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ?? [] ++ xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  [] ?? xs ++ xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  [] ?? ys ++ xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ?? xs ++ ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ?? ys ++ ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ?? [] ++ ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ?? xs ++ ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ?? ys ++ ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ?? [] ++ ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  [] ?? xs ++ ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  [] ?? ys ++ ys
-
-[] ?? xs  =  xs ++ xs
-(x:xs) ?? ys  =  xs ?? xs
-
-[] ?? xs  =  xs ++ xs
-(x:xs) ?? ys  =  xs ?? ys
-
-[] ?? xs  =  xs ++ xs
-(x:xs) ?? ys  =  xs ?? []
-
-[] ?? xs  =  xs ++ xs
-(x:xs) ?? ys  =  ys ?? xs
-
-[] ?? xs  =  xs ++ xs
-(x:xs) ?? ys  =  ys ?? ys
-
-[] ?? xs  =  xs ++ xs
-(x:xs) ?? ys  =  ys ?? []
-
-[] ?? xs  =  xs ++ xs
-(x:xs) ?? ys  =  [] ?? xs
-
-[] ?? xs  =  xs ++ xs
-(x:xs) ?? ys  =  [] ?? ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  x:x:xs
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  x:x:ys
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  [x,x]
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  x:(xs ++ xs)
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  x:(xs ++ ys)
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  x:(ys ++ xs)
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  x:(ys ++ ys)
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ++ (x:xs)
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ++ (x:ys)
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ++ [x]
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ++ (xs ++ xs)
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ++ (xs ++ ys)
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ++ (ys ++ xs)
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  xs ++ (ys ++ ys)
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ++ (x:xs)
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ++ (x:ys)
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ++ [x]
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ++ (xs ++ xs)
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ++ (xs ++ ys)
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ++ (ys ++ xs)
-
-xs ?? []  =  xs
-xs ?? (x:ys)  =  ys ++ (ys ++ ys)
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  x:x:xs
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  x:x:ys
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  [x,x]
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  x:(xs ++ xs)
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  x:(xs ++ ys)
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  x:(ys ++ xs)
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  x:(ys ++ ys)
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ++ (x:xs)
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ++ (x:ys)
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ++ [x]
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ++ (xs ++ xs)
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ++ (xs ++ ys)
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ++ (ys ++ xs)
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  xs ++ (ys ++ ys)
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ++ (x:xs)
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ++ (x:ys)
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ++ [x]
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ++ (xs ++ xs)
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ++ (xs ++ ys)
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ++ (ys ++ xs)
-
-xs ?? []  =  []
-xs ?? (x:ys)  =  ys ++ (ys ++ ys)
-
-xs ?? []  =  xs ++ xs
-xs ?? (x:ys)  =  x:xs
-
-xs ?? []  =  xs ++ xs
-xs ?? (x:ys)  =  x:ys
-
-xs ?? []  =  xs ++ xs
-xs ?? (x:ys)  =  [x]
-
-xs ?? []  =  xs ++ xs
-xs ?? (x:ys)  =  xs ++ ys
-
-xs ?? []  =  xs ++ xs
-xs ?? (x:ys)  =  ys ++ xs
-
-xs ?? []  =  xs ++ xs
-xs ?? (x:ys)  =  ys ++ ys
-
-xs ?? []  =  xs ++ (xs ++ xs)
-xs ?? (x:ys)  =  xs
-
-xs ?? []  =  xs ++ (xs ++ xs)
-xs ?? (x:ys)  =  ys
-
-xs ?? []  =  xs ++ (xs ++ xs)
-xs ?? (x:ys)  =  []
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  x:x:xs
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  x:x:ys
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  [x,x]
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  x:(xs ++ xs)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  x:(xs ++ ys)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  x:(ys ++ xs)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  x:(ys ++ ys)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ++ (x:xs)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ++ (x:ys)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ++ [x]
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ++ (xs ++ xs)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ++ (xs ++ ys)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ++ (ys ++ xs)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  xs ++ (ys ++ ys)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ++ (x:xs)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ++ (x:ys)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ++ [x]
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ++ (xs ++ xs)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ++ (xs ++ ys)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ++ (ys ++ xs)
-
-[] ?? xs  =  xs
-(x:xs) ?? ys  =  ys ++ (ys ++ ys)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  x:x:xs
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  x:x:ys
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  [x,x]
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  x:(xs ++ xs)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  x:(xs ++ ys)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  x:(ys ++ xs)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  x:(ys ++ ys)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ++ (x:xs)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ++ (x:ys)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ++ [x]
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ++ (xs ++ xs)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ++ (xs ++ ys)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ++ (ys ++ xs)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  xs ++ (ys ++ ys)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ++ (x:xs)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ++ (x:ys)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ++ [x]
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ++ (xs ++ xs)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ++ (xs ++ ys)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ++ (ys ++ xs)
-
-[] ?? xs  =  []
-(x:xs) ?? ys  =  ys ++ (ys ++ ys)
-
-[] ?? xs  =  xs ++ xs
-(x:xs) ?? ys  =  x:xs
-
-[] ?? xs  =  xs ++ xs
-(x:xs) ?? ys  =  x:ys
-
-[] ?? xs  =  xs ++ xs
-(x:xs) ?? ys  =  [x]
-
-[] ?? xs  =  xs ++ xs
-(x:xs) ?? ys  =  xs ++ ys
-
-[] ?? xs  =  xs ++ xs
-(x:xs) ?? ys  =  ys ++ xs
-
-[] ?? xs  =  xs ++ (xs ++ xs)
-(x:xs) ?? ys  =  xs
-
-[] ?? xs  =  xs ++ (xs ++ xs)
-(x:xs) ?? ys  =  ys
-
-[] ?? xs  =  xs ++ (xs ++ xs)
-(x:xs) ?? ys  =  []
-
-
-Candidates for: ton :: Bool -> Bool
-  pruning with 39/49 rules
-  [3,1,0,2,6,14,38,68,140] direct candidates, 0 duplicates
-  [3,3,0,0,0,0,0,0,0] pattern candidates, 0 duplicates
-
-rules:
-not False == True
-not True == False
-p && p == p
-p || p == p
-not (not p) == p
-p && False == False
-p && True == p
-False && p == False
-True && p == p
-p || False == p
-p || True == True
-False || p == p
-True || p == True
-not (p && q) == not p || not q
-not (p && q) == not q || not p
-not (p || q) == not p && not q
-not (p || q) == not q && not p
-p && not p == False
-not p && p == False
-p || not p == True
-not p || p == True
-(p && q) && r == p && (q && r)
-(p && q) && r == q && (p && r)
-(p || q) || r == p || (q || r)
-(p || q) || r == q || (p || r)
-p && (p && q) == p && q
-p && (q && p) == p && q
-p && (q && p) == q && p
-p || (p || q) == p || q
-p || (q || p) == p || q
-p || (q || p) == q || p
-p && (p || q) == p
-p && (q || p) == p
-(p || q) && p == p
-(p || q) && q == q
-p || p && q == p
-p || q && p == p
-p && q || p == p
-p && q || q == q
-equations:
-q && p == p && q
-q || p == p || q
-q && (p && r) == p && (q && r)
-r && (p && q) == p && (q && r)
-r && (q && p) == p && (q && r)
-q || (p || r) == p || (q || r)
-r || (p || q) == p || (q || r)
-r || (q || p) == p || (q || r)
-(r || q) && p == p && (q || r)
-r && q || p == p || q && r
-
-direct candidates:
-
-ton p  =  p
-
-ton p  =  False
-
-ton p  =  True
-
-ton p  =  not p
-
-ton p  =  p && ton p
-
-ton p  =  p || ton p
-
-ton p  =  p && ton (not p)
-
-ton p  =  p || ton (not p)
-
-ton p  =  p && not (ton p)
-
-ton p  =  not p && ton p
-
-ton p  =  p || not (ton p)
-
-ton p  =  not p || ton p
-
-ton p  =  p && not (ton (not p))
-
-ton p  =  not p && ton (not p)
-
-ton p  =  p || not (ton (not p))
-
-ton p  =  not p || ton (not p)
-
-ton p  =  p && (p && ton p)
-
-ton p  =  p && (ton p && p)
-
-ton p  =  p && (p || ton p)
-
-ton p  =  p && (ton p || p)
-
-ton p  =  not p && not (ton p)
-
-ton p  =  p || p && ton p
-
-ton p  =  p || ton p && p
-
-ton p  =  p || (p || ton p)
-
-ton p  =  p || (ton p || p)
-
-ton p  =  not p || not (ton p)
-
-
-pattern candidates:
-
-ton p  =  p
-
-ton p  =  False
-
-ton p  =  True
-
-ton p  =  not p
-
-ton False  =  False
-ton True  =  True
-
-ton False  =  True
-ton True  =  False
-
-
-Candidates for: &| :: Bool -> Bool -> Bool
-  pruning with 39/49 rules
-  [4,2,4,8,32,128,468,1576,4924] direct candidates, 0 duplicates
-  [4,14,26,8,4,48,60,280,592] pattern candidates, 0 duplicates
-
-rules:
-not False == True
-not True == False
-p && p == p
-p || p == p
-not (not p) == p
-p && False == False
-p && True == p
-False && p == False
-True && p == p
-p || False == p
-p || True == True
-False || p == p
-True || p == True
-not (p && q) == not p || not q
-not (p && q) == not q || not p
-not (p || q) == not p && not q
-not (p || q) == not q && not p
-p && not p == False
-not p && p == False
-p || not p == True
-not p || p == True
-(p && q) && r == p && (q && r)
-(p && q) && r == q && (p && r)
-(p || q) || r == p || (q || r)
-(p || q) || r == q || (p || r)
-p && (p && q) == p && q
-p && (q && p) == p && q
-p && (q && p) == q && p
-p || (p || q) == p || q
-p || (q || p) == p || q
-p || (q || p) == q || p
-p && (p || q) == p
-p && (q || p) == p
-(p || q) && p == p
-(p || q) && q == q
-p || p && q == p
-p || q && p == p
-p && q || p == p
-p && q || q == q
-equations:
-q && p == p && q
-q || p == p || q
-q && (p && r) == p && (q && r)
-r && (p && q) == p && (q && r)
-r && (q && p) == p && (q && r)
-q || (p || r) == p || (q || r)
-r || (p || q) == p || (q || r)
-r || (q || p) == p || (q || r)
-(r || q) && p == p && (q || r)
-r && q || p == p || q && r
-
-direct candidates:
-
-p &| q  =  p
-
-p &| q  =  q
-
-p &| q  =  False
-
-p &| q  =  True
-
-p &| q  =  not p
-
-p &| q  =  not q
-
-p &| q  =  p && q
-
-p &| q  =  q && p
-
-p &| q  =  p || q
-
-p &| q  =  q || p
-
-p &| q  =  not p && q
-
-p &| q  =  not q && p
-
-p &| q  =  not p || q
-
-p &| q  =  not q || p
-
-p &| q  =  p && not q
-
-p &| q  =  q && not p
-
-p &| q  =  p || not q
-
-p &| q  =  q || not p
-
-p &| q  =  not p && not q
-
-p &| q  =  not q && not p
-
-p &| q  =  not p || not q
-
-p &| q  =  not q || not p
-
-p &| q  =  p && p &| p
-
-p &| q  =  p && p &| q
-
-p &| q  =  p && p &| False
-
-p &| q  =  p && p &| True
-
-p &| q  =  p && q &| q
-
-p &| q  =  p && False &| q
-
-p &| q  =  p && True &| q
-
-p &| q  =  q && p &| p
-
-p &| q  =  q && p &| q
-
-p &| q  =  q && p &| False
-
-p &| q  =  q && p &| True
-
-p &| q  =  q && q &| q
-
-p &| q  =  q && False &| q
-
-p &| q  =  q && True &| q
-
-p &| q  =  p || p &| p
-
-p &| q  =  p || p &| q
-
-p &| q  =  p || p &| False
-
-p &| q  =  p || p &| True
-
-p &| q  =  p || q &| q
-
-p &| q  =  p || False &| q
-
-p &| q  =  p || True &| q
-
-p &| q  =  q || p &| p
-
-p &| q  =  q || p &| q
-
-p &| q  =  q || p &| False
-
-p &| q  =  q || p &| True
-
-p &| q  =  q || q &| q
-
-p &| q  =  q || False &| q
-
-p &| q  =  q || True &| q
-
-p &| q  =  p && (not p && q)
-
-p &| q  =  p && (not p || q)
-
-p &| q  =  p && (q && not p)
-
-p &| q  =  p && (q || not p)
-
-p &| q  =  q && (not q && p)
-
-p &| q  =  q && (not q || p)
-
-p &| q  =  q && (p && not q)
-
-p &| q  =  q && (p || not q)
-
-p &| q  =  p || not p && q
-
-p &| q  =  p || (not p || q)
-
-p &| q  =  p || q && not p
-
-p &| q  =  p || (q || not p)
-
-p &| q  =  q || not q && p
-
-p &| q  =  q || (not q || p)
-
-p &| q  =  q || p && not q
-
-p &| q  =  q || (p || not q)
-
-p &| q  =  not p && (p || q)
-
-p &| q  =  not p && (q || p)
-
-p &| q  =  not q && (p || q)
-
-p &| q  =  not q && (q || p)
-
-p &| q  =  not p || p && q
-
-p &| q  =  not p || q && p
-
-p &| q  =  not q || p && q
-
-p &| q  =  not q || q && p
-
-p &| q  =  (p || q) && not p
-
-p &| q  =  (p || q) && not q
-
-p &| q  =  (q || p) && not p
-
-p &| q  =  (q || p) && not q
-
-p &| q  =  p && q || not p
-
-p &| q  =  p && q || not q
-
-p &| q  =  q && p || not p
-
-p &| q  =  q && p || not q
-
-p &| q  =  p && p &| not p
-
-p &| q  =  p && p &| not q
-
-p &| q  =  p && q &| not q
-
-p &| q  =  p && False &| not q
-
-p &| q  =  p && True &| not q
-
-p &| q  =  p && not p &| p
-
-p &| q  =  p && not p &| q
-
-p &| q  =  p && not p &| False
-
-p &| q  =  p && not p &| True
-
-p &| q  =  p && not q &| q
-
-p &| q  =  q && p &| not p
-
-p &| q  =  q && p &| not q
-
-p &| q  =  q && q &| not q
-
-p &| q  =  q && False &| not q
-
-p &| q  =  q && True &| not q
-
-p &| q  =  q && not p &| p
-
-p &| q  =  q && not p &| q
-
-p &| q  =  q && not p &| False
-
-p &| q  =  q && not p &| True
-
-p &| q  =  q && not q &| q
-
-p &| q  =  p || p &| not p
-
-p &| q  =  p || p &| not q
-
-p &| q  =  p || q &| not q
-
-p &| q  =  p || False &| not q
-
-p &| q  =  p || True &| not q
-
-p &| q  =  p || not p &| p
-
-p &| q  =  p || not p &| q
-
-p &| q  =  p || not p &| False
-
-p &| q  =  p || not p &| True
-
-p &| q  =  p || not q &| q
-
-p &| q  =  q || p &| not p
-
-p &| q  =  q || p &| not q
-
-p &| q  =  q || q &| not q
-
-p &| q  =  q || False &| not q
-
-p &| q  =  q || True &| not q
-
-p &| q  =  q || not p &| p
-
-p &| q  =  q || not p &| q
-
-p &| q  =  q || not p &| False
-
-p &| q  =  q || not p &| True
-
-p &| q  =  q || not q &| q
-
-p &| q  =  p && not (p &| p)
-
-p &| q  =  p && not (p &| q)
-
-p &| q  =  p && not (p &| False)
-
-p &| q  =  p && not (p &| True)
-
-p &| q  =  p && not (q &| q)
-
-p &| q  =  p && not (False &| q)
-
-p &| q  =  p && not (True &| q)
-
-p &| q  =  q && not (p &| p)
-
-p &| q  =  q && not (p &| q)
-
-p &| q  =  q && not (p &| False)
-
-p &| q  =  q && not (p &| True)
-
-p &| q  =  q && not (q &| q)
-
-p &| q  =  q && not (False &| q)
-
-p &| q  =  q && not (True &| q)
-
-p &| q  =  not p && p &| p
-
-p &| q  =  not p && p &| q
-
-p &| q  =  not p && p &| False
-
-p &| q  =  not p && p &| True
-
-p &| q  =  not p && q &| q
-
-p &| q  =  not p && False &| q
-
-p &| q  =  not p && True &| q
-
-p &| q  =  not q && p &| p
-
-p &| q  =  not q && p &| q
-
-p &| q  =  not q && p &| False
-
-p &| q  =  not q && p &| True
-
-p &| q  =  not q && q &| q
-
-p &| q  =  not q && False &| q
-
-p &| q  =  not q && True &| q
-
-p &| q  =  p || not (p &| p)
-
-p &| q  =  p || not (p &| q)
-
-p &| q  =  p || not (p &| False)
-
-p &| q  =  p || not (p &| True)
-
-p &| q  =  p || not (q &| q)
-
-p &| q  =  p || not (False &| q)
-
-p &| q  =  p || not (True &| q)
-
-p &| q  =  q || not (p &| p)
-
-p &| q  =  q || not (p &| q)
-
-p &| q  =  q || not (p &| False)
-
-p &| q  =  q || not (p &| True)
-
-p &| q  =  q || not (q &| q)
-
-p &| q  =  q || not (False &| q)
-
-p &| q  =  q || not (True &| q)
-
-p &| q  =  not p || p &| p
-
-p &| q  =  not p || p &| q
-
-p &| q  =  not p || p &| False
-
-p &| q  =  not p || p &| True
-
-p &| q  =  not p || q &| q
-
-p &| q  =  not p || False &| q
-
-p &| q  =  not p || True &| q
-
-p &| q  =  not q || p &| p
-
-p &| q  =  not q || p &| q
-
-p &| q  =  not q || p &| False
-
-p &| q  =  not q || p &| True
-
-p &| q  =  not q || q &| q
-
-p &| q  =  not q || False &| q
-
-p &| q  =  not q || True &| q
-
-
-pattern candidates:
-
-p &| q  =  p
-
-p &| q  =  q
-
-p &| q  =  False
-
-p &| q  =  True
-
-p &| q  =  not p
-
-p &| q  =  not q
-
-p &| False  =  p
-p &| True  =  False
-
-p &| False  =  p
-p &| True  =  True
-
-p &| False  =  False
-p &| True  =  p
-
-p &| False  =  False
-p &| True  =  True
-
-p &| False  =  True
-p &| True  =  p
-
-p &| False  =  True
-p &| True  =  False
-
-False &| p  =  p
-True &| p  =  False
-
-False &| p  =  p
-True &| p  =  True
-
-False &| p  =  False
-True &| p  =  p
-
-False &| p  =  False
-True &| p  =  True
-
-False &| p  =  True
-True &| p  =  p
-
-False &| p  =  True
-True &| p  =  False
-
-p &| q  =  p && q
-
-p &| q  =  q && p
-
-p &| q  =  p || q
-
-p &| q  =  q || p
-
-p &| False  =  p
-p &| True  =  not p
-
-p &| False  =  False
-p &| True  =  not p
-
-p &| False  =  True
-p &| True  =  not p
-
-p &| False  =  not p
-p &| True  =  p
-
-p &| False  =  not p
-p &| True  =  False
-
-p &| False  =  not p
-p &| True  =  True
-
-False &| p  =  p
-True &| p  =  not p
-
-False &| p  =  False
-True &| p  =  not p
-
-False &| p  =  True
-True &| p  =  not p
-
-False &| p  =  not p
-True &| p  =  p
-
-False &| p  =  not p
-True &| p  =  False
-
-False &| p  =  not p
-True &| p  =  True
-
-False &| False  =  False
-False &| True  =  False
-True &| False  =  False
-True &| True  =  True
-
-False &| False  =  False
-False &| True  =  False
-True &| False  =  True
-True &| True  =  False
-
-False &| False  =  False
-False &| True  =  True
-True &| False  =  False
-True &| True  =  False
-
-False &| False  =  False
-False &| True  =  True
-True &| False  =  True
-True &| True  =  False
-
-False &| False  =  False
-False &| True  =  True
-True &| False  =  True
-True &| True  =  True
-
-False &| False  =  True
-False &| True  =  False
-True &| False  =  False
-True &| True  =  False
-
-False &| False  =  True
-False &| True  =  False
-True &| False  =  False
-True &| True  =  True
-
-False &| False  =  True
-False &| True  =  False
-True &| False  =  True
-True &| True  =  True
-
-False &| False  =  True
-False &| True  =  True
-True &| False  =  False
-True &| True  =  True
-
-False &| False  =  True
-False &| True  =  True
-True &| False  =  True
-True &| True  =  False
-
-p &| q  =  not p && q
-
-p &| q  =  not q && p
-
-p &| q  =  not p || q
-
-p &| q  =  not q || p
-
-p &| q  =  p && not q
-
-p &| q  =  q && not p
-
-p &| q  =  p || not q
-
-p &| q  =  q || not p
-
-p &| q  =  not p && not q
-
-p &| q  =  not q && not p
-
-p &| q  =  not p || not q
-
-p &| q  =  not q || not p
-
-p &| q  =  (not p || q) && p
-
-p &| q  =  (not q || p) && q
-
-p &| q  =  (p || not q) && q
-
-p &| q  =  (q || not p) && p
-
-p &| q  =  not p && q || p
-
-p &| q  =  not q && p || q
-
-p &| q  =  p && not q || q
-
-p &| q  =  q && not p || p
-
-p &| q  =  p && (not p && q)
-
-p &| q  =  p && (not p || q)
-
-p &| q  =  p && (q && not p)
-
-p &| q  =  p && (q || not p)
-
-p &| q  =  q && (not q && p)
-
-p &| q  =  q && (not q || p)
-
-p &| q  =  q && (p && not q)
-
-p &| q  =  q && (p || not q)
-
-p &| q  =  p || not p && q
-
-p &| q  =  p || (not p || q)
-
-p &| q  =  p || q && not p
-
-p &| q  =  p || (q || not p)
-
-p &| q  =  q || not q && p
-
-p &| q  =  q || (not q || p)
-
-p &| q  =  q || p && not q
-
-p &| q  =  q || (p || not q)
-
-p &| q  =  not p && (p && q)
-
-p &| q  =  not p && (q && p)
-
-p &| q  =  not p && (p || q)
-
-p &| q  =  not p && (q || p)
-
-p &| q  =  not q && (p && q)
-
-p &| q  =  not q && (q && p)
-
-p &| q  =  not q && (p || q)
-
-p &| q  =  not q && (q || p)
-
-p &| q  =  not p || p && q
-
-p &| q  =  not p || q && p
-
-p &| q  =  not p || (p || q)
-
-p &| q  =  not p || (q || p)
-
-p &| q  =  not q || p && q
-
-p &| q  =  not q || q && p
-
-p &| q  =  not q || (p || q)
-
-p &| q  =  not q || (q || p)
-
-p &| q  =  (p || q) && not p
-
-p &| q  =  (p || q) && not q
-
-p &| q  =  (q || p) && not p
-
-p &| q  =  (q || p) && not q
-
-p &| q  =  p && q || not p
-
-p &| q  =  p && q || not q
-
-p &| q  =  q && p || not p
-
-p &| q  =  q && p || not q
-
-
-Candidates for: gcd :: Int -> Int -> Int
-  pruning with 0/0 rules
-  [3,0,9,0,54,0,405,0,3402] direct candidates, 0 duplicates
-  [3,7,18,60,150,469,1245,3812,10634] pattern candidates, 0 duplicates
-
-no rules.
-
-direct candidates:
-
-gcd x y  =  x
-
-gcd x y  =  y
-
-gcd x y  =  0
-
-gcd x y  =  x `mod` x
-
-gcd x y  =  x `mod` y
-
-gcd x y  =  x `mod` 0
-
-gcd x y  =  y `mod` x
-
-gcd x y  =  y `mod` y
-
-gcd x y  =  y `mod` 0
-
-gcd x y  =  0 `mod` x
-
-gcd x y  =  0 `mod` y
-
-gcd x y  =  0 `mod` 0
-
-gcd x y  =  (x `mod` x) `mod` x
-
-gcd x y  =  (x `mod` x) `mod` y
-
-gcd x y  =  (x `mod` x) `mod` 0
-
-gcd x y  =  (x `mod` y) `mod` x
-
-gcd x y  =  (x `mod` y) `mod` y
-
-gcd x y  =  (x `mod` y) `mod` 0
-
-gcd x y  =  (x `mod` 0) `mod` x
-
-gcd x y  =  (x `mod` 0) `mod` y
-
-gcd x y  =  (x `mod` 0) `mod` 0
-
-gcd x y  =  (y `mod` x) `mod` x
-
-gcd x y  =  (y `mod` x) `mod` y
-
-gcd x y  =  (y `mod` x) `mod` 0
-
-gcd x y  =  (y `mod` y) `mod` x
-
-gcd x y  =  (y `mod` y) `mod` y
-
-gcd x y  =  (y `mod` y) `mod` 0
-
-gcd x y  =  (y `mod` 0) `mod` x
-
-gcd x y  =  (y `mod` 0) `mod` y
-
-gcd x y  =  (y `mod` 0) `mod` 0
-
-gcd x y  =  (0 `mod` x) `mod` x
-
-gcd x y  =  (0 `mod` x) `mod` y
-
-gcd x y  =  (0 `mod` x) `mod` 0
-
-gcd x y  =  (0 `mod` y) `mod` x
-
-gcd x y  =  (0 `mod` y) `mod` y
-
-gcd x y  =  (0 `mod` y) `mod` 0
-
-gcd x y  =  (0 `mod` 0) `mod` x
-
-gcd x y  =  (0 `mod` 0) `mod` y
-
-gcd x y  =  (0 `mod` 0) `mod` 0
-
-gcd x y  =  x `mod` (x `mod` x)
-
-gcd x y  =  x `mod` (x `mod` y)
-
-gcd x y  =  x `mod` (x `mod` 0)
-
-gcd x y  =  x `mod` (y `mod` x)
-
-gcd x y  =  x `mod` (y `mod` y)
-
-gcd x y  =  x `mod` (y `mod` 0)
-
-gcd x y  =  x `mod` (0 `mod` x)
-
-gcd x y  =  x `mod` (0 `mod` y)
-
-gcd x y  =  x `mod` (0 `mod` 0)
-
-gcd x y  =  y `mod` (x `mod` x)
-
-gcd x y  =  y `mod` (x `mod` y)
-
-gcd x y  =  y `mod` (x `mod` 0)
-
-gcd x y  =  y `mod` (y `mod` x)
-
-gcd x y  =  y `mod` (y `mod` y)
-
-gcd x y  =  y `mod` (y `mod` 0)
-
-gcd x y  =  y `mod` (0 `mod` x)
-
-gcd x y  =  y `mod` (0 `mod` y)
-
-gcd x y  =  y `mod` (0 `mod` 0)
-
-gcd x y  =  0 `mod` (x `mod` x)
-
-gcd x y  =  0 `mod` (x `mod` y)
-
-gcd x y  =  0 `mod` (x `mod` 0)
-
-gcd x y  =  0 `mod` (y `mod` x)
-
-gcd x y  =  0 `mod` (y `mod` y)
-
-gcd x y  =  0 `mod` (y `mod` 0)
-
-gcd x y  =  0 `mod` (0 `mod` x)
-
-gcd x y  =  0 `mod` (0 `mod` y)
-
-gcd x y  =  0 `mod` (0 `mod` 0)
-
-
-pattern candidates:
-
-gcd x y  =  x
-
-gcd x y  =  y
-
-gcd x y  =  0
-
-gcd x 0  =  x
-gcd x y  =  y
-
-gcd x 0  =  x
-gcd x y  =  0
-
-gcd x 0  =  0
-gcd x y  =  x
-
-gcd x 0  =  0
-gcd x y  =  y
-
-gcd 0 x  =  x
-gcd x y  =  0
-
-gcd 0 x  =  0
-gcd x y  =  x
-
-gcd 0 x  =  0
-gcd x y  =  y
-
-gcd x y  =  x `mod` x
-
-gcd x y  =  x `mod` y
-
-gcd x y  =  x `mod` 0
-
-gcd x y  =  y `mod` x
-
-gcd x y  =  y `mod` y
-
-gcd x y  =  y `mod` 0
-
-gcd x y  =  0 `mod` x
-
-gcd x y  =  0 `mod` y
-
-gcd x y  =  0 `mod` 0
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  0
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  0
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  x
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  x
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  0
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  0
-gcd x y  =  y
-
-gcd x 0  =  x
-gcd x y  =  x `mod` x
-
-gcd x 0  =  x
-gcd x y  =  x `mod` y
-
-gcd x 0  =  x
-gcd x y  =  x `mod` 0
-
-gcd x 0  =  x
-gcd x y  =  y `mod` x
-
-gcd x 0  =  x
-gcd x y  =  y `mod` y
-
-gcd x 0  =  x
-gcd x y  =  y `mod` 0
-
-gcd x 0  =  x
-gcd x y  =  0 `mod` x
-
-gcd x 0  =  x
-gcd x y  =  0 `mod` y
-
-gcd x 0  =  x
-gcd x y  =  0 `mod` 0
-
-gcd x 0  =  0
-gcd x y  =  x `mod` x
-
-gcd x 0  =  0
-gcd x y  =  x `mod` y
-
-gcd x 0  =  0
-gcd x y  =  x `mod` 0
-
-gcd x 0  =  0
-gcd x y  =  y `mod` x
-
-gcd x 0  =  0
-gcd x y  =  y `mod` y
-
-gcd x 0  =  0
-gcd x y  =  y `mod` 0
-
-gcd x 0  =  0
-gcd x y  =  0 `mod` x
-
-gcd x 0  =  0
-gcd x y  =  0 `mod` y
-
-gcd x 0  =  0
-gcd x y  =  0 `mod` 0
-
-gcd x 0  =  x `mod` x
-gcd x y  =  x
-
-gcd x 0  =  x `mod` x
-gcd x y  =  y
-
-gcd x 0  =  x `mod` x
-gcd x y  =  0
-
-gcd x 0  =  x `mod` 0
-gcd x y  =  x
-
-gcd x 0  =  x `mod` 0
-gcd x y  =  y
-
-gcd x 0  =  x `mod` 0
-gcd x y  =  0
-
-gcd x 0  =  0 `mod` x
-gcd x y  =  x
-
-gcd x 0  =  0 `mod` x
-gcd x y  =  y
-
-gcd x 0  =  0 `mod` x
-gcd x y  =  0
-
-gcd x 0  =  0 `mod` 0
-gcd x y  =  x
-
-gcd x 0  =  0 `mod` 0
-gcd x y  =  y
-
-gcd x 0  =  0 `mod` 0
-gcd x y  =  0
-
-gcd 0 x  =  x
-gcd x y  =  x `mod` x
-
-gcd 0 x  =  x
-gcd x y  =  x `mod` y
-
-gcd 0 x  =  x
-gcd x y  =  x `mod` 0
-
-gcd 0 x  =  x
-gcd x y  =  y `mod` x
-
-gcd 0 x  =  x
-gcd x y  =  y `mod` y
-
-gcd 0 x  =  x
-gcd x y  =  y `mod` 0
-
-gcd 0 x  =  x
-gcd x y  =  0 `mod` x
-
-gcd 0 x  =  x
-gcd x y  =  0 `mod` y
-
-gcd 0 x  =  x
-gcd x y  =  0 `mod` 0
-
-gcd 0 x  =  0
-gcd x y  =  x `mod` x
-
-gcd 0 x  =  0
-gcd x y  =  x `mod` y
-
-gcd 0 x  =  0
-gcd x y  =  x `mod` 0
-
-gcd 0 x  =  0
-gcd x y  =  y `mod` x
-
-gcd 0 x  =  0
-gcd x y  =  y `mod` y
-
-gcd 0 x  =  0
-gcd x y  =  y `mod` 0
-
-gcd 0 x  =  0
-gcd x y  =  0 `mod` x
-
-gcd 0 x  =  0
-gcd x y  =  0 `mod` y
-
-gcd 0 x  =  0
-gcd x y  =  0 `mod` 0
-
-gcd 0 x  =  x `mod` x
-gcd x y  =  x
-
-gcd 0 x  =  x `mod` x
-gcd x y  =  y
-
-gcd 0 x  =  x `mod` x
-gcd x y  =  0
-
-gcd 0 x  =  x `mod` 0
-gcd x y  =  x
-
-gcd 0 x  =  x `mod` 0
-gcd x y  =  y
-
-gcd 0 x  =  x `mod` 0
-gcd x y  =  0
-
-gcd 0 x  =  0 `mod` x
-gcd x y  =  x
-
-gcd 0 x  =  0 `mod` x
-gcd x y  =  y
-
-gcd 0 x  =  0 `mod` x
-gcd x y  =  0
-
-gcd 0 x  =  0 `mod` 0
-gcd x y  =  x
-
-gcd 0 x  =  0 `mod` 0
-gcd x y  =  y
-
-gcd 0 x  =  0 `mod` 0
-gcd x y  =  0
-
-gcd x y  =  (x `mod` x) `mod` x
-
-gcd x y  =  (x `mod` x) `mod` y
-
-gcd x y  =  (x `mod` x) `mod` 0
-
-gcd x y  =  (x `mod` y) `mod` x
-
-gcd x y  =  (x `mod` y) `mod` y
-
-gcd x y  =  (x `mod` y) `mod` 0
-
-gcd x y  =  (x `mod` 0) `mod` x
-
-gcd x y  =  (x `mod` 0) `mod` y
-
-gcd x y  =  (x `mod` 0) `mod` 0
-
-gcd x y  =  (y `mod` x) `mod` x
-
-gcd x y  =  (y `mod` x) `mod` y
-
-gcd x y  =  (y `mod` x) `mod` 0
-
-gcd x y  =  (y `mod` y) `mod` x
-
-gcd x y  =  (y `mod` y) `mod` y
-
-gcd x y  =  (y `mod` y) `mod` 0
-
-gcd x y  =  (y `mod` 0) `mod` x
-
-gcd x y  =  (y `mod` 0) `mod` y
-
-gcd x y  =  (y `mod` 0) `mod` 0
-
-gcd x y  =  (0 `mod` x) `mod` x
-
-gcd x y  =  (0 `mod` x) `mod` y
-
-gcd x y  =  (0 `mod` x) `mod` 0
-
-gcd x y  =  (0 `mod` y) `mod` x
-
-gcd x y  =  (0 `mod` y) `mod` y
-
-gcd x y  =  (0 `mod` y) `mod` 0
-
-gcd x y  =  (0 `mod` 0) `mod` x
-
-gcd x y  =  (0 `mod` 0) `mod` y
-
-gcd x y  =  (0 `mod` 0) `mod` 0
-
-gcd x y  =  x `mod` (x `mod` x)
-
-gcd x y  =  x `mod` (x `mod` y)
-
-gcd x y  =  x `mod` (x `mod` 0)
-
-gcd x y  =  x `mod` (y `mod` x)
-
-gcd x y  =  x `mod` (y `mod` y)
-
-gcd x y  =  x `mod` (y `mod` 0)
-
-gcd x y  =  x `mod` (0 `mod` x)
-
-gcd x y  =  x `mod` (0 `mod` y)
-
-gcd x y  =  x `mod` (0 `mod` 0)
-
-gcd x y  =  y `mod` (x `mod` x)
-
-gcd x y  =  y `mod` (x `mod` y)
-
-gcd x y  =  y `mod` (x `mod` 0)
-
-gcd x y  =  y `mod` (y `mod` x)
-
-gcd x y  =  y `mod` (y `mod` y)
-
-gcd x y  =  y `mod` (y `mod` 0)
-
-gcd x y  =  y `mod` (0 `mod` x)
-
-gcd x y  =  y `mod` (0 `mod` y)
-
-gcd x y  =  y `mod` (0 `mod` 0)
-
-gcd x y  =  0 `mod` (x `mod` x)
-
-gcd x y  =  0 `mod` (x `mod` y)
-
-gcd x y  =  0 `mod` (x `mod` 0)
-
-gcd x y  =  0 `mod` (y `mod` x)
-
-gcd x y  =  0 `mod` (y `mod` y)
-
-gcd x y  =  0 `mod` (y `mod` 0)
-
-gcd x y  =  0 `mod` (0 `mod` x)
-
-gcd x y  =  0 `mod` (0 `mod` y)
-
-gcd x y  =  0 `mod` (0 `mod` 0)
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x
-gcd x y  =  x `mod` x
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x
-gcd x y  =  x `mod` y
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x
-gcd x y  =  x `mod` 0
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x
-gcd x y  =  y `mod` x
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x
-gcd x y  =  y `mod` y
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x
-gcd x y  =  y `mod` 0
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x
-gcd x y  =  0 `mod` x
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x
-gcd x y  =  0 `mod` y
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x
-gcd x y  =  0 `mod` 0
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  0
-gcd x y  =  x `mod` x
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  0
-gcd x y  =  x `mod` y
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  0
-gcd x y  =  x `mod` 0
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  0
-gcd x y  =  y `mod` x
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  0
-gcd x y  =  y `mod` y
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  0
-gcd x y  =  y `mod` 0
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  0
-gcd x y  =  0 `mod` x
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  0
-gcd x y  =  0 `mod` y
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  0
-gcd x y  =  0 `mod` 0
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x `mod` x
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x `mod` x
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x `mod` x
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x `mod` 0
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x `mod` 0
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  x `mod` 0
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  0 `mod` x
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  0 `mod` x
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  0 `mod` x
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  0 `mod` 0
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  0 `mod` 0
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  x
-gcd x 0  =  0 `mod` 0
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  x
-gcd x y  =  x `mod` x
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  x
-gcd x y  =  x `mod` y
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  x
-gcd x y  =  x `mod` 0
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  x
-gcd x y  =  y `mod` x
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  x
-gcd x y  =  y `mod` y
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  x
-gcd x y  =  y `mod` 0
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  x
-gcd x y  =  0 `mod` x
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  x
-gcd x y  =  0 `mod` y
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  x
-gcd x y  =  0 `mod` 0
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  0
-gcd x y  =  x `mod` x
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  0
-gcd x y  =  x `mod` y
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  0
-gcd x y  =  x `mod` 0
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  0
-gcd x y  =  y `mod` x
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  0
-gcd x y  =  y `mod` y
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  0
-gcd x y  =  y `mod` 0
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  0
-gcd x y  =  0 `mod` x
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  0
-gcd x y  =  0 `mod` y
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  0
-gcd x y  =  0 `mod` 0
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  x `mod` x
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  x `mod` x
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  x `mod` x
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  x `mod` 0
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  x `mod` 0
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  x `mod` 0
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  0 `mod` x
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  0 `mod` x
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  0 `mod` x
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  0 `mod` 0
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  0 `mod` 0
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  0
-gcd x 0  =  0 `mod` 0
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  x `mod` x
-gcd x 0  =  x
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  x `mod` x
-gcd x 0  =  x
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  x `mod` x
-gcd x 0  =  x
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  x `mod` x
-gcd x 0  =  0
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  x `mod` x
-gcd x 0  =  0
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  x `mod` x
-gcd x 0  =  0
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  x `mod` 0
-gcd x 0  =  x
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  x `mod` 0
-gcd x 0  =  x
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  x `mod` 0
-gcd x 0  =  x
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  x `mod` 0
-gcd x 0  =  0
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  x `mod` 0
-gcd x 0  =  0
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  x `mod` 0
-gcd x 0  =  0
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  0 `mod` x
-gcd x 0  =  x
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  0 `mod` x
-gcd x 0  =  x
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  0 `mod` x
-gcd x 0  =  x
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  0 `mod` x
-gcd x 0  =  0
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  0 `mod` x
-gcd x 0  =  0
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  0 `mod` x
-gcd x 0  =  0
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  0 `mod` 0
-gcd x 0  =  x
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  0 `mod` 0
-gcd x 0  =  x
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  0 `mod` 0
-gcd x 0  =  x
-gcd x y  =  0
-
-gcd 0 0  =  0
-gcd 0 x  =  0 `mod` 0
-gcd x 0  =  0
-gcd x y  =  x
-
-gcd 0 0  =  0
-gcd 0 x  =  0 `mod` 0
-gcd x 0  =  0
-gcd x y  =  y
-
-gcd 0 0  =  0
-gcd 0 x  =  0 `mod` 0
-gcd x 0  =  0
-gcd x y  =  0
-
-gcd 0 0  =  0 `mod` 0
-gcd 0 x  =  x
-gcd x 0  =  x
-gcd x y  =  x
-
-gcd 0 0  =  0 `mod` 0
-gcd 0 x  =  x
-gcd x 0  =  x
-gcd x y  =  y
-
-gcd 0 0  =  0 `mod` 0
-gcd 0 x  =  x
-gcd x 0  =  x
-gcd x y  =  0
-
-gcd 0 0  =  0 `mod` 0
-gcd 0 x  =  x
-gcd x 0  =  0
-gcd x y  =  x
-
-gcd 0 0  =  0 `mod` 0
-gcd 0 x  =  x
-gcd x 0  =  0
-gcd x y  =  y
-
-gcd 0 0  =  0 `mod` 0
-gcd 0 x  =  x
-gcd x 0  =  0
-gcd x y  =  0
-
-gcd 0 0  =  0 `mod` 0
-gcd 0 x  =  0
-gcd x 0  =  x
-gcd x y  =  x
-
-gcd 0 0  =  0 `mod` 0
-gcd 0 x  =  0
-gcd x 0  =  x
-gcd x y  =  y
-
-gcd 0 0  =  0 `mod` 0
-gcd 0 x  =  0
-gcd x 0  =  x
-gcd x y  =  0
-
-gcd 0 0  =  0 `mod` 0
-gcd 0 x  =  0
-gcd x 0  =  0
-gcd x y  =  x
-
-gcd 0 0  =  0 `mod` 0
-gcd 0 x  =  0
-gcd x 0  =  0
-gcd x y  =  y
-
-gcd 0 0  =  0 `mod` 0
-gcd 0 x  =  0
-gcd x 0  =  0
-gcd x y  =  0
-
-gcd x 0  =  x
-gcd x y  =  gcd x (x `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  gcd x (y `mod` x)
-
-gcd x 0  =  x
-gcd x y  =  gcd x (y `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  gcd x (0 `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  gcd y (x `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  gcd y (y `mod` x)
-
-gcd x 0  =  x
-gcd x y  =  gcd y (y `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  gcd y (0 `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  gcd 0 (x `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  gcd 0 (y `mod` x)
-
-gcd x 0  =  x
-gcd x y  =  gcd 0 (y `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  gcd 0 (0 `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  gcd (x `mod` x) x
-
-gcd x 0  =  x
-gcd x y  =  gcd (x `mod` x) y
-
-gcd x 0  =  x
-gcd x y  =  gcd (x `mod` x) 0
-
-gcd x 0  =  x
-gcd x y  =  gcd (x `mod` y) x
-
-gcd x 0  =  x
-gcd x y  =  gcd (x `mod` y) y
-
-gcd x 0  =  x
-gcd x y  =  gcd (x `mod` y) 0
-
-gcd x 0  =  x
-gcd x y  =  gcd (y `mod` x) x
-
-gcd x 0  =  x
-gcd x y  =  gcd (y `mod` x) y
-
-gcd x 0  =  x
-gcd x y  =  gcd (y `mod` x) 0
-
-gcd x 0  =  x
-gcd x y  =  gcd (0 `mod` x) x
-
-gcd x 0  =  x
-gcd x y  =  gcd (0 `mod` x) y
-
-gcd x 0  =  x
-gcd x y  =  gcd (0 `mod` x) 0
-
-gcd x 0  =  0
-gcd x y  =  gcd x (x `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  gcd x (y `mod` x)
-
-gcd x 0  =  0
-gcd x y  =  gcd x (y `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  gcd x (0 `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  gcd y (x `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  gcd y (y `mod` x)
-
-gcd x 0  =  0
-gcd x y  =  gcd y (y `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  gcd y (0 `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  gcd 0 (x `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  gcd 0 (y `mod` x)
-
-gcd x 0  =  0
-gcd x y  =  gcd 0 (y `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  gcd 0 (0 `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  gcd (x `mod` x) x
-
-gcd x 0  =  0
-gcd x y  =  gcd (x `mod` x) y
-
-gcd x 0  =  0
-gcd x y  =  gcd (x `mod` x) 0
-
-gcd x 0  =  0
-gcd x y  =  gcd (x `mod` y) x
-
-gcd x 0  =  0
-gcd x y  =  gcd (x `mod` y) y
-
-gcd x 0  =  0
-gcd x y  =  gcd (x `mod` y) 0
-
-gcd x 0  =  0
-gcd x y  =  gcd (y `mod` x) x
-
-gcd x 0  =  0
-gcd x y  =  gcd (y `mod` x) y
-
-gcd x 0  =  0
-gcd x y  =  gcd (y `mod` x) 0
-
-gcd x 0  =  0
-gcd x y  =  gcd (0 `mod` x) x
-
-gcd x 0  =  0
-gcd x y  =  gcd (0 `mod` x) y
-
-gcd x 0  =  0
-gcd x y  =  gcd (0 `mod` x) 0
-
-gcd 0 x  =  x
-gcd x y  =  gcd x (x `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  gcd x (y `mod` x)
-
-gcd 0 x  =  x
-gcd x y  =  gcd x (y `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  gcd x (0 `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  gcd y (x `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  gcd y (y `mod` x)
-
-gcd 0 x  =  x
-gcd x y  =  gcd y (y `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  gcd y (0 `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  gcd 0 (x `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  gcd 0 (y `mod` x)
-
-gcd 0 x  =  x
-gcd x y  =  gcd 0 (y `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  gcd 0 (0 `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  gcd (x `mod` x) x
-
-gcd 0 x  =  x
-gcd x y  =  gcd (x `mod` x) y
-
-gcd 0 x  =  x
-gcd x y  =  gcd (x `mod` x) 0
-
-gcd 0 x  =  x
-gcd x y  =  gcd (x `mod` y) x
-
-gcd 0 x  =  x
-gcd x y  =  gcd (x `mod` y) y
-
-gcd 0 x  =  x
-gcd x y  =  gcd (x `mod` y) 0
-
-gcd 0 x  =  x
-gcd x y  =  gcd (y `mod` x) x
-
-gcd 0 x  =  x
-gcd x y  =  gcd (y `mod` x) y
-
-gcd 0 x  =  x
-gcd x y  =  gcd (y `mod` x) 0
-
-gcd 0 x  =  x
-gcd x y  =  gcd (0 `mod` x) x
-
-gcd 0 x  =  x
-gcd x y  =  gcd (0 `mod` x) y
-
-gcd 0 x  =  x
-gcd x y  =  gcd (0 `mod` x) 0
-
-gcd 0 x  =  0
-gcd x y  =  gcd x (x `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  gcd x (y `mod` x)
-
-gcd 0 x  =  0
-gcd x y  =  gcd x (y `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  gcd x (0 `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  gcd y (x `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  gcd y (y `mod` x)
-
-gcd 0 x  =  0
-gcd x y  =  gcd y (y `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  gcd y (0 `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  gcd 0 (x `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  gcd 0 (y `mod` x)
-
-gcd 0 x  =  0
-gcd x y  =  gcd 0 (y `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  gcd 0 (0 `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  gcd (x `mod` x) x
-
-gcd 0 x  =  0
-gcd x y  =  gcd (x `mod` x) y
-
-gcd 0 x  =  0
-gcd x y  =  gcd (x `mod` x) 0
-
-gcd 0 x  =  0
-gcd x y  =  gcd (x `mod` y) x
-
-gcd 0 x  =  0
-gcd x y  =  gcd (x `mod` y) y
-
-gcd 0 x  =  0
-gcd x y  =  gcd (x `mod` y) 0
-
-gcd 0 x  =  0
-gcd x y  =  gcd (y `mod` x) x
-
-gcd 0 x  =  0
-gcd x y  =  gcd (y `mod` x) y
-
-gcd 0 x  =  0
-gcd x y  =  gcd (y `mod` x) 0
-
-gcd 0 x  =  0
-gcd x y  =  gcd (0 `mod` x) x
-
-gcd 0 x  =  0
-gcd x y  =  gcd (0 `mod` x) y
-
-gcd 0 x  =  0
-gcd x y  =  gcd (0 `mod` x) 0
-
-gcd x 0  =  x
-gcd x y  =  (x `mod` x) `mod` x
-
-gcd x 0  =  x
-gcd x y  =  (x `mod` x) `mod` y
-
-gcd x 0  =  x
-gcd x y  =  (x `mod` x) `mod` 0
-
-gcd x 0  =  x
-gcd x y  =  (x `mod` y) `mod` x
-
-gcd x 0  =  x
-gcd x y  =  (x `mod` y) `mod` y
-
-gcd x 0  =  x
-gcd x y  =  (x `mod` y) `mod` 0
-
-gcd x 0  =  x
-gcd x y  =  (x `mod` 0) `mod` x
-
-gcd x 0  =  x
-gcd x y  =  (x `mod` 0) `mod` y
-
-gcd x 0  =  x
-gcd x y  =  (x `mod` 0) `mod` 0
-
-gcd x 0  =  x
-gcd x y  =  (y `mod` x) `mod` x
-
-gcd x 0  =  x
-gcd x y  =  (y `mod` x) `mod` y
-
-gcd x 0  =  x
-gcd x y  =  (y `mod` x) `mod` 0
-
-gcd x 0  =  x
-gcd x y  =  (y `mod` y) `mod` x
-
-gcd x 0  =  x
-gcd x y  =  (y `mod` y) `mod` y
-
-gcd x 0  =  x
-gcd x y  =  (y `mod` y) `mod` 0
-
-gcd x 0  =  x
-gcd x y  =  (y `mod` 0) `mod` x
-
-gcd x 0  =  x
-gcd x y  =  (y `mod` 0) `mod` y
-
-gcd x 0  =  x
-gcd x y  =  (y `mod` 0) `mod` 0
-
-gcd x 0  =  x
-gcd x y  =  (0 `mod` x) `mod` x
-
-gcd x 0  =  x
-gcd x y  =  (0 `mod` x) `mod` y
-
-gcd x 0  =  x
-gcd x y  =  (0 `mod` x) `mod` 0
-
-gcd x 0  =  x
-gcd x y  =  (0 `mod` y) `mod` x
-
-gcd x 0  =  x
-gcd x y  =  (0 `mod` y) `mod` y
-
-gcd x 0  =  x
-gcd x y  =  (0 `mod` y) `mod` 0
-
-gcd x 0  =  x
-gcd x y  =  (0 `mod` 0) `mod` x
-
-gcd x 0  =  x
-gcd x y  =  (0 `mod` 0) `mod` y
-
-gcd x 0  =  x
-gcd x y  =  (0 `mod` 0) `mod` 0
-
-gcd x 0  =  x
-gcd x y  =  x `mod` (x `mod` x)
-
-gcd x 0  =  x
-gcd x y  =  x `mod` (x `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  x `mod` (x `mod` 0)
-
-gcd x 0  =  x
-gcd x y  =  x `mod` (y `mod` x)
-
-gcd x 0  =  x
-gcd x y  =  x `mod` (y `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  x `mod` (y `mod` 0)
-
-gcd x 0  =  x
-gcd x y  =  x `mod` (0 `mod` x)
-
-gcd x 0  =  x
-gcd x y  =  x `mod` (0 `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  x `mod` (0 `mod` 0)
-
-gcd x 0  =  x
-gcd x y  =  y `mod` (x `mod` x)
-
-gcd x 0  =  x
-gcd x y  =  y `mod` (x `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  y `mod` (x `mod` 0)
-
-gcd x 0  =  x
-gcd x y  =  y `mod` (y `mod` x)
-
-gcd x 0  =  x
-gcd x y  =  y `mod` (y `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  y `mod` (y `mod` 0)
-
-gcd x 0  =  x
-gcd x y  =  y `mod` (0 `mod` x)
-
-gcd x 0  =  x
-gcd x y  =  y `mod` (0 `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  y `mod` (0 `mod` 0)
-
-gcd x 0  =  x
-gcd x y  =  0 `mod` (x `mod` x)
-
-gcd x 0  =  x
-gcd x y  =  0 `mod` (x `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  0 `mod` (x `mod` 0)
-
-gcd x 0  =  x
-gcd x y  =  0 `mod` (y `mod` x)
-
-gcd x 0  =  x
-gcd x y  =  0 `mod` (y `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  0 `mod` (y `mod` 0)
-
-gcd x 0  =  x
-gcd x y  =  0 `mod` (0 `mod` x)
-
-gcd x 0  =  x
-gcd x y  =  0 `mod` (0 `mod` y)
-
-gcd x 0  =  x
-gcd x y  =  0 `mod` (0 `mod` 0)
-
-gcd x 0  =  0
-gcd x y  =  (x `mod` x) `mod` x
-
-gcd x 0  =  0
-gcd x y  =  (x `mod` x) `mod` y
-
-gcd x 0  =  0
-gcd x y  =  (x `mod` x) `mod` 0
-
-gcd x 0  =  0
-gcd x y  =  (x `mod` y) `mod` x
-
-gcd x 0  =  0
-gcd x y  =  (x `mod` y) `mod` y
-
-gcd x 0  =  0
-gcd x y  =  (x `mod` y) `mod` 0
-
-gcd x 0  =  0
-gcd x y  =  (x `mod` 0) `mod` x
-
-gcd x 0  =  0
-gcd x y  =  (x `mod` 0) `mod` y
-
-gcd x 0  =  0
-gcd x y  =  (x `mod` 0) `mod` 0
-
-gcd x 0  =  0
-gcd x y  =  (y `mod` x) `mod` x
-
-gcd x 0  =  0
-gcd x y  =  (y `mod` x) `mod` y
-
-gcd x 0  =  0
-gcd x y  =  (y `mod` x) `mod` 0
-
-gcd x 0  =  0
-gcd x y  =  (y `mod` y) `mod` x
-
-gcd x 0  =  0
-gcd x y  =  (y `mod` y) `mod` y
-
-gcd x 0  =  0
-gcd x y  =  (y `mod` y) `mod` 0
-
-gcd x 0  =  0
-gcd x y  =  (y `mod` 0) `mod` x
-
-gcd x 0  =  0
-gcd x y  =  (y `mod` 0) `mod` y
-
-gcd x 0  =  0
-gcd x y  =  (y `mod` 0) `mod` 0
-
-gcd x 0  =  0
-gcd x y  =  (0 `mod` x) `mod` x
-
-gcd x 0  =  0
-gcd x y  =  (0 `mod` x) `mod` y
-
-gcd x 0  =  0
-gcd x y  =  (0 `mod` x) `mod` 0
-
-gcd x 0  =  0
-gcd x y  =  (0 `mod` y) `mod` x
-
-gcd x 0  =  0
-gcd x y  =  (0 `mod` y) `mod` y
-
-gcd x 0  =  0
-gcd x y  =  (0 `mod` y) `mod` 0
-
-gcd x 0  =  0
-gcd x y  =  (0 `mod` 0) `mod` x
-
-gcd x 0  =  0
-gcd x y  =  (0 `mod` 0) `mod` y
-
-gcd x 0  =  0
-gcd x y  =  (0 `mod` 0) `mod` 0
-
-gcd x 0  =  0
-gcd x y  =  x `mod` (x `mod` x)
-
-gcd x 0  =  0
-gcd x y  =  x `mod` (x `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  x `mod` (x `mod` 0)
-
-gcd x 0  =  0
-gcd x y  =  x `mod` (y `mod` x)
-
-gcd x 0  =  0
-gcd x y  =  x `mod` (y `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  x `mod` (y `mod` 0)
-
-gcd x 0  =  0
-gcd x y  =  x `mod` (0 `mod` x)
-
-gcd x 0  =  0
-gcd x y  =  x `mod` (0 `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  x `mod` (0 `mod` 0)
-
-gcd x 0  =  0
-gcd x y  =  y `mod` (x `mod` x)
-
-gcd x 0  =  0
-gcd x y  =  y `mod` (x `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  y `mod` (x `mod` 0)
-
-gcd x 0  =  0
-gcd x y  =  y `mod` (y `mod` x)
-
-gcd x 0  =  0
-gcd x y  =  y `mod` (y `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  y `mod` (y `mod` 0)
-
-gcd x 0  =  0
-gcd x y  =  y `mod` (0 `mod` x)
-
-gcd x 0  =  0
-gcd x y  =  y `mod` (0 `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  y `mod` (0 `mod` 0)
-
-gcd x 0  =  0
-gcd x y  =  0 `mod` (x `mod` x)
-
-gcd x 0  =  0
-gcd x y  =  0 `mod` (x `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  0 `mod` (x `mod` 0)
-
-gcd x 0  =  0
-gcd x y  =  0 `mod` (y `mod` x)
-
-gcd x 0  =  0
-gcd x y  =  0 `mod` (y `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  0 `mod` (y `mod` 0)
-
-gcd x 0  =  0
-gcd x y  =  0 `mod` (0 `mod` x)
-
-gcd x 0  =  0
-gcd x y  =  0 `mod` (0 `mod` y)
-
-gcd x 0  =  0
-gcd x y  =  0 `mod` (0 `mod` 0)
-
-gcd x 0  =  x `mod` x
-gcd x y  =  x `mod` y
-
-gcd x 0  =  x `mod` x
-gcd x y  =  x `mod` 0
-
-gcd x 0  =  x `mod` x
-gcd x y  =  y `mod` x
-
-gcd x 0  =  x `mod` x
-gcd x y  =  y `mod` y
-
-gcd x 0  =  x `mod` x
-gcd x y  =  y `mod` 0
-
-gcd x 0  =  x `mod` x
-gcd x y  =  0 `mod` x
-
-gcd x 0  =  x `mod` x
-gcd x y  =  0 `mod` y
-
-gcd x 0  =  x `mod` x
-gcd x y  =  0 `mod` 0
-
-gcd x 0  =  x `mod` 0
-gcd x y  =  x `mod` x
-
-gcd x 0  =  x `mod` 0
-gcd x y  =  x `mod` y
-
-gcd x 0  =  x `mod` 0
-gcd x y  =  y `mod` x
-
-gcd x 0  =  x `mod` 0
-gcd x y  =  y `mod` y
-
-gcd x 0  =  x `mod` 0
-gcd x y  =  y `mod` 0
-
-gcd x 0  =  x `mod` 0
-gcd x y  =  0 `mod` x
-
-gcd x 0  =  x `mod` 0
-gcd x y  =  0 `mod` y
-
-gcd x 0  =  x `mod` 0
-gcd x y  =  0 `mod` 0
-
-gcd x 0  =  0 `mod` x
-gcd x y  =  x `mod` x
-
-gcd x 0  =  0 `mod` x
-gcd x y  =  x `mod` y
-
-gcd x 0  =  0 `mod` x
-gcd x y  =  x `mod` 0
-
-gcd x 0  =  0 `mod` x
-gcd x y  =  y `mod` x
-
-gcd x 0  =  0 `mod` x
-gcd x y  =  y `mod` y
-
-gcd x 0  =  0 `mod` x
-gcd x y  =  y `mod` 0
-
-gcd x 0  =  0 `mod` x
-gcd x y  =  0 `mod` y
-
-gcd x 0  =  0 `mod` x
-gcd x y  =  0 `mod` 0
-
-gcd x 0  =  0 `mod` 0
-gcd x y  =  x `mod` x
-
-gcd x 0  =  0 `mod` 0
-gcd x y  =  x `mod` y
-
-gcd x 0  =  0 `mod` 0
-gcd x y  =  x `mod` 0
-
-gcd x 0  =  0 `mod` 0
-gcd x y  =  y `mod` x
-
-gcd x 0  =  0 `mod` 0
-gcd x y  =  y `mod` y
-
-gcd x 0  =  0 `mod` 0
-gcd x y  =  y `mod` 0
-
-gcd x 0  =  0 `mod` 0
-gcd x y  =  0 `mod` x
-
-gcd x 0  =  0 `mod` 0
-gcd x y  =  0 `mod` y
-
-gcd x 0  =  (x `mod` x) `mod` x
-gcd x y  =  x
-
-gcd x 0  =  (x `mod` x) `mod` x
-gcd x y  =  y
-
-gcd x 0  =  (x `mod` x) `mod` x
-gcd x y  =  0
-
-gcd x 0  =  (x `mod` x) `mod` 0
-gcd x y  =  x
-
-gcd x 0  =  (x `mod` x) `mod` 0
-gcd x y  =  y
-
-gcd x 0  =  (x `mod` x) `mod` 0
-gcd x y  =  0
-
-gcd x 0  =  (x `mod` 0) `mod` x
-gcd x y  =  x
-
-gcd x 0  =  (x `mod` 0) `mod` x
-gcd x y  =  y
-
-gcd x 0  =  (x `mod` 0) `mod` x
-gcd x y  =  0
-
-gcd x 0  =  (x `mod` 0) `mod` 0
-gcd x y  =  x
-
-gcd x 0  =  (x `mod` 0) `mod` 0
-gcd x y  =  y
-
-gcd x 0  =  (x `mod` 0) `mod` 0
-gcd x y  =  0
-
-gcd x 0  =  (0 `mod` x) `mod` x
-gcd x y  =  x
-
-gcd x 0  =  (0 `mod` x) `mod` x
-gcd x y  =  y
-
-gcd x 0  =  (0 `mod` x) `mod` x
-gcd x y  =  0
-
-gcd x 0  =  (0 `mod` x) `mod` 0
-gcd x y  =  x
-
-gcd x 0  =  (0 `mod` x) `mod` 0
-gcd x y  =  y
-
-gcd x 0  =  (0 `mod` x) `mod` 0
-gcd x y  =  0
-
-gcd x 0  =  (0 `mod` 0) `mod` x
-gcd x y  =  x
-
-gcd x 0  =  (0 `mod` 0) `mod` x
-gcd x y  =  y
-
-gcd x 0  =  (0 `mod` 0) `mod` x
-gcd x y  =  0
-
-gcd x 0  =  (0 `mod` 0) `mod` 0
-gcd x y  =  x
-
-gcd x 0  =  (0 `mod` 0) `mod` 0
-gcd x y  =  y
-
-gcd x 0  =  (0 `mod` 0) `mod` 0
-gcd x y  =  0
-
-gcd x 0  =  x `mod` (x `mod` x)
-gcd x y  =  x
-
-gcd x 0  =  x `mod` (x `mod` x)
-gcd x y  =  y
-
-gcd x 0  =  x `mod` (x `mod` x)
-gcd x y  =  0
-
-gcd x 0  =  x `mod` (x `mod` 0)
-gcd x y  =  x
-
-gcd x 0  =  x `mod` (x `mod` 0)
-gcd x y  =  y
-
-gcd x 0  =  x `mod` (x `mod` 0)
-gcd x y  =  0
-
-gcd x 0  =  x `mod` (0 `mod` x)
-gcd x y  =  x
-
-gcd x 0  =  x `mod` (0 `mod` x)
-gcd x y  =  y
-
-gcd x 0  =  x `mod` (0 `mod` x)
-gcd x y  =  0
-
-gcd x 0  =  x `mod` (0 `mod` 0)
-gcd x y  =  x
-
-gcd x 0  =  x `mod` (0 `mod` 0)
-gcd x y  =  y
-
-gcd x 0  =  x `mod` (0 `mod` 0)
-gcd x y  =  0
-
-gcd x 0  =  0 `mod` (x `mod` x)
-gcd x y  =  x
-
-gcd x 0  =  0 `mod` (x `mod` x)
-gcd x y  =  y
-
-gcd x 0  =  0 `mod` (x `mod` x)
-gcd x y  =  0
-
-gcd x 0  =  0 `mod` (x `mod` 0)
-gcd x y  =  x
-
-gcd x 0  =  0 `mod` (x `mod` 0)
-gcd x y  =  y
-
-gcd x 0  =  0 `mod` (x `mod` 0)
-gcd x y  =  0
-
-gcd x 0  =  0 `mod` (0 `mod` x)
-gcd x y  =  x
-
-gcd x 0  =  0 `mod` (0 `mod` x)
-gcd x y  =  y
-
-gcd x 0  =  0 `mod` (0 `mod` x)
-gcd x y  =  0
-
-gcd x 0  =  0 `mod` (0 `mod` 0)
-gcd x y  =  x
-
-gcd x 0  =  0 `mod` (0 `mod` 0)
-gcd x y  =  y
-
-gcd x 0  =  0 `mod` (0 `mod` 0)
-gcd x y  =  0
-
-gcd 0 x  =  x
-gcd x y  =  (x `mod` x) `mod` x
-
-gcd 0 x  =  x
-gcd x y  =  (x `mod` x) `mod` y
-
-gcd 0 x  =  x
-gcd x y  =  (x `mod` x) `mod` 0
-
-gcd 0 x  =  x
-gcd x y  =  (x `mod` y) `mod` x
-
-gcd 0 x  =  x
-gcd x y  =  (x `mod` y) `mod` y
-
-gcd 0 x  =  x
-gcd x y  =  (x `mod` y) `mod` 0
-
-gcd 0 x  =  x
-gcd x y  =  (x `mod` 0) `mod` x
-
-gcd 0 x  =  x
-gcd x y  =  (x `mod` 0) `mod` y
-
-gcd 0 x  =  x
-gcd x y  =  (x `mod` 0) `mod` 0
-
-gcd 0 x  =  x
-gcd x y  =  (y `mod` x) `mod` x
-
-gcd 0 x  =  x
-gcd x y  =  (y `mod` x) `mod` y
-
-gcd 0 x  =  x
-gcd x y  =  (y `mod` x) `mod` 0
-
-gcd 0 x  =  x
-gcd x y  =  (y `mod` y) `mod` x
-
-gcd 0 x  =  x
-gcd x y  =  (y `mod` y) `mod` y
-
-gcd 0 x  =  x
-gcd x y  =  (y `mod` y) `mod` 0
-
-gcd 0 x  =  x
-gcd x y  =  (y `mod` 0) `mod` x
-
-gcd 0 x  =  x
-gcd x y  =  (y `mod` 0) `mod` y
-
-gcd 0 x  =  x
-gcd x y  =  (y `mod` 0) `mod` 0
-
-gcd 0 x  =  x
-gcd x y  =  (0 `mod` x) `mod` x
-
-gcd 0 x  =  x
-gcd x y  =  (0 `mod` x) `mod` y
-
-gcd 0 x  =  x
-gcd x y  =  (0 `mod` x) `mod` 0
-
-gcd 0 x  =  x
-gcd x y  =  (0 `mod` y) `mod` x
-
-gcd 0 x  =  x
-gcd x y  =  (0 `mod` y) `mod` y
-
-gcd 0 x  =  x
-gcd x y  =  (0 `mod` y) `mod` 0
-
-gcd 0 x  =  x
-gcd x y  =  (0 `mod` 0) `mod` x
-
-gcd 0 x  =  x
-gcd x y  =  (0 `mod` 0) `mod` y
-
-gcd 0 x  =  x
-gcd x y  =  (0 `mod` 0) `mod` 0
-
-gcd 0 x  =  x
-gcd x y  =  x `mod` (x `mod` x)
-
-gcd 0 x  =  x
-gcd x y  =  x `mod` (x `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  x `mod` (x `mod` 0)
-
-gcd 0 x  =  x
-gcd x y  =  x `mod` (y `mod` x)
-
-gcd 0 x  =  x
-gcd x y  =  x `mod` (y `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  x `mod` (y `mod` 0)
-
-gcd 0 x  =  x
-gcd x y  =  x `mod` (0 `mod` x)
-
-gcd 0 x  =  x
-gcd x y  =  x `mod` (0 `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  x `mod` (0 `mod` 0)
-
-gcd 0 x  =  x
-gcd x y  =  y `mod` (x `mod` x)
-
-gcd 0 x  =  x
-gcd x y  =  y `mod` (x `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  y `mod` (x `mod` 0)
-
-gcd 0 x  =  x
-gcd x y  =  y `mod` (y `mod` x)
-
-gcd 0 x  =  x
-gcd x y  =  y `mod` (y `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  y `mod` (y `mod` 0)
-
-gcd 0 x  =  x
-gcd x y  =  y `mod` (0 `mod` x)
-
-gcd 0 x  =  x
-gcd x y  =  y `mod` (0 `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  y `mod` (0 `mod` 0)
-
-gcd 0 x  =  x
-gcd x y  =  0 `mod` (x `mod` x)
-
-gcd 0 x  =  x
-gcd x y  =  0 `mod` (x `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  0 `mod` (x `mod` 0)
-
-gcd 0 x  =  x
-gcd x y  =  0 `mod` (y `mod` x)
-
-gcd 0 x  =  x
-gcd x y  =  0 `mod` (y `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  0 `mod` (y `mod` 0)
-
-gcd 0 x  =  x
-gcd x y  =  0 `mod` (0 `mod` x)
-
-gcd 0 x  =  x
-gcd x y  =  0 `mod` (0 `mod` y)
-
-gcd 0 x  =  x
-gcd x y  =  0 `mod` (0 `mod` 0)
-
-gcd 0 x  =  0
-gcd x y  =  (x `mod` x) `mod` x
-
-gcd 0 x  =  0
-gcd x y  =  (x `mod` x) `mod` y
-
-gcd 0 x  =  0
-gcd x y  =  (x `mod` x) `mod` 0
-
-gcd 0 x  =  0
-gcd x y  =  (x `mod` y) `mod` x
-
-gcd 0 x  =  0
-gcd x y  =  (x `mod` y) `mod` y
-
-gcd 0 x  =  0
-gcd x y  =  (x `mod` y) `mod` 0
-
-gcd 0 x  =  0
-gcd x y  =  (x `mod` 0) `mod` x
-
-gcd 0 x  =  0
-gcd x y  =  (x `mod` 0) `mod` y
-
-gcd 0 x  =  0
-gcd x y  =  (x `mod` 0) `mod` 0
-
-gcd 0 x  =  0
-gcd x y  =  (y `mod` x) `mod` x
-
-gcd 0 x  =  0
-gcd x y  =  (y `mod` x) `mod` y
-
-gcd 0 x  =  0
-gcd x y  =  (y `mod` x) `mod` 0
-
-gcd 0 x  =  0
-gcd x y  =  (y `mod` y) `mod` x
-
-gcd 0 x  =  0
-gcd x y  =  (y `mod` y) `mod` y
-
-gcd 0 x  =  0
-gcd x y  =  (y `mod` y) `mod` 0
-
-gcd 0 x  =  0
-gcd x y  =  (y `mod` 0) `mod` x
-
-gcd 0 x  =  0
-gcd x y  =  (y `mod` 0) `mod` y
-
-gcd 0 x  =  0
-gcd x y  =  (y `mod` 0) `mod` 0
-
-gcd 0 x  =  0
-gcd x y  =  (0 `mod` x) `mod` x
-
-gcd 0 x  =  0
-gcd x y  =  (0 `mod` x) `mod` y
-
-gcd 0 x  =  0
-gcd x y  =  (0 `mod` x) `mod` 0
-
-gcd 0 x  =  0
-gcd x y  =  (0 `mod` y) `mod` x
-
-gcd 0 x  =  0
-gcd x y  =  (0 `mod` y) `mod` y
-
-gcd 0 x  =  0
-gcd x y  =  (0 `mod` y) `mod` 0
-
-gcd 0 x  =  0
-gcd x y  =  (0 `mod` 0) `mod` x
-
-gcd 0 x  =  0
-gcd x y  =  (0 `mod` 0) `mod` y
-
-gcd 0 x  =  0
-gcd x y  =  (0 `mod` 0) `mod` 0
-
-gcd 0 x  =  0
-gcd x y  =  x `mod` (x `mod` x)
-
-gcd 0 x  =  0
-gcd x y  =  x `mod` (x `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  x `mod` (x `mod` 0)
-
-gcd 0 x  =  0
-gcd x y  =  x `mod` (y `mod` x)
-
-gcd 0 x  =  0
-gcd x y  =  x `mod` (y `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  x `mod` (y `mod` 0)
-
-gcd 0 x  =  0
-gcd x y  =  x `mod` (0 `mod` x)
-
-gcd 0 x  =  0
-gcd x y  =  x `mod` (0 `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  x `mod` (0 `mod` 0)
-
-gcd 0 x  =  0
-gcd x y  =  y `mod` (x `mod` x)
-
-gcd 0 x  =  0
-gcd x y  =  y `mod` (x `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  y `mod` (x `mod` 0)
-
-gcd 0 x  =  0
-gcd x y  =  y `mod` (y `mod` x)
-
-gcd 0 x  =  0
-gcd x y  =  y `mod` (y `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  y `mod` (y `mod` 0)
-
-gcd 0 x  =  0
-gcd x y  =  y `mod` (0 `mod` x)
-
-gcd 0 x  =  0
-gcd x y  =  y `mod` (0 `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  y `mod` (0 `mod` 0)
-
-gcd 0 x  =  0
-gcd x y  =  0 `mod` (x `mod` x)
-
-gcd 0 x  =  0
-gcd x y  =  0 `mod` (x `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  0 `mod` (x `mod` 0)
-
-gcd 0 x  =  0
-gcd x y  =  0 `mod` (y `mod` x)
-
-gcd 0 x  =  0
-gcd x y  =  0 `mod` (y `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  0 `mod` (y `mod` 0)
-
-gcd 0 x  =  0
-gcd x y  =  0 `mod` (0 `mod` x)
-
-gcd 0 x  =  0
-gcd x y  =  0 `mod` (0 `mod` y)
-
-gcd 0 x  =  0
-gcd x y  =  0 `mod` (0 `mod` 0)
-
-gcd 0 x  =  x `mod` x
-gcd x y  =  x `mod` y
-
-gcd 0 x  =  x `mod` x
-gcd x y  =  x `mod` 0
-
-gcd 0 x  =  x `mod` x
-gcd x y  =  y `mod` x
-
-gcd 0 x  =  x `mod` x
-gcd x y  =  y `mod` 0
-
-gcd 0 x  =  x `mod` x
-gcd x y  =  0 `mod` x
-
-gcd 0 x  =  x `mod` x
-gcd x y  =  0 `mod` y
-
-gcd 0 x  =  x `mod` x
-gcd x y  =  0 `mod` 0
-
-gcd 0 x  =  x `mod` 0
-gcd x y  =  x `mod` x
-
-gcd 0 x  =  x `mod` 0
-gcd x y  =  x `mod` y
-
-gcd 0 x  =  x `mod` 0
-gcd x y  =  y `mod` x
-
-gcd 0 x  =  x `mod` 0
-gcd x y  =  y `mod` y
-
-gcd 0 x  =  x `mod` 0
-gcd x y  =  0 `mod` x
-
-gcd 0 x  =  x `mod` 0
-gcd x y  =  0 `mod` y
-
-gcd 0 x  =  x `mod` 0
-gcd x y  =  0 `mod` 0
-
-gcd 0 x  =  0 `mod` x
-gcd x y  =  x `mod` x
-
-gcd 0 x  =  0 `mod` x
-gcd x y  =  x `mod` y
-
-gcd 0 x  =  0 `mod` x
-gcd x y  =  x `mod` 0
-
-gcd 0 x  =  0 `mod` x
-gcd x y  =  y `mod` x
-
-gcd 0 x  =  0 `mod` x
-gcd x y  =  y `mod` y
-
-gcd 0 x  =  0 `mod` x
-gcd x y  =  y `mod` 0
-
-gcd 0 x  =  0 `mod` x
-gcd x y  =  0 `mod` 0
-
-gcd 0 x  =  0 `mod` 0
-gcd x y  =  x `mod` x
-
-gcd 0 x  =  0 `mod` 0
-gcd x y  =  x `mod` y
-
-gcd 0 x  =  0 `mod` 0
-gcd x y  =  x `mod` 0
-
-gcd 0 x  =  0 `mod` 0
-gcd x y  =  y `mod` x
-
-gcd 0 x  =  0 `mod` 0
-gcd x y  =  y `mod` y
-
-gcd 0 x  =  0 `mod` 0
-gcd x y  =  y `mod` 0
-
-gcd 0 x  =  0 `mod` 0
-gcd x y  =  0 `mod` x
-
-gcd 0 x  =  0 `mod` 0
-gcd x y  =  0 `mod` y
-
-gcd 0 x  =  (x `mod` x) `mod` x
-gcd x y  =  x
-
-gcd 0 x  =  (x `mod` x) `mod` x
-gcd x y  =  y
-
-gcd 0 x  =  (x `mod` x) `mod` x
-gcd x y  =  0
-
-gcd 0 x  =  (x `mod` x) `mod` 0
-gcd x y  =  x
-
-gcd 0 x  =  (x `mod` x) `mod` 0
-gcd x y  =  y
-
-gcd 0 x  =  (x `mod` x) `mod` 0
-gcd x y  =  0
-
-gcd 0 x  =  (x `mod` 0) `mod` x
-gcd x y  =  x
-
-gcd 0 x  =  (x `mod` 0) `mod` x
-gcd x y  =  y
-
-gcd 0 x  =  (x `mod` 0) `mod` x
-gcd x y  =  0
-
-gcd 0 x  =  (x `mod` 0) `mod` 0
-gcd x y  =  x
-
-gcd 0 x  =  (x `mod` 0) `mod` 0
-gcd x y  =  y
-
-gcd 0 x  =  (x `mod` 0) `mod` 0
-gcd x y  =  0
-
-gcd 0 x  =  (0 `mod` x) `mod` x
-gcd x y  =  x
-
-gcd 0 x  =  (0 `mod` x) `mod` x
-gcd x y  =  y
-
-gcd 0 x  =  (0 `mod` x) `mod` x
-gcd x y  =  0
-
-gcd 0 x  =  (0 `mod` x) `mod` 0
-gcd x y  =  x
-
-gcd 0 x  =  (0 `mod` x) `mod` 0
-gcd x y  =  y
-
-gcd 0 x  =  (0 `mod` x) `mod` 0
-gcd x y  =  0
-
-gcd 0 x  =  (0 `mod` 0) `mod` x
-gcd x y  =  x
-
-gcd 0 x  =  (0 `mod` 0) `mod` x
-gcd x y  =  y
-
-gcd 0 x  =  (0 `mod` 0) `mod` x
-gcd x y  =  0
-
-gcd 0 x  =  (0 `mod` 0) `mod` 0
-gcd x y  =  x
-
-gcd 0 x  =  (0 `mod` 0) `mod` 0
-gcd x y  =  y
-
-gcd 0 x  =  (0 `mod` 0) `mod` 0
-gcd x y  =  0
-
-gcd 0 x  =  x `mod` (x `mod` x)
-gcd x y  =  x
-
-gcd 0 x  =  x `mod` (x `mod` x)
-gcd x y  =  y
-
-gcd 0 x  =  x `mod` (x `mod` x)
-gcd x y  =  0
-
-gcd 0 x  =  x `mod` (x `mod` 0)
-gcd x y  =  x
-
-gcd 0 x  =  x `mod` (x `mod` 0)
-gcd x y  =  y
-
-gcd 0 x  =  x `mod` (x `mod` 0)
-gcd x y  =  0
-
-gcd 0 x  =  x `mod` (0 `mod` x)
-gcd x y  =  x
-
-gcd 0 x  =  x `mod` (0 `mod` x)
-gcd x y  =  y
-
-gcd 0 x  =  x `mod` (0 `mod` x)
-gcd x y  =  0
-
-gcd 0 x  =  x `mod` (0 `mod` 0)
-gcd x y  =  x
-
-gcd 0 x  =  x `mod` (0 `mod` 0)
-gcd x y  =  y
-
-gcd 0 x  =  x `mod` (0 `mod` 0)
-gcd x y  =  0
-
-gcd 0 x  =  0 `mod` (x `mod` x)
-gcd x y  =  x
-
-gcd 0 x  =  0 `mod` (x `mod` x)
-gcd x y  =  y
-
-gcd 0 x  =  0 `mod` (x `mod` x)
-gcd x y  =  0
-
-gcd 0 x  =  0 `mod` (x `mod` 0)
-gcd x y  =  x
-
-gcd 0 x  =  0 `mod` (x `mod` 0)
-gcd x y  =  y
-
-gcd 0 x  =  0 `mod` (x `mod` 0)
-gcd x y  =  0
-
-gcd 0 x  =  0 `mod` (0 `mod` x)
-gcd x y  =  x
-
-gcd 0 x  =  0 `mod` (0 `mod` x)
-gcd x y  =  y
-
-gcd 0 x  =  0 `mod` (0 `mod` x)
-gcd x y  =  0
-
-gcd 0 x  =  0 `mod` (0 `mod` 0)
-gcd x y  =  x
-
-gcd 0 x  =  0 `mod` (0 `mod` 0)
-gcd x y  =  y
-
-gcd 0 x  =  0 `mod` (0 `mod` 0)
+  [3,0,7,0,19,0,90,0,454] direct candidates, 0 duplicates
+  [3,3,8,13,29,52,139,212,629] pattern candidates, 0 duplicates
+
+rules:
+x * y == x + y
+x * y == y + x
+x - x == 0
+x + 0 == x
+0 + x == x
+x - 0 == x
+(x + y) + z == x + (y + z)
+(x + y) + z == y + (x + z)
+x - (y - z) == z + (x - y)
+(x - y) - z == x - (y + z)
+(x - y) - z == x - (z + y)
+(x + y) - z == x + (y - z)
+(x + y) - z == y + (x - z)
+x + (y - x) == y
+(x - y) + y == x
+equations:
+y + x == x + y
+y + (x + z) == x + (y + z)
+z + (x + y) == x + (y + z)
+z + (y + x) == x + (y + z)
+y + (x - z) == x + (y - z)
+(x - z) + y == x + (y - z)
+(z - y) + x == (x - y) + z
+y - (x + y) == 0 - x
+y - (y + x) == 0 - x
+z - (y + z) == x - (x + y)
+z - (y + z) == x - (y + x)
+z - (z + y) == x - (x + y)
+z - (z + y) == x - (y + x)
+x + (0 - y) == x - y
+(0 - y) + x == x - y
+x - (x + 1) == 0 - 1
+x - (1 + x) == 0 - 1
+y - (y + 1) == x - (x + 1)
+y - (y + 1) == x - (1 + x)
+y - (1 + y) == x - (1 + x)
+
+direct candidates:
+
+foo x  =  x
+
+foo x  =  0
+
+foo x  =  1
+
+foo x  =  x + x
+
+foo x  =  x + 1
+
+foo x  =  1 + 1
+
+foo x  =  x - 1
+
+foo x  =  0 - x
+
+foo x  =  0 - 1
+
+foo x  =  1 - x
+
+foo x  =  x + (x + x)
+
+foo x  =  x + (x + 1)
+
+foo x  =  x + (1 + 1)
+
+foo x  =  x + (x - 1)
+
+foo x  =  x + (0 - 1)
+
+foo x  =  1 + (x + x)
+
+foo x  =  1 + (x + 1)
+
+foo x  =  1 + (1 + 1)
+
+foo x  =  1 + (0 - x)
+
+foo x  =  1 + (1 - x)
+
+foo x  =  x - (x + x)
+
+foo x  =  x - (x + 1)
+
+foo x  =  x - (1 + 1)
+
+foo x  =  0 - (x + x)
+
+foo x  =  0 - (x + 1)
+
+foo x  =  0 - (1 + 1)
+
+foo x  =  1 - (x + x)
+
+foo x  =  1 - (x + 1)
+
+foo x  =  1 - (1 + 1)
+
+
+pattern candidates:
+
+foo x  =  x
+
+foo x  =  0
+
+foo x  =  1
+
+foo 0  =  0
+foo x  =  1
+
+foo 0  =  1
+foo x  =  x
+
+foo 0  =  1
+foo x  =  0
+
+foo x  =  x + x
+
+foo x  =  x + 1
+
+foo x  =  x - 1
+
+foo x  =  0 - x
+
+foo x  =  1 - x
+
+foo 1  =  0
+foo x  =  x
+
+foo 1  =  0
+foo x  =  1
+
+foo 1  =  1
+foo x  =  0
+
+foo 0  =  0
+foo x  =  x + x
+
+foo 0  =  0
+foo x  =  x + 1
+
+foo 0  =  0
+foo x  =  x - 1
+
+foo 0  =  0
+foo x  =  0 - x
+
+foo 0  =  0
+foo x  =  1 - x
+
+foo 0  =  1
+foo x  =  x + x
+
+foo 0  =  1
+foo x  =  x + 1
+
+foo 0  =  1
+foo x  =  x - 1
+
+foo 0  =  1
+foo x  =  0 - x
+
+foo 0  =  1
+foo x  =  1 - x
+
+foo 0  =  0
+foo 1  =  0
+foo x  =  1
+
+foo 0  =  1
+foo 1  =  0
+foo x  =  x
+
+foo 0  =  1
+foo 1  =  1
+foo x  =  0
+
+foo 0  =  0
+foo x  =  foo (x - 1)
+
+foo 0  =  0
+foo x  =  foo (0 - x)
+
+foo 0  =  0
+foo x  =  foo (1 - x)
+
+foo 0  =  1
+foo x  =  foo (x - 1)
+
+foo 0  =  1
+foo x  =  foo (0 - x)
+
+foo 0  =  1
+foo x  =  foo (1 - x)
+
+foo x  =  x + (x + x)
+
+foo x  =  x + (x + 1)
+
+foo x  =  x + (x - 1)
+
+foo x  =  1 + (x + x)
+
+foo x  =  1 + (x + 1)
+
+foo x  =  1 + (0 - x)
+
+foo x  =  1 + (1 - x)
+
+foo x  =  x - (x + x)
+
+foo x  =  x - (x + 1)
+
+foo x  =  0 - (x + x)
+
+foo x  =  0 - (x + 1)
+
+foo x  =  1 - (x + x)
+
+foo x  =  1 - (x + 1)
+
+foo 1  =  0
+foo x  =  x + x
+
+foo 1  =  0
+foo x  =  x + 1
+
+foo 1  =  0
+foo x  =  x - 1
+
+foo 1  =  0
+foo x  =  0 - x
+
+foo 1  =  0
+foo x  =  1 - x
+
+foo 1  =  1
+foo x  =  x + x
+
+foo 1  =  1
+foo x  =  x + 1
+
+foo 1  =  1
+foo x  =  x - 1
+
+foo 1  =  1
+foo x  =  0 - x
+
+foo 1  =  1
+foo x  =  1 - x
+
+foo 1  =  0
+foo x  =  foo (x - 1)
+
+foo 1  =  0
+foo x  =  foo (0 - x)
+
+foo 1  =  0
+foo x  =  foo (1 - x)
+
+foo 1  =  1
+foo x  =  foo (x - 1)
+
+foo 1  =  1
+foo x  =  foo (0 - x)
+
+foo 1  =  1
+foo x  =  foo (1 - x)
+
+foo 0  =  0
+foo x  =  x + (x + x)
+
+foo 0  =  0
+foo x  =  x + (x + 1)
+
+foo 0  =  0
+foo x  =  x + (x - 1)
+
+foo 0  =  0
+foo x  =  1 + (x + x)
+
+foo 0  =  0
+foo x  =  1 + (x + 1)
+
+foo 0  =  0
+foo x  =  1 + (0 - x)
+
+foo 0  =  0
+foo x  =  1 + (1 - x)
+
+foo 0  =  0
+foo x  =  x - (x + x)
+
+foo 0  =  0
+foo x  =  x - (x + 1)
+
+foo 0  =  0
+foo x  =  0 - (x + x)
+
+foo 0  =  0
+foo x  =  0 - (x + 1)
+
+foo 0  =  0
+foo x  =  1 - (x + x)
+
+foo 0  =  0
+foo x  =  1 - (x + 1)
+
+foo 0  =  1
+foo x  =  x + (x + x)
+
+foo 0  =  1
+foo x  =  x + (x + 1)
+
+foo 0  =  1
+foo x  =  x + (x - 1)
+
+foo 0  =  1
+foo x  =  1 + (x + x)
+
+foo 0  =  1
+foo x  =  1 + (x + 1)
+
+foo 0  =  1
+foo x  =  1 + (0 - x)
+
+foo 0  =  1
+foo x  =  1 + (1 - x)
+
+foo 0  =  1
+foo x  =  x - (x + x)
+
+foo 0  =  1
+foo x  =  x - (x + 1)
+
+foo 0  =  1
+foo x  =  0 - (x + x)
+
+foo 0  =  1
+foo x  =  0 - (x + 1)
+
+foo 0  =  1
+foo x  =  1 - (x + x)
+
+foo 0  =  1
+foo x  =  1 - (x + 1)
+
+foo 0  =  0
+foo 1  =  0
+foo x  =  x + x
+
+foo 0  =  0
+foo 1  =  0
+foo x  =  x + 1
+
+foo 0  =  0
+foo 1  =  0
+foo x  =  x - 1
+
+foo 0  =  0
+foo 1  =  0
+foo x  =  0 - x
+
+foo 0  =  0
+foo 1  =  0
+foo x  =  1 - x
+
+foo 0  =  0
+foo 1  =  1
+foo x  =  x + x
+
+foo 0  =  0
+foo 1  =  1
+foo x  =  x + 1
+
+foo 0  =  0
+foo 1  =  1
+foo x  =  x - 1
+
+foo 0  =  0
+foo 1  =  1
+foo x  =  0 - x
+
+foo 0  =  0
+foo 1  =  1
+foo x  =  1 - x
+
+foo 0  =  1
+foo 1  =  0
+foo x  =  x + x
+
+foo 0  =  1
+foo 1  =  0
+foo x  =  x + 1
+
+foo 0  =  1
+foo 1  =  0
+foo x  =  x - 1
+
+foo 0  =  1
+foo 1  =  0
+foo x  =  0 - x
+
+foo 0  =  1
+foo 1  =  0
+foo x  =  1 - x
+
+foo 0  =  1
+foo 1  =  1
+foo x  =  x + x
+
+foo 0  =  1
+foo 1  =  1
+foo x  =  x + 1
+
+foo 0  =  1
+foo 1  =  1
+foo x  =  x - 1
+
+foo 0  =  1
+foo 1  =  1
+foo x  =  0 - x
+
+foo 0  =  1
+foo 1  =  1
+foo x  =  1 - x
+
+
+Candidates for: ? :: Int -> Int -> Int
+  pruning with 10/23 rules
+  [3,3,6,9,21,39,87,180,390] direct candidates, 0 duplicates
+  [3,7,22,53,129,313,747,1743,4077] pattern candidates, 0 duplicates
+
+rules:
+x * y == x + y
+x * y == y + x
+x + 0 == x
+0 + x == x
+dec (x + y) == x + dec y
+dec (x + y) == y + dec x
+dec (x + y) == dec x + y
+dec (x + y) == dec y + x
+(x + y) + z == x + (y + z)
+(x + y) + z == y + (x + z)
+equations:
+y + x == x + y
+y + dec x == x + dec y
+dec x + y == x + dec y
+dec y + x == dec x + y
+x + dec 0 == dec x
+dec 0 + x == dec x
+y + (x + z) == x + (y + z)
+z + (x + y) == x + (y + z)
+z + (y + x) == x + (y + z)
+y + dec (dec x) == x + dec (dec y)
+dec (dec x) + y == x + dec (dec y)
+x + dec (dec 0) == dec (dec x)
+dec (dec 0) + x == dec (dec x)
+
+direct candidates:
+
+x ? y  =  x
+
+x ? y  =  y
+
+x ? y  =  0
+
+x ? y  =  dec x
+
+x ? y  =  dec y
+
+x ? y  =  dec 0
+
+x ? y  =  x + x
+
+x ? y  =  x + y
+
+x ? y  =  y + y
+
+x ? y  =  dec (dec x)
+
+x ? y  =  dec (dec y)
+
+x ? y  =  dec (dec 0)
+
+x ? y  =  dec (dec (dec x))
+
+x ? y  =  dec (dec (dec y))
+
+x ? y  =  dec (dec (dec 0))
+
+x ? y  =  x + dec x
+
+x ? y  =  x + dec y
+
+x ? y  =  x + dec 0
+
+x ? y  =  y + dec x
+
+x ? y  =  y + dec y
+
+x ? y  =  y + dec 0
+
+x ? y  =  dec (dec (dec (dec x)))
+
+x ? y  =  dec (dec (dec (dec y)))
+
+x ? y  =  dec (dec (dec (dec 0)))
+
+x ? y  =  x + (x + x)
+
+x ? y  =  x + (x + y)
+
+x ? y  =  x + (y + y)
+
+x ? y  =  x + dec (dec x)
+
+x ? y  =  x + dec (dec y)
+
+x ? y  =  x + dec (dec 0)
+
+x ? y  =  y + (x + x)
+
+x ? y  =  y + (x + y)
+
+x ? y  =  y + (y + y)
+
+x ? y  =  y + dec (dec x)
+
+x ? y  =  y + dec (dec y)
+
+x ? y  =  y + dec (dec 0)
+
+x ? y  =  dec x + dec x
+
+x ? y  =  dec x + dec y
+
+x ? y  =  dec x + dec 0
+
+x ? y  =  dec y + dec y
+
+x ? y  =  dec y + dec 0
+
+x ? y  =  dec 0 + dec 0
+
+x ? y  =  dec (dec (dec (dec (dec x))))
+
+x ? y  =  dec (dec (dec (dec (dec y))))
+
+x ? y  =  dec (dec (dec (dec (dec 0))))
+
+x ? y  =  x + dec (dec (dec x))
+
+x ? y  =  x + dec (dec (dec y))
+
+x ? y  =  x + dec (dec (dec 0))
+
+x ? y  =  x + (x + dec x)
+
+x ? y  =  x + (x + dec y)
+
+x ? y  =  x + (x + dec 0)
+
+x ? y  =  x + (y + dec x)
+
+x ? y  =  x + (y + dec y)
+
+x ? y  =  x + (y + dec 0)
+
+x ? y  =  y + dec (dec (dec x))
+
+x ? y  =  y + dec (dec (dec y))
+
+x ? y  =  y + dec (dec (dec 0))
+
+x ? y  =  y + (x + dec x)
+
+x ? y  =  y + (x + dec y)
+
+x ? y  =  y + (x + dec 0)
+
+x ? y  =  y + (y + dec x)
+
+x ? y  =  y + (y + dec y)
+
+x ? y  =  y + (y + dec 0)
+
+x ? y  =  dec x + (x + x)
+
+x ? y  =  dec x + (x + y)
+
+x ? y  =  dec x + (y + y)
+
+x ? y  =  dec x + dec (dec x)
+
+x ? y  =  dec x + dec (dec y)
+
+x ? y  =  dec x + dec (dec 0)
+
+x ? y  =  dec y + (x + x)
+
+x ? y  =  dec y + (x + y)
+
+x ? y  =  dec y + (y + y)
+
+x ? y  =  dec y + dec (dec x)
+
+x ? y  =  dec y + dec (dec y)
+
+x ? y  =  dec y + dec (dec 0)
+
+x ? y  =  dec 0 + (x + x)
+
+x ? y  =  dec 0 + (x + y)
+
+x ? y  =  dec 0 + (y + y)
+
+x ? y  =  dec 0 + dec (dec x)
+
+x ? y  =  dec 0 + dec (dec y)
+
+x ? y  =  dec 0 + dec (dec 0)
+
+
+pattern candidates:
+
+x ? y  =  x
+
+x ? y  =  y
+
+x ? y  =  0
+
+x ? y  =  dec x
+
+x ? y  =  dec y
+
+x ? 0  =  x
+x ? y  =  y
+
+x ? 0  =  x
+x ? y  =  0
+
+x ? 0  =  0
+x ? y  =  x
+
+0 ? x  =  x
+x ? y  =  0
+
+0 ? x  =  0
+x ? y  =  y
+
+x ? y  =  x + x
+
+x ? y  =  x + y
+
+x ? y  =  y + y
+
+x ? y  =  dec (dec x)
+
+x ? y  =  dec (dec y)
+
+x ? 0  =  x
+x ? y  =  dec x
+
+x ? 0  =  x
+x ? y  =  dec y
+
+x ? 0  =  0
+x ? y  =  dec x
+
+x ? 0  =  0
+x ? y  =  dec y
+
+x ? 0  =  dec x
+x ? y  =  x
+
+x ? 0  =  dec x
+x ? y  =  y
+
+x ? 0  =  dec x
+x ? y  =  0
+
+0 ? x  =  x
+x ? y  =  dec x
+
+0 ? x  =  x
+x ? y  =  dec y
+
+0 ? x  =  0
+x ? y  =  dec x
+
+0 ? x  =  0
+x ? y  =  dec y
+
+0 ? x  =  dec x
+x ? y  =  x
+
+0 ? x  =  dec x
+x ? y  =  y
+
+0 ? x  =  dec x
+x ? y  =  0
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  0
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  x
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  y
+
+x ? y  =  dec (dec (dec x))
+
+x ? y  =  dec (dec (dec y))
+
+x ? y  =  x + dec x
+
+x ? y  =  x + dec y
+
+x ? y  =  y + dec x
+
+x ? y  =  y + dec y
+
+x ? 0  =  x
+x ? y  =  x + x
+
+x ? 0  =  x
+x ? y  =  x + y
+
+x ? 0  =  x
+x ? y  =  y + y
+
+x ? 0  =  x
+x ? y  =  dec (dec x)
+
+x ? 0  =  x
+x ? y  =  dec (dec y)
+
+x ? 0  =  0
+x ? y  =  x + x
+
+x ? 0  =  0
+x ? y  =  x + y
+
+x ? 0  =  0
+x ? y  =  y + y
+
+x ? 0  =  0
+x ? y  =  dec (dec x)
+
+x ? 0  =  0
+x ? y  =  dec (dec y)
+
+x ? 0  =  dec x
+x ? y  =  dec y
+
+x ? 0  =  x + x
+x ? y  =  x
+
+x ? 0  =  x + x
+x ? y  =  y
+
+x ? 0  =  x + x
+x ? y  =  0
+
+x ? 0  =  dec (dec x)
+x ? y  =  x
+
+x ? 0  =  dec (dec x)
+x ? y  =  y
+
+x ? 0  =  dec (dec x)
+x ? y  =  0
+
+0 ? x  =  x
+x ? y  =  x + x
+
+0 ? x  =  x
+x ? y  =  x + y
+
+0 ? x  =  x
+x ? y  =  y + y
+
+0 ? x  =  x
+x ? y  =  dec (dec x)
+
+0 ? x  =  x
+x ? y  =  dec (dec y)
+
+0 ? x  =  0
+x ? y  =  x + x
+
+0 ? x  =  0
+x ? y  =  x + y
+
+0 ? x  =  0
+x ? y  =  y + y
+
+0 ? x  =  0
+x ? y  =  dec (dec x)
+
+0 ? x  =  0
+x ? y  =  dec (dec y)
+
+0 ? x  =  x + x
+x ? y  =  x
+
+0 ? x  =  x + x
+x ? y  =  y
+
+0 ? x  =  x + x
+x ? y  =  0
+
+0 ? x  =  dec (dec x)
+x ? y  =  x
+
+0 ? x  =  dec (dec x)
+x ? y  =  y
+
+0 ? x  =  dec (dec x)
+x ? y  =  0
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  dec x
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  dec y
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  dec x
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  dec y
+
+0 ? x  =  x
+x ? 0  =  dec x
+x ? y  =  x
+
+0 ? x  =  x
+x ? 0  =  dec x
+x ? y  =  0
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  dec x
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  dec y
+
+0 ? x  =  0
+x ? 0  =  0
+x ? y  =  dec x
+
+0 ? x  =  0
+x ? 0  =  0
+x ? y  =  dec y
+
+0 ? x  =  0
+x ? 0  =  dec x
+x ? y  =  y
+
+0 ? x  =  dec x
+x ? 0  =  x
+x ? y  =  y
+
+0 ? x  =  dec x
+x ? 0  =  x
+x ? y  =  0
+
+0 ? x  =  dec x
+x ? 0  =  0
+x ? y  =  x
+
+x ? 0  =  x
+x ? y  =  x ? dec y
+
+x ? 0  =  x
+x ? y  =  y ? dec y
+
+x ? 0  =  x
+x ? y  =  0 ? dec y
+
+x ? 0  =  x
+x ? y  =  dec x ? x
+
+x ? 0  =  x
+x ? y  =  dec x ? y
+
+x ? 0  =  0
+x ? y  =  x ? dec y
+
+x ? 0  =  0
+x ? y  =  y ? dec y
+
+x ? 0  =  0
+x ? y  =  0 ? dec y
+
+x ? 0  =  0
+x ? y  =  dec x ? x
+
+x ? 0  =  0
+x ? y  =  dec x ? y
+
+0 ? x  =  x
+x ? y  =  x ? dec y
+
+0 ? x  =  x
+x ? y  =  y ? dec y
+
+0 ? x  =  x
+x ? y  =  dec x ? x
+
+0 ? x  =  x
+x ? y  =  dec x ? y
+
+0 ? x  =  x
+x ? y  =  dec x ? 0
+
+0 ? x  =  0
+x ? y  =  x ? dec y
+
+0 ? x  =  0
+x ? y  =  y ? dec y
+
+0 ? x  =  0
+x ? y  =  dec x ? x
+
+0 ? x  =  0
+x ? y  =  dec x ? y
+
+0 ? x  =  0
+x ? y  =  dec x ? 0
+
+x ? y  =  dec (dec (dec (dec x)))
+
+x ? y  =  dec (dec (dec (dec y)))
+
+x ? y  =  x + (x + x)
+
+x ? y  =  x + (x + y)
+
+x ? y  =  x + (y + y)
+
+x ? y  =  x + dec (dec x)
+
+x ? y  =  x + dec (dec y)
+
+x ? y  =  y + (x + x)
+
+x ? y  =  y + (x + y)
+
+x ? y  =  y + (y + y)
+
+x ? y  =  y + dec (dec x)
+
+x ? y  =  y + dec (dec y)
+
+x ? y  =  dec x + dec x
+
+x ? y  =  dec x + dec y
+
+x ? y  =  dec y + dec y
+
+x ? 0  =  x
+x ? y  =  dec (dec (dec x))
+
+x ? 0  =  x
+x ? y  =  dec (dec (dec y))
+
+x ? 0  =  x
+x ? y  =  x + dec x
+
+x ? 0  =  x
+x ? y  =  x + dec y
+
+x ? 0  =  x
+x ? y  =  y + dec x
+
+x ? 0  =  x
+x ? y  =  y + dec y
+
+x ? 0  =  0
+x ? y  =  dec (dec (dec x))
+
+x ? 0  =  0
+x ? y  =  dec (dec (dec y))
+
+x ? 0  =  0
+x ? y  =  x + dec x
+
+x ? 0  =  0
+x ? y  =  x + dec y
+
+x ? 0  =  0
+x ? y  =  y + dec x
+
+x ? 0  =  0
+x ? y  =  y + dec y
+
+x ? 0  =  dec x
+x ? y  =  x + x
+
+x ? 0  =  dec x
+x ? y  =  x + y
+
+x ? 0  =  dec x
+x ? y  =  y + y
+
+x ? 0  =  dec x
+x ? y  =  dec (dec x)
+
+x ? 0  =  dec x
+x ? y  =  dec (dec y)
+
+x ? 0  =  x + x
+x ? y  =  dec x
+
+x ? 0  =  x + x
+x ? y  =  dec y
+
+x ? 0  =  dec (dec x)
+x ? y  =  dec x
+
+x ? 0  =  dec (dec x)
+x ? y  =  dec y
+
+x ? 0  =  dec (dec (dec x))
+x ? y  =  x
+
+x ? 0  =  dec (dec (dec x))
+x ? y  =  y
+
+x ? 0  =  dec (dec (dec x))
+x ? y  =  0
+
+x ? 0  =  x + dec x
+x ? y  =  x
+
+x ? 0  =  x + dec x
+x ? y  =  y
+
+x ? 0  =  x + dec x
+x ? y  =  0
+
+0 ? x  =  x
+x ? y  =  dec (dec (dec x))
+
+0 ? x  =  x
+x ? y  =  dec (dec (dec y))
+
+0 ? x  =  x
+x ? y  =  x + dec x
+
+0 ? x  =  x
+x ? y  =  x + dec y
+
+0 ? x  =  x
+x ? y  =  y + dec x
+
+0 ? x  =  x
+x ? y  =  y + dec y
+
+0 ? x  =  0
+x ? y  =  dec (dec (dec x))
+
+0 ? x  =  0
+x ? y  =  dec (dec (dec y))
+
+0 ? x  =  0
+x ? y  =  x + dec x
+
+0 ? x  =  0
+x ? y  =  x + dec y
+
+0 ? x  =  0
+x ? y  =  y + dec x
+
+0 ? x  =  0
+x ? y  =  y + dec y
+
+0 ? x  =  dec x
+x ? y  =  x + x
+
+0 ? x  =  dec x
+x ? y  =  x + y
+
+0 ? x  =  dec x
+x ? y  =  y + y
+
+0 ? x  =  dec x
+x ? y  =  dec (dec x)
+
+0 ? x  =  dec x
+x ? y  =  dec (dec y)
+
+0 ? x  =  x + x
+x ? y  =  dec x
+
+0 ? x  =  x + x
+x ? y  =  dec y
+
+0 ? x  =  dec (dec x)
+x ? y  =  dec x
+
+0 ? x  =  dec (dec x)
+x ? y  =  dec y
+
+0 ? x  =  dec (dec (dec x))
+x ? y  =  x
+
+0 ? x  =  dec (dec (dec x))
+x ? y  =  y
+
+0 ? x  =  dec (dec (dec x))
+x ? y  =  0
+
+0 ? x  =  x + dec x
+x ? y  =  x
+
+0 ? x  =  x + dec x
+x ? y  =  y
+
+0 ? x  =  x + dec x
+x ? y  =  0
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  x + x
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  x + y
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  y + y
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  dec (dec x)
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  dec (dec y)
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  x + x
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  x + y
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  y + y
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  dec (dec x)
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  dec (dec y)
+
+0 ? x  =  x
+x ? 0  =  dec x
+x ? y  =  dec y
+
+0 ? x  =  x
+x ? 0  =  x + x
+x ? y  =  x
+
+0 ? x  =  x
+x ? 0  =  x + x
+x ? y  =  0
+
+0 ? x  =  x
+x ? 0  =  dec (dec x)
+x ? y  =  x
+
+0 ? x  =  x
+x ? 0  =  dec (dec x)
+x ? y  =  0
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  x + x
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  x + y
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  y + y
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  dec (dec x)
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  dec (dec y)
+
+0 ? x  =  0
+x ? 0  =  0
+x ? y  =  x + x
+
+0 ? x  =  0
+x ? 0  =  0
+x ? y  =  x + y
+
+0 ? x  =  0
+x ? 0  =  0
+x ? y  =  y + y
+
+0 ? x  =  0
+x ? 0  =  0
+x ? y  =  dec (dec x)
+
+0 ? x  =  0
+x ? 0  =  0
+x ? y  =  dec (dec y)
+
+0 ? x  =  0
+x ? 0  =  dec x
+x ? y  =  dec y
+
+0 ? x  =  0
+x ? 0  =  x + x
+x ? y  =  y
+
+0 ? x  =  0
+x ? 0  =  dec (dec x)
+x ? y  =  y
+
+0 ? x  =  dec x
+x ? 0  =  x
+x ? y  =  dec x
+
+0 ? x  =  dec x
+x ? 0  =  0
+x ? y  =  dec x
+
+0 ? x  =  dec x
+x ? 0  =  dec x
+x ? y  =  x
+
+0 ? x  =  dec x
+x ? 0  =  dec x
+x ? y  =  y
+
+0 ? x  =  dec x
+x ? 0  =  dec x
+x ? y  =  0
+
+0 ? x  =  x + x
+x ? 0  =  x
+x ? y  =  y
+
+0 ? x  =  x + x
+x ? 0  =  x
+x ? y  =  0
+
+0 ? x  =  x + x
+x ? 0  =  0
+x ? y  =  x
+
+0 ? x  =  dec (dec x)
+x ? 0  =  x
+x ? y  =  y
+
+0 ? x  =  dec (dec x)
+x ? 0  =  x
+x ? y  =  0
+
+0 ? x  =  dec (dec x)
+x ? 0  =  0
+x ? y  =  x
+
+0 ? 0  =  0
+0 ? x  =  dec x
+x ? y  =  dec x
+
+x ? 0  =  x
+x ? y  =  x ? dec (dec y)
+
+x ? 0  =  x
+x ? y  =  y ? dec (dec y)
+
+x ? 0  =  x
+x ? y  =  0 ? dec (dec y)
+
+x ? 0  =  x
+x ? y  =  dec x ? dec x
+
+x ? 0  =  x
+x ? y  =  dec x ? dec y
+
+x ? 0  =  x
+x ? y  =  dec y ? dec y
+
+x ? 0  =  x
+x ? y  =  dec (dec x) ? x
+
+x ? 0  =  x
+x ? y  =  dec (dec x) ? y
+
+x ? 0  =  0
+x ? y  =  x ? dec (dec y)
+
+x ? 0  =  0
+x ? y  =  y ? dec (dec y)
+
+x ? 0  =  0
+x ? y  =  0 ? dec (dec y)
+
+x ? 0  =  0
+x ? y  =  dec x ? dec x
+
+x ? 0  =  0
+x ? y  =  dec x ? dec y
+
+x ? 0  =  0
+x ? y  =  dec y ? dec y
+
+x ? 0  =  0
+x ? y  =  dec (dec x) ? x
+
+x ? 0  =  0
+x ? y  =  dec (dec x) ? y
+
+0 ? x  =  x
+x ? y  =  x ? dec (dec y)
+
+0 ? x  =  x
+x ? y  =  y ? dec (dec y)
+
+0 ? x  =  x
+x ? y  =  dec x ? dec x
+
+0 ? x  =  x
+x ? y  =  dec x ? dec y
+
+0 ? x  =  x
+x ? y  =  dec y ? dec y
+
+0 ? x  =  x
+x ? y  =  dec (dec x) ? x
+
+0 ? x  =  x
+x ? y  =  dec (dec x) ? y
+
+0 ? x  =  x
+x ? y  =  dec (dec x) ? 0
+
+0 ? x  =  0
+x ? y  =  x ? dec (dec y)
+
+0 ? x  =  0
+x ? y  =  y ? dec (dec y)
+
+0 ? x  =  0
+x ? y  =  dec x ? dec x
+
+0 ? x  =  0
+x ? y  =  dec x ? dec y
+
+0 ? x  =  0
+x ? y  =  dec y ? dec y
+
+0 ? x  =  0
+x ? y  =  dec (dec x) ? x
+
+0 ? x  =  0
+x ? y  =  dec (dec x) ? y
+
+0 ? x  =  0
+x ? y  =  dec (dec x) ? 0
+
+x ? 0  =  x
+x ? y  =  dec (x ? dec y)
+
+x ? 0  =  x
+x ? y  =  dec (y ? dec y)
+
+x ? 0  =  x
+x ? y  =  dec (0 ? dec y)
+
+x ? 0  =  x
+x ? y  =  dec (dec x ? x)
+
+x ? 0  =  x
+x ? y  =  dec (dec x ? y)
+
+x ? 0  =  0
+x ? y  =  dec (x ? dec y)
+
+x ? 0  =  0
+x ? y  =  dec (y ? dec y)
+
+x ? 0  =  0
+x ? y  =  dec (0 ? dec y)
+
+x ? 0  =  0
+x ? y  =  dec (dec x ? x)
+
+x ? 0  =  0
+x ? y  =  dec (dec x ? y)
+
+x ? 0  =  dec x
+x ? y  =  x ? dec y
+
+x ? 0  =  dec x
+x ? y  =  y ? dec y
+
+x ? 0  =  dec x
+x ? y  =  0 ? dec y
+
+x ? 0  =  dec x
+x ? y  =  dec x ? x
+
+x ? 0  =  dec x
+x ? y  =  dec x ? y
+
+0 ? x  =  x
+x ? y  =  dec (x ? dec y)
+
+0 ? x  =  x
+x ? y  =  dec (y ? dec y)
+
+0 ? x  =  x
+x ? y  =  dec (dec x ? x)
+
+0 ? x  =  x
+x ? y  =  dec (dec x ? y)
+
+0 ? x  =  x
+x ? y  =  dec (dec x ? 0)
+
+0 ? x  =  0
+x ? y  =  dec (x ? dec y)
+
+0 ? x  =  0
+x ? y  =  dec (y ? dec y)
+
+0 ? x  =  0
+x ? y  =  dec (dec x ? x)
+
+0 ? x  =  0
+x ? y  =  dec (dec x ? y)
+
+0 ? x  =  0
+x ? y  =  dec (dec x ? 0)
+
+0 ? x  =  dec x
+x ? y  =  x ? dec y
+
+0 ? x  =  dec x
+x ? y  =  y ? dec y
+
+0 ? x  =  dec x
+x ? y  =  dec x ? x
+
+0 ? x  =  dec x
+x ? y  =  dec x ? y
+
+0 ? x  =  dec x
+x ? y  =  dec x ? 0
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  x ? dec y
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  y ? dec y
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  dec x ? x
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  dec x ? y
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  x ? dec y
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  y ? dec y
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  dec x ? x
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  dec x ? y
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  x ? dec y
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  y ? dec y
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  dec x ? x
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  dec x ? y
+
+0 ? x  =  0
+x ? 0  =  0
+x ? y  =  x ? dec y
+
+0 ? x  =  0
+x ? 0  =  0
+x ? y  =  y ? dec y
+
+0 ? x  =  0
+x ? 0  =  0
+x ? y  =  dec x ? x
+
+0 ? x  =  0
+x ? 0  =  0
+x ? y  =  dec x ? y
+
+x ? y  =  dec (dec (dec (dec (dec x))))
+
+x ? y  =  dec (dec (dec (dec (dec y))))
+
+x ? y  =  x + dec (dec (dec x))
+
+x ? y  =  x + dec (dec (dec y))
+
+x ? y  =  x + (x + dec x)
+
+x ? y  =  x + (x + dec y)
+
+x ? y  =  x + (y + dec x)
+
+x ? y  =  x + (y + dec y)
+
+x ? y  =  y + dec (dec (dec x))
+
+x ? y  =  y + dec (dec (dec y))
+
+x ? y  =  y + (x + dec x)
+
+x ? y  =  y + (x + dec y)
+
+x ? y  =  y + (y + dec x)
+
+x ? y  =  y + (y + dec y)
+
+x ? y  =  dec x + (x + x)
+
+x ? y  =  dec x + (x + y)
+
+x ? y  =  dec x + (y + y)
+
+x ? y  =  dec x + dec (dec x)
+
+x ? y  =  dec x + dec (dec y)
+
+x ? y  =  dec y + (x + x)
+
+x ? y  =  dec y + (x + y)
+
+x ? y  =  dec y + (y + y)
+
+x ? y  =  dec y + dec (dec x)
+
+x ? y  =  dec y + dec (dec y)
+
+x ? 0  =  x
+x ? y  =  dec (dec (dec (dec x)))
+
+x ? 0  =  x
+x ? y  =  dec (dec (dec (dec y)))
+
+x ? 0  =  x
+x ? y  =  x + (x + x)
+
+x ? 0  =  x
+x ? y  =  x + (x + y)
+
+x ? 0  =  x
+x ? y  =  x + (y + y)
+
+x ? 0  =  x
+x ? y  =  x + dec (dec x)
+
+x ? 0  =  x
+x ? y  =  x + dec (dec y)
+
+x ? 0  =  x
+x ? y  =  y + (x + x)
+
+x ? 0  =  x
+x ? y  =  y + (x + y)
+
+x ? 0  =  x
+x ? y  =  y + (y + y)
+
+x ? 0  =  x
+x ? y  =  y + dec (dec x)
+
+x ? 0  =  x
+x ? y  =  y + dec (dec y)
+
+x ? 0  =  x
+x ? y  =  dec x + dec x
+
+x ? 0  =  x
+x ? y  =  dec x + dec y
+
+x ? 0  =  x
+x ? y  =  dec y + dec y
+
+x ? 0  =  0
+x ? y  =  dec (dec (dec (dec x)))
+
+x ? 0  =  0
+x ? y  =  dec (dec (dec (dec y)))
+
+x ? 0  =  0
+x ? y  =  x + (x + x)
+
+x ? 0  =  0
+x ? y  =  x + (x + y)
+
+x ? 0  =  0
+x ? y  =  x + (y + y)
+
+x ? 0  =  0
+x ? y  =  x + dec (dec x)
+
+x ? 0  =  0
+x ? y  =  x + dec (dec y)
+
+x ? 0  =  0
+x ? y  =  y + (x + x)
+
+x ? 0  =  0
+x ? y  =  y + (x + y)
+
+x ? 0  =  0
+x ? y  =  y + (y + y)
+
+x ? 0  =  0
+x ? y  =  y + dec (dec x)
+
+x ? 0  =  0
+x ? y  =  y + dec (dec y)
+
+x ? 0  =  0
+x ? y  =  dec x + dec x
+
+x ? 0  =  0
+x ? y  =  dec x + dec y
+
+x ? 0  =  0
+x ? y  =  dec y + dec y
+
+x ? 0  =  dec x
+x ? y  =  dec (dec (dec x))
+
+x ? 0  =  dec x
+x ? y  =  dec (dec (dec y))
+
+x ? 0  =  dec x
+x ? y  =  x + dec x
+
+x ? 0  =  dec x
+x ? y  =  x + dec y
+
+x ? 0  =  dec x
+x ? y  =  y + dec x
+
+x ? 0  =  dec x
+x ? y  =  y + dec y
+
+x ? 0  =  x + x
+x ? y  =  x + y
+
+x ? 0  =  x + x
+x ? y  =  y + y
+
+x ? 0  =  x + x
+x ? y  =  dec (dec x)
+
+x ? 0  =  x + x
+x ? y  =  dec (dec y)
+
+x ? 0  =  dec (dec x)
+x ? y  =  x + x
+
+x ? 0  =  dec (dec x)
+x ? y  =  x + y
+
+x ? 0  =  dec (dec x)
+x ? y  =  y + y
+
+x ? 0  =  dec (dec x)
+x ? y  =  dec (dec y)
+
+x ? 0  =  dec (dec (dec x))
+x ? y  =  dec x
+
+x ? 0  =  dec (dec (dec x))
+x ? y  =  dec y
+
+x ? 0  =  x + dec x
+x ? y  =  dec x
+
+x ? 0  =  x + dec x
+x ? y  =  dec y
+
+x ? 0  =  dec (dec (dec (dec x)))
+x ? y  =  x
+
+x ? 0  =  dec (dec (dec (dec x)))
+x ? y  =  y
+
+x ? 0  =  dec (dec (dec (dec x)))
+x ? y  =  0
+
+x ? 0  =  x + (x + x)
+x ? y  =  x
+
+x ? 0  =  x + (x + x)
+x ? y  =  y
+
+x ? 0  =  x + (x + x)
+x ? y  =  0
+
+x ? 0  =  x + dec (dec x)
+x ? y  =  x
+
+x ? 0  =  x + dec (dec x)
+x ? y  =  y
+
+x ? 0  =  x + dec (dec x)
+x ? y  =  0
+
+x ? 0  =  dec x + dec x
+x ? y  =  x
+
+x ? 0  =  dec x + dec x
+x ? y  =  y
+
+x ? 0  =  dec x + dec x
+x ? y  =  0
+
+0 ? x  =  x
+x ? y  =  dec (dec (dec (dec x)))
+
+0 ? x  =  x
+x ? y  =  dec (dec (dec (dec y)))
+
+0 ? x  =  x
+x ? y  =  x + (x + x)
+
+0 ? x  =  x
+x ? y  =  x + (x + y)
+
+0 ? x  =  x
+x ? y  =  x + (y + y)
+
+0 ? x  =  x
+x ? y  =  x + dec (dec x)
+
+0 ? x  =  x
+x ? y  =  x + dec (dec y)
+
+0 ? x  =  x
+x ? y  =  y + (x + x)
+
+0 ? x  =  x
+x ? y  =  y + (x + y)
+
+0 ? x  =  x
+x ? y  =  y + (y + y)
+
+0 ? x  =  x
+x ? y  =  y + dec (dec x)
+
+0 ? x  =  x
+x ? y  =  y + dec (dec y)
+
+0 ? x  =  x
+x ? y  =  dec x + dec x
+
+0 ? x  =  x
+x ? y  =  dec x + dec y
+
+0 ? x  =  x
+x ? y  =  dec y + dec y
+
+0 ? x  =  0
+x ? y  =  dec (dec (dec (dec x)))
+
+0 ? x  =  0
+x ? y  =  dec (dec (dec (dec y)))
+
+0 ? x  =  0
+x ? y  =  x + (x + x)
+
+0 ? x  =  0
+x ? y  =  x + (x + y)
+
+0 ? x  =  0
+x ? y  =  x + (y + y)
+
+0 ? x  =  0
+x ? y  =  x + dec (dec x)
+
+0 ? x  =  0
+x ? y  =  x + dec (dec y)
+
+0 ? x  =  0
+x ? y  =  y + (x + x)
+
+0 ? x  =  0
+x ? y  =  y + (x + y)
+
+0 ? x  =  0
+x ? y  =  y + (y + y)
+
+0 ? x  =  0
+x ? y  =  y + dec (dec x)
+
+0 ? x  =  0
+x ? y  =  y + dec (dec y)
+
+0 ? x  =  0
+x ? y  =  dec x + dec x
+
+0 ? x  =  0
+x ? y  =  dec x + dec y
+
+0 ? x  =  0
+x ? y  =  dec y + dec y
+
+0 ? x  =  dec x
+x ? y  =  dec (dec (dec x))
+
+0 ? x  =  dec x
+x ? y  =  dec (dec (dec y))
+
+0 ? x  =  dec x
+x ? y  =  x + dec x
+
+0 ? x  =  dec x
+x ? y  =  x + dec y
+
+0 ? x  =  dec x
+x ? y  =  y + dec x
+
+0 ? x  =  dec x
+x ? y  =  y + dec y
+
+0 ? x  =  x + x
+x ? y  =  x + y
+
+0 ? x  =  x + x
+x ? y  =  dec (dec x)
+
+0 ? x  =  x + x
+x ? y  =  dec (dec y)
+
+0 ? x  =  dec (dec x)
+x ? y  =  x + x
+
+0 ? x  =  dec (dec x)
+x ? y  =  x + y
+
+0 ? x  =  dec (dec x)
+x ? y  =  y + y
+
+0 ? x  =  dec (dec (dec x))
+x ? y  =  dec x
+
+0 ? x  =  dec (dec (dec x))
+x ? y  =  dec y
+
+0 ? x  =  x + dec x
+x ? y  =  dec x
+
+0 ? x  =  x + dec x
+x ? y  =  dec y
+
+0 ? x  =  dec (dec (dec (dec x)))
+x ? y  =  x
+
+0 ? x  =  dec (dec (dec (dec x)))
+x ? y  =  y
+
+0 ? x  =  dec (dec (dec (dec x)))
+x ? y  =  0
+
+0 ? x  =  x + (x + x)
+x ? y  =  x
+
+0 ? x  =  x + (x + x)
+x ? y  =  y
+
+0 ? x  =  x + (x + x)
+x ? y  =  0
+
+0 ? x  =  x + dec (dec x)
+x ? y  =  x
+
+0 ? x  =  x + dec (dec x)
+x ? y  =  y
+
+0 ? x  =  x + dec (dec x)
+x ? y  =  0
+
+0 ? x  =  dec x + dec x
+x ? y  =  x
+
+0 ? x  =  dec x + dec x
+x ? y  =  y
+
+0 ? x  =  dec x + dec x
+x ? y  =  0
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  dec (dec (dec x))
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  dec (dec (dec y))
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  x + dec x
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  x + dec y
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  y + dec x
+
+0 ? x  =  x
+x ? 0  =  x
+x ? y  =  y + dec y
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  dec (dec (dec x))
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  dec (dec (dec y))
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  x + dec x
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  x + dec y
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  y + dec x
+
+0 ? x  =  x
+x ? 0  =  0
+x ? y  =  y + dec y
+
+0 ? x  =  x
+x ? 0  =  dec x
+x ? y  =  x + x
+
+0 ? x  =  x
+x ? 0  =  dec x
+x ? y  =  x + y
+
+0 ? x  =  x
+x ? 0  =  dec x
+x ? y  =  y + y
+
+0 ? x  =  x
+x ? 0  =  dec x
+x ? y  =  dec (dec x)
+
+0 ? x  =  x
+x ? 0  =  dec x
+x ? y  =  dec (dec y)
+
+0 ? x  =  x
+x ? 0  =  x + x
+x ? y  =  dec x
+
+0 ? x  =  x
+x ? 0  =  x + x
+x ? y  =  dec y
+
+0 ? x  =  x
+x ? 0  =  dec (dec x)
+x ? y  =  dec x
+
+0 ? x  =  x
+x ? 0  =  dec (dec x)
+x ? y  =  dec y
+
+0 ? x  =  x
+x ? 0  =  dec (dec (dec x))
+x ? y  =  x
+
+0 ? x  =  x
+x ? 0  =  dec (dec (dec x))
+x ? y  =  0
+
+0 ? x  =  x
+x ? 0  =  x + dec x
+x ? y  =  x
+
+0 ? x  =  x
+x ? 0  =  x + dec x
+x ? y  =  0
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  dec (dec (dec x))
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  dec (dec (dec y))
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  x + dec x
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  x + dec y
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  y + dec x
+
+0 ? x  =  0
+x ? 0  =  x
+x ? y  =  y + dec y
+
+0 ? x  =  0
+x ? 0  =  0
+x ? y  =  dec (dec (dec x))
+
+0 ? x  =  0
+x ? 0  =  0
+x ? y  =  dec (dec (dec y))
+
+0 ? x  =  0
+x ? 0  =  0
+x ? y  =  x + dec x
+
+0 ? x  =  0
+x ? 0  =  0
+x ? y  =  x + dec y
+
+0 ? x  =  0
+x ? 0  =  0
+x ? y  =  y + dec x
+
+0 ? x  =  0
+x ? 0  =  0
+x ? y  =  y + dec y
+
+0 ? x  =  0
+x ? 0  =  dec x
+x ? y  =  x + x
+
+0 ? x  =  0
+x ? 0  =  dec x
+x ? y  =  x + y
+
+0 ? x  =  0
+x ? 0  =  dec x
+x ? y  =  y + y
+
+0 ? x  =  0
+x ? 0  =  dec x
+x ? y  =  dec (dec x)
+
+0 ? x  =  0
+x ? 0  =  dec x
+x ? y  =  dec (dec y)
+
+0 ? x  =  0
+x ? 0  =  x + x
+x ? y  =  dec x
+
+0 ? x  =  0
+x ? 0  =  x + x
+x ? y  =  dec y
+
+0 ? x  =  0
+x ? 0  =  dec (dec x)
+x ? y  =  dec x
+
+0 ? x  =  0
+x ? 0  =  dec (dec x)
+x ? y  =  dec y
+
+0 ? x  =  0
+x ? 0  =  dec (dec (dec x))
+x ? y  =  y
+
+0 ? x  =  0
+x ? 0  =  x + dec x
+x ? y  =  y
+
+0 ? x  =  dec x
+x ? 0  =  x
+x ? y  =  x + x
+
+0 ? x  =  dec x
+x ? 0  =  x
+x ? y  =  x + y
+
+0 ? x  =  dec x
+x ? 0  =  x
+x ? y  =  y + y
+
+0 ? x  =  dec x
+x ? 0  =  x
+x ? y  =  dec (dec x)
+
+0 ? x  =  dec x
+x ? 0  =  x
+x ? y  =  dec (dec y)
+
+0 ? x  =  dec x
+x ? 0  =  0
+x ? y  =  x + x
+
+0 ? x  =  dec x
+x ? 0  =  0
+x ? y  =  x + y
+
+0 ? x  =  dec x
+x ? 0  =  0
+x ? y  =  y + y
+
+0 ? x  =  dec x
+x ? 0  =  0
+x ? y  =  dec (dec x)
+
+0 ? x  =  dec x
+x ? 0  =  0
+x ? y  =  dec (dec y)
+
+0 ? x  =  dec x
+x ? 0  =  x + x
+x ? y  =  x
+
+0 ? x  =  dec x
+x ? 0  =  x + x
+x ? y  =  y
+
+0 ? x  =  dec x
+x ? 0  =  x + x
+x ? y  =  0
+
+0 ? x  =  dec x
+x ? 0  =  dec (dec x)
+x ? y  =  x
+
+0 ? x  =  dec x
+x ? 0  =  dec (dec x)
+x ? y  =  y
+
+0 ? x  =  dec x
+x ? 0  =  dec (dec x)
+x ? y  =  0
+
+0 ? x  =  x + x
+x ? 0  =  x
+x ? y  =  dec x
+
+0 ? x  =  x + x
+x ? 0  =  x
+x ? y  =  dec y
+
+0 ? x  =  x + x
+x ? 0  =  0
+x ? y  =  dec x
+
+0 ? x  =  x + x
+x ? 0  =  0
+x ? y  =  dec y
+
+0 ? x  =  x + x
+x ? 0  =  dec x
+x ? y  =  x
+
+0 ? x  =  x + x
+x ? 0  =  dec x
+x ? y  =  y
+
+0 ? x  =  x + x
+x ? 0  =  dec x
+x ? y  =  0
+
+0 ? x  =  dec (dec x)
+x ? 0  =  x
+x ? y  =  dec x
+
+0 ? x  =  dec (dec x)
+x ? 0  =  x
+x ? y  =  dec y
+
+0 ? x  =  dec (dec x)
+x ? 0  =  0
+x ? y  =  dec x
+
+0 ? x  =  dec (dec x)
+x ? 0  =  0
+x ? y  =  dec y
+
+0 ? x  =  dec (dec x)
+x ? 0  =  dec x
+x ? y  =  x
+
+0 ? x  =  dec (dec x)
+x ? 0  =  dec x
+x ? y  =  y
+
+0 ? x  =  dec (dec x)
+x ? 0  =  dec x
+x ? y  =  0
+
+0 ? x  =  dec (dec (dec x))
+x ? 0  =  x
+x ? y  =  y
+
+0 ? x  =  dec (dec (dec x))
+x ? 0  =  x
+x ? y  =  0
+
+0 ? x  =  dec (dec (dec x))
+x ? 0  =  0
+x ? y  =  x
+
+0 ? x  =  x + dec x
+x ? 0  =  x
+x ? y  =  y
+
+0 ? x  =  x + dec x
+x ? 0  =  x
+x ? y  =  0
+
+0 ? x  =  x + dec x
+x ? 0  =  0
+x ? y  =  x
+
+0 ? 0  =  0
+0 ? x  =  dec x
+x ? y  =  x + x
+
+0 ? 0  =  0
+0 ? x  =  dec x
+x ? y  =  x + y
+
+0 ? 0  =  0
+0 ? x  =  dec x
+x ? y  =  y + y
+
+0 ? 0  =  0
+0 ? x  =  dec x
+x ? y  =  dec (dec x)
+
+0 ? 0  =  0
+0 ? x  =  dec x
+x ? y  =  dec (dec y)
+
+0 ? 0  =  0
+0 ? x  =  x + x
+x ? y  =  dec x
+
+0 ? 0  =  0
+0 ? x  =  x + x
+x ? y  =  dec y
+
+0 ? 0  =  0
+0 ? x  =  dec (dec x)
+x ? y  =  dec x
+
+0 ? 0  =  0
+0 ? x  =  dec (dec x)
+x ? y  =  dec y
+
+
+Candidates for: goo :: [Int] -> [Int]
+  pruning with 4/4 rules
+  [2,0,1,0,1,0,1,0,1] direct candidates, 0 duplicates
+  [2,1,2,3,4,7,10,17,26] pattern candidates, 0 duplicates
+
+rules:
+xs ++ [] == xs
+[] ++ xs == xs
+(xs ++ ys) ++ zs == xs ++ (ys ++ zs)
+(x:xs) ++ ys == x:(xs ++ ys)
+
+direct candidates:
+
+goo xs  =  xs
+
+goo xs  =  []
+
+goo xs  =  xs ++ xs
+
+goo xs  =  xs ++ (xs ++ xs)
+
+
+pattern candidates:
+
+goo xs  =  xs
+
+goo xs  =  []
+
+goo []  =  []
+goo (x:xs)  =  xs
+
+goo []  =  []
+goo (x:xs)  =  goo xs
+
+goo xs  =  xs ++ xs
+
+goo []  =  []
+goo (x:xs)  =  x:xs
+
+goo []  =  []
+goo (x:xs)  =  [x]
+
+goo []  =  []
+goo (x:xs)  =  xs ++ xs
+
+goo []  =  []
+goo (x:xs)  =  x:goo xs
+
+goo []  =  []
+goo (x:xs)  =  xs ++ goo xs
+
+goo []  =  []
+goo (x:xs)  =  goo xs ++ xs
+
+goo xs  =  xs ++ (xs ++ xs)
+
+goo []  =  []
+goo (x:xs)  =  goo xs ++ goo xs
+
+goo []  =  []
+goo (x:xs)  =  x:x:xs
+
+goo []  =  []
+goo (x:xs)  =  [x,x]
+
+goo []  =  []
+goo (x:xs)  =  x:(xs ++ xs)
+
+goo []  =  []
+goo (x:xs)  =  xs ++ (x:xs)
+
+goo []  =  []
+goo (x:xs)  =  xs ++ [x]
+
+goo []  =  []
+goo (x:xs)  =  xs ++ (xs ++ xs)
+
+
+Candidates for: ?? :: [Int] -> [Int] -> [Int]
+  pruning with 4/4 rules
+  [3,0,4,0,8,0,16,0,32] direct candidates, 0 duplicates
+  [3,7,15,59,139,331,987,2016,6970] pattern candidates, 0 duplicates
+
+rules:
+xs ++ [] == xs
+[] ++ xs == xs
+(xs ++ ys) ++ zs == xs ++ (ys ++ zs)
+(x:xs) ++ ys == x:(xs ++ ys)
+
+direct candidates:
+
+xs ?? ys  =  xs
+
+xs ?? ys  =  ys
+
+xs ?? ys  =  []
+
+xs ?? ys  =  xs ++ xs
+
+xs ?? ys  =  xs ++ ys
+
+xs ?? ys  =  ys ++ xs
+
+xs ?? ys  =  ys ++ ys
+
+xs ?? ys  =  xs ++ (xs ++ xs)
+
+xs ?? ys  =  xs ++ (xs ++ ys)
+
+xs ?? ys  =  xs ++ (ys ++ xs)
+
+xs ?? ys  =  xs ++ (ys ++ ys)
+
+xs ?? ys  =  ys ++ (xs ++ xs)
+
+xs ?? ys  =  ys ++ (xs ++ ys)
+
+xs ?? ys  =  ys ++ (ys ++ xs)
+
+xs ?? ys  =  ys ++ (ys ++ ys)
+
+
+pattern candidates:
+
+xs ?? ys  =  xs
+
+xs ?? ys  =  ys
+
+xs ?? ys  =  []
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  []
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  []
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys
+
+xs ?? ys  =  xs ++ xs
+
+xs ?? ys  =  xs ++ ys
+
+xs ?? ys  =  ys ++ xs
+
+xs ?? ys  =  ys ++ ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  []
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ?? ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ?? ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  [] ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  [] ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  [] ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  [] ?? ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ?? xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ?? ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ?? []
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ?? xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ?? ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ?? []
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ?? xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ?? ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ?? []
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ?? xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ?? ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ?? []
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  x:xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  x:ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  [x]
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ++ xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ++ ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ++ xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ++ ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  x:xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  x:ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  [x]
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ++ xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ++ ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ++ xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ++ ys
+
+xs ?? []  =  xs ++ xs
+xs ?? (x:ys)  =  xs
+
+xs ?? []  =  xs ++ xs
+xs ?? (x:ys)  =  ys
+
+xs ?? []  =  xs ++ xs
+xs ?? (x:ys)  =  []
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  x:xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  x:ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  [x]
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ++ xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ++ ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ++ xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ++ ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  x:xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  x:ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  [x]
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ++ xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ++ ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ++ xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ++ ys
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? ys  =  xs
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? ys  =  ys
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? ys  =  []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  xs ?? xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  xs ?? ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  xs ?? []
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys ?? xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys ?? ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys ?? []
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs ?? xs
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs ?? []
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs ?? xs
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs ?? []
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs ?? xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs ?? []
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  xs ?? xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  xs ?? ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  xs ?? []
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  ys ?? xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  ys ?? ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  ys ?? []
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  xs ?? xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  xs ?? ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  xs ?? []
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys ?? xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys ?? ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys ?? []
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs ?? xs
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs ?? []
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs ?? xs
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs ?? []
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs ?? xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs ?? []
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  xs ?? xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  xs ?? ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  xs ?? []
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  ys ?? xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  ys ?? ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  ys ?? []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  xs ?? xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  xs ?? ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  xs ?? []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  ys ?? xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  ys ?? ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  ys ?? []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  [] ?? xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  [] ?? ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs ?? xs
+(x:xs) ?? ys  =  xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs ?? []
+(x:xs) ?? ys  =  xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  [] ?? xs
+(x:xs) ?? ys  =  xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs ?? xs
+(x:xs) ?? ys  =  ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs ?? []
+(x:xs) ?? ys  =  ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  [] ?? xs
+(x:xs) ?? ys  =  ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs ?? xs
+(x:xs) ?? ys  =  []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs ?? []
+(x:xs) ?? ys  =  []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  [] ?? xs
+(x:xs) ?? ys  =  []
+
+xs ?? ys  =  xs ++ (xs ++ xs)
+
+xs ?? ys  =  xs ++ (xs ++ ys)
+
+xs ?? ys  =  xs ++ (ys ++ xs)
+
+xs ?? ys  =  xs ++ (ys ++ ys)
+
+xs ?? ys  =  ys ++ (xs ++ xs)
+
+xs ?? ys  =  ys ++ (xs ++ ys)
+
+xs ?? ys  =  ys ++ (ys ++ xs)
+
+xs ?? ys  =  ys ++ (ys ++ ys)
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  x:xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  x:ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  [x]
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  y:xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  y:ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  [y]
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  xs ++ xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  xs ++ ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys ++ xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys ++ ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  x:xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  x:ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  [x]
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  y:xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  y:ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  [y]
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  xs ++ xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  xs ++ ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  ys ++ xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  ys ++ ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  x:xs
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  x:xs
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  x:xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  [x]
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  [x]
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  [x]
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs ++ xs
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs ++ xs
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? xs  =  xs
+(x:xs) ?? []  =  xs ++ xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  x:xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  x:ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  [x]
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  y:xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  y:ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  [y]
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  xs ++ xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  xs ++ ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys ++ xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys ++ ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  x:xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  x:ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  [x]
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  y:xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  y:ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  [y]
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  xs ++ xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  xs ++ ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  ys ++ xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  ys ++ ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  x:xs
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  x:xs
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  x:xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  [x]
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  [x]
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  [x]
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs ++ xs
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs ++ xs
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? xs  =  []
+(x:xs) ?? []  =  xs ++ xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? []  =  []
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  x:xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  x:ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  [x]
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  xs ++ xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  xs ++ ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  ys ++ xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? ys  =  ys ++ ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  x:xs
+(x:xs) ?? ys  =  xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  x:xs
+(x:xs) ?? ys  =  ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  x:xs
+(x:xs) ?? ys  =  []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  [x]
+(x:xs) ?? ys  =  xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  [x]
+(x:xs) ?? ys  =  ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  [x]
+(x:xs) ?? ys  =  []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs ++ xs
+(x:xs) ?? ys  =  xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs ++ xs
+(x:xs) ?? ys  =  ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs ++ xs
+(x:xs) ?? ys  =  []
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  (x:xs) ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  (x:xs) ?? ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  (x:ys) ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  (x:ys) ?? ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  [x] ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  [x] ?? ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  (xs ++ xs) ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  (xs ++ xs) ?? ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  (xs ++ ys) ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  (xs ++ ys) ?? ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  (ys ++ xs) ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  (ys ++ xs) ?? ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  (ys ++ ys) ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  (ys ++ ys) ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  (x:xs) ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  (x:xs) ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  (x:ys) ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  (x:ys) ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  [x] ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  [x] ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  (xs ++ xs) ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  (xs ++ xs) ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  (xs ++ ys) ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  (xs ++ ys) ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  (ys ++ xs) ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  (ys ++ xs) ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  (ys ++ ys) ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  (ys ++ ys) ?? ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ?? (x:xs)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ?? (x:ys)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ?? [x]
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ?? (xs ++ xs)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ?? (xs ++ ys)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ?? (ys ++ xs)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ?? (ys ++ ys)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ?? (x:xs)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ?? (x:ys)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ?? [x]
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ?? (xs ++ xs)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ?? (xs ++ ys)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ?? (ys ++ xs)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ?? (ys ++ ys)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ?? (x:xs)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ?? (x:ys)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ?? [x]
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ?? (xs ++ xs)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ?? (xs ++ ys)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ?? (ys ++ xs)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ?? (ys ++ ys)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ?? (x:xs)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ?? (x:ys)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ?? [x]
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ?? (xs ++ xs)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ?? (xs ++ ys)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ?? (ys ++ xs)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ?? (ys ++ ys)
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  x:xs ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  x:xs ?? ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  x:ys ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  x:ys ?? ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  x:[] ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  x:[] ?? ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ++ xs ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ++ xs ?? ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ++ ys ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ++ ys ?? ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ++ [] ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ++ [] ?? ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ++ xs ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ++ xs ?? ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ++ ys ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ++ ys ?? ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ++ [] ?? xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ++ [] ?? ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ?? xs ++ xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ?? ys ++ xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ?? xs ++ xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ?? ys ++ xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  [] ?? xs ++ xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  [] ?? ys ++ xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ?? xs ++ ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ?? ys ++ ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ?? xs ++ ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ?? ys ++ ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  [] ?? xs ++ ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  [] ?? ys ++ ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  x:xs ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  x:xs ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  x:ys ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  x:ys ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  x:[] ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  x:[] ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ++ xs ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ++ xs ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ++ ys ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ++ ys ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ++ [] ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ++ [] ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ++ xs ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ++ xs ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ++ ys ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ++ ys ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ++ [] ?? xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ++ [] ?? ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ?? xs ++ xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ?? ys ++ xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ?? xs ++ xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ?? ys ++ xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  [] ?? xs ++ xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  [] ?? ys ++ xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ?? xs ++ ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ?? ys ++ ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ?? xs ++ ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ?? ys ++ ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  [] ?? xs ++ ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  [] ?? ys ++ ys
+
+xs ?? []  =  xs ++ xs
+xs ?? (x:ys)  =  xs ?? xs
+
+xs ?? []  =  xs ++ xs
+xs ?? (x:ys)  =  xs ?? ys
+
+xs ?? []  =  xs ++ xs
+xs ?? (x:ys)  =  ys ?? xs
+
+xs ?? []  =  xs ++ xs
+xs ?? (x:ys)  =  ys ?? ys
+
+xs ?? []  =  xs ++ xs
+xs ?? (x:ys)  =  [] ?? xs
+
+xs ?? []  =  xs ++ xs
+xs ?? (x:ys)  =  [] ?? ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  x:xs ?? xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  x:xs ?? ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  x:xs ?? []
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  x:ys ?? xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  x:ys ?? ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  x:ys ?? []
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ++ xs ?? xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ++ xs ?? ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ++ xs ?? []
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ++ ys ?? xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ++ ys ?? ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ++ ys ?? []
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ++ xs ?? xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ++ xs ?? ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ++ xs ?? []
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ++ ys ?? xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ++ ys ?? ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ++ ys ?? []
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ?? xs ++ xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ?? ys ++ xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ?? [] ++ xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ?? xs ++ xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ?? ys ++ xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ?? [] ++ xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ?? xs ++ ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ?? ys ++ ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ?? [] ++ ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ?? xs ++ ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ?? ys ++ ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ?? [] ++ ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  x:xs ?? xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  x:xs ?? ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  x:xs ?? []
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  x:ys ?? xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  x:ys ?? ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  x:ys ?? []
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ++ xs ?? xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ++ xs ?? ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ++ xs ?? []
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ++ ys ?? xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ++ ys ?? ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ++ ys ?? []
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ++ xs ?? xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ++ xs ?? ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ++ xs ?? []
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ++ ys ?? xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ++ ys ?? ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ++ ys ?? []
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ?? xs ++ xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ?? ys ++ xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ?? [] ++ xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ?? xs ++ xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ?? ys ++ xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ?? [] ++ xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ?? xs ++ ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ?? ys ++ ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ?? [] ++ ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ?? xs ++ ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ?? ys ++ ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ?? [] ++ ys
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? ys  =  xs ?? xs
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? ys  =  xs ?? ys
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? ys  =  xs ?? []
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? ys  =  ys ?? xs
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? ys  =  ys ?? ys
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? ys  =  ys ?? []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  xs ?? xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  xs ?? ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  xs ?? []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys ?? xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys ?? ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys ?? []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  [] ?? xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  [] ?? ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs ?? xs
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs ?? []
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  [] ?? xs
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs ?? xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs ?? []
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  [] ?? xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs ?? xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs ?? []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  [] ?? xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs ?? xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs ?? []
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  [] ?? xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  []
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  x:x:xs
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  x:x:ys
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  [x,x]
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  x:(xs ++ xs)
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  x:(xs ++ ys)
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  x:(ys ++ xs)
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  x:(ys ++ ys)
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ++ (x:xs)
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ++ (x:ys)
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ++ [x]
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ++ (xs ++ xs)
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ++ (xs ++ ys)
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ++ (ys ++ xs)
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  xs ++ (ys ++ ys)
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ++ (x:xs)
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ++ (x:ys)
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ++ [x]
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ++ (xs ++ xs)
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ++ (xs ++ ys)
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ++ (ys ++ xs)
+
+xs ?? []  =  xs
+xs ?? (x:ys)  =  ys ++ (ys ++ ys)
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  x:x:xs
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  x:x:ys
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  [x,x]
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  x:(xs ++ xs)
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  x:(xs ++ ys)
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  x:(ys ++ xs)
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  x:(ys ++ ys)
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ++ (x:xs)
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ++ (x:ys)
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ++ [x]
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ++ (xs ++ xs)
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ++ (xs ++ ys)
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ++ (ys ++ xs)
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  xs ++ (ys ++ ys)
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ++ (x:xs)
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ++ (x:ys)
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ++ [x]
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ++ (xs ++ xs)
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ++ (xs ++ ys)
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ++ (ys ++ xs)
+
+xs ?? []  =  []
+xs ?? (x:ys)  =  ys ++ (ys ++ ys)
+
+xs ?? []  =  xs ++ xs
+xs ?? (x:ys)  =  x:xs
+
+xs ?? []  =  xs ++ xs
+xs ?? (x:ys)  =  x:ys
+
+xs ?? []  =  xs ++ xs
+xs ?? (x:ys)  =  [x]
+
+xs ?? []  =  xs ++ xs
+xs ?? (x:ys)  =  xs ++ ys
+
+xs ?? []  =  xs ++ xs
+xs ?? (x:ys)  =  ys ++ xs
+
+xs ?? []  =  xs ++ xs
+xs ?? (x:ys)  =  ys ++ ys
+
+xs ?? []  =  xs ++ (xs ++ xs)
+xs ?? (x:ys)  =  xs
+
+xs ?? []  =  xs ++ (xs ++ xs)
+xs ?? (x:ys)  =  ys
+
+xs ?? []  =  xs ++ (xs ++ xs)
+xs ?? (x:ys)  =  []
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  x:x:xs
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  x:x:ys
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  [x,x]
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  x:(xs ++ xs)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  x:(xs ++ ys)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  x:(ys ++ xs)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  x:(ys ++ ys)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ++ (x:xs)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ++ (x:ys)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ++ [x]
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ++ (xs ++ xs)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ++ (xs ++ ys)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ++ (ys ++ xs)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  xs ++ (ys ++ ys)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ++ (x:xs)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ++ (x:ys)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ++ [x]
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ++ (xs ++ xs)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ++ (xs ++ ys)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ++ (ys ++ xs)
+
+[] ?? xs  =  xs
+(x:xs) ?? ys  =  ys ++ (ys ++ ys)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  x:x:xs
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  x:x:ys
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  [x,x]
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  x:(xs ++ xs)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  x:(xs ++ ys)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  x:(ys ++ xs)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  x:(ys ++ ys)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ++ (x:xs)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ++ (x:ys)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ++ [x]
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ++ (xs ++ xs)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ++ (xs ++ ys)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ++ (ys ++ xs)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  xs ++ (ys ++ ys)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ++ (x:xs)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ++ (x:ys)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ++ [x]
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ++ (xs ++ xs)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ++ (xs ++ ys)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ++ (ys ++ xs)
+
+[] ?? xs  =  []
+(x:xs) ?? ys  =  ys ++ (ys ++ ys)
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? ys  =  x:xs
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? ys  =  x:ys
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? ys  =  [x]
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? ys  =  xs ++ ys
+
+[] ?? xs  =  xs ++ xs
+(x:xs) ?? ys  =  ys ++ xs
+
+[] ?? xs  =  xs ++ (xs ++ xs)
+(x:xs) ?? ys  =  xs
+
+[] ?? xs  =  xs ++ (xs ++ xs)
+(x:xs) ?? ys  =  ys
+
+[] ?? xs  =  xs ++ (xs ++ xs)
+(x:xs) ?? ys  =  []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  x:xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  x:ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  [x]
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  y:xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  y:ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  [y]
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  xs ++ xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  xs ++ ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys ++ xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys ++ ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  x:xs
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  x:xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  [x]
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  [x]
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs ++ xs
+(x:xs) ?? (y:ys)  =  xs
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs
+(x:xs) ?? []  =  xs ++ xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  x:xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  x:xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  [x]
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  [x]
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  []
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs ++ xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  ys
+
+[] ?? []  =  []
+[] ?? (x:xs)  =  xs ++ xs
+(x:xs) ?? []  =  xs
+(x:xs) ?? (y:ys)  =  []
+
+
+Candidates for: ton :: Bool -> Bool
+  pruning with 39/49 rules
+  [3,1,0,2,6,10,22,40,76] direct candidates, 0 duplicates
+  [3,3,0,0,0,0,0,0,0] pattern candidates, 0 duplicates
+
+rules:
+not False == True
+not True == False
+p && p == p
+p || p == p
+not (not p) == p
+p && False == False
+p && True == p
+False && p == False
+True && p == p
+p || False == p
+p || True == True
+False || p == p
+True || p == True
+not (p && q) == not p || not q
+not (p && q) == not q || not p
+not (p || q) == not p && not q
+not (p || q) == not q && not p
+p && not p == False
+not p && p == False
+p || not p == True
+not p || p == True
+(p && q) && r == p && (q && r)
+(p && q) && r == q && (p && r)
+(p || q) || r == p || (q || r)
+(p || q) || r == q || (p || r)
+p && (p && q) == p && q
+p && (q && p) == p && q
+p && (q && p) == q && p
+p || (p || q) == p || q
+p || (q || p) == p || q
+p || (q || p) == q || p
+p && (p || q) == p
+p && (q || p) == p
+(p || q) && p == p
+(p || q) && q == q
+p || p && q == p
+p || q && p == p
+p && q || p == p
+p && q || q == q
+equations:
+q && p == p && q
+q || p == p || q
+q && (p && r) == p && (q && r)
+r && (p && q) == p && (q && r)
+r && (q && p) == p && (q && r)
+q || (p || r) == p || (q || r)
+r || (p || q) == p || (q || r)
+r || (q || p) == p || (q || r)
+(r || q) && p == p && (q || r)
+r && q || p == p || q && r
+
+direct candidates:
+
+ton p  =  p
+
+ton p  =  False
+
+ton p  =  True
+
+ton p  =  not p
+
+ton p  =  p && ton p
+
+ton p  =  p || ton p
+
+ton p  =  p && ton (not p)
+
+ton p  =  p || ton (not p)
+
+ton p  =  p && not (ton p)
+
+ton p  =  not p && ton p
+
+ton p  =  p || not (ton p)
+
+ton p  =  not p || ton p
+
+ton p  =  p && not (ton (not p))
+
+ton p  =  not p && ton (not p)
+
+ton p  =  p || not (ton (not p))
+
+ton p  =  not p || ton (not p)
+
+ton p  =  p && (p && ton p)
+
+ton p  =  p && (p || ton p)
+
+ton p  =  not p && not (ton p)
+
+ton p  =  p || p && ton p
+
+ton p  =  p || (p || ton p)
+
+ton p  =  not p || not (ton p)
+
+
+pattern candidates:
+
+ton p  =  p
+
+ton p  =  False
+
+ton p  =  True
+
+ton p  =  not p
+
+ton False  =  False
+ton True  =  True
+
+ton False  =  True
+ton True  =  False
+
+
+Candidates for: &| :: Bool -> Bool -> Bool
+  pruning with 39/49 rules
+  [4,2,2,4,30,112,342,1032,2852] direct candidates, 0 duplicates
+  [4,14,26,10,2,16,18,60,120] pattern candidates, 0 duplicates
+
+rules:
+not False == True
+not True == False
+p && p == p
+p || p == p
+not (not p) == p
+p && False == False
+p && True == p
+False && p == False
+True && p == p
+p || False == p
+p || True == True
+False || p == p
+True || p == True
+not (p && q) == not p || not q
+not (p && q) == not q || not p
+not (p || q) == not p && not q
+not (p || q) == not q && not p
+p && not p == False
+not p && p == False
+p || not p == True
+not p || p == True
+(p && q) && r == p && (q && r)
+(p && q) && r == q && (p && r)
+(p || q) || r == p || (q || r)
+(p || q) || r == q || (p || r)
+p && (p && q) == p && q
+p && (q && p) == p && q
+p && (q && p) == q && p
+p || (p || q) == p || q
+p || (q || p) == p || q
+p || (q || p) == q || p
+p && (p || q) == p
+p && (q || p) == p
+(p || q) && p == p
+(p || q) && q == q
+p || p && q == p
+p || q && p == p
+p && q || p == p
+p && q || q == q
+equations:
+q && p == p && q
+q || p == p || q
+q && (p && r) == p && (q && r)
+r && (p && q) == p && (q && r)
+r && (q && p) == p && (q && r)
+q || (p || r) == p || (q || r)
+r || (p || q) == p || (q || r)
+r || (q || p) == p || (q || r)
+(r || q) && p == p && (q || r)
+r && q || p == p || q && r
+
+direct candidates:
+
+p &| q  =  p
+
+p &| q  =  q
+
+p &| q  =  False
+
+p &| q  =  True
+
+p &| q  =  not p
+
+p &| q  =  not q
+
+p &| q  =  p && q
+
+p &| q  =  p || q
+
+p &| q  =  p && not q
+
+p &| q  =  q && not p
+
+p &| q  =  p || not q
+
+p &| q  =  q || not p
+
+p &| q  =  not p && not q
+
+p &| q  =  not p || not q
+
+p &| q  =  p && p &| p
+
+p &| q  =  p && p &| q
+
+p &| q  =  p && p &| False
+
+p &| q  =  p && p &| True
+
+p &| q  =  p && q &| q
+
+p &| q  =  p && False &| q
+
+p &| q  =  p && True &| q
+
+p &| q  =  q && p &| p
+
+p &| q  =  q && p &| q
+
+p &| q  =  q && p &| False
+
+p &| q  =  q && p &| True
+
+p &| q  =  q && q &| q
+
+p &| q  =  q && False &| q
+
+p &| q  =  q && True &| q
+
+p &| q  =  p || p &| p
+
+p &| q  =  p || p &| q
+
+p &| q  =  p || p &| False
+
+p &| q  =  p || p &| True
+
+p &| q  =  p || q &| q
+
+p &| q  =  p || False &| q
+
+p &| q  =  p || True &| q
+
+p &| q  =  q || p &| p
+
+p &| q  =  q || p &| q
+
+p &| q  =  q || p &| False
+
+p &| q  =  q || p &| True
+
+p &| q  =  q || q &| q
+
+p &| q  =  q || False &| q
+
+p &| q  =  q || True &| q
+
+p &| q  =  p && (q && not p)
+
+p &| q  =  p && (q || not p)
+
+p &| q  =  q && (p && not q)
+
+p &| q  =  q && (p || not q)
+
+p &| q  =  p || q && not p
+
+p &| q  =  p || (q || not p)
+
+p &| q  =  q || p && not q
+
+p &| q  =  q || (p || not q)
+
+p &| q  =  not p && (p && q)
+
+p &| q  =  not p && (p || q)
+
+p &| q  =  not q && (p && q)
+
+p &| q  =  not q && (p || q)
+
+p &| q  =  not p || p && q
+
+p &| q  =  not p || (p || q)
+
+p &| q  =  not q || p && q
+
+p &| q  =  not q || (p || q)
+
+p &| q  =  p && p &| not p
+
+p &| q  =  p && p &| not q
+
+p &| q  =  p && q &| not q
+
+p &| q  =  p && False &| not q
+
+p &| q  =  p && True &| not q
+
+p &| q  =  p && not p &| p
+
+p &| q  =  p && not p &| q
+
+p &| q  =  p && not p &| False
+
+p &| q  =  p && not p &| True
+
+p &| q  =  p && not q &| q
+
+p &| q  =  q && p &| not p
+
+p &| q  =  q && p &| not q
+
+p &| q  =  q && q &| not q
+
+p &| q  =  q && False &| not q
+
+p &| q  =  q && True &| not q
+
+p &| q  =  q && not p &| p
+
+p &| q  =  q && not p &| q
+
+p &| q  =  q && not p &| False
+
+p &| q  =  q && not p &| True
+
+p &| q  =  q && not q &| q
+
+p &| q  =  p || p &| not p
+
+p &| q  =  p || p &| not q
+
+p &| q  =  p || q &| not q
+
+p &| q  =  p || False &| not q
+
+p &| q  =  p || True &| not q
+
+p &| q  =  p || not p &| p
+
+p &| q  =  p || not p &| q
+
+p &| q  =  p || not p &| False
+
+p &| q  =  p || not p &| True
+
+p &| q  =  p || not q &| q
+
+p &| q  =  q || p &| not p
+
+p &| q  =  q || p &| not q
+
+p &| q  =  q || q &| not q
+
+p &| q  =  q || False &| not q
+
+p &| q  =  q || True &| not q
+
+p &| q  =  q || not p &| p
+
+p &| q  =  q || not p &| q
+
+p &| q  =  q || not p &| False
+
+p &| q  =  q || not p &| True
+
+p &| q  =  q || not q &| q
+
+p &| q  =  p && not (p &| p)
+
+p &| q  =  p && not (p &| q)
+
+p &| q  =  p && not (p &| False)
+
+p &| q  =  p && not (p &| True)
+
+p &| q  =  p && not (q &| q)
+
+p &| q  =  p && not (False &| q)
+
+p &| q  =  p && not (True &| q)
+
+p &| q  =  q && not (p &| p)
+
+p &| q  =  q && not (p &| q)
+
+p &| q  =  q && not (p &| False)
+
+p &| q  =  q && not (p &| True)
+
+p &| q  =  q && not (q &| q)
+
+p &| q  =  q && not (False &| q)
+
+p &| q  =  q && not (True &| q)
+
+p &| q  =  not p && p &| p
+
+p &| q  =  not p && p &| q
+
+p &| q  =  not p && p &| False
+
+p &| q  =  not p && p &| True
+
+p &| q  =  not p && q &| q
+
+p &| q  =  not p && False &| q
+
+p &| q  =  not p && True &| q
+
+p &| q  =  not q && p &| p
+
+p &| q  =  not q && p &| q
+
+p &| q  =  not q && p &| False
+
+p &| q  =  not q && p &| True
+
+p &| q  =  not q && q &| q
+
+p &| q  =  not q && False &| q
+
+p &| q  =  not q && True &| q
+
+p &| q  =  p || not (p &| p)
+
+p &| q  =  p || not (p &| q)
+
+p &| q  =  p || not (p &| False)
+
+p &| q  =  p || not (p &| True)
+
+p &| q  =  p || not (q &| q)
+
+p &| q  =  p || not (False &| q)
+
+p &| q  =  p || not (True &| q)
+
+p &| q  =  q || not (p &| p)
+
+p &| q  =  q || not (p &| q)
+
+p &| q  =  q || not (p &| False)
+
+p &| q  =  q || not (p &| True)
+
+p &| q  =  q || not (q &| q)
+
+p &| q  =  q || not (False &| q)
+
+p &| q  =  q || not (True &| q)
+
+p &| q  =  not p || p &| p
+
+p &| q  =  not p || p &| q
+
+p &| q  =  not p || p &| False
+
+p &| q  =  not p || p &| True
+
+p &| q  =  not p || q &| q
+
+p &| q  =  not p || False &| q
+
+p &| q  =  not p || True &| q
+
+p &| q  =  not q || p &| p
+
+p &| q  =  not q || p &| q
+
+p &| q  =  not q || p &| False
+
+p &| q  =  not q || p &| True
+
+p &| q  =  not q || q &| q
+
+p &| q  =  not q || False &| q
+
+p &| q  =  not q || True &| q
+
+
+pattern candidates:
+
+p &| q  =  p
+
+p &| q  =  q
+
+p &| q  =  False
+
+p &| q  =  True
+
+p &| q  =  not p
+
+p &| q  =  not q
+
+p &| False  =  p
+p &| True  =  False
+
+p &| False  =  p
+p &| True  =  True
+
+p &| False  =  False
+p &| True  =  p
+
+p &| False  =  False
+p &| True  =  True
+
+p &| False  =  True
+p &| True  =  p
+
+p &| False  =  True
+p &| True  =  False
+
+False &| p  =  p
+True &| p  =  False
+
+False &| p  =  p
+True &| p  =  True
+
+False &| p  =  False
+True &| p  =  p
+
+False &| p  =  False
+True &| p  =  True
+
+False &| p  =  True
+True &| p  =  p
+
+False &| p  =  True
+True &| p  =  False
+
+p &| q  =  p && q
+
+p &| q  =  p || q
+
+p &| False  =  p
+p &| True  =  not p
+
+p &| False  =  False
+p &| True  =  not p
+
+p &| False  =  True
+p &| True  =  not p
+
+p &| False  =  not p
+p &| True  =  p
+
+p &| False  =  not p
+p &| True  =  False
+
+p &| False  =  not p
+p &| True  =  True
+
+False &| p  =  p
+True &| p  =  not p
+
+False &| p  =  False
+True &| p  =  not p
+
+False &| p  =  True
+True &| p  =  not p
+
+False &| p  =  not p
+True &| p  =  p
+
+False &| p  =  not p
+True &| p  =  False
+
+False &| p  =  not p
+True &| p  =  True
+
+False &| p  =  p
+True &| False  =  False
+True &| True  =  True
+
+False &| p  =  p
+True &| False  =  True
+True &| True  =  False
+
+False &| p  =  False
+True &| False  =  False
+True &| True  =  True
+
+False &| p  =  False
+True &| False  =  True
+True &| True  =  False
+
+False &| p  =  True
+True &| False  =  False
+True &| True  =  True
+
+False &| p  =  True
+True &| False  =  True
+True &| True  =  False
+
+False &| False  =  False
+False &| True  =  True
+True &| p  =  p
+
+False &| False  =  False
+False &| True  =  True
+True &| p  =  False
+
+False &| False  =  False
+False &| True  =  True
+True &| p  =  True
+
+False &| False  =  True
+False &| True  =  False
+True &| p  =  p
+
+False &| False  =  True
+False &| True  =  False
+True &| p  =  False
+
+False &| False  =  True
+False &| True  =  False
+True &| p  =  True
+
+p &| q  =  p && not q
+
+p &| q  =  q && not p
+
+p &| q  =  p || not q
+
+p &| q  =  q || not p
+
+False &| p  =  not p
+True &| False  =  False
+True &| True  =  True
+
+False &| p  =  not p
+True &| False  =  True
+True &| True  =  False
+
+False &| False  =  False
+False &| True  =  True
+True &| p  =  not p
+
+False &| False  =  True
+False &| True  =  False
+True &| p  =  not p
+
+False &| False  =  False
+False &| True  =  True
+True &| False  =  True
+True &| True  =  False
+
+False &| False  =  True
+False &| True  =  False
+True &| False  =  False
+True &| True  =  True
+
+p &| q  =  not p && not q
+
+p &| q  =  not p || not q
+
+p &| q  =  p && (q && not p)
+
+p &| q  =  p && (q || not p)
+
+p &| q  =  q && (p && not q)
+
+p &| q  =  q && (p || not q)
+
+p &| q  =  p || q && not p
+
+p &| q  =  p || (q || not p)
+
+p &| q  =  q || p && not q
+
+p &| q  =  q || (p || not q)
+
+p &| q  =  not p && (p && q)
+
+p &| q  =  not p && (p || q)
+
+p &| q  =  not q && (p && q)
+
+p &| q  =  not q && (p || q)
+
+p &| q  =  not p || p && q
+
+p &| q  =  not p || (p || q)
+
+p &| q  =  not q || p && q
+
+p &| q  =  not q || (p || q)
+
+
+Candidates for: gcd :: Int -> Int -> Int
+  pruning with 0/0 rules
+  [3,0,9,0,54,0,405,0,3402] direct candidates, 0 duplicates
+  [3,5,11,50,98,359,786,2836,6723] pattern candidates, 0 duplicates
+
+no rules.
+
+direct candidates:
+
+gcd x y  =  x
+
+gcd x y  =  y
+
+gcd x y  =  0
+
+gcd x y  =  x `mod` x
+
+gcd x y  =  x `mod` y
+
+gcd x y  =  x `mod` 0
+
+gcd x y  =  y `mod` x
+
+gcd x y  =  y `mod` y
+
+gcd x y  =  y `mod` 0
+
+gcd x y  =  0 `mod` x
+
+gcd x y  =  0 `mod` y
+
+gcd x y  =  0 `mod` 0
+
+gcd x y  =  (x `mod` x) `mod` x
+
+gcd x y  =  (x `mod` x) `mod` y
+
+gcd x y  =  (x `mod` x) `mod` 0
+
+gcd x y  =  (x `mod` y) `mod` x
+
+gcd x y  =  (x `mod` y) `mod` y
+
+gcd x y  =  (x `mod` y) `mod` 0
+
+gcd x y  =  (x `mod` 0) `mod` x
+
+gcd x y  =  (x `mod` 0) `mod` y
+
+gcd x y  =  (x `mod` 0) `mod` 0
+
+gcd x y  =  (y `mod` x) `mod` x
+
+gcd x y  =  (y `mod` x) `mod` y
+
+gcd x y  =  (y `mod` x) `mod` 0
+
+gcd x y  =  (y `mod` y) `mod` x
+
+gcd x y  =  (y `mod` y) `mod` y
+
+gcd x y  =  (y `mod` y) `mod` 0
+
+gcd x y  =  (y `mod` 0) `mod` x
+
+gcd x y  =  (y `mod` 0) `mod` y
+
+gcd x y  =  (y `mod` 0) `mod` 0
+
+gcd x y  =  (0 `mod` x) `mod` x
+
+gcd x y  =  (0 `mod` x) `mod` y
+
+gcd x y  =  (0 `mod` x) `mod` 0
+
+gcd x y  =  (0 `mod` y) `mod` x
+
+gcd x y  =  (0 `mod` y) `mod` y
+
+gcd x y  =  (0 `mod` y) `mod` 0
+
+gcd x y  =  (0 `mod` 0) `mod` x
+
+gcd x y  =  (0 `mod` 0) `mod` y
+
+gcd x y  =  (0 `mod` 0) `mod` 0
+
+gcd x y  =  x `mod` (x `mod` x)
+
+gcd x y  =  x `mod` (x `mod` y)
+
+gcd x y  =  x `mod` (x `mod` 0)
+
+gcd x y  =  x `mod` (y `mod` x)
+
+gcd x y  =  x `mod` (y `mod` y)
+
+gcd x y  =  x `mod` (y `mod` 0)
+
+gcd x y  =  x `mod` (0 `mod` x)
+
+gcd x y  =  x `mod` (0 `mod` y)
+
+gcd x y  =  x `mod` (0 `mod` 0)
+
+gcd x y  =  y `mod` (x `mod` x)
+
+gcd x y  =  y `mod` (x `mod` y)
+
+gcd x y  =  y `mod` (x `mod` 0)
+
+gcd x y  =  y `mod` (y `mod` x)
+
+gcd x y  =  y `mod` (y `mod` y)
+
+gcd x y  =  y `mod` (y `mod` 0)
+
+gcd x y  =  y `mod` (0 `mod` x)
+
+gcd x y  =  y `mod` (0 `mod` y)
+
+gcd x y  =  y `mod` (0 `mod` 0)
+
+gcd x y  =  0 `mod` (x `mod` x)
+
+gcd x y  =  0 `mod` (x `mod` y)
+
+gcd x y  =  0 `mod` (x `mod` 0)
+
+gcd x y  =  0 `mod` (y `mod` x)
+
+gcd x y  =  0 `mod` (y `mod` y)
+
+gcd x y  =  0 `mod` (y `mod` 0)
+
+gcd x y  =  0 `mod` (0 `mod` x)
+
+gcd x y  =  0 `mod` (0 `mod` y)
+
+gcd x y  =  0 `mod` (0 `mod` 0)
+
+
+pattern candidates:
+
+gcd x y  =  x
+
+gcd x y  =  y
+
+gcd x y  =  0
+
+gcd x 0  =  x
+gcd x y  =  y
+
+gcd x 0  =  x
+gcd x y  =  0
+
+gcd x 0  =  0
+gcd x y  =  x
+
+gcd 0 x  =  x
+gcd x y  =  0
+
+gcd 0 x  =  0
+gcd x y  =  y
+
+gcd x y  =  x `mod` x
+
+gcd x y  =  x `mod` y
+
+gcd x y  =  x `mod` 0
+
+gcd x y  =  y `mod` x
+
+gcd x y  =  y `mod` y
+
+gcd x y  =  y `mod` 0
+
+gcd x y  =  0 `mod` x
+
+gcd x y  =  0 `mod` y
+
+gcd 0 x  =  x
+gcd x 0  =  x
+gcd x y  =  0
+
+gcd 0 x  =  x
+gcd x 0  =  0
+gcd x y  =  x
+
+gcd 0 x  =  0
+gcd x 0  =  x
+gcd x y  =  y
+
+gcd x 0  =  x
+gcd x y  =  x `mod` x
+
+gcd x 0  =  x
+gcd x y  =  x `mod` y
+
+gcd x 0  =  x
+gcd x y  =  x `mod` 0
+
+gcd x 0  =  x
+gcd x y  =  y `mod` x
+
+gcd x 0  =  x
+gcd x y  =  y `mod` y
+
+gcd x 0  =  x
+gcd x y  =  y `mod` 0
+
+gcd x 0  =  x
+gcd x y  =  0 `mod` x
+
+gcd x 0  =  x
+gcd x y  =  0 `mod` y
+
+gcd x 0  =  0
+gcd x y  =  x `mod` x
+
+gcd x 0  =  0
+gcd x y  =  x `mod` y
+
+gcd x 0  =  0
+gcd x y  =  x `mod` 0
+
+gcd x 0  =  0
+gcd x y  =  y `mod` x
+
+gcd x 0  =  0
+gcd x y  =  y `mod` y
+
+gcd x 0  =  0
+gcd x y  =  y `mod` 0
+
+gcd x 0  =  0
+gcd x y  =  0 `mod` x
+
+gcd x 0  =  0
+gcd x y  =  0 `mod` y
+
+gcd x 0  =  x `mod` x
+gcd x y  =  x
+
+gcd x 0  =  x `mod` x
+gcd x y  =  y
+
+gcd x 0  =  x `mod` x
+gcd x y  =  0
+
+gcd x 0  =  x `mod` 0
+gcd x y  =  x
+
+gcd x 0  =  x `mod` 0
+gcd x y  =  y
+
+gcd x 0  =  x `mod` 0
+gcd x y  =  0
+
+gcd x 0  =  0 `mod` x
+gcd x y  =  x
+
+gcd x 0  =  0 `mod` x
+gcd x y  =  y
+
+gcd x 0  =  0 `mod` x
+gcd x y  =  0
+
+gcd 0 x  =  x
+gcd x y  =  x `mod` x
+
+gcd 0 x  =  x
+gcd x y  =  x `mod` y
+
+gcd 0 x  =  x
+gcd x y  =  x `mod` 0
+
+gcd 0 x  =  x
+gcd x y  =  y `mod` x
+
+gcd 0 x  =  x
+gcd x y  =  y `mod` y
+
+gcd 0 x  =  x
+gcd x y  =  y `mod` 0
+
+gcd 0 x  =  x
+gcd x y  =  0 `mod` x
+
+gcd 0 x  =  x
+gcd x y  =  0 `mod` y
+
+gcd 0 x  =  0
+gcd x y  =  x `mod` x
+
+gcd 0 x  =  0
+gcd x y  =  x `mod` y
+
+gcd 0 x  =  0
+gcd x y  =  x `mod` 0
+
+gcd 0 x  =  0
+gcd x y  =  y `mod` x
+
+gcd 0 x  =  0
+gcd x y  =  y `mod` y
+
+gcd 0 x  =  0
+gcd x y  =  y `mod` 0
+
+gcd 0 x  =  0
+gcd x y  =  0 `mod` x
+
+gcd 0 x  =  0
+gcd x y  =  0 `mod` y
+
+gcd 0 x  =  x `mod` x
+gcd x y  =  x
+
+gcd 0 x  =  x `mod` x
+gcd x y  =  y
+
+gcd 0 x  =  x `mod` x
+gcd x y  =  0
+
+gcd 0 x  =  x `mod` 0
+gcd x y  =  x
+
+gcd 0 x  =  x `mod` 0
+gcd x y  =  y
+
+gcd 0 x  =  x `mod` 0
+gcd x y  =  0
+
+gcd 0 x  =  0 `mod` x
+gcd x y  =  x
+
+gcd 0 x  =  0 `mod` x
+gcd x y  =  y
+
+gcd 0 x  =  0 `mod` x
+gcd x y  =  0
+
+gcd x y  =  (x `mod` x) `mod` x
+
+gcd x y  =  (x `mod` x) `mod` y
+
+gcd x y  =  (x `mod` x) `mod` 0
+
+gcd x y  =  (x `mod` y) `mod` x
+
+gcd x y  =  (x `mod` y) `mod` y
+
+gcd x y  =  (x `mod` y) `mod` 0
+
+gcd x y  =  (x `mod` 0) `mod` x
+
+gcd x y  =  (x `mod` 0) `mod` y
+
+gcd x y  =  (x `mod` 0) `mod` 0
+
+gcd x y  =  (y `mod` x) `mod` x
+
+gcd x y  =  (y `mod` x) `mod` y
+
+gcd x y  =  (y `mod` x) `mod` 0
+
+gcd x y  =  (y `mod` y) `mod` x
+
+gcd x y  =  (y `mod` y) `mod` y
+
+gcd x y  =  (y `mod` y) `mod` 0
+
+gcd x y  =  (y `mod` 0) `mod` x
+
+gcd x y  =  (y `mod` 0) `mod` y
+
+gcd x y  =  (y `mod` 0) `mod` 0
+
+gcd x y  =  (0 `mod` x) `mod` x
+
+gcd x y  =  (0 `mod` x) `mod` y
+
+gcd x y  =  (0 `mod` x) `mod` 0
+
+gcd x y  =  (0 `mod` y) `mod` x
+
+gcd x y  =  (0 `mod` y) `mod` y
+
+gcd x y  =  (0 `mod` y) `mod` 0
+
+gcd x y  =  x `mod` (x `mod` x)
+
+gcd x y  =  x `mod` (x `mod` y)
+
+gcd x y  =  x `mod` (x `mod` 0)
+
+gcd x y  =  x `mod` (y `mod` x)
+
+gcd x y  =  x `mod` (y `mod` y)
+
+gcd x y  =  x `mod` (y `mod` 0)
+
+gcd x y  =  x `mod` (0 `mod` x)
+
+gcd x y  =  x `mod` (0 `mod` y)
+
+gcd x y  =  y `mod` (x `mod` x)
+
+gcd x y  =  y `mod` (x `mod` y)
+
+gcd x y  =  y `mod` (x `mod` 0)
+
+gcd x y  =  y `mod` (y `mod` x)
+
+gcd x y  =  y `mod` (y `mod` y)
+
+gcd x y  =  y `mod` (y `mod` 0)
+
+gcd x y  =  y `mod` (0 `mod` x)
+
+gcd x y  =  y `mod` (0 `mod` y)
+
+gcd x y  =  0 `mod` (x `mod` x)
+
+gcd x y  =  0 `mod` (x `mod` y)
+
+gcd x y  =  0 `mod` (x `mod` 0)
+
+gcd x y  =  0 `mod` (y `mod` x)
+
+gcd x y  =  0 `mod` (y `mod` y)
+
+gcd x y  =  0 `mod` (y `mod` 0)
+
+gcd x y  =  0 `mod` (0 `mod` x)
+
+gcd x y  =  0 `mod` (0 `mod` y)
+
+gcd 0 x  =  x
+gcd x 0  =  x
+gcd x y  =  x `mod` x
+
+gcd 0 x  =  x
+gcd x 0  =  x
+gcd x y  =  x `mod` y
+
+gcd 0 x  =  x
+gcd x 0  =  x
+gcd x y  =  x `mod` 0
+
+gcd 0 x  =  x
+gcd x 0  =  x
+gcd x y  =  y `mod` x
+
+gcd 0 x  =  x
+gcd x 0  =  x
+gcd x y  =  y `mod` y
+
+gcd 0 x  =  x
+gcd x 0  =  x
+gcd x y  =  y `mod` 0
+
+gcd 0 x  =  x
+gcd x 0  =  x
+gcd x y  =  0 `mod` x
+
+gcd 0 x  =  x
+gcd x 0  =  x
+gcd x y  =  0 `mod` y
+
+gcd 0 x  =  x
+gcd x 0  =  0
+gcd x y  =  x `mod` x
+
+gcd 0 x  =  x
+gcd x 0  =  0
+gcd x y  =  x `mod` y
+
+gcd 0 x  =  x
+gcd x 0  =  0
+gcd x y  =  x `mod` 0
+
+gcd 0 x  =  x
+gcd x 0  =  0
+gcd x y  =  y `mod` x
+
+gcd 0 x  =  x
+gcd x 0  =  0
+gcd x y  =  y `mod` y
+
+gcd 0 x  =  x
+gcd x 0  =  0
+gcd x y  =  y `mod` 0
+
+gcd 0 x  =  x
+gcd x 0  =  0
+gcd x y  =  0 `mod` x
+
+gcd 0 x  =  x
+gcd x 0  =  0
+gcd x y  =  0 `mod` y
+
+gcd 0 x  =  x
+gcd x 0  =  x `mod` x
+gcd x y  =  x
+
+gcd 0 x  =  x
+gcd x 0  =  x `mod` x
+gcd x y  =  0
+
+gcd 0 x  =  x
+gcd x 0  =  x `mod` 0
+gcd x y  =  x
+
+gcd 0 x  =  x
+gcd x 0  =  x `mod` 0
+gcd x y  =  0
+
+gcd 0 x  =  x
+gcd x 0  =  0 `mod` x
+gcd x y  =  x
+
+gcd 0 x  =  x
+gcd x 0  =  0 `mod` x
+gcd x y  =  0
+
+gcd 0 x  =  0
+gcd x 0  =  x
+gcd x y  =  x `mod` x
+
+gcd 0 x  =  0
+gcd x 0  =  x
+gcd x y  =  x `mod` y
+
+gcd 0 x  =  0
+gcd x 0  =  x
+gcd x y  =  x `mod` 0
+
+gcd 0 x  =  0
+gcd x 0  =  x
+gcd x y  =  y `mod` x
+
+gcd 0 x  =  0
+gcd x 0  =  x
+gcd x y  =  y `mod` y
+
+gcd 0 x  =  0
+gcd x 0  =  x
+gcd x y  =  y `mod` 0
+
+gcd 0 x  =  0
+gcd x 0  =  x
+gcd x y  =  0 `mod` x
+
+gcd 0 x  =  0
+gcd x 0  =  x
+gcd x y  =  0 `mod` y
+
+gcd 0 x  =  0
+gcd x 0  =  0
+gcd x y  =  x `mod` x
+
+gcd 0 x  =  0
+gcd x 0  =  0
+gcd x y  =  x `mod` y
+
+gcd 0 x  =  0
+gcd x 0  =  0
+gcd x y  =  x `mod` 0
+
+gcd 0 x  =  0
+gcd x 0  =  0
+gcd x y  =  y `mod` x
+
+gcd 0 x  =  0
+gcd x 0  =  0
+gcd x y  =  y `mod` y
+
+gcd 0 x  =  0
+gcd x 0  =  0
+gcd x y  =  y `mod` 0
+
+gcd 0 x  =  0
+gcd x 0  =  0
+gcd x y  =  0 `mod` x
+
+gcd 0 x  =  0
+gcd x 0  =  0
+gcd x y  =  0 `mod` y
+
+gcd 0 x  =  0
+gcd x 0  =  x `mod` x
+gcd x y  =  y
+
+gcd 0 x  =  0
+gcd x 0  =  x `mod` 0
+gcd x y  =  y
+
+gcd 0 x  =  0
+gcd x 0  =  0 `mod` x
+gcd x y  =  y
+
+gcd 0 x  =  x `mod` x
+gcd x 0  =  x
+gcd x y  =  y
+
+gcd 0 x  =  x `mod` x
+gcd x 0  =  x
+gcd x y  =  0
+
+gcd 0 x  =  x `mod` x
+gcd x 0  =  0
+gcd x y  =  x
+
+gcd 0 x  =  x `mod` 0
+gcd x 0  =  x
+gcd x y  =  y
+
+gcd 0 x  =  x `mod` 0
+gcd x 0  =  x
+gcd x y  =  0
+
+gcd 0 x  =  x `mod` 0
+gcd x 0  =  0
+gcd x y  =  x
+
+gcd 0 x  =  0 `mod` x
+gcd x 0  =  x
+gcd x y  =  y
+
+gcd 0 x  =  0 `mod` x
+gcd x 0  =  x
+gcd x y  =  0
+
+gcd 0 x  =  0 `mod` x
+gcd x 0  =  0
+gcd x y  =  x
+
+gcd x 0  =  x
+gcd x y  =  gcd x (x `mod` y)
+
+gcd x 0  =  x
+gcd x y  =  gcd x (y `mod` y)
+
+gcd x 0  =  x
+gcd x y  =  gcd x (0 `mod` y)
+
+gcd x 0  =  x
+gcd x y  =  gcd y (x `mod` y)
+
+gcd x 0  =  x
+gcd x y  =  gcd y (y `mod` y)
+
+gcd x 0  =  x
+gcd x y  =  gcd y (0 `mod` y)
+
+gcd x 0  =  x
+gcd x y  =  gcd 0 (x `mod` y)
+
+gcd x 0  =  x
+gcd x y  =  gcd 0 (y `mod` y)
+
+gcd x 0  =  x
+gcd x y  =  gcd 0 (0 `mod` y)
+
+gcd x 0  =  x
+gcd x y  =  gcd (x `mod` x) x
+
+gcd x 0  =  x
+gcd x y  =  gcd (x `mod` x) y
+
+gcd x 0  =  x
+gcd x y  =  gcd (y `mod` x) x
+
+gcd x 0  =  x
+gcd x y  =  gcd (y `mod` x) y
+
+gcd x 0  =  x
+gcd x y  =  gcd (0 `mod` x) x
+
+gcd x 0  =  x
+gcd x y  =  gcd (0 `mod` x) y
+
+gcd x 0  =  0
+gcd x y  =  gcd x (x `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  gcd x (y `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  gcd x (0 `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  gcd y (x `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  gcd y (y `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  gcd y (0 `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  gcd 0 (x `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  gcd 0 (y `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  gcd 0 (0 `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  gcd (x `mod` x) x
+
+gcd x 0  =  0
+gcd x y  =  gcd (x `mod` x) y
+
+gcd x 0  =  0
+gcd x y  =  gcd (y `mod` x) x
+
+gcd x 0  =  0
+gcd x y  =  gcd (y `mod` x) y
+
+gcd x 0  =  0
+gcd x y  =  gcd (0 `mod` x) x
+
+gcd x 0  =  0
+gcd x y  =  gcd (0 `mod` x) y
+
+gcd 0 x  =  x
+gcd x y  =  gcd x (x `mod` y)
+
+gcd 0 x  =  x
+gcd x y  =  gcd x (y `mod` y)
+
+gcd 0 x  =  x
+gcd x y  =  gcd x (0 `mod` y)
+
+gcd 0 x  =  x
+gcd x y  =  gcd y (x `mod` y)
+
+gcd 0 x  =  x
+gcd x y  =  gcd y (y `mod` y)
+
+gcd 0 x  =  x
+gcd x y  =  gcd y (0 `mod` y)
+
+gcd 0 x  =  x
+gcd x y  =  gcd (x `mod` x) x
+
+gcd 0 x  =  x
+gcd x y  =  gcd (x `mod` x) y
+
+gcd 0 x  =  x
+gcd x y  =  gcd (x `mod` x) 0
+
+gcd 0 x  =  x
+gcd x y  =  gcd (y `mod` x) x
+
+gcd 0 x  =  x
+gcd x y  =  gcd (y `mod` x) y
+
+gcd 0 x  =  x
+gcd x y  =  gcd (y `mod` x) 0
+
+gcd 0 x  =  x
+gcd x y  =  gcd (0 `mod` x) x
+
+gcd 0 x  =  x
+gcd x y  =  gcd (0 `mod` x) y
+
+gcd 0 x  =  x
+gcd x y  =  gcd (0 `mod` x) 0
+
+gcd 0 x  =  0
+gcd x y  =  gcd x (x `mod` y)
+
+gcd 0 x  =  0
+gcd x y  =  gcd x (y `mod` y)
+
+gcd 0 x  =  0
+gcd x y  =  gcd x (0 `mod` y)
+
+gcd 0 x  =  0
+gcd x y  =  gcd y (x `mod` y)
+
+gcd 0 x  =  0
+gcd x y  =  gcd y (y `mod` y)
+
+gcd 0 x  =  0
+gcd x y  =  gcd y (0 `mod` y)
+
+gcd 0 x  =  0
+gcd x y  =  gcd (x `mod` x) x
+
+gcd 0 x  =  0
+gcd x y  =  gcd (x `mod` x) y
+
+gcd 0 x  =  0
+gcd x y  =  gcd (x `mod` x) 0
+
+gcd 0 x  =  0
+gcd x y  =  gcd (y `mod` x) x
+
+gcd 0 x  =  0
+gcd x y  =  gcd (y `mod` x) y
+
+gcd 0 x  =  0
+gcd x y  =  gcd (y `mod` x) 0
+
+gcd 0 x  =  0
+gcd x y  =  gcd (0 `mod` x) x
+
+gcd 0 x  =  0
+gcd x y  =  gcd (0 `mod` x) y
+
+gcd 0 x  =  0
+gcd x y  =  gcd (0 `mod` x) 0
+
+gcd x 0  =  x
+gcd x y  =  (x `mod` x) `mod` x
+
+gcd x 0  =  x
+gcd x y  =  (x `mod` x) `mod` y
+
+gcd x 0  =  x
+gcd x y  =  (x `mod` x) `mod` 0
+
+gcd x 0  =  x
+gcd x y  =  (x `mod` y) `mod` x
+
+gcd x 0  =  x
+gcd x y  =  (x `mod` y) `mod` y
+
+gcd x 0  =  x
+gcd x y  =  (x `mod` y) `mod` 0
+
+gcd x 0  =  x
+gcd x y  =  (x `mod` 0) `mod` x
+
+gcd x 0  =  x
+gcd x y  =  (x `mod` 0) `mod` y
+
+gcd x 0  =  x
+gcd x y  =  (x `mod` 0) `mod` 0
+
+gcd x 0  =  x
+gcd x y  =  (y `mod` x) `mod` x
+
+gcd x 0  =  x
+gcd x y  =  (y `mod` x) `mod` y
+
+gcd x 0  =  x
+gcd x y  =  (y `mod` x) `mod` 0
+
+gcd x 0  =  x
+gcd x y  =  (y `mod` y) `mod` x
+
+gcd x 0  =  x
+gcd x y  =  (y `mod` y) `mod` y
+
+gcd x 0  =  x
+gcd x y  =  (y `mod` y) `mod` 0
+
+gcd x 0  =  x
+gcd x y  =  (y `mod` 0) `mod` x
+
+gcd x 0  =  x
+gcd x y  =  (y `mod` 0) `mod` y
+
+gcd x 0  =  x
+gcd x y  =  (y `mod` 0) `mod` 0
+
+gcd x 0  =  x
+gcd x y  =  (0 `mod` x) `mod` x
+
+gcd x 0  =  x
+gcd x y  =  (0 `mod` x) `mod` y
+
+gcd x 0  =  x
+gcd x y  =  (0 `mod` x) `mod` 0
+
+gcd x 0  =  x
+gcd x y  =  (0 `mod` y) `mod` x
+
+gcd x 0  =  x
+gcd x y  =  (0 `mod` y) `mod` y
+
+gcd x 0  =  x
+gcd x y  =  (0 `mod` y) `mod` 0
+
+gcd x 0  =  x
+gcd x y  =  x `mod` (x `mod` x)
+
+gcd x 0  =  x
+gcd x y  =  x `mod` (x `mod` y)
+
+gcd x 0  =  x
+gcd x y  =  x `mod` (x `mod` 0)
+
+gcd x 0  =  x
+gcd x y  =  x `mod` (y `mod` x)
+
+gcd x 0  =  x
+gcd x y  =  x `mod` (y `mod` y)
+
+gcd x 0  =  x
+gcd x y  =  x `mod` (y `mod` 0)
+
+gcd x 0  =  x
+gcd x y  =  x `mod` (0 `mod` x)
+
+gcd x 0  =  x
+gcd x y  =  x `mod` (0 `mod` y)
+
+gcd x 0  =  x
+gcd x y  =  y `mod` (x `mod` x)
+
+gcd x 0  =  x
+gcd x y  =  y `mod` (x `mod` y)
+
+gcd x 0  =  x
+gcd x y  =  y `mod` (x `mod` 0)
+
+gcd x 0  =  x
+gcd x y  =  y `mod` (y `mod` x)
+
+gcd x 0  =  x
+gcd x y  =  y `mod` (y `mod` y)
+
+gcd x 0  =  x
+gcd x y  =  y `mod` (y `mod` 0)
+
+gcd x 0  =  x
+gcd x y  =  y `mod` (0 `mod` x)
+
+gcd x 0  =  x
+gcd x y  =  y `mod` (0 `mod` y)
+
+gcd x 0  =  x
+gcd x y  =  0 `mod` (x `mod` x)
+
+gcd x 0  =  x
+gcd x y  =  0 `mod` (x `mod` y)
+
+gcd x 0  =  x
+gcd x y  =  0 `mod` (x `mod` 0)
+
+gcd x 0  =  x
+gcd x y  =  0 `mod` (y `mod` x)
+
+gcd x 0  =  x
+gcd x y  =  0 `mod` (y `mod` y)
+
+gcd x 0  =  x
+gcd x y  =  0 `mod` (y `mod` 0)
+
+gcd x 0  =  x
+gcd x y  =  0 `mod` (0 `mod` x)
+
+gcd x 0  =  x
+gcd x y  =  0 `mod` (0 `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  (x `mod` x) `mod` x
+
+gcd x 0  =  0
+gcd x y  =  (x `mod` x) `mod` y
+
+gcd x 0  =  0
+gcd x y  =  (x `mod` x) `mod` 0
+
+gcd x 0  =  0
+gcd x y  =  (x `mod` y) `mod` x
+
+gcd x 0  =  0
+gcd x y  =  (x `mod` y) `mod` y
+
+gcd x 0  =  0
+gcd x y  =  (x `mod` y) `mod` 0
+
+gcd x 0  =  0
+gcd x y  =  (x `mod` 0) `mod` x
+
+gcd x 0  =  0
+gcd x y  =  (x `mod` 0) `mod` y
+
+gcd x 0  =  0
+gcd x y  =  (x `mod` 0) `mod` 0
+
+gcd x 0  =  0
+gcd x y  =  (y `mod` x) `mod` x
+
+gcd x 0  =  0
+gcd x y  =  (y `mod` x) `mod` y
+
+gcd x 0  =  0
+gcd x y  =  (y `mod` x) `mod` 0
+
+gcd x 0  =  0
+gcd x y  =  (y `mod` y) `mod` x
+
+gcd x 0  =  0
+gcd x y  =  (y `mod` y) `mod` y
+
+gcd x 0  =  0
+gcd x y  =  (y `mod` y) `mod` 0
+
+gcd x 0  =  0
+gcd x y  =  (y `mod` 0) `mod` x
+
+gcd x 0  =  0
+gcd x y  =  (y `mod` 0) `mod` y
+
+gcd x 0  =  0
+gcd x y  =  (y `mod` 0) `mod` 0
+
+gcd x 0  =  0
+gcd x y  =  (0 `mod` x) `mod` x
+
+gcd x 0  =  0
+gcd x y  =  (0 `mod` x) `mod` y
+
+gcd x 0  =  0
+gcd x y  =  (0 `mod` x) `mod` 0
+
+gcd x 0  =  0
+gcd x y  =  (0 `mod` y) `mod` x
+
+gcd x 0  =  0
+gcd x y  =  (0 `mod` y) `mod` y
+
+gcd x 0  =  0
+gcd x y  =  (0 `mod` y) `mod` 0
+
+gcd x 0  =  0
+gcd x y  =  x `mod` (x `mod` x)
+
+gcd x 0  =  0
+gcd x y  =  x `mod` (x `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  x `mod` (x `mod` 0)
+
+gcd x 0  =  0
+gcd x y  =  x `mod` (y `mod` x)
+
+gcd x 0  =  0
+gcd x y  =  x `mod` (y `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  x `mod` (y `mod` 0)
+
+gcd x 0  =  0
+gcd x y  =  x `mod` (0 `mod` x)
+
+gcd x 0  =  0
+gcd x y  =  x `mod` (0 `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  y `mod` (x `mod` x)
+
+gcd x 0  =  0
+gcd x y  =  y `mod` (x `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  y `mod` (x `mod` 0)
+
+gcd x 0  =  0
+gcd x y  =  y `mod` (y `mod` x)
+
+gcd x 0  =  0
+gcd x y  =  y `mod` (y `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  y `mod` (y `mod` 0)
+
+gcd x 0  =  0
+gcd x y  =  y `mod` (0 `mod` x)
+
+gcd x 0  =  0
+gcd x y  =  y `mod` (0 `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  0 `mod` (x `mod` x)
+
+gcd x 0  =  0
+gcd x y  =  0 `mod` (x `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  0 `mod` (x `mod` 0)
+
+gcd x 0  =  0
+gcd x y  =  0 `mod` (y `mod` x)
+
+gcd x 0  =  0
+gcd x y  =  0 `mod` (y `mod` y)
+
+gcd x 0  =  0
+gcd x y  =  0 `mod` (y `mod` 0)
+
+gcd x 0  =  0
+gcd x y  =  0 `mod` (0 `mod` x)
+
+gcd x 0  =  0
+gcd x y  =  0 `mod` (0 `mod` y)
+
+gcd x 0  =  x `mod` x
+gcd x y  =  x `mod` y
+
+gcd x 0  =  x `mod` x
+gcd x y  =  x `mod` 0
+
+gcd x 0  =  x `mod` x
+gcd x y  =  y `mod` x
+
+gcd x 0  =  x `mod` x
+gcd x y  =  y `mod` y
+
+gcd x 0  =  x `mod` x
+gcd x y  =  y `mod` 0
+
+gcd x 0  =  x `mod` x
+gcd x y  =  0 `mod` x
+
+gcd x 0  =  x `mod` x
+gcd x y  =  0 `mod` y
+
+gcd x 0  =  x `mod` 0
+gcd x y  =  x `mod` x
+
+gcd x 0  =  x `mod` 0
+gcd x y  =  y `mod` x
+
+gcd x 0  =  x `mod` 0
+gcd x y  =  y `mod` y
+
+gcd x 0  =  x `mod` 0
+gcd x y  =  y `mod` 0
+
+gcd x 0  =  x `mod` 0
+gcd x y  =  0 `mod` x
+
+gcd x 0  =  x `mod` 0
+gcd x y  =  0 `mod` y
+
+gcd x 0  =  0 `mod` x
+gcd x y  =  x `mod` x
+
+gcd x 0  =  0 `mod` x
+gcd x y  =  x `mod` y
+
+gcd x 0  =  0 `mod` x
+gcd x y  =  x `mod` 0
+
+gcd x 0  =  0 `mod` x
+gcd x y  =  y `mod` y
+
+gcd x 0  =  0 `mod` x
+gcd x y  =  y `mod` 0
+
+gcd x 0  =  0 `mod` x
+gcd x y  =  0 `mod` y
+
+gcd x 0  =  (x `mod` x) `mod` x
+gcd x y  =  x
+
+gcd x 0  =  (x `mod` x) `mod` x
+gcd x y  =  y
+
+gcd x 0  =  (x `mod` x) `mod` x
+gcd x y  =  0
+
+gcd x 0  =  (x `mod` x) `mod` 0
+gcd x y  =  x
+
+gcd x 0  =  (x `mod` x) `mod` 0
+gcd x y  =  y
+
+gcd x 0  =  (x `mod` x) `mod` 0
+gcd x y  =  0
+
+gcd x 0  =  (x `mod` 0) `mod` x
+gcd x y  =  x
+
+gcd x 0  =  (x `mod` 0) `mod` x
+gcd x y  =  y
+
+gcd x 0  =  (x `mod` 0) `mod` x
+gcd x y  =  0
+
+gcd x 0  =  (x `mod` 0) `mod` 0
+gcd x y  =  x
+
+gcd x 0  =  (x `mod` 0) `mod` 0
+gcd x y  =  y
+
+gcd x 0  =  (x `mod` 0) `mod` 0
+gcd x y  =  0
+
+gcd x 0  =  (0 `mod` x) `mod` x
+gcd x y  =  x
+
+gcd x 0  =  (0 `mod` x) `mod` x
+gcd x y  =  y
+
+gcd x 0  =  (0 `mod` x) `mod` x
+gcd x y  =  0
+
+gcd x 0  =  (0 `mod` x) `mod` 0
+gcd x y  =  x
+
+gcd x 0  =  (0 `mod` x) `mod` 0
+gcd x y  =  y
+
+gcd x 0  =  (0 `mod` x) `mod` 0
+gcd x y  =  0
+
+gcd x 0  =  x `mod` (x `mod` x)
+gcd x y  =  x
+
+gcd x 0  =  x `mod` (x `mod` x)
+gcd x y  =  y
+
+gcd x 0  =  x `mod` (x `mod` x)
+gcd x y  =  0
+
+gcd x 0  =  x `mod` (x `mod` 0)
+gcd x y  =  x
+
+gcd x 0  =  x `mod` (x `mod` 0)
+gcd x y  =  y
+
+gcd x 0  =  x `mod` (x `mod` 0)
+gcd x y  =  0
+
+gcd x 0  =  x `mod` (0 `mod` x)
+gcd x y  =  x
+
+gcd x 0  =  x `mod` (0 `mod` x)
+gcd x y  =  y
+
+gcd x 0  =  x `mod` (0 `mod` x)
+gcd x y  =  0
+
+gcd x 0  =  0 `mod` (x `mod` x)
+gcd x y  =  x
+
+gcd x 0  =  0 `mod` (x `mod` x)
+gcd x y  =  y
+
+gcd x 0  =  0 `mod` (x `mod` x)
+gcd x y  =  0
+
+gcd x 0  =  0 `mod` (x `mod` 0)
+gcd x y  =  x
+
+gcd x 0  =  0 `mod` (x `mod` 0)
+gcd x y  =  y
+
+gcd x 0  =  0 `mod` (x `mod` 0)
+gcd x y  =  0
+
+gcd x 0  =  0 `mod` (0 `mod` x)
+gcd x y  =  x
+
+gcd x 0  =  0 `mod` (0 `mod` x)
+gcd x y  =  y
+
+gcd x 0  =  0 `mod` (0 `mod` x)
+gcd x y  =  0
+
+gcd 0 x  =  x
+gcd x y  =  (x `mod` x) `mod` x
+
+gcd 0 x  =  x
+gcd x y  =  (x `mod` x) `mod` y
+
+gcd 0 x  =  x
+gcd x y  =  (x `mod` x) `mod` 0
+
+gcd 0 x  =  x
+gcd x y  =  (x `mod` y) `mod` x
+
+gcd 0 x  =  x
+gcd x y  =  (x `mod` y) `mod` y
+
+gcd 0 x  =  x
+gcd x y  =  (x `mod` y) `mod` 0
+
+gcd 0 x  =  x
+gcd x y  =  (x `mod` 0) `mod` x
+
+gcd 0 x  =  x
+gcd x y  =  (x `mod` 0) `mod` y
+
+gcd 0 x  =  x
+gcd x y  =  (x `mod` 0) `mod` 0
+
+gcd 0 x  =  x
+gcd x y  =  (y `mod` x) `mod` x
+
+gcd 0 x  =  x
+gcd x y  =  (y `mod` x) `mod` y
+
+gcd 0 x  =  x
+gcd x y  =  (y `mod` x) `mod` 0
+
+gcd 0 x  =  x
+gcd x y  =  (y `mod` y) `mod` x
+
+gcd 0 x  =  x
+gcd x y  =  (y `mod` y) `mod` y
+
+gcd 0 x  =  x
+gcd x y  =  (y `mod` y) `mod` 0
+
+gcd 0 x  =  x
+gcd x y  =  (y `mod` 0) `mod` x
+
+gcd 0 x  =  x
+gcd x y  =  (y `mod` 0) `mod` y
+
+gcd 0 x  =  x
+gcd x y  =  (y `mod` 0) `mod` 0
+
+gcd 0 x  =  x
+gcd x y  =  (0 `mod` x) `mod` x
+
+gcd 0 x  =  x
+gcd x y  =  (0 `mod` x) `mod` y
+
+gcd 0 x  =  x
+gcd x y  =  (0 `mod` x) `mod` 0
+
+gcd 0 x  =  x
+gcd x y  =  (0 `mod` y) `mod` x
+
+gcd 0 x  =  x
+gcd x y  =  (0 `mod` y) `mod` y
+
+gcd 0 x  =  x
+gcd x y  =  (0 `mod` y) `mod` 0
+
+gcd 0 x  =  x
+gcd x y  =  x `mod` (x `mod` x)
+
+gcd 0 x  =  x
+gcd x y  =  x `mod` (x `mod` y)
+
+gcd 0 x  =  x
+gcd x y  =  x `mod` (x `mod` 0)
+
+gcd 0 x  =  x
+gcd x y  =  x `mod` (y `mod` x)
+
+gcd 0 x  =  x
+gcd x y  =  x `mod` (y `mod` y)
+
+gcd 0 x  =  x
+gcd x y  =  x `mod` (y `mod` 0)
+
+gcd 0 x  =  x
+gcd x y  =  x `mod` (0 `mod` x)
+
+gcd 0 x  =  x
+gcd x y  =  x `mod` (0 `mod` y)
+
+gcd 0 x  =  x
+gcd x y  =  y `mod` (x `mod` x)
+
+gcd 0 x  =  x
+gcd x y  =  y `mod` (x `mod` y)
+
+gcd 0 x  =  x
+gcd x y  =  y `mod` (x `mod` 0)
+
+gcd 0 x  =  x
+gcd x y  =  y `mod` (y `mod` x)
+
+gcd 0 x  =  x
+gcd x y  =  y `mod` (y `mod` y)
+
+gcd 0 x  =  x
+gcd x y  =  y `mod` (y `mod` 0)
+
+gcd 0 x  =  x
+gcd x y  =  y `mod` (0 `mod` x)
+
+gcd 0 x  =  x
+gcd x y  =  y `mod` (0 `mod` y)
+
+gcd 0 x  =  x
+gcd x y  =  0 `mod` (x `mod` x)
+
+gcd 0 x  =  x
+gcd x y  =  0 `mod` (x `mod` y)
+
+gcd 0 x  =  x
+gcd x y  =  0 `mod` (x `mod` 0)
+
+gcd 0 x  =  x
+gcd x y  =  0 `mod` (y `mod` x)
+
+gcd 0 x  =  x
+gcd x y  =  0 `mod` (y `mod` y)
+
+gcd 0 x  =  x
+gcd x y  =  0 `mod` (y `mod` 0)
+
+gcd 0 x  =  x
+gcd x y  =  0 `mod` (0 `mod` x)
+
+gcd 0 x  =  x
+gcd x y  =  0 `mod` (0 `mod` y)
+
+gcd 0 x  =  0
+gcd x y  =  (x `mod` x) `mod` x
+
+gcd 0 x  =  0
+gcd x y  =  (x `mod` x) `mod` y
+
+gcd 0 x  =  0
+gcd x y  =  (x `mod` x) `mod` 0
+
+gcd 0 x  =  0
+gcd x y  =  (x `mod` y) `mod` x
+
+gcd 0 x  =  0
+gcd x y  =  (x `mod` y) `mod` y
+
+gcd 0 x  =  0
+gcd x y  =  (x `mod` y) `mod` 0
+
+gcd 0 x  =  0
+gcd x y  =  (x `mod` 0) `mod` x
+
+gcd 0 x  =  0
+gcd x y  =  (x `mod` 0) `mod` y
+
+gcd 0 x  =  0
+gcd x y  =  (x `mod` 0) `mod` 0
+
+gcd 0 x  =  0
+gcd x y  =  (y `mod` x) `mod` x
+
+gcd 0 x  =  0
+gcd x y  =  (y `mod` x) `mod` y
+
+gcd 0 x  =  0
+gcd x y  =  (y `mod` x) `mod` 0
+
+gcd 0 x  =  0
+gcd x y  =  (y `mod` y) `mod` x
+
+gcd 0 x  =  0
+gcd x y  =  (y `mod` y) `mod` y
+
+gcd 0 x  =  0
+gcd x y  =  (y `mod` y) `mod` 0
+
+gcd 0 x  =  0
+gcd x y  =  (y `mod` 0) `mod` x
+
+gcd 0 x  =  0
+gcd x y  =  (y `mod` 0) `mod` y
+
+gcd 0 x  =  0
+gcd x y  =  (y `mod` 0) `mod` 0
+
+gcd 0 x  =  0
+gcd x y  =  (0 `mod` x) `mod` x
+
+gcd 0 x  =  0
+gcd x y  =  (0 `mod` x) `mod` y
+
+gcd 0 x  =  0
+gcd x y  =  (0 `mod` x) `mod` 0
+
+gcd 0 x  =  0
+gcd x y  =  (0 `mod` y) `mod` x
+
+gcd 0 x  =  0
+gcd x y  =  (0 `mod` y) `mod` y
+
+gcd 0 x  =  0
+gcd x y  =  (0 `mod` y) `mod` 0
+
+gcd 0 x  =  0
+gcd x y  =  x `mod` (x `mod` x)
+
+gcd 0 x  =  0
+gcd x y  =  x `mod` (x `mod` y)
+
+gcd 0 x  =  0
+gcd x y  =  x `mod` (x `mod` 0)
+
+gcd 0 x  =  0
+gcd x y  =  x `mod` (y `mod` x)
+
+gcd 0 x  =  0
+gcd x y  =  x `mod` (y `mod` y)
+
+gcd 0 x  =  0
+gcd x y  =  x `mod` (y `mod` 0)
+
+gcd 0 x  =  0
+gcd x y  =  x `mod` (0 `mod` x)
+
+gcd 0 x  =  0
+gcd x y  =  x `mod` (0 `mod` y)
+
+gcd 0 x  =  0
+gcd x y  =  y `mod` (x `mod` x)
+
+gcd 0 x  =  0
+gcd x y  =  y `mod` (x `mod` y)
+
+gcd 0 x  =  0
+gcd x y  =  y `mod` (x `mod` 0)
+
+gcd 0 x  =  0
+gcd x y  =  y `mod` (y `mod` x)
+
+gcd 0 x  =  0
+gcd x y  =  y `mod` (y `mod` y)
+
+gcd 0 x  =  0
+gcd x y  =  y `mod` (y `mod` 0)
+
+gcd 0 x  =  0
+gcd x y  =  y `mod` (0 `mod` x)
+
+gcd 0 x  =  0
+gcd x y  =  y `mod` (0 `mod` y)
+
+gcd 0 x  =  0
+gcd x y  =  0 `mod` (x `mod` x)
+
+gcd 0 x  =  0
+gcd x y  =  0 `mod` (x `mod` y)
+
+gcd 0 x  =  0
+gcd x y  =  0 `mod` (x `mod` 0)
+
+gcd 0 x  =  0
+gcd x y  =  0 `mod` (y `mod` x)
+
+gcd 0 x  =  0
+gcd x y  =  0 `mod` (y `mod` y)
+
+gcd 0 x  =  0
+gcd x y  =  0 `mod` (y `mod` 0)
+
+gcd 0 x  =  0
+gcd x y  =  0 `mod` (0 `mod` x)
+
+gcd 0 x  =  0
+gcd x y  =  0 `mod` (0 `mod` y)
+
+gcd 0 x  =  x `mod` x
+gcd x y  =  x `mod` y
+
+gcd 0 x  =  x `mod` x
+gcd x y  =  x `mod` 0
+
+gcd 0 x  =  x `mod` x
+gcd x y  =  y `mod` x
+
+gcd 0 x  =  x `mod` x
+gcd x y  =  y `mod` 0
+
+gcd 0 x  =  x `mod` x
+gcd x y  =  0 `mod` x
+
+gcd 0 x  =  x `mod` x
+gcd x y  =  0 `mod` y
+
+gcd 0 x  =  x `mod` 0
+gcd x y  =  x `mod` x
+
+gcd 0 x  =  x `mod` 0
+gcd x y  =  x `mod` y
+
+gcd 0 x  =  x `mod` 0
+gcd x y  =  y `mod` y
+
+gcd 0 x  =  x `mod` 0
+gcd x y  =  0 `mod` x
+
+gcd 0 x  =  x `mod` 0
+gcd x y  =  0 `mod` y
+
+gcd 0 x  =  0 `mod` x
+gcd x y  =  x `mod` x
+
+gcd 0 x  =  0 `mod` x
+gcd x y  =  x `mod` 0
+
+gcd 0 x  =  0 `mod` x
+gcd x y  =  y `mod` x
+
+gcd 0 x  =  0 `mod` x
+gcd x y  =  y `mod` y
+
+gcd 0 x  =  0 `mod` x
+gcd x y  =  y `mod` 0
+
+gcd 0 x  =  (x `mod` x) `mod` x
+gcd x y  =  x
+
+gcd 0 x  =  (x `mod` x) `mod` x
+gcd x y  =  y
+
+gcd 0 x  =  (x `mod` x) `mod` x
+gcd x y  =  0
+
+gcd 0 x  =  (x `mod` x) `mod` 0
+gcd x y  =  x
+
+gcd 0 x  =  (x `mod` x) `mod` 0
+gcd x y  =  y
+
+gcd 0 x  =  (x `mod` x) `mod` 0
+gcd x y  =  0
+
+gcd 0 x  =  (x `mod` 0) `mod` x
+gcd x y  =  x
+
+gcd 0 x  =  (x `mod` 0) `mod` x
+gcd x y  =  y
+
+gcd 0 x  =  (x `mod` 0) `mod` x
+gcd x y  =  0
+
+gcd 0 x  =  (x `mod` 0) `mod` 0
+gcd x y  =  x
+
+gcd 0 x  =  (x `mod` 0) `mod` 0
+gcd x y  =  y
+
+gcd 0 x  =  (x `mod` 0) `mod` 0
+gcd x y  =  0
+
+gcd 0 x  =  (0 `mod` x) `mod` x
+gcd x y  =  x
+
+gcd 0 x  =  (0 `mod` x) `mod` x
+gcd x y  =  y
+
+gcd 0 x  =  (0 `mod` x) `mod` x
+gcd x y  =  0
+
+gcd 0 x  =  (0 `mod` x) `mod` 0
+gcd x y  =  x
+
+gcd 0 x  =  (0 `mod` x) `mod` 0
+gcd x y  =  y
+
+gcd 0 x  =  (0 `mod` x) `mod` 0
+gcd x y  =  0
+
+gcd 0 x  =  x `mod` (x `mod` x)
+gcd x y  =  x
+
+gcd 0 x  =  x `mod` (x `mod` x)
+gcd x y  =  y
+
+gcd 0 x  =  x `mod` (x `mod` x)
+gcd x y  =  0
+
+gcd 0 x  =  x `mod` (x `mod` 0)
+gcd x y  =  x
+
+gcd 0 x  =  x `mod` (x `mod` 0)
+gcd x y  =  y
+
+gcd 0 x  =  x `mod` (x `mod` 0)
+gcd x y  =  0
+
+gcd 0 x  =  x `mod` (0 `mod` x)
+gcd x y  =  x
+
+gcd 0 x  =  x `mod` (0 `mod` x)
+gcd x y  =  y
+
+gcd 0 x  =  x `mod` (0 `mod` x)
+gcd x y  =  0
+
+gcd 0 x  =  0 `mod` (x `mod` x)
+gcd x y  =  x
+
+gcd 0 x  =  0 `mod` (x `mod` x)
+gcd x y  =  y
+
+gcd 0 x  =  0 `mod` (x `mod` x)
+gcd x y  =  0
+
+gcd 0 x  =  0 `mod` (x `mod` 0)
+gcd x y  =  x
+
+gcd 0 x  =  0 `mod` (x `mod` 0)
+gcd x y  =  y
+
+gcd 0 x  =  0 `mod` (x `mod` 0)
+gcd x y  =  0
+
+gcd 0 x  =  0 `mod` (0 `mod` x)
+gcd x y  =  x
+
+gcd 0 x  =  0 `mod` (0 `mod` x)
+gcd x y  =  y
+
+gcd 0 x  =  0 `mod` (0 `mod` x)
 gcd x y  =  0
 
 
diff --git a/bench/gps.out b/bench/gps.out
--- a/bench/gps.out
+++ b/bench/gps.out
@@ -4,9 +4,9 @@
 -- looking through 1 candidates of size 1
 -- looking through 1 candidates of size 2
 -- looking through 1 candidates of size 3
--- looking through 2 candidates of size 4
+-- looking through 1 candidates of size 4
 -- tested 4 candidates
-gps1 x y  =  fromIntegral x + y
+gps1 x y  =  y + fromIntegral x
 
 gps2 :: Int -> Maybe [Char]
 -- testing 6 combinations of argument values
@@ -14,7 +14,7 @@
 -- looking through 1 candidates of size 1
 -- looking through 2 candidates of size 2
 -- looking through 3 candidates of size 3
--- looking through 3 candidates of size 4
+-- looking through 2 candidates of size 4
 -- looking through 2 candidates of size 5
 -- looking through 0 candidates of size 6
 -- looking through 32 candidates of size 7
@@ -24,8 +24,10 @@
 -- looking through 16 candidates of size 11
 -- looking through 512 candidates of size 12
 -- looking through 1792 candidates of size 13
--- tested 1204 candidates
-gps2 x  =  if 2000 <= x then Just "large" else (if x < 1000 then Just "small" else Nothing)
+-- tested 1203 candidates
+gps2 x  =  if 2000 <= x
+           then Just "large"
+           else if x < 1000 then Just "small" else Nothing
 
 gps3 :: Int -> Int -> Int -> [Int]
 -- testing 2 combinations of argument values
@@ -35,10 +37,10 @@
 -- looking through 0 candidates of size 3
 -- looking through 64 candidates of size 4
 -- looking through 0 candidates of size 5
--- looking through 1536 candidates of size 6
+-- looking through 1248 candidates of size 6
 -- looking through 0 candidates of size 7
--- looking through 26858 candidates of size 8
--- tested 19480 candidates
+-- looking through 18627 candidates of size 8
+-- tested 12358 candidates
 gps3 x y z  =  enumFromThenTo x (x + z) (y - 1)
 
 gps3 :: Int -> Int -> Int -> [Int]
@@ -48,11 +50,11 @@
 -- looking through 0 candidates of size 2
 -- looking through 3 candidates of size 3
 -- looking through 0 candidates of size 4
--- looking through 18 candidates of size 5
+-- looking through 15 candidates of size 5
 -- looking through 0 candidates of size 6
--- looking through 108 candidates of size 7
+-- looking through 81 candidates of size 7
 -- looking through 36 candidates of size 8
--- tested 166 candidates
+-- tested 136 candidates
 cannot conjure
 
 gps4 :: [Char] -> [Char] -> [Char] -> Bool
@@ -67,9 +69,9 @@
 -- looking through 0 candidates of size 7
 -- looking through 0 candidates of size 8
 -- looking through 162 candidates of size 9
--- looking through 16 candidates of size 10
--- looking through 30 candidates of size 11
--- tested 187 candidates
+-- looking through 26 candidates of size 10
+-- looking through 15 candidates of size 11
+-- tested 197 candidates
 gps4 cs ds es  =  length cs < length ds && length ds < length es
 
 gps5 :: [Char] -> [Char]
@@ -88,12 +90,12 @@
 -- testing 9 combinations of argument values
 -- pruning with 16/18 rules
 -- looking through 4 candidates of size 1
--- looking through 3 candidates of size 2
--- looking through 27 candidates of size 3
--- looking through 32 candidates of size 4
--- looking through 506 candidates of size 5
--- looking through 530 candidates of size 6
--- tested 1102 candidates
+-- looking through 2 candidates of size 2
+-- looking through 14 candidates of size 3
+-- looking through 17 candidates of size 4
+-- looking through 188 candidates of size 5
+-- looking through 200 candidates of size 6
+-- tested 425 candidates
 cannot conjure
 
 gps7 :: [Char] -> ([Char],Int)
@@ -119,6 +121,7 @@
 -- looking through 0 candidates of size 1
 -- looking through 0 candidates of size 2
 -- looking through 0 candidates of size 3
+-- looking through 0 candidates of size 4
 -- tested 0 candidates
 cannot conjure
 
@@ -130,12 +133,12 @@
 -- looking through 4 candidates of size 3
 -- looking through 4 candidates of size 4
 -- looking through 10 candidates of size 5
--- looking through 24 candidates of size 6
+-- looking through 21 candidates of size 6
 -- looking through 34 candidates of size 7
 -- looking through 83 candidates of size 8
 -- looking through 143 candidates of size 9
--- looking through 259 candidates of size 10
--- tested 328 candidates
+-- looking through 256 candidates of size 10
+-- tested 325 candidates
 gps9 x  =  filter even (filter (x >) (map sq [1..x]))
 
 wallisNext :: Ratio Integer -> Ratio Integer
@@ -146,10 +149,10 @@
 -- looking through 3 candidates of size 3
 -- looking through 15 candidates of size 4
 -- looking through 4 candidates of size 5
--- looking through 118 candidates of size 6
+-- looking through 86 candidates of size 6
 -- looking through 5 candidates of size 7
--- looking through 1001 candidates of size 8
--- tested 1015 candidates
+-- looking through 537 candidates of size 8
+-- tested 588 candidates
 wallisNext (x % y)  =  (y + 1) % (x + 1)
 
 wallisNext :: Ratio Integer -> Ratio Integer
@@ -160,10 +163,10 @@
 -- looking through 4 candidates of size 3
 -- looking through 16 candidates of size 4
 -- looking through 3 candidates of size 5
--- looking through 103 candidates of size 6
+-- looking through 71 candidates of size 6
 -- looking through 5 candidates of size 7
--- looking through 801 candidates of size 8
--- tested 832 candidates
+-- looking through 393 candidates of size 8
+-- tested 451 candidates
 wallisNext (x % y)  =  (y + 1) % (x + 1)
 
 gps10 :: Int -> Ratio Integer
@@ -210,16 +213,16 @@
 -- pruning with 13/27 rules
 -- looking through 2 candidates of size 1
 -- looking through 5 candidates of size 2
--- looking through 5 candidates of size 3
--- looking through 16 candidates of size 4
--- looking through 26 candidates of size 5
--- looking through 71 candidates of size 6
--- looking through 160 candidates of size 7
--- looking through 432 candidates of size 8
--- looking through 1166 candidates of size 9
--- looking through 3187 candidates of size 10
--- looking through 9282 candidates of size 11
--- tested 10413 candidates
+-- looking through 4 candidates of size 3
+-- looking through 11 candidates of size 4
+-- looking through 22 candidates of size 5
+-- looking through 51 candidates of size 6
+-- looking through 133 candidates of size 7
+-- looking through 318 candidates of size 8
+-- looking through 938 candidates of size 9
+-- looking through 2418 candidates of size 10
+-- looking through 7229 candidates of size 11
+-- tested 8246 candidates
 gps12 xs  =  (length xs - fromJust (findIndex (0 ==) (reverse xs))) - 1
 
 gps13 :: [Ratio Integer] -> Ratio Integer
@@ -229,11 +232,11 @@
 -- looking through 1 candidates of size 2
 -- looking through 3 candidates of size 3
 -- looking through 10 candidates of size 4
--- looking through 15 candidates of size 5
--- looking through 56 candidates of size 6
--- looking through 125 candidates of size 7
--- looking through 449 candidates of size 8
--- tested 317 candidates
+-- looking through 14 candidates of size 5
+-- looking through 51 candidates of size 6
+-- looking through 105 candidates of size 7
+-- looking through 365 candidates of size 8
+-- tested 271 candidates
 gps13 qs  =  foldr (+) 0 qs / fromIntegral (length qs)
 
 odd :: Int -> Bool
@@ -241,11 +244,11 @@
 -- pruning with 12/13 rules
 -- looking through 0 candidates of size 1
 -- looking through 0 candidates of size 2
--- looking through 7 candidates of size 3
--- looking through 7 candidates of size 4
--- looking through 83 candidates of size 5
--- tested 29 candidates
-odd x  =  x `mod` 2 /= 0
+-- looking through 4 candidates of size 3
+-- looking through 4 candidates of size 4
+-- looking through 44 candidates of size 5
+-- tested 25 candidates
+odd x  =  0 /= x `mod` 2
 
 gps14 :: [Int] -> Int
 -- testing 3 combinations of argument values
@@ -262,24 +265,24 @@
 -- pruning with 39/58 rules
 -- looking through 3 candidates of size 1
 -- looking through 9 candidates of size 2
--- looking through 7 candidates of size 3
--- looking through 58 candidates of size 4
--- looking through 66 candidates of size 5
--- looking through 600 candidates of size 6
--- looking through 1034 candidates of size 7
--- tested 749 candidates
+-- looking through 3 candidates of size 3
+-- looking through 27 candidates of size 4
+-- looking through 30 candidates of size 5
+-- looking through 258 candidates of size 6
+-- looking through 474 candidates of size 7
+-- tested 381 candidates
 gps14 []  =  0
-gps14 (x:xs)  =  x `mod` 2 + gps14 xs
+gps14 (x:xs)  =  x + gps14 xs `mod` 2
 
 gps15 :: [Int] -> [Int] -> Bool
 -- testing 5 combinations of argument values
 -- pruning with 3/7 rules
 -- looking through 0 candidates of size 1
 -- looking through 0 candidates of size 2
--- looking through 2 candidates of size 3
--- looking through 8 candidates of size 4
--- tested 4 candidates
-gps15 xs ys  =  reverse xs == ys
+-- looking through 1 candidates of size 3
+-- looking through 4 candidates of size 4
+-- tested 3 candidates
+gps15 xs ys  =  xs == reverse ys
 
 gps16 :: [Char] -> [Char] -> Bool
 -- testing 6 combinations of argument values
@@ -296,33 +299,32 @@
 -- testing 4 combinations of argument values
 -- pruning with 27/65 rules
 -- looking through 3 candidates of size 1
--- looking through 4 candidates of size 2
--- looking through 11 candidates of size 3
--- looking through 29 candidates of size 4
--- looking through 60 candidates of size 5
--- looking through 145 candidates of size 6
--- looking through 501 candidates of size 7
--- looking through 1098 candidates of size 8
--- looking through 4673 candidates of size 9
--- tested 1852 candidates
+-- looking through 3 candidates of size 2
+-- looking through 7 candidates of size 3
+-- looking through 13 candidates of size 4
+-- looking through 35 candidates of size 5
+-- looking through 61 candidates of size 6
+-- looking through 219 candidates of size 7
+-- looking through 354 candidates of size 8
+-- looking through 1431 candidates of size 9
+-- tested 729 candidates
 gps17 0  =  0
-gps17 x  =  x * x + gps17 (x - 1)
+gps17 x  =  gps17 (x - 1) + x * x
 
 gps18 :: [Int] -> [Int] -> [Int]
 -- testing 3 combinations of argument values
 -- pruning with 2/6 rules
 -- looking through 3 candidates of size 1
 -- looking through 7 candidates of size 2
--- looking through 9 candidates of size 3
--- looking through 44 candidates of size 4
--- looking through 116 candidates of size 5
--- looking through 92 candidates of size 6
--- looking through 787 candidates of size 7
--- looking through 220 candidates of size 8
--- looking through 4632 candidates of size 9
--- tested 3924 candidates
-gps18 [] []  =  []
-gps18 [] (x:xs)  =  xs
+-- looking through 11 candidates of size 3
+-- looking through 37 candidates of size 4
+-- looking through 98 candidates of size 5
+-- looking through 106 candidates of size 6
+-- looking through 440 candidates of size 7
+-- looking through 428 candidates of size 8
+-- looking through 1950 candidates of size 9
+-- tested 2031 candidates
+gps18 [] xs  =  xs
 gps18 (x:xs) []  =  xs
 gps18 (x:xs) (y:ys)  =  x + y:gps18 xs ys
 
@@ -331,9 +333,9 @@
 -- pruning with 2/7 rules
 -- looking through 2 candidates of size 1
 -- looking through 1 candidates of size 2
--- looking through 0 candidates of size 3
--- looking through 12 candidates of size 4
--- tested 13 candidates
+-- looking through 1 candidates of size 3
+-- looking through 11 candidates of size 4
+-- tested 14 candidates
 gps18 xs ys  =  zipWith (+) xs ys
 
 gps19 :: Int -> [Char] -> [Char]
@@ -396,7 +398,9 @@
 -- looking through 20409 candidates of size 14
 -- tested 27901 candidates
 pig1 ""  =  "ay"
-pig1 (c:cs)  =  if isVowel c then (c:cs) ++ "ay" else cs ++ (c:"ay")
+pig1 (c:cs)  =  if isVowel c
+                then (c:cs) ++ "ay"
+                else cs ++ (c:"ay")
 
 gps20c :: [Char] -> [Char]
 -- pruning with 1/1 rules
@@ -432,10 +436,10 @@
 -- looking through 2 candidates of size 3
 -- looking through 0 candidates of size 4
 -- looking through 0 candidates of size 5
--- looking through 4 candidates of size 6
+-- looking through 3 candidates of size 6
 -- tested 5 candidates
 gps22 ""  =  0
-gps22 (c:cs)  =  scrabble1 c + gps22 cs
+gps22 (c:cs)  =  gps22 cs + scrabble1 c
 
 gps23 :: [Char] -> ([(Int,Int)],Int,Double)
 -- pruning with 0/0 rules
@@ -451,13 +455,13 @@
 -- looking through 2 candidates of size 2
 -- looking through 4 candidates of size 3
 -- looking through 3 candidates of size 4
--- looking through 9 candidates of size 5
--- looking through 19 candidates of size 6
--- looking through 40 candidates of size 7
--- looking through 97 candidates of size 8
--- looking through 286 candidates of size 9
--- looking through 739 candidates of size 10
--- tested 673 candidates
+-- looking through 8 candidates of size 5
+-- looking through 15 candidates of size 6
+-- looking through 31 candidates of size 7
+-- looking through 77 candidates of size 8
+-- looking through 203 candidates of size 9
+-- looking through 487 candidates of size 10
+-- tested 485 candidates
 gps24 cs  =  chr (ord ' ' + sum (map ord cs) `mod` 64)
 
 gps25 :: Int -> [Int]
@@ -487,47 +491,49 @@
 -- looking through 0 candidates of size 7
 -- looking through 0 candidates of size 8
 -- looking through 0 candidates of size 9
--- looking through 180 candidates of size 10
+-- looking through 90 candidates of size 10
 -- looking through 2592 candidates of size 11
--- tested 1579 candidates
-gps27 x y z  =  if x < y then (if y < z then y else z) else x
+-- tested 1489 candidates
+gps27 x y z  =  if x < y
+                then if y < z then y else z
+                else x
 
 gps27b :: Int -> Int -> Int -> Int
 -- testing 3 combinations of argument values
 -- pruning with 20/30 rules
 -- looking through 3 candidates of size 1
 -- looking through 0 candidates of size 2
--- looking through 12 candidates of size 3
+-- looking through 6 candidates of size 3
 -- looking through 0 candidates of size 4
--- looking through 36 candidates of size 5
--- tested 16 candidates
-gps27b x y z  =  min (max x y) z
+-- looking through 12 candidates of size 5
+-- tested 15 candidates
+gps27b x y z  =  min z (max x y)
 
 gps28 :: Int -> Int -> Int -> Int -> Int
 -- testing 5 combinations of argument values
 -- pruning with 6/10 rules
 -- looking through 4 candidates of size 1
 -- looking through 0 candidates of size 2
--- looking through 12 candidates of size 3
+-- looking through 6 candidates of size 3
 -- looking through 0 candidates of size 4
--- looking through 24 candidates of size 5
+-- looking through 12 candidates of size 5
 -- looking through 0 candidates of size 6
--- looking through 72 candidates of size 7
--- tested 44 candidates
+-- looking through 36 candidates of size 7
+-- tested 25 candidates
 gps28 x y z x'  =  x `min` (y `min` (z `min` x'))
 
 gps29 :: [Char] -> Int
 -- pruning with 7/11 rules
 -- looking through 2 candidates of size 1
 -- looking through 2 candidates of size 2
--- looking through 3 candidates of size 3
--- looking through 4 candidates of size 4
--- looking through 6 candidates of size 5
--- looking through 10 candidates of size 6
--- looking through 18 candidates of size 7
--- looking through 33 candidates of size 8
--- looking through 65 candidates of size 9
--- tested 86 candidates
+-- looking through 2 candidates of size 3
+-- looking through 0 candidates of size 4
+-- looking through 2 candidates of size 5
+-- looking through 6 candidates of size 6
+-- looking through 10 candidates of size 7
+-- looking through 10 candidates of size 8
+-- looking through 24 candidates of size 9
+-- tested 40 candidates
 gps29 ""  =  0
-gps29 (c:cs)  =  (if isVowel c then 1 else 0) + gps29 cs
+gps29 (c:cs)  =  gps29 cs + (if isVowel c then 1 else 0)
 
diff --git a/bench/gps2.hs b/bench/gps2.hs
--- a/bench/gps2.hs
+++ b/bench/gps2.hs
@@ -280,7 +280,7 @@
 -- gps8g x xs  =  head $ filter ((x ==) . uncurry (+)) $ liftA2 (,) xs xs
 
 gps8c :: IO ()
-gps8c  =  conjure "gps" gps8p []
+gps8c  =  conjure "gps8" gps8p []
 
 
 -- GPSB#9: Fizz Buzz (CW)
@@ -302,24 +302,36 @@
 
 -- probably unreachable performance-wise
 gps9c :: IO ()
-gps9c  =  conjure "gps" gps9p []
+gps9c  =  conjure "gps9" gps9p []
 
 
 gps10p :: [Int] -> Int
+gps10p [0]  =  -2
+gps10p [3]  =  -1
+gps10p [6]  =  0
+gps10p [9]  =  1
+gps10p [0,3]  =  -3
+gps10p [3,0]  =  -3
+gps10p [3,2,1]  =  -5
 gps10p [1,2,3]  =  -5
 gps10p [10,20,30]  =  13
 
 -- does not do rounding
 gps10g :: [Int] -> Int
-gps10g xs  =  sum $ map (\x -> x `div` 3 - 2) xs
--- TODO: reachable with explicit fold?
--- gps10g []  =  0
--- gps10g (x:xs)  =  x`div`3 - 2 : gps10g xs
--- ??
+gps10g []  =  0
+gps10g (x:xs)  =  (x `div` 3 - 2) + gps10g xs
 
 -- unreachable due to lambda
 gps10c :: IO ()
-gps10c  =  conjure "gps" gps9p []
+gps10c  =  conjure "gps10" gps10p
+  [ pr (0 :: Int)
+  , pr (1 :: Int)
+  , pr (2 :: Int)
+  , pr (3 :: Int)
+  , prim "`div`" (div :: Int -> Int -> Int)
+  , prim "+" ((+) :: Int -> Int -> Int)
+  , prim "-" ((-) :: Int -> Int -> Int)
+  ]
 
 
 gps11p :: Int -> Int -> Int
diff --git a/bench/gps2.out b/bench/gps2.out
--- a/bench/gps2.out
+++ b/bench/gps2.out
@@ -32,10 +32,10 @@
 -- testing 6 combinations of argument values
 -- pruning with 8/9 rules
 -- looking through 4 candidates of size 1
--- looking through 25 candidates of size 2
--- looking through 237 candidates of size 3
--- looking through 433 candidates of size 4
--- tested 699 candidates
+-- looking through 24 candidates of size 2
+-- looking through 75 candidates of size 3
+-- looking through 234 candidates of size 4
+-- tested 337 candidates
 cannot conjure
 
 gps2 :: Double -> Double -> Int -> Double
@@ -43,11 +43,11 @@
 -- pruning with 2/6 rules
 -- looking through 2 candidates of size 1
 -- looking through 2 candidates of size 2
--- looking through 18 candidates of size 3
--- looking through 70 candidates of size 4
--- looking through 316 candidates of size 5
--- looking through 1440 candidates of size 6
--- tested 1848 candidates
+-- looking through 17 candidates of size 3
+-- looking through 62 candidates of size 4
+-- looking through 266 candidates of size 5
+-- looking through 1154 candidates of size 6
+-- tested 1503 candidates
 cannot conjure
 
 gps3 :: [Char] -> Int
@@ -80,14 +80,14 @@
 -- looking through 2 candidates of size 1
 -- looking through 1 candidates of size 2
 -- looking through 2 candidates of size 3
--- looking through 10 candidates of size 4
+-- looking through 8 candidates of size 4
 -- looking through 6 candidates of size 5
--- looking through 60 candidates of size 6
+-- looking through 46 candidates of size 6
 -- looking through 26 candidates of size 7
--- looking through 538 candidates of size 8
+-- looking through 400 candidates of size 8
 -- looking through 134 candidates of size 9
--- looking through 5296 candidates of size 10
--- tested 2698 candidates
+-- looking through 3914 candidates of size 10
+-- tested 1552 candidates
 tell [] x  =  []
 tell (x:xs) y  =  y `div` x:tell xs (y `mod` x)
 
@@ -108,13 +108,13 @@
 -- looking through 5 candidates of size 3
 -- looking through 9 candidates of size 4
 -- looking through 45 candidates of size 5
--- looking through 92 candidates of size 6
--- looking through 438 candidates of size 7
--- looking through 944 candidates of size 8
--- looking through 4413 candidates of size 9
--- looking through 9649 candidates of size 10
--- looking through 44336 candidates of size 11
--- tested 32852 candidates
+-- looking through 82 candidates of size 6
+-- looking through 428 candidates of size 7
+-- looking through 887 candidates of size 8
+-- looking through 4354 candidates of size 9
+-- looking through 9260 candidates of size 10
+-- looking through 43875 candidates of size 11
+-- tested 32327 candidates
 gps5 x  =  tell [25,10,5,1] x
 
 gps6 :: [Int] -> Int
@@ -133,7 +133,7 @@
 -- tested 0 candidates
 cannot conjure
 
-gps :: Int -> [Int] -> (Int,Int)
+gps8 :: Int -> [Int] -> (Int,Int)
 -- testing 3 combinations of argument values
 -- pruning with 0/0 rules
 -- looking through 0 candidates of size 1
@@ -141,30 +141,39 @@
 -- tested 0 candidates
 cannot conjure
 
-gps :: Int -> [Char]
+gps9 :: Int -> [Char]
 -- testing 7 combinations of argument values
 -- pruning with 0/0 rules
 -- looking through 0 candidates of size 1
 -- tested 0 candidates
 cannot conjure
 
-gps :: Int -> [Char]
+gps10 :: [Int] -> Int
 -- testing 7 combinations of argument values
--- pruning with 0/0 rules
--- looking through 0 candidates of size 1
--- tested 0 candidates
-cannot conjure
+-- pruning with 67/100 rules
+-- looking through 4 candidates of size 1
+-- looking through 16 candidates of size 2
+-- looking through 4 candidates of size 3
+-- looking through 68 candidates of size 4
+-- looking through 80 candidates of size 5
+-- looking through 1084 candidates of size 6
+-- looking through 1556 candidates of size 7
+-- looking through 20600 candidates of size 8
+-- looking through 35632 candidates of size 9
+-- tested 29542 candidates
+gps10 []  =  0
+gps10 (x:xs)  =  gps10 xs + (x `div` 3 - 2)
 
 gcd :: Int -> Int -> Int
 -- testing 11 combinations of argument values
 -- pruning with 0/0 rules
 -- looking through 3 candidates of size 1
--- looking through 7 candidates of size 2
--- looking through 18 candidates of size 3
--- looking through 60 candidates of size 4
--- looking through 150 candidates of size 5
--- looking through 469 candidates of size 6
--- tested 243 candidates
+-- looking through 5 candidates of size 2
+-- looking through 11 candidates of size 3
+-- looking through 50 candidates of size 4
+-- looking through 98 candidates of size 5
+-- looking through 359 candidates of size 6
+-- tested 171 candidates
 gcd x 0  =  x
 gcd x y  =  gcd y (x `mod` y)
 
@@ -196,7 +205,9 @@
 -- looking through 67 candidates of size 12
 -- tested 83 candidates
 gps13_leaders []  =  []
-gps13_leaders (x:xs)  =  if all (x >) xs then x:gps13_leaders xs else gps13_leaders xs
+gps13_leaders (x:xs)  =  if all (x >) xs
+                         then x:gps13_leaders xs
+                         else gps13_leaders xs
 
 gps14_luhn :: [Int] -> Int
 -- pruning with 0/0 rules
@@ -228,7 +239,9 @@
 -- looking through 6293 candidates of size 12
 -- tested 3977 candidates
 gps16_middle ""  =  ""
-gps16_middle (c:cs)  =  if length cs <= 1 then c:cs else gps16_middle (init cs)
+gps16_middle (c:cs)  =  if length cs <= 1
+                        then c:cs
+                        else gps16_middle (init cs)
 
 gps17_pds :: [Int] -> Int
 -- testing 5 combinations of argument values
@@ -237,8 +250,8 @@
 -- looking through 2 candidates of size 2
 -- looking through 2 candidates of size 3
 -- looking through 1 candidates of size 4
--- looking through 5 candidates of size 5
--- tested 11 candidates
+-- looking through 3 candidates of size 5
+-- tested 9 candidates
 cannot conjure
 
 gps18_price :: [Double] -> [Double] -> Double
@@ -246,23 +259,23 @@
 -- pruning with 26/35 rules
 -- looking through 2 candidates of size 1
 -- looking through 8 candidates of size 2
--- looking through 64 candidates of size 3
--- looking through 72 candidates of size 4
--- looking through 1193 candidates of size 5
--- looking through 714 candidates of size 6
--- tested 2053 candidates
+-- looking through 32 candidates of size 3
+-- looking through 86 candidates of size 4
+-- looking through 412 candidates of size 5
+-- looking through 1072 candidates of size 6
+-- tested 1612 candidates
 cannot conjure
 
 gps19_snowday :: Int -> Double -> Double -> Double -> Double
 -- testing 7 combinations of argument values
 -- pruning with 6/19 rules
 -- looking through 3 candidates of size 1
--- looking through 0 candidates of size 2
--- looking through 24 candidates of size 3
--- looking through 150 candidates of size 4
--- looking through 546 candidates of size 5
--- looking through 3540 candidates of size 6
--- tested 4263 candidates
+-- looking through 4 candidates of size 2
+-- looking through 22 candidates of size 3
+-- looking through 118 candidates of size 4
+-- looking through 318 candidates of size 5
+-- looking through 1936 candidates of size 6
+-- tested 2401 candidates
 cannot conjure
 
 gps20 :: [Char] -> Bool
@@ -284,7 +297,9 @@
 -- looking through 0 candidates of size 7
 -- looking through 4 candidates of size 8
 -- tested 3 candidates
-spin cs  =  if length cs >= 5 then reverse cs else cs
+spin cs  =  if length cs >= 5
+            then reverse cs
+            else cs
 
 gps21_spinwords :: [Char] -> [Char]
 -- pruning with 16/16 rules
@@ -304,15 +319,15 @@
 -- looking through 0 candidates of size 2
 -- looking through 2 candidates of size 3
 -- looking through 3 candidates of size 4
--- looking through 17 candidates of size 5
--- looking through 14 candidates of size 6
--- looking through 103 candidates of size 7
+-- looking through 14 candidates of size 5
+-- looking through 13 candidates of size 6
+-- looking through 94 candidates of size 7
 -- looking through 104 candidates of size 8
--- looking through 901 candidates of size 9
--- looking through 935 candidates of size 10
--- looking through 9226 candidates of size 11
+-- looking through 856 candidates of size 9
+-- looking through 929 candidates of size 10
+-- looking through 8914 candidates of size 11
 -- looking through 9686 candidates of size 12
--- tested 20992 candidates
+-- tested 20616 candidates
 cannot conjure
 
 gps22 :: Int -> [Char]
@@ -324,18 +339,18 @@
 gps23 :: [Char] -> [Char] -> [Char] -> [Char]
 -- pruning with 0/0 rules
 -- looking through 3 candidates of size 1
--- looking through 5 candidates of size 2
--- looking through 9 candidates of size 3
--- looking through 0 candidates of size 4
--- looking through 162 candidates of size 5
--- looking through 612 candidates of size 6
--- looking through 0 candidates of size 7
--- looking through 0 candidates of size 8
--- looking through 3168 candidates of size 9
--- looking through 0 candidates of size 10
--- looking through 0 candidates of size 11
--- looking through 5184 candidates of size 12
--- tested 9143 candidates
+-- looking through 9 candidates of size 2
+-- looking through 31 candidates of size 3
+-- looking through 36 candidates of size 4
+-- looking through 187 candidates of size 5
+-- looking through 627 candidates of size 6
+-- looking through 944 candidates of size 7
+-- looking through 863 candidates of size 8
+-- looking through 951 candidates of size 9
+-- looking through 3902 candidates of size 10
+-- looking through 6758 candidates of size 11
+-- looking through 3276 candidates of size 12
+-- tested 17587 candidates
 cannot conjure
 
 gps24 :: [Char] -> Twitter
@@ -355,17 +370,19 @@
 -- looking through 483 candidates of size 12
 -- tested 936 candidates
 gps24 ""  =  Empty
-gps24 (c:cs)  =  if 140 > length cs then Tweet (length (c:cs)) else TooMany
+gps24 (c:cs)  =  if 140 > length cs
+                 then Tweet (length (c:cs))
+                 else TooMany
 
 gps25 :: [Double] -> [Double] -> Double
 -- testing 6 combinations of argument values
 -- pruning with 31/59 rules
 -- looking through 2 candidates of size 1
 -- looking through 9 candidates of size 2
--- looking through 81 candidates of size 3
--- looking through 312 candidates of size 4
--- looking through 2249 candidates of size 5
--- looking through 9419 candidates of size 6
--- tested 12072 candidates
+-- looking through 49 candidates of size 3
+-- looking through 211 candidates of size 4
+-- looking through 1063 candidates of size 5
+-- looking through 4717 candidates of size 6
+-- tested 6051 candidates
 cannot conjure
 
diff --git a/bench/ill-hit.out b/bench/ill-hit.out
--- a/bench/ill-hit.out
+++ b/bench/ill-hit.out
@@ -3,10 +3,10 @@
 -- pruning with 14/25 rules
 -- looking through 2 candidates of size 1
 -- looking through 3 candidates of size 2
--- looking through 4 candidates of size 3
--- looking through 10 candidates of size 4
--- looking through 19 candidates of size 5
--- tested 20 candidates
+-- looking through 3 candidates of size 3
+-- looking through 7 candidates of size 4
+-- looking through 11 candidates of size 5
+-- tested 16 candidates
 sum []  =  0
 sum (x:xs)  =  x + sum xs
 
@@ -14,10 +14,10 @@
 -- pruning with 14/25 rules
 -- looking through 2 candidates of size 1
 -- looking through 5 candidates of size 2
--- looking through 6 candidates of size 3
--- looking through 20 candidates of size 4
--- looking through 34 candidates of size 5
--- tested 34 candidates
+-- looking through 5 candidates of size 3
+-- looking through 12 candidates of size 4
+-- looking through 18 candidates of size 5
+-- tested 25 candidates
 sum []  =  0
 sum (x:xs)  =  x + sum xs
 
diff --git a/bench/lowtests.out b/bench/lowtests.out
--- a/bench/lowtests.out
+++ b/bench/lowtests.out
@@ -22,10 +22,10 @@
 -- looking through 12 candidates of size 7
 -- looking through 21 candidates of size 8
 -- looking through 8 candidates of size 9
--- looking through 0 candidates of size 10
--- looking through 0 candidates of size 11
--- looking through 0 candidates of size 12
--- tested 47 candidates
+-- looking through 6 candidates of size 10
+-- looking through 30 candidates of size 11
+-- looking through 45 candidates of size 12
+-- tested 128 candidates
 cannot conjure
 
 subset :: [Int] -> [Int] -> Bool
diff --git a/bench/p12.out b/bench/p12.out
--- a/bench/p12.out
+++ b/bench/p12.out
@@ -3,12 +3,12 @@
 -- testing 6 combinations of argument values
 -- pruning with 67/100 rules
 -- looking through 3 candidates of size 1
--- looking through 5 candidates of size 2
--- looking through 14 candidates of size 3
--- looking through 39 candidates of size 4
--- looking through 128 candidates of size 5
--- looking through 497 candidates of size 6
--- tested 200 candidates
+-- looking through 3 candidates of size 2
+-- looking through 6 candidates of size 3
+-- looking through 15 candidates of size 4
+-- looking through 43 candidates of size 5
+-- looking through 152 candidates of size 6
+-- tested 77 candidates
 factorial 0  =  1
 factorial x  =  x * factorial (dec x)
 
diff --git a/bench/redundants.hs b/bench/redundants.hs
--- a/bench/redundants.hs
+++ b/bench/redundants.hs
@@ -8,6 +8,7 @@
 import Conjure.Engine
 import Conjure.Defn
 import Conjure.Utils
+import Test.LeanCheck.Tiers (discardT)
 
 
 -- | This function prints redundant candidates.
@@ -34,7 +35,9 @@
   numRedundant   =  numCandidates - numUnique
   classes        =  classifyBy (equalModuloTesting maxTests maxEvalRecursions nm f) candidates
   candidates     =  concat css
-  css            =  take n css'
+  css            =  take n
+                 .  discardT isRedundantByIntroduction -- additional pruning rule
+                 $  css'
   (css', thy)    =  candidateDefnsC args nm f ps  -- Conjure uses this for listing candidates
   nRules         =  length (rules thy)
   nREs           =  length (equations thy) + nRules
diff --git a/bench/redundants.out b/bench/redundants.out
--- a/bench/redundants.out
+++ b/bench/redundants.out
@@ -1,2117 +1,953 @@
 Redundant candidates for: foo :: Int -> Int
   pruning with 15/35 rules
-  [3,4,12,32,54] candidates
-  68/105 unique candidates
-  37/105 redundant candidates
-
-rules:
-x * y == x + y
-x * y == y + x
-x - x == 0
-x + 0 == x
-0 + x == x
-x - 0 == x
-(x + y) + z == x + (y + z)
-(x + y) + z == y + (x + z)
-x - (y - z) == z + (x - y)
-(x - y) - z == x - (y + z)
-(x - y) - z == x - (z + y)
-(x + y) - z == x + (y - z)
-(x + y) - z == y + (x - z)
-x + (y - x) == y
-(x - y) + y == x
-equations:
-y + x == x + y
-y + (x + z) == x + (y + z)
-z + (x + y) == x + (y + z)
-z + (y + x) == x + (y + z)
-y + (x - z) == x + (y - z)
-(x - z) + y == x + (y - z)
-(z - y) + x == (x - y) + z
-y - (x + y) == 0 - x
-y - (y + x) == 0 - x
-z - (y + z) == x - (x + y)
-z - (y + z) == x - (y + x)
-z - (z + y) == x - (x + y)
-z - (z + y) == x - (y + x)
-x + (0 - y) == x - y
-(0 - y) + x == x - y
-x - (x + 1) == 0 - 1
-x - (1 + x) == 0 - 1
-y - (y + 1) == x - (x + 1)
-y - (y + 1) == x - (1 + x)
-y - (1 + y) == x - (1 + x)
-
-class of 4 equivalent candidates:
-
-    foo x  =  x
-
-    foo 0  =  0
-    foo x  =  x
-
-    foo 1  =  1
-    foo x  =  x
-
-    foo 0  =  0
-    foo 1  =  1
-    foo x  =  x
-
-
-class of 2 equivalent candidates:
-
-    foo 0  =  0
-    foo x  =  1
-
-    foo 0  =  0
-    foo 1  =  1
-    foo x  =  1
-
-
-class of 2 equivalent candidates:
-
-    foo 0  =  1
-    foo x  =  x
-
-    foo 0  =  1
-    foo 1  =  1
-    foo x  =  x
-
-
-class of 2 equivalent candidates:
-
-    foo 0  =  1
-    foo x  =  0
-
-    foo 0  =  1
-    foo 1  =  0
-    foo x  =  0
-
-
-class of 2 equivalent candidates:
-
-    foo x  =  x + x
-
-    foo 0  =  0
-    foo x  =  x + x
-
-
-class of 4 equivalent candidates:
-
-    foo x  =  x + 1
-
-    foo x  =  1 + x
-
-    foo 0  =  1
-    foo x  =  x + 1
-
-    foo 0  =  1
-    foo x  =  1 + x
-
-
-class of 4 equivalent candidates:
-
-    foo x  =  x - 1
-
-    foo x  =  (0 - 1) + x
-
-    foo x  =  x + (0 - 1)
-
-    foo 1  =  0
-    foo x  =  x - 1
-
-
-class of 5 equivalent candidates:
-
-    foo x  =  0 - x
-
-    foo 0  =  0
-    foo x  =  0 - x
-
-    foo x  =  x - (x + x)
-
-    foo x  =  1 - (x + 1)
-
-    foo x  =  1 - (1 + x)
-
-
-class of 4 equivalent candidates:
-
-    foo x  =  0 - 1
-
-    foo x  =  x - (x + 1)
-
-    foo x  =  x - (1 + x)
-
-    foo x  =  1 - (1 + 1)
-
-
-class of 5 equivalent candidates:
-
-    foo x  =  1 - x
-
-    foo 0  =  1
-    foo x  =  1 - x
-
-    foo x  =  (0 - x) + 1
-
-    foo x  =  1 + (0 - x)
-
-    foo 1  =  0
-    foo x  =  1 - x
-
-
-class of 2 equivalent candidates:
-
-    foo 1  =  0
-    foo x  =  x
-
-    foo 0  =  0
-    foo 1  =  0
-    foo x  =  x
-
-
-class of 2 equivalent candidates:
-
-    foo 1  =  0
-    foo x  =  1
-
-    foo 0  =  1
-    foo 1  =  0
-    foo x  =  1
-
-
-class of 2 equivalent candidates:
-
-    foo 1  =  1
-    foo x  =  0
-
-    foo 0  =  0
-    foo 1  =  1
-    foo x  =  0
-
-
-class of 2 equivalent candidates:
-
-    foo 0  =  0
-    foo x  =  x + 1
-
-    foo 0  =  0
-    foo x  =  1 + x
-
-
-class of 2 equivalent candidates:
-
-    foo x  =  (x - 1) + x
-
-    foo x  =  x + (x - 1)
-
-
-class of 2 equivalent candidates:
-
-    foo x  =  (1 - x) + 1
-
-    foo x  =  1 + (1 - x)
-
-
-class of 3 equivalent candidates:
-
-    foo x  =  x + (x + 1)
-
-    foo x  =  x + (1 + x)
-
-    foo x  =  1 + (x + x)
-
-
-class of 3 equivalent candidates:
-
-    foo x  =  x + (1 + 1)
-
-    foo x  =  1 + (x + 1)
-
-    foo x  =  1 + (1 + x)
-
-
-class of 2 equivalent candidates:
-
-    foo x  =  0 - (x + 1)
-
-    foo x  =  0 - (1 + x)
-
-
-class of 2 equivalent candidates:
-
-    foo 1  =  0
-    foo x  =  x + 1
-
-    foo 1  =  0
-    foo x  =  1 + x
-
-
-class of 2 equivalent candidates:
-
-    foo 1  =  1
-    foo x  =  x + 1
-
-    foo 1  =  1
-    foo x  =  1 + x
-
-
-
-Redundant candidates for: ? :: Int -> Int -> Int
-  pruning with 10/23 rules
-  [3,10,40,116,338] candidates
-  363/507 unique candidates
-  144/507 redundant candidates
-
-rules:
-x * y == x + y
-x * y == y + x
-x + 0 == x
-0 + x == x
-dec (x + y) == x + dec y
-dec (x + y) == y + dec x
-dec (x + y) == dec x + y
-dec (x + y) == dec y + x
-(x + y) + z == x + (y + z)
-(x + y) + z == y + (x + z)
-equations:
-y + x == x + y
-y + dec x == x + dec y
-dec x + y == x + dec y
-dec y + x == dec x + y
-x + dec 0 == dec x
-dec 0 + x == dec x
-y + (x + z) == x + (y + z)
-z + (x + y) == x + (y + z)
-z + (y + x) == x + (y + z)
-y + dec (dec x) == x + dec (dec y)
-dec (dec x) + y == x + dec (dec y)
-x + dec (dec 0) == dec (dec x)
-dec (dec 0) + x == dec (dec x)
-
-class of 2 equivalent candidates:
-
-    x ? y  =  x
-
-    0 ? x  =  0
-    x ? y  =  x
-
-
-class of 2 equivalent candidates:
-
-    x ? y  =  y
-
-    x ? 0  =  0
-    x ? y  =  y
-
-
-class of 3 equivalent candidates:
-
-    x ? y  =  0
-
-    x ? 0  =  0
-    x ? y  =  dec x ? 0
-
-    0 ? x  =  0
-    x ? y  =  0 ? dec y
-
-
-class of 4 equivalent candidates:
-
-    x ? y  =  dec x
-
-    x ? y  =  dec 0 + x
-
-    x ? y  =  x + dec 0
-
-    0 ? x  =  dec 0
-    x ? y  =  dec x
-
-
-class of 4 equivalent candidates:
-
-    x ? y  =  dec y
-
-    x ? y  =  dec 0 + y
-
-    x ? y  =  y + dec 0
-
-    x ? 0  =  dec 0
-    x ? y  =  dec y
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  x
-    x ? y  =  y
-
-    0 ? 0  =  0
-    0 ? x  =  x
-    x ? 0  =  x
-    x ? y  =  y
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  x
-    x ? y  =  0
-
-    0 ? 0  =  0
-    0 ? x  =  0
-    x ? 0  =  x
-    x ? y  =  0
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  0
-    x ? y  =  x
-
-    0 ? 0  =  0
-    0 ? x  =  0
-    x ? 0  =  0
-    x ? y  =  x
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  x
-    x ? y  =  0
-
-    0 ? 0  =  0
-    0 ? x  =  x
-    x ? 0  =  0
-    x ? y  =  0
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  0
-    x ? y  =  y
-
-    0 ? 0  =  0
-    0 ? x  =  0
-    x ? 0  =  0
-    x ? y  =  y
-
-
-class of 2 equivalent candidates:
-
-    x ? y  =  x + x
-
-    0 ? x  =  0
-    x ? y  =  x + x
-
-
-class of 8 equivalent candidates:
-
-    x ? y  =  x + y
-
-    x ? y  =  y + x
-
-    x ? 0  =  x
-    x ? y  =  x + y
-
-    x ? 0  =  x
-    x ? y  =  y + x
-
-    0 ? x  =  x
-    x ? y  =  x + y
-
-    0 ? x  =  x
-    x ? y  =  y + x
-
-    0 ? 0  =  0
-    0 ? x  =  x
-    x ? 0  =  x
-    x ? y  =  x + y
-
-    0 ? 0  =  0
-    0 ? x  =  x
-    x ? 0  =  x
-    x ? y  =  y + x
-
-
-class of 2 equivalent candidates:
-
-    x ? y  =  y + y
-
-    x ? 0  =  0
-    x ? y  =  y + y
-
-
-class of 5 equivalent candidates:
-
-    x ? y  =  dec (dec x)
-
-    x ? y  =  dec (dec 0) + x
-
-    x ? y  =  x + dec (dec 0)
-
-    x ? y  =  dec x + dec 0
-
-    x ? y  =  dec 0 + dec x
-
-
-class of 5 equivalent candidates:
-
-    x ? y  =  dec (dec y)
-
-    x ? y  =  dec (dec 0) + y
-
-    x ? y  =  y + dec (dec 0)
-
-    x ? y  =  dec y + dec 0
-
-    x ? y  =  dec 0 + dec y
-
-
-class of 2 equivalent candidates:
-
-    x ? y  =  dec (dec 0)
-
-    x ? y  =  dec 0 + dec 0
-
-
-class of 5 equivalent candidates:
-
-    x ? 0  =  x
-    x ? y  =  dec x
-
-    x ? 0  =  x
-    x ? y  =  dec x ? 0
-
-    x ? 0  =  x
-    x ? y  =  dec 0 + x
-
-    x ? 0  =  x
-    x ? y  =  x + dec 0
-
-    0 ? 0  =  0
-    0 ? x  =  dec 0
-    x ? 0  =  x
-    x ? y  =  dec x
-
-
-class of 4 equivalent candidates:
-
-    x ? 0  =  x
-    x ? y  =  dec y
-
-    x ? 0  =  x
-    x ? y  =  dec 0 + y
-
-    x ? 0  =  x
-    x ? y  =  y + dec 0
-
-    0 ? 0  =  0
-    0 ? x  =  dec x
-    x ? 0  =  x
-    x ? y  =  dec y
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  x
-    x ? y  =  dec 0
-
-    0 ? 0  =  0
-    0 ? x  =  dec 0
-    x ? 0  =  x
-    x ? y  =  dec 0
-
-
-class of 4 equivalent candidates:
-
-    x ? 0  =  0
-    x ? y  =  dec x
-
-    x ? 0  =  0
-    x ? y  =  dec 0 + x
-
-    x ? 0  =  0
-    x ? y  =  x + dec 0
-
-    0 ? 0  =  0
-    0 ? x  =  dec 0
-    x ? 0  =  0
-    x ? y  =  dec x
-
-
-class of 3 equivalent candidates:
-
-    x ? 0  =  0
-    x ? y  =  dec y
-
-    x ? 0  =  0
-    x ? y  =  dec 0 + y
-
-    x ? 0  =  0
-    x ? y  =  y + dec 0
-
-
-class of 4 equivalent candidates:
-
-    x ? 0  =  dec x
-    x ? y  =  x
-
-    x ? 0  =  dec 0 + x
-    x ? y  =  x
-
-    x ? 0  =  x + dec 0
-    x ? y  =  x
-
-    0 ? 0  =  dec 0
-    0 ? x  =  0
-    x ? 0  =  dec x
-    x ? y  =  x
-
-
-class of 4 equivalent candidates:
-
-    x ? 0  =  dec x
-    x ? y  =  y
-
-    x ? 0  =  dec 0 + x
-    x ? y  =  y
-
-    x ? 0  =  x + dec 0
-    x ? y  =  y
-
-    0 ? 0  =  dec 0
-    0 ? x  =  x
-    x ? 0  =  dec x
-    x ? y  =  y
-
-
-class of 4 equivalent candidates:
-
-    x ? 0  =  dec x
-    x ? y  =  0
-
-    x ? 0  =  dec 0 + x
-    x ? y  =  0
-
-    x ? 0  =  x + dec 0
-    x ? y  =  0
-
-    0 ? 0  =  dec 0
-    0 ? x  =  0
-    x ? 0  =  dec x
-    x ? y  =  0
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  dec 0
-    x ? y  =  x
-
-    0 ? 0  =  dec 0
-    0 ? x  =  0
-    x ? 0  =  dec 0
-    x ? y  =  x
-
-
-class of 4 equivalent candidates:
-
-    0 ? x  =  x
-    x ? y  =  dec x
-
-    0 ? x  =  x
-    x ? y  =  dec 0 + x
-
-    0 ? x  =  x
-    x ? y  =  x + dec 0
-
-    0 ? 0  =  0
-    0 ? x  =  x
-    x ? 0  =  dec x
-    x ? y  =  dec x
-
-
-class of 5 equivalent candidates:
-
-    0 ? x  =  x
-    x ? y  =  dec y
-
-    0 ? x  =  x
-    x ? y  =  0 ? dec y
-
-    0 ? x  =  x
-    x ? y  =  dec 0 + y
-
-    0 ? x  =  x
-    x ? y  =  y + dec 0
-
-    0 ? 0  =  0
-    0 ? x  =  x
-    x ? 0  =  dec 0
-    x ? y  =  dec y
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  x
-    x ? y  =  dec 0
-
-    0 ? 0  =  0
-    0 ? x  =  x
-    x ? 0  =  dec 0
-    x ? y  =  dec 0
-
-
-class of 3 equivalent candidates:
-
-    0 ? x  =  0
-    x ? y  =  dec x
-
-    0 ? x  =  0
-    x ? y  =  dec 0 + x
-
-    0 ? x  =  0
-    x ? y  =  x + dec 0
-
-
-class of 4 equivalent candidates:
-
-    0 ? x  =  0
-    x ? y  =  dec y
-
-    0 ? x  =  0
-    x ? y  =  dec 0 + y
-
-    0 ? x  =  0
-    x ? y  =  y + dec 0
-
-    0 ? 0  =  0
-    0 ? x  =  0
-    x ? 0  =  dec 0
-    x ? y  =  dec y
-
-
-class of 4 equivalent candidates:
-
-    0 ? x  =  dec x
-    x ? y  =  x
-
-    0 ? x  =  dec 0 + x
-    x ? y  =  x
-
-    0 ? x  =  x + dec 0
-    x ? y  =  x
-
-    0 ? 0  =  dec 0
-    0 ? x  =  dec x
-    x ? 0  =  x
-    x ? y  =  x
-
-
-class of 4 equivalent candidates:
-
-    0 ? x  =  dec x
-    x ? y  =  y
-
-    0 ? x  =  dec 0 + x
-    x ? y  =  y
-
-    0 ? x  =  x + dec 0
-    x ? y  =  y
-
-    0 ? 0  =  dec 0
-    0 ? x  =  dec x
-    x ? 0  =  0
-    x ? y  =  y
-
-
-class of 4 equivalent candidates:
-
-    0 ? x  =  dec x
-    x ? y  =  0
-
-    0 ? x  =  dec 0 + x
-    x ? y  =  0
-
-    0 ? x  =  x + dec 0
-    x ? y  =  0
-
-    0 ? 0  =  dec 0
-    0 ? x  =  dec x
-    x ? 0  =  0
-    x ? y  =  0
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  dec 0
-    x ? y  =  y
-
-    0 ? 0  =  dec 0
-    0 ? x  =  dec 0
-    x ? 0  =  0
-    x ? y  =  y
-
-
-class of 2 equivalent candidates:
-
-    x ? y  =  dec x + x
-
-    x ? y  =  x + dec x
-
-
-class of 4 equivalent candidates:
-
-    x ? y  =  dec x + y
-
-    x ? y  =  dec y + x
-
-    x ? y  =  x + dec y
-
-    x ? y  =  y + dec x
-
-
-class of 2 equivalent candidates:
-
-    x ? y  =  dec y + y
-
-    x ? y  =  y + dec y
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  x
-    x ? y  =  x + x
-
-    0 ? 0  =  0
-    0 ? x  =  0
-    x ? 0  =  x
-    x ? y  =  x + x
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  0
-    x ? y  =  x + x
-
-    0 ? 0  =  0
-    0 ? x  =  0
-    x ? 0  =  0
-    x ? y  =  x + x
-
-
-class of 4 equivalent candidates:
-
-    x ? 0  =  0
-    x ? y  =  x + y
-
-    x ? 0  =  0
-    x ? y  =  y + x
-
-    0 ? 0  =  0
-    0 ? x  =  x
-    x ? 0  =  0
-    x ? y  =  x + y
-
-    0 ? 0  =  0
-    0 ? x  =  x
-    x ? 0  =  0
-    x ? y  =  y + x
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  x + x
-    x ? y  =  x
-
-    0 ? 0  =  0
-    0 ? x  =  0
-    x ? 0  =  x + x
-    x ? y  =  x
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  x + x
-    x ? y  =  y
-
-    0 ? 0  =  0
-    0 ? x  =  x
-    x ? 0  =  x + x
-    x ? y  =  y
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  x + x
-    x ? y  =  0
-
-    0 ? 0  =  0
-    0 ? x  =  0
-    x ? 0  =  x + x
-    x ? y  =  0
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  x
-    x ? y  =  y + y
-
-    0 ? 0  =  0
-    0 ? x  =  x
-    x ? 0  =  0
-    x ? y  =  y + y
-
-
-class of 4 equivalent candidates:
-
-    0 ? x  =  0
-    x ? y  =  x + y
-
-    0 ? x  =  0
-    x ? y  =  y + x
-
-    0 ? 0  =  0
-    0 ? x  =  0
-    x ? 0  =  x
-    x ? y  =  x + y
-
-    0 ? 0  =  0
-    0 ? x  =  0
-    x ? 0  =  x
-    x ? y  =  y + x
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  0
-    x ? y  =  y + y
-
-    0 ? 0  =  0
-    0 ? x  =  0
-    x ? 0  =  0
-    x ? y  =  y + y
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  x + x
-    x ? y  =  x
-
-    0 ? 0  =  0
-    0 ? x  =  x + x
-    x ? 0  =  x
-    x ? y  =  x
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  x + x
-    x ? y  =  y
-
-    0 ? 0  =  0
-    0 ? x  =  x + x
-    x ? 0  =  0
-    x ? y  =  y
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  x + x
-    x ? y  =  0
-
-    0 ? 0  =  0
-    0 ? x  =  x + x
-    x ? 0  =  0
-    x ? y  =  0
-
-
-class of 3 equivalent candidates:
-
-    x ? y  =  dec (dec x) + x
-
-    x ? y  =  x + dec (dec x)
-
-    x ? y  =  dec x + dec x
-
-
-class of 6 equivalent candidates:
-
-    x ? y  =  dec (dec x) + y
-
-    x ? y  =  dec (dec y) + x
-
-    x ? y  =  x + dec (dec y)
-
-    x ? y  =  y + dec (dec x)
-
-    x ? y  =  dec x + dec y
-
-    x ? y  =  dec y + dec x
-
-
-class of 3 equivalent candidates:
-
-    x ? y  =  dec (dec y) + y
-
-    x ? y  =  y + dec (dec y)
-
-    x ? y  =  dec y + dec y
-
-
-class of 3 equivalent candidates:
-
-    x ? y  =  x + (x + y)
-
-    x ? y  =  x + (y + x)
-
-    x ? y  =  y + (x + x)
-
-
-class of 3 equivalent candidates:
-
-    x ? y  =  x + (y + y)
-
-    x ? y  =  y + (x + y)
-
-    x ? y  =  y + (y + x)
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  x
-    x ? y  =  dec x + x
-
-    x ? 0  =  x
-    x ? y  =  x + dec x
-
-
-class of 4 equivalent candidates:
-
-    x ? 0  =  x
-    x ? y  =  dec x + y
-
-    x ? 0  =  x
-    x ? y  =  dec y + x
-
-    x ? 0  =  x
-    x ? y  =  x + dec y
-
-    x ? 0  =  x
-    x ? y  =  y + dec x
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  x
-    x ? y  =  dec y + y
-
-    x ? 0  =  x
-    x ? y  =  y + dec y
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  0
-    x ? y  =  dec x + x
-
-    x ? 0  =  0
-    x ? y  =  x + dec x
-
-
-class of 4 equivalent candidates:
-
-    x ? 0  =  0
-    x ? y  =  dec x + y
-
-    x ? 0  =  0
-    x ? y  =  dec y + x
-
-    x ? 0  =  0
-    x ? y  =  x + dec y
-
-    x ? 0  =  0
-    x ? y  =  y + dec x
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  0
-    x ? y  =  dec y + y
-
-    x ? 0  =  0
-    x ? y  =  y + dec y
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  dec x
-    x ? y  =  x + y
-
-    x ? 0  =  dec x
-    x ? y  =  y + x
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  dec 0
-    x ? y  =  x + y
-
-    x ? 0  =  dec 0
-    x ? y  =  y + x
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  dec x + x
-    x ? y  =  x
-
-    x ? 0  =  x + dec x
-    x ? y  =  x
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  dec x + x
-    x ? y  =  y
-
-    x ? 0  =  x + dec x
-    x ? y  =  y
-
-
-class of 2 equivalent candidates:
-
-    x ? 0  =  dec x + x
-    x ? y  =  0
-
-    x ? 0  =  x + dec x
-    x ? y  =  0
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  x
-    x ? y  =  dec x + x
-
-    0 ? x  =  x
-    x ? y  =  x + dec x
-
-
-class of 4 equivalent candidates:
-
-    0 ? x  =  x
-    x ? y  =  dec x + y
-
-    0 ? x  =  x
-    x ? y  =  dec y + x
-
-    0 ? x  =  x
-    x ? y  =  x + dec y
-
-    0 ? x  =  x
-    x ? y  =  y + dec x
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  x
-    x ? y  =  dec y + y
-
-    0 ? x  =  x
-    x ? y  =  y + dec y
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  0
-    x ? y  =  dec x + x
-
-    0 ? x  =  0
-    x ? y  =  x + dec x
-
-
-class of 4 equivalent candidates:
-
-    0 ? x  =  0
-    x ? y  =  dec x + y
-
-    0 ? x  =  0
-    x ? y  =  dec y + x
-
-    0 ? x  =  0
-    x ? y  =  x + dec y
-
-    0 ? x  =  0
-    x ? y  =  y + dec x
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  0
-    x ? y  =  dec y + y
-
-    0 ? x  =  0
-    x ? y  =  y + dec y
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  dec x
-    x ? y  =  x + y
-
-    0 ? x  =  dec x
-    x ? y  =  y + x
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  dec 0
-    x ? y  =  x + y
-
-    0 ? x  =  dec 0
-    x ? y  =  y + x
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  dec x + x
-    x ? y  =  x
-
-    0 ? x  =  x + dec x
-    x ? y  =  x
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  dec x + x
-    x ? y  =  y
-
-    0 ? x  =  x + dec x
-    x ? y  =  y
-
-
-class of 2 equivalent candidates:
-
-    0 ? x  =  dec x + x
-    x ? y  =  0
-
-    0 ? x  =  x + dec x
-    x ? y  =  0
-
-
-class of 2 equivalent candidates:
-
-    0 ? 0  =  0
-    0 ? x  =  0
-    x ? 0  =  0
-    x ? y  =  x + y
-
-    0 ? 0  =  0
-    0 ? x  =  0
-    x ? 0  =  0
-    x ? y  =  y + x
-
-
-
-Redundant candidates for: goo :: [Int] -> [Int]
-  pruning with 4/4 rules
-  [2,1,2,3,4] candidates
-  9/12 unique candidates
-  3/12 redundant candidates
-
-rules:
-xs ++ [] == xs
-[] ++ xs == xs
-(xs ++ ys) ++ zs == xs ++ (ys ++ zs)
-(x:xs) ++ ys == x:(xs ++ ys)
-
-class of 3 equivalent candidates:
-
-    goo xs  =  xs
-
-    goo []  =  []
-    goo (x:xs)  =  x:xs
-
-    goo []  =  []
-    goo (x:xs)  =  x:goo xs
-
-
-class of 2 equivalent candidates:
-
-    goo xs  =  []
-
-    goo []  =  []
-    goo (x:xs)  =  goo xs
-
-
-
-Redundant candidates for: ?? :: [Int] -> [Int] -> [Int]
-  pruning with 4/4 rules
-  [3,7,13,66,152] candidates
-  161/241 unique candidates
-  80/241 redundant candidates
-
-rules:
-xs ++ [] == xs
-[] ++ xs == xs
-(xs ++ ys) ++ zs == xs ++ (ys ++ zs)
-(x:xs) ++ ys == x:(xs ++ ys)
-
-class of 4 equivalent candidates:
-
-    xs ?? ys  =  xs
-
-    xs ?? []  =  xs
-    xs ?? (x:ys)  =  xs ?? ys
-
-    xs ?? []  =  xs
-    xs ?? (x:ys)  =  xs ?? []
-
-    [] ?? xs  =  []
-    (x:xs) ?? ys  =  x:xs
-
-
-class of 4 equivalent candidates:
-
-    xs ?? ys  =  ys
-
-    [] ?? xs  =  xs
-    (x:xs) ?? ys  =  xs ?? ys
-
-    [] ?? xs  =  xs
-    (x:xs) ?? ys  =  [] ?? ys
-
-    xs ?? []  =  []
-    xs ?? (x:ys)  =  x:ys
-
-
-class of 29 equivalent candidates:
-
-    xs ?? ys  =  []
-
-    xs ?? []  =  []
-    xs ?? (x:ys)  =  xs ?? ys
-
-    xs ?? []  =  []
-    xs ?? (x:ys)  =  xs ?? []
-
-    xs ?? []  =  []
-    xs ?? (x:ys)  =  ys ?? xs
-
-    xs ?? []  =  []
-    xs ?? (x:ys)  =  ys ?? ys
-
-    xs ?? []  =  []
-    xs ?? (x:ys)  =  ys ?? []
-
-    xs ?? []  =  []
-    xs ?? (x:ys)  =  [] ?? xs
-
-    xs ?? []  =  []
-    xs ?? (x:ys)  =  [] ?? ys
-
-    [] ?? xs  =  []
-    (x:xs) ?? ys  =  xs ?? xs
-
-    [] ?? xs  =  []
-    (x:xs) ?? ys  =  xs ?? ys
-
-    [] ?? xs  =  []
-    (x:xs) ?? ys  =  xs ?? []
-
-    [] ?? xs  =  []
-    (x:xs) ?? ys  =  ys ?? xs
-
-    [] ?? xs  =  []
-    (x:xs) ?? ys  =  ys ?? []
-
-    [] ?? xs  =  []
-    (x:xs) ?? ys  =  [] ?? xs
-
-    [] ?? xs  =  []
-    (x:xs) ?? ys  =  [] ?? ys
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs ?? xs
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs ?? []
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  [] ?? xs
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  xs ?? xs
-    (x:xs) ?? (y:ys)  =  []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  xs ?? []
-    (x:xs) ?? (y:ys)  =  []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  [] ?? xs
-    (x:xs) ?? (y:ys)  =  []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  xs ?? xs
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  xs ?? ys
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  xs ?? []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  ys ?? xs
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  ys ?? ys
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  ys ?? []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  [] ?? xs
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  [] ?? ys
-
-
-class of 3 equivalent candidates:
-
-    xs ?? []  =  xs
-    xs ?? (x:ys)  =  ys
-
-    xs ?? []  =  xs
-    xs ?? (x:ys)  =  ys ?? []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  x:xs
-    (x:xs) ?? (y:ys)  =  ys
-
-
-class of 5 equivalent candidates:
-
-    xs ?? []  =  xs
-    xs ?? (x:ys)  =  []
-
-    xs ?? []  =  xs
-    xs ?? (x:ys)  =  ys ?? ys
-
-    xs ?? []  =  xs
-    xs ?? (x:ys)  =  [] ?? xs
-
-    xs ?? []  =  xs
-    xs ?? (x:ys)  =  [] ?? ys
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  x:xs
-    (x:xs) ?? (y:ys)  =  []
-
-
-class of 2 equivalent candidates:
-
-    xs ?? []  =  []
-    xs ?? (x:ys)  =  xs
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  x:xs
-
-
-class of 2 equivalent candidates:
-
-    xs ?? []  =  []
-    xs ?? (x:ys)  =  ys
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  xs ?? []
-    (x:xs) ?? (y:ys)  =  ys
-
-
-class of 5 equivalent candidates:
-
-    [] ?? xs  =  xs
-    (x:xs) ?? ys  =  []
-
-    [] ?? xs  =  xs
-    (x:xs) ?? ys  =  xs ?? xs
-
-    [] ?? xs  =  xs
-    (x:xs) ?? ys  =  xs ?? []
-
-    [] ?? xs  =  xs
-    (x:xs) ?? ys  =  ys ?? []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  x:xs
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  []
-
-
-class of 2 equivalent candidates:
-
-    [] ?? xs  =  []
-    (x:xs) ?? ys  =  xs
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  [] ?? xs
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  xs
-
-
-class of 2 equivalent candidates:
-
-    [] ?? xs  =  []
-    (x:xs) ?? ys  =  ys
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  y:ys
-
-
-class of 3 equivalent candidates:
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  xs ?? xs
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  ys ?? ys
-
-
-class of 2 equivalent candidates:
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  xs
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  xs ?? []
-    (x:xs) ?? (y:ys)  =  xs
-
-
-class of 7 equivalent candidates:
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  xs ?? xs
-    (x:xs) ?? (y:ys)  =  []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  xs ?? []
-    (x:xs) ?? (y:ys)  =  []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  xs ?? xs
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  xs ?? []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  ys ?? ys
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  ys ?? []
-
-
-class of 2 equivalent candidates:
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  ys
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  [] ?? xs
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  ys
-
-
-class of 7 equivalent candidates:
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs ?? xs
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  [] ?? xs
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  xs ?? xs
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  ys ?? ys
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  [] ?? xs
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  [] ?? ys
-
-
-class of 5 equivalent candidates:
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  xs
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs ?? []
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  xs
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  [] ?? xs
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  xs
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  xs ?? []
-    (x:xs) ?? (y:ys)  =  xs
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  [] ?? xs
-    (x:xs) ?? (y:ys)  =  xs
-
-
-class of 5 equivalent candidates:
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  ys
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs ?? []
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  ys
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  [] ?? xs
-    (x:xs) ?? []  =  []
-    (x:xs) ?? (y:ys)  =  ys
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  xs ?? []
-    (x:xs) ?? (y:ys)  =  ys
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  []
-    (x:xs) ?? []  =  [] ?? xs
-    (x:xs) ?? (y:ys)  =  ys
-
-
-class of 2 equivalent candidates:
-
-    [] ?? xs  =  xs
-    (x:xs) ?? ys  =  [] ?? xs
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  x:xs
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  xs
-
-
-class of 2 equivalent candidates:
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  xs ?? ys
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  ys ?? xs
-
-
-class of 2 equivalent candidates:
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  xs ?? []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  [] ?? xs
-
-
-class of 2 equivalent candidates:
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  ys ?? []
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  [] ?? ys
-
-
-class of 2 equivalent candidates:
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  xs ?? xs
-    (x:xs) ?? (y:ys)  =  xs
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  [] ?? xs
-    (x:xs) ?? (y:ys)  =  xs
-
-
-class of 2 equivalent candidates:
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  xs ?? xs
-    (x:xs) ?? (y:ys)  =  ys
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs
-    (x:xs) ?? []  =  [] ?? xs
-    (x:xs) ?? (y:ys)  =  ys
-
-
-class of 2 equivalent candidates:
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs ?? xs
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  xs
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs ?? []
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  xs
-
-
-class of 2 equivalent candidates:
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs ?? xs
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  ys
-
-    [] ?? []  =  []
-    [] ?? (x:xs)  =  xs ?? []
-    (x:xs) ?? []  =  xs
-    (x:xs) ?? (y:ys)  =  ys
-
-
-
-Redundant candidates for: ton :: Bool -> Bool
-  pruning with 39/49 rules
-  [3,3,0,0,0] candidates
-  4/6 unique candidates
-  2/6 redundant candidates
-
-rules:
-not False == True
-not True == False
-p && p == p
-p || p == p
-not (not p) == p
-p && False == False
-p && True == p
-False && p == False
-True && p == p
-p || False == p
-p || True == True
-False || p == p
-True || p == True
-not (p && q) == not p || not q
-not (p && q) == not q || not p
-not (p || q) == not p && not q
-not (p || q) == not q && not p
-p && not p == False
-not p && p == False
-p || not p == True
-not p || p == True
-(p && q) && r == p && (q && r)
-(p && q) && r == q && (p && r)
-(p || q) || r == p || (q || r)
-(p || q) || r == q || (p || r)
-p && (p && q) == p && q
-p && (q && p) == p && q
-p && (q && p) == q && p
-p || (p || q) == p || q
-p || (q || p) == p || q
-p || (q || p) == q || p
-p && (p || q) == p
-p && (q || p) == p
-(p || q) && p == p
-(p || q) && q == q
-p || p && q == p
-p || q && p == p
-p && q || p == p
-p && q || q == q
-equations:
-q && p == p && q
-q || p == p || q
-q && (p && r) == p && (q && r)
-r && (p && q) == p && (q && r)
-r && (q && p) == p && (q && r)
-q || (p || r) == p || (q || r)
-r || (p || q) == p || (q || r)
-r || (q || p) == p || (q || r)
-(r || q) && p == p && (q || r)
-r && q || p == p || q && r
-
-class of 2 equivalent candidates:
-
-    ton p  =  p
-
-    ton False  =  False
-    ton True  =  True
-
-
-class of 2 equivalent candidates:
-
-    ton p  =  not p
-
-    ton False  =  True
-    ton True  =  False
-
-
-
-Redundant candidates for: &| :: Bool -> Bool -> Bool
-  pruning with 39/49 rules
-  [4,14,26,8,4] candidates
-  16/56 unique candidates
-  40/56 redundant candidates
-
-rules:
-not False == True
-not True == False
-p && p == p
-p || p == p
-not (not p) == p
-p && False == False
-p && True == p
-False && p == False
-True && p == p
-p || False == p
-p || True == True
-False || p == p
-True || p == True
-not (p && q) == not p || not q
-not (p && q) == not q || not p
-not (p || q) == not p && not q
-not (p || q) == not q && not p
-p && not p == False
-not p && p == False
-p || not p == True
-not p || p == True
-(p && q) && r == p && (q && r)
-(p && q) && r == q && (p && r)
-(p || q) || r == p || (q || r)
-(p || q) || r == q || (p || r)
-p && (p && q) == p && q
-p && (q && p) == p && q
-p && (q && p) == q && p
-p || (p || q) == p || q
-p || (q || p) == p || q
-p || (q || p) == q || p
-p && (p || q) == p
-p && (q || p) == p
-(p || q) && p == p
-(p || q) && q == q
-p || p && q == p
-p || q && p == p
-p && q || p == p
-p && q || q == q
-equations:
-q && p == p && q
-q || p == p || q
-q && (p && r) == p && (q && r)
-r && (p && q) == p && (q && r)
-r && (q && p) == p && (q && r)
-q || (p || r) == p || (q || r)
-r || (p || q) == p || (q || r)
-r || (q || p) == p || (q || r)
-(r || q) && p == p && (q || r)
-r && q || p == p || q && r
-
-class of 2 equivalent candidates:
-
-    p &| q  =  p
-
-    False &| p  =  False
-    True &| p  =  True
-
-
-class of 2 equivalent candidates:
-
-    p &| q  =  q
-
-    p &| False  =  False
-    p &| True  =  True
-
-
-class of 2 equivalent candidates:
-
-    p &| q  =  not p
-
-    False &| p  =  True
-    True &| p  =  False
-
-
-class of 2 equivalent candidates:
-
-    p &| q  =  not q
-
-    p &| False  =  True
-    p &| True  =  False
-
-
-class of 5 equivalent candidates:
-
-    p &| False  =  p
-    p &| True  =  False
-
-    False &| p  =  False
-    True &| p  =  not p
-
-    False &| False  =  False
-    False &| True  =  False
-    True &| False  =  True
-    True &| True  =  False
-
-    p &| q  =  not q && p
-
-    p &| q  =  p && not q
-
-
-class of 5 equivalent candidates:
-
-    p &| False  =  p
-    p &| True  =  True
-
-    False &| p  =  p
-    True &| p  =  True
-
-    p &| q  =  p || q
-
-    p &| q  =  q || p
-
-    False &| False  =  False
-    False &| True  =  True
-    True &| False  =  True
-    True &| True  =  True
-
-
-class of 5 equivalent candidates:
-
-    p &| False  =  False
-    p &| True  =  p
-
-    False &| p  =  False
-    True &| p  =  p
-
-    p &| q  =  p && q
-
-    p &| q  =  q && p
-
-    False &| False  =  False
-    False &| True  =  False
-    True &| False  =  False
-    True &| True  =  True
-
-
-class of 5 equivalent candidates:
-
-    p &| False  =  True
-    p &| True  =  p
-
-    False &| p  =  not p
-    True &| p  =  True
-
-    False &| False  =  True
-    False &| True  =  False
-    True &| False  =  True
-    True &| True  =  True
-
-    p &| q  =  not q || p
-
-    p &| q  =  p || not q
-
-
-class of 5 equivalent candidates:
-
-    False &| p  =  p
-    True &| p  =  False
-
-    p &| False  =  False
-    p &| True  =  not p
-
-    False &| False  =  False
-    False &| True  =  True
-    True &| False  =  False
-    True &| True  =  False
-
-    p &| q  =  not p && q
-
-    p &| q  =  q && not p
-
-
-class of 5 equivalent candidates:
-
-    False &| p  =  True
-    True &| p  =  p
-
-    p &| False  =  not p
-    p &| True  =  True
-
-    False &| False  =  True
-    False &| True  =  True
-    True &| False  =  False
-    True &| True  =  True
-
-    p &| q  =  not p || q
-
-    p &| q  =  q || not p
-
-
-class of 3 equivalent candidates:
-
-    p &| False  =  p
-    p &| True  =  not p
-
-    False &| p  =  p
-    True &| p  =  not p
-
-    False &| False  =  False
-    False &| True  =  True
-    True &| False  =  True
-    True &| True  =  False
-
-
-class of 5 equivalent candidates:
-
-    p &| False  =  True
-    p &| True  =  not p
-
-    False &| p  =  True
-    True &| p  =  not p
-
-    False &| False  =  True
-    False &| True  =  True
-    True &| False  =  True
-    True &| True  =  False
-
-    p &| q  =  not p || not q
-
-    p &| q  =  not q || not p
-
-
-class of 3 equivalent candidates:
-
-    p &| False  =  not p
-    p &| True  =  p
-
-    False &| p  =  not p
-    True &| p  =  p
-
-    False &| False  =  True
-    False &| True  =  False
-    True &| False  =  False
-    True &| True  =  True
-
-
-class of 5 equivalent candidates:
-
-    p &| False  =  not p
-    p &| True  =  False
-
-    False &| p  =  not p
-    True &| p  =  False
-
-    False &| False  =  True
-    False &| True  =  False
-    True &| False  =  False
-    True &| True  =  False
-
-    p &| q  =  not p && not q
-
-    p &| q  =  not q && not p
+  [3,3,8,13,29] candidates
+  46/56 unique candidates
+  10/56 redundant candidates
+
+rules:
+x * y == x + y
+x * y == y + x
+x - x == 0
+x + 0 == x
+0 + x == x
+x - 0 == x
+(x + y) + z == x + (y + z)
+(x + y) + z == y + (x + z)
+x - (y - z) == z + (x - y)
+(x - y) - z == x - (y + z)
+(x - y) - z == x - (z + y)
+(x + y) - z == x + (y - z)
+(x + y) - z == y + (x - z)
+x + (y - x) == y
+(x - y) + y == x
+equations:
+y + x == x + y
+y + (x + z) == x + (y + z)
+z + (x + y) == x + (y + z)
+z + (y + x) == x + (y + z)
+y + (x - z) == x + (y - z)
+(x - z) + y == x + (y - z)
+(z - y) + x == (x - y) + z
+y - (x + y) == 0 - x
+y - (y + x) == 0 - x
+z - (y + z) == x - (x + y)
+z - (y + z) == x - (y + x)
+z - (z + y) == x - (x + y)
+z - (z + y) == x - (y + x)
+x + (0 - y) == x - y
+(0 - y) + x == x - y
+x - (x + 1) == 0 - 1
+x - (1 + x) == 0 - 1
+y - (y + 1) == x - (x + 1)
+y - (y + 1) == x - (1 + x)
+y - (1 + y) == x - (1 + x)
+
+class of 2 equivalent candidates:
+
+    foo x  =  x + x
+
+    foo 0  =  0
+    foo x  =  x + x
+
+
+class of 2 equivalent candidates:
+
+    foo x  =  x + 1
+
+    foo 0  =  1
+    foo x  =  x + 1
+
+
+class of 2 equivalent candidates:
+
+    foo x  =  x - 1
+
+    foo 1  =  0
+    foo x  =  x - 1
+
+
+class of 4 equivalent candidates:
+
+    foo x  =  0 - x
+
+    foo 0  =  0
+    foo x  =  0 - x
+
+    foo x  =  x - (x + x)
+
+    foo x  =  1 - (x + 1)
+
+
+class of 4 equivalent candidates:
+
+    foo x  =  1 - x
+
+    foo 0  =  1
+    foo x  =  1 - x
+
+    foo x  =  1 + (0 - x)
+
+    foo 1  =  0
+    foo x  =  1 - x
+
+
+class of 2 equivalent candidates:
+
+    foo x  =  x + (x + 1)
+
+    foo x  =  1 + (x + x)
+
+
+
+Redundant candidates for: ? :: Int -> Int -> Int
+  pruning with 10/23 rules
+  [3,7,22,53,129] candidates
+  192/214 unique candidates
+  22/214 redundant candidates
+
+rules:
+x * y == x + y
+x * y == y + x
+x + 0 == x
+0 + x == x
+dec (x + y) == x + dec y
+dec (x + y) == y + dec x
+dec (x + y) == dec x + y
+dec (x + y) == dec y + x
+(x + y) + z == x + (y + z)
+(x + y) + z == y + (x + z)
+equations:
+y + x == x + y
+y + dec x == x + dec y
+dec x + y == x + dec y
+dec y + x == dec x + y
+x + dec 0 == dec x
+dec 0 + x == dec x
+y + (x + z) == x + (y + z)
+z + (x + y) == x + (y + z)
+z + (y + x) == x + (y + z)
+y + dec (dec x) == x + dec (dec y)
+dec (dec x) + y == x + dec (dec y)
+x + dec (dec 0) == dec (dec x)
+dec (dec 0) + x == dec (dec x)
+
+class of 2 equivalent candidates:
+
+    x ? y  =  x + x
+
+    0 ? x  =  0
+    x ? y  =  x + x
+
+
+class of 4 equivalent candidates:
+
+    x ? y  =  x + y
+
+    x ? 0  =  x
+    x ? y  =  x + y
+
+    0 ? x  =  x
+    x ? y  =  x + y
+
+    0 ? x  =  x
+    x ? 0  =  x
+    x ? y  =  x + y
+
+
+class of 2 equivalent candidates:
+
+    x ? y  =  y + y
+
+    x ? 0  =  0
+    x ? y  =  y + y
+
+
+class of 2 equivalent candidates:
+
+    x ? y  =  x + dec y
+
+    x ? y  =  y + dec x
+
+
+class of 2 equivalent candidates:
+
+    x ? 0  =  x
+    x ? y  =  x + x
+
+    0 ? x  =  0
+    x ? 0  =  x
+    x ? y  =  x + x
+
+
+class of 2 equivalent candidates:
+
+    x ? 0  =  0
+    x ? y  =  x + x
+
+    0 ? x  =  0
+    x ? 0  =  0
+    x ? y  =  x + x
+
+
+class of 2 equivalent candidates:
+
+    x ? 0  =  0
+    x ? y  =  x + y
+
+    0 ? x  =  x
+    x ? 0  =  0
+    x ? y  =  x + y
+
+
+class of 2 equivalent candidates:
+
+    0 ? x  =  x
+    x ? y  =  y + y
+
+    0 ? x  =  x
+    x ? 0  =  0
+    x ? y  =  y + y
+
+
+class of 2 equivalent candidates:
+
+    0 ? x  =  0
+    x ? y  =  x + y
+
+    0 ? x  =  0
+    x ? 0  =  x
+    x ? y  =  x + y
+
+
+class of 2 equivalent candidates:
+
+    0 ? x  =  0
+    x ? y  =  y + y
+
+    0 ? x  =  0
+    x ? 0  =  0
+    x ? y  =  y + y
+
+
+class of 2 equivalent candidates:
+
+    x ? y  =  x + (x + y)
+
+    x ? y  =  y + (x + x)
+
+
+class of 2 equivalent candidates:
+
+    x ? y  =  x + (y + y)
+
+    x ? y  =  y + (x + y)
+
+
+class of 2 equivalent candidates:
+
+    x ? y  =  x + dec (dec x)
+
+    x ? y  =  dec x + dec x
+
+
+class of 3 equivalent candidates:
+
+    x ? y  =  x + dec (dec y)
+
+    x ? y  =  y + dec (dec x)
+
+    x ? y  =  dec x + dec y
+
+
+class of 2 equivalent candidates:
+
+    x ? y  =  y + dec (dec y)
+
+    x ? y  =  dec y + dec y
+
+
+class of 2 equivalent candidates:
+
+    x ? 0  =  x
+    x ? y  =  x + dec y
+
+    x ? 0  =  x
+    x ? y  =  y + dec x
+
+
+class of 2 equivalent candidates:
+
+    x ? 0  =  0
+    x ? y  =  x + dec y
+
+    x ? 0  =  0
+    x ? y  =  y + dec x
+
+
+class of 2 equivalent candidates:
+
+    0 ? x  =  x
+    x ? y  =  x + dec y
+
+    0 ? x  =  x
+    x ? y  =  y + dec x
+
+
+class of 2 equivalent candidates:
+
+    0 ? x  =  0
+    x ? y  =  x + dec y
+
+    0 ? x  =  0
+    x ? y  =  y + dec x
+
+
+
+Redundant candidates for: goo :: [Int] -> [Int]
+  pruning with 4/4 rules
+  [2,1,2,2,4] candidates
+  9/11 unique candidates
+  2/11 redundant candidates
+
+rules:
+xs ++ [] == xs
+[] ++ xs == xs
+(xs ++ ys) ++ zs == xs ++ (ys ++ zs)
+(x:xs) ++ ys == x:(xs ++ ys)
+
+class of 2 equivalent candidates:
+
+    goo xs  =  xs
+
+    goo []  =  []
+    goo (x:xs)  =  x:goo xs
+
+
+class of 2 equivalent candidates:
+
+    goo xs  =  []
+
+    goo []  =  []
+    goo (x:xs)  =  goo xs
+
+
+
+Redundant candidates for: ?? :: [Int] -> [Int] -> [Int]
+  pruning with 4/4 rules
+  [3,7,15,57,134] candidates
+  160/216 unique candidates
+  56/216 redundant candidates
+
+rules:
+xs ++ [] == xs
+[] ++ xs == xs
+(xs ++ ys) ++ zs == xs ++ (ys ++ zs)
+(x:xs) ++ ys == x:(xs ++ ys)
+
+class of 2 equivalent candidates:
+
+    xs ?? ys  =  xs
+
+    xs ?? []  =  xs
+    xs ?? (x:ys)  =  xs ?? ys
+
+
+class of 2 equivalent candidates:
+
+    xs ?? ys  =  ys
+
+    [] ?? xs  =  xs
+    (x:xs) ?? ys  =  xs ?? ys
+
+
+class of 22 equivalent candidates:
+
+    xs ?? ys  =  []
+
+    xs ?? []  =  []
+    xs ?? (x:ys)  =  xs ?? ys
+
+    xs ?? []  =  []
+    xs ?? (x:ys)  =  ys ?? xs
+
+    xs ?? []  =  []
+    xs ?? (x:ys)  =  ys ?? ys
+
+    xs ?? []  =  []
+    xs ?? (x:ys)  =  [] ?? xs
+
+    xs ?? []  =  []
+    xs ?? (x:ys)  =  [] ?? ys
+
+    [] ?? xs  =  []
+    (x:xs) ?? ys  =  xs ?? xs
+
+    [] ?? xs  =  []
+    (x:xs) ?? ys  =  xs ?? ys
+
+    [] ?? xs  =  []
+    (x:xs) ?? ys  =  xs ?? []
+
+    [] ?? xs  =  []
+    (x:xs) ?? ys  =  ys ?? xs
+
+    [] ?? xs  =  []
+    (x:xs) ?? ys  =  ys ?? []
+
+    [] ?? xs  =  []
+    (x:xs) ?? []  =  xs ?? xs
+    (x:xs) ?? (y:ys)  =  []
+
+    [] ?? xs  =  []
+    (x:xs) ?? []  =  xs ?? []
+    (x:xs) ?? (y:ys)  =  []
+
+    [] ?? xs  =  []
+    (x:xs) ?? []  =  []
+    (x:xs) ?? (y:ys)  =  xs ?? xs
+
+    [] ?? xs  =  []
+    (x:xs) ?? []  =  []
+    (x:xs) ?? (y:ys)  =  xs ?? ys
+
+    [] ?? xs  =  []
+    (x:xs) ?? []  =  []
+    (x:xs) ?? (y:ys)  =  xs ?? []
+
+    [] ?? xs  =  []
+    (x:xs) ?? []  =  []
+    (x:xs) ?? (y:ys)  =  ys ?? xs
+
+    [] ?? xs  =  []
+    (x:xs) ?? []  =  []
+    (x:xs) ?? (y:ys)  =  ys ?? ys
+
+    [] ?? xs  =  []
+    (x:xs) ?? []  =  []
+    (x:xs) ?? (y:ys)  =  ys ?? []
+
+    [] ?? []  =  []
+    [] ?? (x:xs)  =  xs ?? xs
+    (x:xs) ?? ys  =  []
+
+    [] ?? []  =  []
+    [] ?? (x:xs)  =  xs ?? []
+    (x:xs) ?? ys  =  []
+
+    [] ?? []  =  []
+    [] ?? (x:xs)  =  [] ?? xs
+    (x:xs) ?? ys  =  []
+
+
+class of 5 equivalent candidates:
+
+    xs ?? []  =  xs
+    xs ?? (x:ys)  =  []
+
+    xs ?? []  =  xs
+    xs ?? (x:ys)  =  ys ?? ys
+
+    xs ?? []  =  xs
+    xs ?? (x:ys)  =  [] ?? xs
+
+    xs ?? []  =  xs
+    xs ?? (x:ys)  =  [] ?? ys
+
+    [] ?? xs  =  []
+    (x:xs) ?? []  =  x:xs
+    (x:xs) ?? (y:ys)  =  []
+
+
+class of 2 equivalent candidates:
+
+    xs ?? []  =  []
+    xs ?? (x:ys)  =  xs
+
+    [] ?? xs  =  []
+    (x:xs) ?? []  =  []
+    (x:xs) ?? (y:ys)  =  x:xs
+
+
+class of 3 equivalent candidates:
+
+    xs ?? []  =  []
+    xs ?? (x:ys)  =  ys
+
+    [] ?? []  =  []
+    [] ?? (x:xs)  =  xs
+    (x:xs) ?? ys  =  xs ?? ys
+
+    [] ?? []  =  []
+    [] ?? (x:xs)  =  xs
+    (x:xs) ?? ys  =  [] ?? ys
+
+
+class of 10 equivalent candidates:
+
+    [] ?? xs  =  xs
+    (x:xs) ?? ys  =  []
+
+    [] ?? xs  =  xs
+    (x:xs) ?? ys  =  xs ?? xs
+
+    [] ?? xs  =  xs
+    (x:xs) ?? ys  =  xs ?? []
+
+    [] ?? xs  =  xs
+    (x:xs) ?? ys  =  ys ?? []
+
+    [] ?? xs  =  xs
+    (x:xs) ?? []  =  xs ?? xs
+    (x:xs) ?? (y:ys)  =  []
+
+    [] ?? xs  =  xs
+    (x:xs) ?? []  =  xs ?? []
+    (x:xs) ?? (y:ys)  =  []
+
+    [] ?? xs  =  xs
+    (x:xs) ?? []  =  []
+    (x:xs) ?? (y:ys)  =  xs ?? xs
+
+    [] ?? xs  =  xs
+    (x:xs) ?? []  =  []
+    (x:xs) ?? (y:ys)  =  xs ?? []
+
+    [] ?? xs  =  xs
+    (x:xs) ?? []  =  []
+    (x:xs) ?? (y:ys)  =  ys ?? ys
+
+    [] ?? xs  =  xs
+    (x:xs) ?? []  =  []
+    (x:xs) ?? (y:ys)  =  ys ?? []
+
+
+class of 2 equivalent candidates:
+
+    [] ?? xs  =  []
+    (x:xs) ?? ys  =  xs
+
+    [] ?? []  =  []
+    [] ?? (x:xs)  =  [] ?? xs
+    (x:xs) ?? ys  =  xs
+
+
+class of 3 equivalent candidates:
+
+    [] ?? xs  =  []
+    (x:xs) ?? ys  =  ys
+
+    [] ?? []  =  []
+    [] ?? (x:xs)  =  xs ?? []
+    (x:xs) ?? ys  =  ys
+
+    [] ?? []  =  []
+    [] ?? (x:xs)  =  [] ?? xs
+    (x:xs) ?? ys  =  ys
+
+
+class of 3 equivalent candidates:
+
+    [] ?? xs  =  xs
+    (x:xs) ?? []  =  xs
+    (x:xs) ?? (y:ys)  =  []
+
+    [] ?? xs  =  xs
+    (x:xs) ?? []  =  xs
+    (x:xs) ?? (y:ys)  =  xs ?? xs
+
+    [] ?? xs  =  xs
+    (x:xs) ?? []  =  xs
+    (x:xs) ?? (y:ys)  =  ys ?? ys
+
+
+class of 2 equivalent candidates:
+
+    [] ?? xs  =  xs
+    (x:xs) ?? []  =  []
+    (x:xs) ?? (y:ys)  =  xs
+
+    [] ?? xs  =  xs
+    (x:xs) ?? []  =  xs ?? []
+    (x:xs) ?? (y:ys)  =  xs
+
+
+class of 2 equivalent candidates:
+
+    [] ?? xs  =  xs
+    (x:xs) ?? []  =  []
+    (x:xs) ?? (y:ys)  =  ys
+
+    [] ?? xs  =  xs
+    (x:xs) ?? []  =  xs ?? []
+    (x:xs) ?? (y:ys)  =  ys
+
+
+class of 3 equivalent candidates:
+
+    [] ?? xs  =  []
+    (x:xs) ?? []  =  xs
+    (x:xs) ?? (y:ys)  =  []
+
+    [] ?? xs  =  []
+    (x:xs) ?? []  =  xs
+    (x:xs) ?? (y:ys)  =  xs ?? xs
+
+    [] ?? xs  =  []
+    (x:xs) ?? []  =  xs
+    (x:xs) ?? (y:ys)  =  ys ?? ys
+
+
+class of 2 equivalent candidates:
+
+    [] ?? xs  =  []
+    (x:xs) ?? []  =  []
+    (x:xs) ?? (y:ys)  =  xs
+
+    [] ?? xs  =  []
+    (x:xs) ?? []  =  xs ?? []
+    (x:xs) ?? (y:ys)  =  xs
+
+
+class of 2 equivalent candidates:
+
+    [] ?? xs  =  []
+    (x:xs) ?? []  =  []
+    (x:xs) ?? (y:ys)  =  ys
+
+    [] ?? xs  =  []
+    (x:xs) ?? []  =  xs ?? []
+    (x:xs) ?? (y:ys)  =  ys
+
+
+class of 2 equivalent candidates:
+
+    [] ?? []  =  []
+    [] ?? (x:xs)  =  xs
+    (x:xs) ?? ys  =  ys
+
+    [] ?? []  =  []
+    [] ?? (x:xs)  =  xs ?? xs
+    (x:xs) ?? ys  =  ys
+
+
+class of 4 equivalent candidates:
+
+    [] ?? []  =  []
+    [] ?? (x:xs)  =  xs
+    (x:xs) ?? ys  =  []
+
+    [] ?? []  =  []
+    [] ?? (x:xs)  =  xs
+    (x:xs) ?? ys  =  xs ?? xs
+
+    [] ?? []  =  []
+    [] ?? (x:xs)  =  xs
+    (x:xs) ?? ys  =  xs ?? []
+
+    [] ?? []  =  []
+    [] ?? (x:xs)  =  xs
+    (x:xs) ?? ys  =  ys ?? []
+
+
+class of 2 equivalent candidates:
+
+    [] ?? xs  =  xs
+    (x:xs) ?? ys  =  ys ?? xs
+
+    [] ?? xs  =  xs
+    (x:xs) ?? []  =  xs
+    (x:xs) ?? (y:ys)  =  xs ?? ys
+
+
+class of 2 equivalent candidates:
+
+    [] ?? []  =  []
+    [] ?? (x:xs)  =  xs ?? xs
+    (x:xs) ?? ys  =  xs
+
+    [] ?? []  =  []
+    [] ?? (x:xs)  =  xs ?? []
+    (x:xs) ?? ys  =  xs
+
+
+
+Redundant candidates for: ton :: Bool -> Bool
+  pruning with 39/49 rules
+  [3,2,0,0,0] candidates
+  4/5 unique candidates
+  1/5 redundant candidates
+
+rules:
+not False == True
+not True == False
+p && p == p
+p || p == p
+not (not p) == p
+p && False == False
+p && True == p
+False && p == False
+True && p == p
+p || False == p
+p || True == True
+False || p == p
+True || p == True
+not (p && q) == not p || not q
+not (p && q) == not q || not p
+not (p || q) == not p && not q
+not (p || q) == not q && not p
+p && not p == False
+not p && p == False
+p || not p == True
+not p || p == True
+(p && q) && r == p && (q && r)
+(p && q) && r == q && (p && r)
+(p || q) || r == p || (q || r)
+(p || q) || r == q || (p || r)
+p && (p && q) == p && q
+p && (q && p) == p && q
+p && (q && p) == q && p
+p || (p || q) == p || q
+p || (q || p) == p || q
+p || (q || p) == q || p
+p && (p || q) == p
+p && (q || p) == p
+(p || q) && p == p
+(p || q) && q == q
+p || p && q == p
+p || q && p == p
+p && q || p == p
+p && q || q == q
+equations:
+q && p == p && q
+q || p == p || q
+q && (p && r) == p && (q && r)
+r && (p && q) == p && (q && r)
+r && (q && p) == p && (q && r)
+q || (p || r) == p || (q || r)
+r || (p || q) == p || (q || r)
+r || (q || p) == p || (q || r)
+(r || q) && p == p && (q || r)
+r && q || p == p || q && r
+
+class of 2 equivalent candidates:
+
+    ton p  =  not p
+
+    ton False  =  True
+    ton True  =  False
+
+
+
+Redundant candidates for: &| :: Bool -> Bool -> Bool
+  pruning with 39/49 rules
+  [4,12,20,6,2] candidates
+  16/44 unique candidates
+  28/44 redundant candidates
+
+rules:
+not False == True
+not True == False
+p && p == p
+p || p == p
+not (not p) == p
+p && False == False
+p && True == p
+False && p == False
+True && p == p
+p || False == p
+p || True == True
+False || p == p
+True || p == True
+not (p && q) == not p || not q
+not (p && q) == not q || not p
+not (p || q) == not p && not q
+not (p || q) == not q && not p
+p && not p == False
+not p && p == False
+p || not p == True
+not p || p == True
+(p && q) && r == p && (q && r)
+(p && q) && r == q && (p && r)
+(p || q) || r == p || (q || r)
+(p || q) || r == q || (p || r)
+p && (p && q) == p && q
+p && (q && p) == p && q
+p && (q && p) == q && p
+p || (p || q) == p || q
+p || (q || p) == p || q
+p || (q || p) == q || p
+p && (p || q) == p
+p && (q || p) == p
+(p || q) && p == p
+(p || q) && q == q
+p || p && q == p
+p || q && p == p
+p && q || p == p
+p && q || q == q
+equations:
+q && p == p && q
+q || p == p || q
+q && (p && r) == p && (q && r)
+r && (p && q) == p && (q && r)
+r && (q && p) == p && (q && r)
+q || (p || r) == p || (q || r)
+r || (p || q) == p || (q || r)
+r || (q || p) == p || (q || r)
+(r || q) && p == p && (q || r)
+r && q || p == p || q && r
+
+class of 2 equivalent candidates:
+
+    p &| q  =  not p
+
+    False &| p  =  True
+    True &| p  =  False
+
+
+class of 4 equivalent candidates:
+
+    p &| q  =  not q
+
+    p &| False  =  True
+    p &| True  =  False
+
+    False &| p  =  not p
+    True &| False  =  True
+    True &| True  =  False
+
+    False &| False  =  True
+    False &| True  =  False
+    True &| p  =  not p
+
+
+class of 4 equivalent candidates:
+
+    p &| False  =  p
+    p &| True  =  False
+
+    False &| p  =  False
+    True &| p  =  not p
+
+    False &| p  =  False
+    True &| False  =  True
+    True &| True  =  False
+
+    p &| q  =  p && not q
+
+
+class of 3 equivalent candidates:
+
+    p &| False  =  p
+    p &| True  =  True
+
+    False &| p  =  p
+    True &| p  =  True
+
+    p &| q  =  p || q
+
+
+class of 3 equivalent candidates:
+
+    p &| False  =  False
+    p &| True  =  p
+
+    False &| p  =  False
+    True &| p  =  p
+
+    p &| q  =  p && q
+
+
+class of 4 equivalent candidates:
+
+    p &| False  =  True
+    p &| True  =  p
+
+    False &| p  =  not p
+    True &| p  =  True
+
+    False &| False  =  True
+    False &| True  =  False
+    True &| p  =  True
+
+    p &| q  =  p || not q
+
+
+class of 3 equivalent candidates:
+
+    False &| p  =  p
+    True &| p  =  False
+
+    p &| False  =  False
+    p &| True  =  not p
+
+    p &| q  =  q && not p
+
+
+class of 3 equivalent candidates:
+
+    False &| p  =  True
+    True &| p  =  p
+
+    p &| False  =  not p
+    p &| True  =  True
+
+    p &| q  =  q || not p
+
+
+class of 3 equivalent candidates:
+
+    p &| False  =  p
+    p &| True  =  not p
+
+    False &| p  =  p
+    True &| p  =  not p
+
+    False &| p  =  p
+    True &| False  =  True
+    True &| True  =  False
+
+
+class of 4 equivalent candidates:
+
+    p &| False  =  True
+    p &| True  =  not p
+
+    False &| p  =  True
+    True &| p  =  not p
+
+    False &| p  =  True
+    True &| False  =  True
+    True &| True  =  False
+
+    p &| q  =  not p || not q
+
+
+class of 3 equivalent candidates:
+
+    p &| False  =  not p
+    p &| True  =  p
+
+    False &| p  =  not p
+    True &| p  =  p
+
+    False &| False  =  True
+    False &| True  =  False
+    True &| p  =  p
+
+
+class of 4 equivalent candidates:
+
+    p &| False  =  not p
+    p &| True  =  False
+
+    False &| p  =  not p
+    True &| p  =  False
+
+    False &| False  =  True
+    False &| True  =  False
+    True &| p  =  False
+
+    p &| q  =  not p && not q
 
 
 
diff --git a/bench/runtime/lapmatrud/bench/candidates.runtime b/bench/runtime/lapmatrud/bench/candidates.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/bench/candidates.runtime
@@ -0,0 +1,1 @@
+8.0
diff --git a/bench/runtime/lapmatrud/bench/gps.runtime b/bench/runtime/lapmatrud/bench/gps.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/bench/gps.runtime
@@ -0,0 +1,1 @@
+15.1
diff --git a/bench/runtime/lapmatrud/bench/gps2.runtime b/bench/runtime/lapmatrud/bench/gps2.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/bench/gps2.runtime
@@ -0,0 +1,1 @@
+12.3
diff --git a/bench/runtime/lapmatrud/bench/ill-hit.runtime b/bench/runtime/lapmatrud/bench/ill-hit.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/bench/ill-hit.runtime
@@ -0,0 +1,1 @@
+0.5
diff --git a/bench/runtime/lapmatrud/bench/longshot.runtime b/bench/runtime/lapmatrud/bench/longshot.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/bench/longshot.runtime
@@ -0,0 +1,1 @@
+0.0
diff --git a/bench/runtime/lapmatrud/bench/lowtests.runtime b/bench/runtime/lapmatrud/bench/lowtests.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/bench/lowtests.runtime
@@ -0,0 +1,1 @@
+0.2
diff --git a/bench/runtime/lapmatrud/bench/p12.runtime b/bench/runtime/lapmatrud/bench/p12.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/bench/p12.runtime
@@ -0,0 +1,1 @@
+1.7
diff --git a/bench/runtime/lapmatrud/bench/p30.runtime b/bench/runtime/lapmatrud/bench/p30.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/bench/p30.runtime
@@ -0,0 +1,1 @@
+0.0
diff --git a/bench/runtime/lapmatrud/bench/redundants.runtime b/bench/runtime/lapmatrud/bench/redundants.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/bench/redundants.runtime
@@ -0,0 +1,1 @@
+1.9
diff --git a/bench/runtime/lapmatrud/bench/self.runtime b/bench/runtime/lapmatrud/bench/self.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/bench/self.runtime
@@ -0,0 +1,1 @@
+0.0
diff --git a/bench/runtime/lapmatrud/bench/take-drop.runtime b/bench/runtime/lapmatrud/bench/take-drop.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/bench/take-drop.runtime
@@ -0,0 +1,1 @@
+0.3
diff --git a/bench/runtime/lapmatrud/bench/terpret.runtime b/bench/runtime/lapmatrud/bench/terpret.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/bench/terpret.runtime
@@ -0,0 +1,1 @@
+7.2
diff --git a/bench/runtime/lapmatrud/bench/weird.runtime b/bench/runtime/lapmatrud/bench/weird.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/bench/weird.runtime
@@ -0,0 +1,1 @@
+2.8
diff --git a/bench/runtime/lapmatrud/eg/arith.runtime b/bench/runtime/lapmatrud/eg/arith.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/arith.runtime
@@ -0,0 +1,1 @@
+0.9
diff --git a/bench/runtime/lapmatrud/eg/bools.runtime b/bench/runtime/lapmatrud/eg/bools.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/bools.runtime
@@ -0,0 +1,1 @@
+1.8
diff --git a/bench/runtime/lapmatrud/eg/bst.runtime b/bench/runtime/lapmatrud/eg/bst.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/bst.runtime
@@ -0,0 +1,1 @@
+7.9
diff --git a/bench/runtime/lapmatrud/eg/count.runtime b/bench/runtime/lapmatrud/eg/count.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/count.runtime
@@ -0,0 +1,1 @@
+0.5
diff --git a/bench/runtime/lapmatrud/eg/dupos.runtime b/bench/runtime/lapmatrud/eg/dupos.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/dupos.runtime
@@ -0,0 +1,1 @@
+3.6
diff --git a/bench/runtime/lapmatrud/eg/factorial.runtime b/bench/runtime/lapmatrud/eg/factorial.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/factorial.runtime
@@ -0,0 +1,1 @@
+1.3
diff --git a/bench/runtime/lapmatrud/eg/fib01.runtime b/bench/runtime/lapmatrud/eg/fib01.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/fib01.runtime
@@ -0,0 +1,1 @@
+2.4
diff --git a/bench/runtime/lapmatrud/eg/fibonacci.runtime b/bench/runtime/lapmatrud/eg/fibonacci.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/fibonacci.runtime
@@ -0,0 +1,1 @@
+3.7
diff --git a/bench/runtime/lapmatrud/eg/gcd.runtime b/bench/runtime/lapmatrud/eg/gcd.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/gcd.runtime
@@ -0,0 +1,1 @@
+0.1
diff --git a/bench/runtime/lapmatrud/eg/higher.runtime b/bench/runtime/lapmatrud/eg/higher.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/higher.runtime
@@ -0,0 +1,1 @@
+0.6
diff --git a/bench/runtime/lapmatrud/eg/id.runtime b/bench/runtime/lapmatrud/eg/id.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/id.runtime
@@ -0,0 +1,1 @@
+0.0
diff --git a/bench/runtime/lapmatrud/eg/ints.runtime b/bench/runtime/lapmatrud/eg/ints.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/ints.runtime
@@ -0,0 +1,1 @@
+0.5
diff --git a/bench/runtime/lapmatrud/eg/list.runtime b/bench/runtime/lapmatrud/eg/list.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/list.runtime
@@ -0,0 +1,1 @@
+1.0
diff --git a/bench/runtime/lapmatrud/eg/pow.runtime b/bench/runtime/lapmatrud/eg/pow.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/pow.runtime
@@ -0,0 +1,1 @@
+4.7
diff --git a/bench/runtime/lapmatrud/eg/replicate.runtime b/bench/runtime/lapmatrud/eg/replicate.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/replicate.runtime
@@ -0,0 +1,1 @@
+0.3
diff --git a/bench/runtime/lapmatrud/eg/setelem.runtime b/bench/runtime/lapmatrud/eg/setelem.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/setelem.runtime
@@ -0,0 +1,1 @@
+1.1
diff --git a/bench/runtime/lapmatrud/eg/sort.runtime b/bench/runtime/lapmatrud/eg/sort.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/sort.runtime
@@ -0,0 +1,1 @@
+1.1
diff --git a/bench/runtime/lapmatrud/eg/spec.runtime b/bench/runtime/lapmatrud/eg/spec.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/spec.runtime
@@ -0,0 +1,1 @@
+0.6
diff --git a/bench/runtime/lapmatrud/eg/subset.runtime b/bench/runtime/lapmatrud/eg/subset.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/subset.runtime
@@ -0,0 +1,1 @@
+0.5
diff --git a/bench/runtime/lapmatrud/eg/tapps.runtime b/bench/runtime/lapmatrud/eg/tapps.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/tapps.runtime
@@ -0,0 +1,1 @@
+0.4
diff --git a/bench/runtime/lapmatrud/eg/tree.runtime b/bench/runtime/lapmatrud/eg/tree.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/eg/tree.runtime
@@ -0,0 +1,1 @@
+1.2
diff --git a/bench/runtime/lapmatrud/proto/u-conjure.runtime b/bench/runtime/lapmatrud/proto/u-conjure.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/proto/u-conjure.runtime
@@ -0,0 +1,1 @@
+0.2
diff --git a/bench/runtime/lapmatrud/versions b/bench/runtime/lapmatrud/versions
new file mode 100644
--- /dev/null
+++ b/bench/runtime/lapmatrud/versions
@@ -0,0 +1,4 @@
+GHC 9.0.2
+leancheck-1.0.0
+express-1.0.12
+speculate-0.4.14
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 @@
-10.9
+10.0
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 @@
-26.2
+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 @@
-9.3
+22.6
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 @@
-3.0
+3.1
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 @@
-3.7
+2.7
diff --git a/bench/runtime/zero/bench/self.runtime b/bench/runtime/zero/bench/self.runtime
--- a/bench/runtime/zero/bench/self.runtime
+++ b/bench/runtime/zero/bench/self.runtime
@@ -1,1 +1,1 @@
-0.0
+0.1
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 @@
-12.0
+15.1
diff --git a/bench/runtime/zero/bench/weird.runtime b/bench/runtime/zero/bench/weird.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/zero/bench/weird.runtime
@@ -0,0 +1,1 @@
+5.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 @@
-6.6
+13.9
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.6
+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 @@
-4.0
+7.4
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 @@
-5.7
+2.3
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 @@
-4.7
+8.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.1
+0.2
diff --git a/bench/runtime/zero/eg/higher.runtime b/bench/runtime/zero/eg/higher.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/zero/eg/higher.runtime
@@ -0,0 +1,1 @@
+1.2
diff --git a/bench/runtime/zero/eg/id.runtime b/bench/runtime/zero/eg/id.runtime
new file mode 100644
--- /dev/null
+++ b/bench/runtime/zero/eg/id.runtime
@@ -0,0 +1,1 @@
+0.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.2
+2.0
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 @@
-3.7
+6.9
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.4
+0.5
diff --git a/bench/runtime/zero/eg/setelem.runtime b/bench/runtime/zero/eg/setelem.runtime
--- a/bench/runtime/zero/eg/setelem.runtime
+++ b/bench/runtime/zero/eg/setelem.runtime
@@ -1,1 +1,1 @@
-1.9
+2.1
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 @@
-1.2
+2.5
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.0
+1.2
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
+0.9
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 @@
-1.9
+2.2
diff --git a/bench/self.out b/bench/self.out
--- a/bench/self.out
+++ b/bench/self.out
@@ -2,18 +2,18 @@
 -- testing 360 combinations of argument values
 -- pruning with 0/0 rules
 -- looking through 4 candidates of size 1
--- looking through 17 candidates of size 2
--- looking through 80 candidates of size 3
--- tested 23 candidates
+-- looking through 15 candidates of size 2
+-- looking through 55 candidates of size 3
+-- tested 21 candidates
 x ? y  =  x + y
 
 (?) :: Int -> Int -> Int
 -- testing 360 combinations of argument values
 -- pruning with 0/0 rules
 -- looking through 4 candidates of size 1
--- looking through 17 candidates of size 2
--- looking through 80 candidates of size 3
--- tested 39 candidates
+-- looking through 15 candidates of size 2
+-- looking through 55 candidates of size 3
+-- tested 33 candidates
 x ? y  =  x * y
 
 i :: Int -> Int
@@ -21,7 +21,7 @@
 -- pruning with 0/0 rules
 -- looking through 3 candidates of size 1
 -- looking through 2 candidates of size 2
--- looking through 21 candidates of size 3
+-- looking through 13 candidates of size 3
 -- tested 8 candidates
 i x  =  x + 1
 
@@ -30,7 +30,7 @@
 -- pruning with 0/0 rules
 -- looking through 3 candidates of size 1
 -- looking through 3 candidates of size 2
--- looking through 20 candidates of size 3
--- tested 26 candidates
+-- looking through 12 candidates of size 3
+-- tested 18 candidates
 cannot conjure
 
diff --git a/bench/take-drop.out b/bench/take-drop.out
--- a/bench/take-drop.out
+++ b/bench/take-drop.out
@@ -4,15 +4,12 @@
 -- looking through 2 candidates of size 1
 -- looking through 3 candidates of size 2
 -- looking through 4 candidates of size 3
--- looking through 14 candidates of size 4
--- looking through 26 candidates of size 5
--- looking through 41 candidates of size 6
--- looking through 130 candidates of size 7
--- looking through 125 candidates of size 8
--- looking through 458 candidates of size 9
--- tested 488 candidates
-drop 0 []  =  []
-drop 0 (x:xs)  =  x:xs
+-- looking through 9 candidates of size 4
+-- looking through 10 candidates of size 5
+-- looking through 28 candidates of size 6
+-- looking through 50 candidates of size 7
+-- tested 63 candidates
+drop 0 xs  =  xs
 drop x []  =  []
 drop x (y:xs)  =  drop (x - 1) xs
 
@@ -22,15 +19,14 @@
 -- looking through 2 candidates of size 1
 -- looking through 3 candidates of size 2
 -- looking through 4 candidates of size 3
--- looking through 14 candidates of size 4
--- looking through 26 candidates of size 5
--- looking through 41 candidates of size 6
--- looking through 130 candidates of size 7
--- looking through 125 candidates of size 8
--- looking through 458 candidates of size 9
--- tested 477 candidates
-take 0 []  =  []
-take 0 (x:xs)  =  []
+-- looking through 9 candidates of size 4
+-- looking through 10 candidates of size 5
+-- looking through 28 candidates of size 6
+-- looking through 50 candidates of size 7
+-- looking through 83 candidates of size 8
+-- looking through 133 candidates of size 9
+-- tested 249 candidates
+take 0 xs  =  []
 take x []  =  []
 take x (y:xs)  =  y:take (x - 1) xs
 
diff --git a/bench/terpret.out b/bench/terpret.out
--- a/bench/terpret.out
+++ b/bench/terpret.out
@@ -54,13 +54,15 @@
 -- looking through 10 candidates of size 4
 -- looking through 125 candidates of size 5
 -- looking through 225 candidates of size 6
--- looking through 1075 candidates of size 7
--- looking through 2457 candidates of size 8
--- looking through 8154 candidates of size 9
--- looking through 27432 candidates of size 10
--- looking through 174839 candidates of size 11
--- tested 137576 candidates
-cshift (p,q,r)  =  if p then (p,r,q) else (p,q,r)
+-- looking through 625 candidates of size 7
+-- looking through 1242 candidates of size 8
+-- looking through 3087 candidates of size 9
+-- looking through 8937 candidates of size 10
+-- looking through 102875 candidates of size 11
+-- tested 40385 candidates
+cshift (p,q,r)  =  if p
+                   then (p,r,q)
+                   else (p,q,r)
 
 cshift :: Bool -> Bool -> Bool -> (Bool,Bool,Bool)
 -- testing 4 combinations of argument values
@@ -71,10 +73,10 @@
 -- looking through 0 candidates of size 3
 -- looking through 125 candidates of size 4
 -- looking through 225 candidates of size 5
--- looking through 1035 candidates of size 6
--- looking through 2457 candidates of size 7
--- looking through 20250 candidates of size 8
--- tested 22191 candidates
+-- looking through 585 candidates of size 6
+-- looking through 1242 candidates of size 7
+-- looking through 15183 candidates of size 8
+-- tested 15459 candidates
 cshift False p q  =  (False,p,q)
 cshift True p q  =  (True,q,p)
 
@@ -86,8 +88,12 @@
 -- looking through 0 candidates of size 1
 -- looking through 0 candidates of size 2
 -- looking through 9 candidates of size 3
--- looking through 19 candidates of size 4
--- tested 28 candidates
+-- looking through 18 candidates of size 4
+-- looking through 27 candidates of size 5
+-- looking through 72 candidates of size 6
+-- looking through 245 candidates of size 7
+-- looking through 663 candidates of size 8
+-- tested 1034 candidates
 fadder False False False  =  (False,False)
 fadder False False True  =  (False,True)
 fadder False True False  =  (False,True)
@@ -128,13 +134,12 @@
 -- pruning with 4/7 rules
 -- looking through 1 candidates of size 1
 -- looking through 1 candidates of size 2
--- looking through 2 candidates of size 3
--- looking through 6 candidates of size 4
--- looking through 18 candidates of size 5
--- looking through 23 candidates of size 6
--- looking through 68 candidates of size 7
--- tested 64 candidates
-[] `access` 0  =  undefined
+-- looking through 1 candidates of size 3
+-- looking through 4 candidates of size 4
+-- looking through 9 candidates of size 5
+-- looking through 17 candidates of size 6
+-- looking through 46 candidates of size 7
+-- tested 46 candidates
 [] `access` x  =  undefined
 (x:xs) `access` 0  =  x
 (x:xs) `access` y  =  xs `access` (y - 1)
diff --git a/bench/weird.hs b/bench/weird.hs
new file mode 100644
--- /dev/null
+++ b/bench/weird.hs
@@ -0,0 +1,33 @@
+-- weird.hs: conjures some weird or unintuitive functions
+--
+-- Copyright (C) 2024 Rudy Matela
+-- Distributed under the 3-Clause BSD licence (see the file LICENSE).
+--
+-- This file conjures some weird or unintuitive functions.
+-- It is here to make sure we do not overprune!
+import Conjure
+
+-- | xor for integers
+--
+-- returns the sum but only when one of the arguments is 0
+(^^^) :: Int -> Int -> Int
+0 ^^^ y  =  y
+x ^^^ 0  =  x
+_ ^^^ _  =  0
+
+main :: IO ()
+main = do
+  conjure "^^^" (^^^) primitives
+  conjureWith args{usePatterns = False} "^^^" (^^^) primitives
+
+primitives :: [Prim]
+primitives =
+  [ pr (0::Int)
+  , pr (1::Int)
+  , prim "+" ((+) :: Int -> Int -> Int)
+  , prim "*" ((*) :: Int -> Int -> Int)
+  , prim "==" ((==) :: Int -> Int -> Bool)
+  , prim "&&" (&&)
+  , prim "||" (||)
+  , prif (undefined :: Int)
+  ]
diff --git a/bench/weird.out b/bench/weird.out
new file mode 100644
--- /dev/null
+++ b/bench/weird.out
@@ -0,0 +1,29 @@
+(^^^) :: Int -> Int -> Int
+-- testing 360 combinations of argument values
+-- pruning with 56/91 rules
+-- looking through 4 candidates of size 1
+-- looking through 15 candidates of size 2
+-- looking through 39 candidates of size 3
+-- tested 36 candidates
+0 ^^^ x  =  x
+x ^^^ 0  =  x
+x ^^^ y  =  0
+
+(^^^) :: Int -> Int -> Int
+-- testing 360 combinations of argument values
+-- pruning with 56/91 rules
+-- looking through 4 candidates of size 1
+-- looking through 0 candidates of size 2
+-- looking through 9 candidates of size 3
+-- looking through 0 candidates of size 4
+-- looking through 39 candidates of size 5
+-- looking through 60 candidates of size 6
+-- looking through 225 candidates of size 7
+-- looking through 1056 candidates of size 8
+-- looking through 1488 candidates of size 9
+-- looking through 13020 candidates of size 10
+-- tested 7148 candidates
+x ^^^ y  =  if 0 == x * y
+            then x + y
+            else 0
+
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -2,6 +2,18 @@
 ============================
 
 
+v0.5.8
+------
+
+* prune redundant mutants using a few new rules
+* rework numeric recursion criteria
+* improve pretty-printing
+* improve error handling
+* refactor and lint throughout
+* Conjurable tuples up to 12-tuples
+* bump Express requirement to v1.0.14 (bugfix)
+
+
 v0.5.6
 ------
 
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 Rudy Matela
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 name:                code-conjure
-version:             0.5.6
+version:             0.5.8
 synopsis:            synthesize Haskell functions out of partial definitions
 description:
   Conjure is a tool that synthesizes Haskell functions out of partial definitions.
@@ -43,6 +43,10 @@
                   , bench/runtime/zero/eg/*.runtime
                   , bench/runtime/zero/proto/*.runtime
                   , bench/runtime/zero/versions
+                  , bench/runtime/lapmatrud/bench/*.runtime
+                  , bench/runtime/lapmatrud/eg/*.runtime
+                  , bench/runtime/lapmatrud/proto/*.runtime
+                  , bench/runtime/lapmatrud/versions
                   , bench/versions
                   , bench/time
                   , test/sdist
@@ -60,7 +64,7 @@
 source-repository this
   type:            git
   location:        https://github.com/rudymatela/conjure
-  tag:             v0.5.6
+  tag:             v0.5.8
 
 library
   exposed-modules: Conjure
@@ -76,7 +80,7 @@
                , leancheck >= 1.0.0
                , template-haskell
                , speculate >= 0.4.14
-               , express >= 1.0.8
+               , express >= 1.0.14
   hs-source-dirs:      src
   default-language:    Haskell2010
 
diff --git a/eg/arith.out b/eg/arith.out
--- a/eg/arith.out
+++ b/eg/arith.out
@@ -2,49 +2,49 @@
 -- testing 4 combinations of argument values
 -- pruning with 14/25 rules
 -- looking through 3 candidates of size 1
--- looking through 2 candidates of size 2
--- looking through 8 candidates of size 3
--- tested 6 candidates
+-- looking through 1 candidates of size 2
+-- looking through 6 candidates of size 3
+-- tested 5 candidates
 double x  =  x + x
 
 triple :: Int -> Int
 -- testing 4 combinations of argument values
 -- pruning with 14/25 rules
 -- looking through 3 candidates of size 1
--- looking through 2 candidates of size 2
--- looking through 8 candidates of size 3
--- looking through 8 candidates of size 4
--- looking through 21 candidates of size 5
--- tested 25 candidates
+-- looking through 1 candidates of size 2
+-- looking through 6 candidates of size 3
+-- looking through 4 candidates of size 4
+-- looking through 11 candidates of size 5
+-- tested 15 candidates
 triple x  =  x + (x + x)
 
 add :: Int -> Int -> Int
 -- testing 4 combinations of argument values
 -- pruning with 14/25 rules
 -- looking through 4 candidates of size 1
--- looking through 17 candidates of size 2
--- looking through 61 candidates of size 3
--- tested 23 candidates
+-- looking through 15 candidates of size 2
+-- looking through 39 candidates of size 3
+-- tested 21 candidates
 add x y  =  x + y
 
 square :: Int -> Int
 -- testing 3 combinations of argument values
 -- pruning with 14/25 rules
 -- looking through 3 candidates of size 1
--- looking through 2 candidates of size 2
--- looking through 7 candidates of size 3
--- tested 10 candidates
+-- looking through 1 candidates of size 2
+-- looking through 4 candidates of size 3
+-- tested 7 candidates
 square x  =  x * x
 
 cube :: Int -> Int
 -- testing 3 combinations of argument values
 -- pruning with 14/25 rules
 -- looking through 3 candidates of size 1
--- looking through 2 candidates of size 2
--- looking through 7 candidates of size 3
--- looking through 8 candidates of size 4
--- looking through 21 candidates of size 5
--- tested 36 candidates
+-- looking through 1 candidates of size 2
+-- looking through 4 candidates of size 3
+-- looking through 3 candidates of size 4
+-- looking through 11 candidates of size 5
+-- tested 19 candidates
 cube x  =  x * (x * x)
 
 tnpo :: Int -> Int
@@ -52,11 +52,11 @@
 -- pruning with 14/25 rules
 -- looking through 3 candidates of size 1
 -- looking through 2 candidates of size 2
--- looking through 8 candidates of size 3
--- looking through 8 candidates of size 4
--- looking through 21 candidates of size 5
--- looking through 21 candidates of size 6
--- looking through 90 candidates of size 7
--- tested 87 candidates
+-- looking through 6 candidates of size 3
+-- looking through 5 candidates of size 4
+-- looking through 11 candidates of size 5
+-- looking through 11 candidates of size 6
+-- looking through 35 candidates of size 7
+-- tested 40 candidates
 tnpo x  =  x + (x + (x + 1))
 
diff --git a/eg/bools.out b/eg/bools.out
--- a/eg/bools.out
+++ b/eg/bools.out
@@ -5,8 +5,8 @@
 -- looking through 6 candidates of size 2
 -- looking through 12 candidates of size 3
 -- looking through 16 candidates of size 4
--- looking through 42 candidates of size 5
--- tested 45 candidates
+-- looking through 28 candidates of size 5
+-- tested 42 candidates
 and []  =  True
 and (p:ps)  =  p && and ps
 
@@ -17,7 +17,7 @@
 -- looking through 6 candidates of size 2
 -- looking through 12 candidates of size 3
 -- looking through 16 candidates of size 4
--- looking through 42 candidates of size 5
+-- looking through 28 candidates of size 5
 -- tested 39 candidates
 or []  =  False
 or (p:ps)  =  p || or ps
diff --git a/eg/bst.hs b/eg/bst.hs
--- a/eg/bst.hs
+++ b/eg/bst.hs
@@ -3,27 +3,14 @@
 -- Copyright (C) 2021 Rudy Matela
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 {-# LANGUAGE CPP, TemplateHaskell #-}
-#if __GLASGOW_HASKELL__ == 708
-{-# LANGUAGE DeriveDataTypeable, StandaloneDeriving #-}
-import Data.Typeable (Typeable)
-#endif
 
 import Conjure
 import Test.LeanCheck
 import Data.Express hiding (height,size)
 
--- TODO: remove the following import
--- and fix build on GHC 7.10 and 7.8
--- the generation of -: and ->>>: somehow fails.
-import Test.LeanCheck.Utils
-
 data Tree  =  Leaf
            |  Node Tree Int Tree
   deriving (Eq, Ord, Show, Read)
-
-#if __GLASGOW_HASKELL__ == 708
-deriving instance Typeable Tree
-#endif
 
 deriveExpress ''Tree
 
diff --git a/eg/bst.out b/eg/bst.out
--- a/eg/bst.out
+++ b/eg/bst.out
@@ -4,18 +4,18 @@
 -- looking through 1 candidates of size 1
 -- looking through 0 candidates of size 2
 -- looking through 0 candidates of size 3
--- looking through 8 candidates of size 4
+-- looking through 7 candidates of size 4
 -- looking through 0 candidates of size 5
 -- looking through 0 candidates of size 6
 -- looking through 0 candidates of size 7
--- looking through 60 candidates of size 8
--- looking through 120 candidates of size 9
+-- looking through 31 candidates of size 8
+-- looking through 92 candidates of size 9
 -- looking through 0 candidates of size 10
--- looking through 452 candidates of size 11
--- looking through 424 candidates of size 12
--- tested 707 candidates
+-- looking through 304 candidates of size 11
+-- looking through 199 candidates of size 12
+-- tested 501 candidates
 mem x Leaf  =  False
-mem x (Node t1 y t2)  =  mem x t1 || (x == y || mem x t2)
+mem x (Node t1 y t2)  =  mem x t1 || (mem x t2 || x == y)
 
 mem :: Int -> Tree -> Bool
 -- testing 360 combinations of argument values
@@ -42,16 +42,16 @@
 -- looking through 2 candidates of size 1
 -- looking through 2 candidates of size 2
 -- looking through 0 candidates of size 3
--- looking through 10 candidates of size 4
+-- looking through 8 candidates of size 4
 -- looking through 21 candidates of size 5
 -- looking through 0 candidates of size 6
--- looking through 118 candidates of size 7
+-- looking through 86 candidates of size 7
 -- looking through 239 candidates of size 8
--- looking through 216 candidates of size 9
--- looking through 2204 candidates of size 10
--- looking through 3651 candidates of size 11
--- looking through 8280 candidates of size 12
--- tested 14743 candidates
+-- looking through 104 candidates of size 9
+-- looking through 1558 candidates of size 10
+-- looking through 3555 candidates of size 11
+-- looking through 4028 candidates of size 12
+-- tested 9603 candidates
 cannot conjure
 
 before :: Int -> Tree -> Tree
@@ -59,16 +59,16 @@
 -- looking through 2 candidates of size 1
 -- looking through 2 candidates of size 2
 -- looking through 0 candidates of size 3
--- looking through 10 candidates of size 4
+-- looking through 8 candidates of size 4
 -- looking through 21 candidates of size 5
 -- looking through 0 candidates of size 6
--- looking through 118 candidates of size 7
+-- looking through 86 candidates of size 7
 -- looking through 239 candidates of size 8
--- looking through 216 candidates of size 9
--- looking through 2204 candidates of size 10
--- looking through 3651 candidates of size 11
--- looking through 8280 candidates of size 12
--- tested 14743 candidates
+-- looking through 104 candidates of size 9
+-- looking through 1558 candidates of size 10
+-- looking through 3555 candidates of size 11
+-- looking through 4028 candidates of size 12
+-- tested 9603 candidates
 cannot conjure
 
 before :: Int -> Tree -> Tree
@@ -76,16 +76,16 @@
 -- looking through 2 candidates of size 1
 -- looking through 2 candidates of size 2
 -- looking through 0 candidates of size 3
--- looking through 10 candidates of size 4
+-- looking through 8 candidates of size 4
 -- looking through 21 candidates of size 5
 -- looking through 0 candidates of size 6
--- looking through 94 candidates of size 7
+-- looking through 68 candidates of size 7
 -- looking through 287 candidates of size 8
--- looking through 72 candidates of size 9
--- looking through 1784 candidates of size 10
+-- looking through 32 candidates of size 9
+-- looking through 1216 candidates of size 10
 -- looking through 5103 candidates of size 11
--- looking through 3312 candidates of size 12
--- tested 10687 candidates
+-- looking through 1472 candidates of size 12
+-- tested 8211 candidates
 cannot conjure
 
 beyond :: Int -> Tree -> Tree
@@ -93,16 +93,16 @@
 -- looking through 2 candidates of size 1
 -- looking through 2 candidates of size 2
 -- looking through 0 candidates of size 3
--- looking through 10 candidates of size 4
+-- looking through 8 candidates of size 4
 -- looking through 21 candidates of size 5
 -- looking through 0 candidates of size 6
--- looking through 94 candidates of size 7
+-- looking through 68 candidates of size 7
 -- looking through 287 candidates of size 8
--- looking through 72 candidates of size 9
--- looking through 1784 candidates of size 10
+-- looking through 32 candidates of size 9
+-- looking through 1216 candidates of size 10
 -- looking through 5103 candidates of size 11
--- looking through 3312 candidates of size 12
--- tested 10687 candidates
+-- looking through 1472 candidates of size 12
+-- tested 8211 candidates
 cannot conjure
 
 union :: Tree -> Tree -> Tree
@@ -110,13 +110,13 @@
 -- pruning with 6/8 rules
 -- looking through 3 candidates of size 1
 -- looking through 11 candidates of size 2
--- looking through 40 candidates of size 3
+-- looking through 32 candidates of size 3
 -- looking through 84 candidates of size 4
--- looking through 784 candidates of size 5
--- looking through 1032 candidates of size 6
--- looking through 8368 candidates of size 7
--- looking through 24890 candidates of size 8
--- looking through 75535 candidates of size 9
--- tested 110747 candidates
+-- looking through 470 candidates of size 5
+-- looking through 1074 candidates of size 6
+-- looking through 4088 candidates of size 7
+-- looking through 16373 candidates of size 8
+-- looking through 41366 candidates of size 9
+-- tested 63501 candidates
 cannot conjure
 
diff --git a/eg/count.out b/eg/count.out
--- a/eg/count.out
+++ b/eg/count.out
@@ -14,16 +14,16 @@
 -- pruning with 8/13 rules
 -- looking through 2 candidates of size 1
 -- looking through 2 candidates of size 2
--- looking through 1 candidates of size 3
--- looking through 8 candidates of size 4
--- looking through 9 candidates of size 5
--- looking through 24 candidates of size 6
--- looking through 46 candidates of size 7
--- looking through 114 candidates of size 8
--- looking through 272 candidates of size 9
--- looking through 648 candidates of size 10
--- looking through 1549 candidates of size 11
--- tested 1751 candidates
+-- looking through 0 candidates of size 3
+-- looking through 4 candidates of size 4
+-- looking through 8 candidates of size 5
+-- looking through 14 candidates of size 6
+-- looking through 24 candidates of size 7
+-- looking through 58 candidates of size 8
+-- looking through 134 candidates of size 9
+-- looking through 302 candidates of size 10
+-- looking through 633 candidates of size 11
+-- tested 909 candidates
 count x []  =  0
-count x (y:xs)  =  (if x == y then 1 else 0) + count x xs
+count x (y:xs)  =  count x xs + (if x == y then 1 else 0)
 
diff --git a/eg/dupos.out b/eg/dupos.out
--- a/eg/dupos.out
+++ b/eg/dupos.out
@@ -12,15 +12,17 @@
 -- looking through 16 candidates of size 9
 -- looking through 25 candidates of size 10
 -- looking through 36 candidates of size 11
--- looking through 65 candidates of size 12
--- looking through 141 candidates of size 13
--- looking through 322 candidates of size 14
--- looking through 644 candidates of size 15
--- looking through 1189 candidates of size 16
--- looking through 2189 candidates of size 17
--- tested 2599 candidates
+-- looking through 63 candidates of size 12
+-- looking through 133 candidates of size 13
+-- looking through 299 candidates of size 14
+-- looking through 602 candidates of size 15
+-- looking through 1116 candidates of size 16
+-- looking through 2031 candidates of size 17
+-- tested 2451 candidates
 duplicates []  =  []
-duplicates (x:xs)  =  if elem x xs && not (elem x (duplicates xs)) then x:duplicates xs else duplicates xs
+duplicates (x:xs)  =  if elem x xs && not (elem x (duplicates xs))
+                      then x:duplicates xs
+                      else duplicates xs
 
 duplicates :: [Int] -> [Int]
 -- pruning with 21/26 rules
@@ -35,15 +37,17 @@
 -- looking through 16 candidates of size 9
 -- looking through 25 candidates of size 10
 -- looking through 36 candidates of size 11
--- looking through 65 candidates of size 12
--- looking through 141 candidates of size 13
--- looking through 322 candidates of size 14
--- looking through 644 candidates of size 15
--- looking through 1189 candidates of size 16
--- looking through 2189 candidates of size 17
--- tested 2599 candidates
+-- looking through 63 candidates of size 12
+-- looking through 133 candidates of size 13
+-- looking through 299 candidates of size 14
+-- looking through 602 candidates of size 15
+-- looking through 1116 candidates of size 16
+-- looking through 2031 candidates of size 17
+-- tested 2451 candidates
 duplicates []  =  []
-duplicates (x:xs)  =  if elem x xs && not (elem x (duplicates xs)) then x:duplicates xs else duplicates xs
+duplicates (x:xs)  =  if elem x xs && not (elem x (duplicates xs))
+                      then x:duplicates xs
+                      else duplicates xs
 
 positionsFrom :: Int -> A -> [A] -> [Int]
 -- testing 360 combinations of argument values
@@ -52,17 +56,17 @@
 -- looking through 0 candidates of size 2
 -- looking through 2 candidates of size 3
 -- looking through 5 candidates of size 4
--- looking through 15 candidates of size 5
--- looking through 25 candidates of size 6
--- looking through 59 candidates of size 7
--- looking through 108 candidates of size 8
--- looking through 256 candidates of size 9
--- looking through 458 candidates of size 10
--- looking through 1064 candidates of size 11
--- looking through 1948 candidates of size 12
--- looking through 4516 candidates of size 13
--- looking through 8304 candidates of size 14
--- tested 8844 candidates
+-- looking through 13 candidates of size 5
+-- looking through 18 candidates of size 6
+-- looking through 47 candidates of size 7
+-- looking through 77 candidates of size 8
+-- looking through 193 candidates of size 9
+-- looking through 293 candidates of size 10
+-- looking through 738 candidates of size 11
+-- looking through 1173 candidates of size 12
+-- looking through 2879 candidates of size 13
+-- looking through 4537 candidates of size 14
+-- tested 5610 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/factorial.out b/eg/factorial.out
--- a/eg/factorial.out
+++ b/eg/factorial.out
@@ -2,13 +2,13 @@
 -- testing 4 combinations of argument values
 -- pruning with 27/65 rules
 -- looking through 3 candidates of size 1
--- looking through 4 candidates of size 2
--- looking through 11 candidates of size 3
--- looking through 29 candidates of size 4
--- looking through 60 candidates of size 5
--- looking through 145 candidates of size 6
--- looking through 501 candidates of size 7
--- tested 283 candidates
+-- looking through 3 candidates of size 2
+-- looking through 7 candidates of size 3
+-- looking through 13 candidates of size 4
+-- looking through 35 candidates of size 5
+-- looking through 61 candidates of size 6
+-- looking through 219 candidates of size 7
+-- tested 153 candidates
 factorial 0  =  1
 factorial x  =  x * factorial (x - 1)
 
@@ -16,11 +16,11 @@
 -- testing 4 combinations of argument values
 -- pruning with 32/72 rules
 -- looking through 3 candidates of size 1
--- looking through 4 candidates of size 2
--- looking through 11 candidates of size 3
--- looking through 29 candidates of size 4
--- looking through 60 candidates of size 5
--- looking through 209 candidates of size 6
--- tested 148 candidates
+-- looking through 3 candidates of size 2
+-- looking through 7 candidates of size 3
+-- looking through 13 candidates of size 4
+-- looking through 35 candidates of size 5
+-- looking through 101 candidates of size 6
+-- tested 89 candidates
 factorial x  =  foldr (*) 1 [1..x]
 
diff --git a/eg/fib01.out b/eg/fib01.out
--- a/eg/fib01.out
+++ b/eg/fib01.out
@@ -3,10 +3,10 @@
 -- pruning with 6/10 rules
 -- looking through 4 candidates of size 1
 -- looking through 24 candidates of size 2
--- looking through 241 candidates of size 3
--- looking through 1958 candidates of size 4
--- looking through 10540 candidates of size 5
--- tested 12767 candidates
+-- looking through 115 candidates of size 3
+-- looking through 470 candidates of size 4
+-- looking through 1657 candidates of size 5
+-- tested 2270 candidates
 cannot conjure
 
 fib01 :: Int -> Int -> Int -> Int
@@ -14,14 +14,14 @@
 -- pruning with 18/37 rules
 -- looking through 4 candidates of size 1
 -- looking through 4 candidates of size 2
--- looking through 9 candidates of size 3
--- looking through 21 candidates of size 4
--- looking through 43 candidates of size 5
--- looking through 84 candidates of size 6
--- looking through 192 candidates of size 7
--- looking through 391 candidates of size 8
--- looking through 840 candidates of size 9
--- looking through 6414 candidates of size 10
--- tested 8002 candidates
+-- looking through 10 candidates of size 3
+-- looking through 16 candidates of size 4
+-- looking through 44 candidates of size 5
+-- looking through 92 candidates of size 6
+-- looking through 234 candidates of size 7
+-- looking through 544 candidates of size 8
+-- looking through 1332 candidates of size 9
+-- looking through 7796 candidates of size 10
+-- tested 10076 candidates
 cannot conjure
 
diff --git a/eg/fibonacci.out b/eg/fibonacci.out
--- a/eg/fibonacci.out
+++ b/eg/fibonacci.out
@@ -3,17 +3,17 @@
 -- pruning with 21/44 rules
 -- looking through 4 candidates of size 1
 -- looking through 3 candidates of size 2
--- looking through 14 candidates of size 3
--- looking through 17 candidates of size 4
--- looking through 58 candidates of size 5
--- looking through 69 candidates of size 6
--- looking through 357 candidates of size 7
--- looking through 390 candidates of size 8
--- looking through 2265 candidates of size 9
--- looking through 2502 candidates of size 10
--- looking through 15355 candidates of size 11
--- looking through 17083 candidates of size 12
--- tested 21324 candidates
+-- looking through 9 candidates of size 3
+-- looking through 11 candidates of size 4
+-- looking through 34 candidates of size 5
+-- looking through 41 candidates of size 6
+-- looking through 187 candidates of size 7
+-- looking through 204 candidates of size 8
+-- looking through 957 candidates of size 9
+-- looking through 1059 candidates of size 10
+-- looking through 5295 candidates of size 11
+-- looking through 6052 candidates of size 12
+-- tested 8126 candidates
 fibonacci 0  =  1
 fibonacci 1  =  1
 fibonacci x  =  fibonacci (x - 1) + fibonacci (x - 2)
diff --git a/eg/gcd.out b/eg/gcd.out
--- a/eg/gcd.out
+++ b/eg/gcd.out
@@ -2,12 +2,12 @@
 -- testing 11 combinations of argument values
 -- pruning with 0/0 rules
 -- looking through 3 candidates of size 1
--- looking through 7 candidates of size 2
--- looking through 18 candidates of size 3
--- looking through 60 candidates of size 4
--- looking through 150 candidates of size 5
--- looking through 469 candidates of size 6
--- tested 243 candidates
+-- looking through 5 candidates of size 2
+-- looking through 11 candidates of size 3
+-- looking through 50 candidates of size 4
+-- looking through 98 candidates of size 5
+-- looking through 359 candidates of size 6
+-- tested 171 candidates
 gcd x 0  =  x
 gcd x y  =  gcd y (x `mod` y)
 
diff --git a/eg/higher.hs b/eg/higher.hs
new file mode 100644
--- /dev/null
+++ b/eg/higher.hs
@@ -0,0 +1,55 @@
+-- higher.hs: conjuring higher order functions
+--
+-- Copyright (C) 2024 Rudy Matela
+-- Distributed under the 3-Clause BSD licence (see the file LICENSE).
+import Conjure
+
+appSpec :: ((Int -> Int) -> Int -> Int) -> Bool
+appSpec ($)  =  ((+1) $ 2) == 3
+             && (abs $ (-2)) == 2
+             && (negate $ 1) == -1
+
+-- composeSpec :: ((Int->Int) -> (Int->Int) -> Int->Int) -> 
+
+composeSpec :: ((Int->Int) -> (Int->Int) -> Int->Int) -> Bool
+composeSpec (.)  =  ((*2) . (*3)) 1 == 6
+                 && (abs . negate) 7 == 7
+                 && (negate . abs) 8 == -8
+
+flipSpec :: ((Int -> Int -> Int) -> Int -> Int -> Int) -> Bool
+flipSpec flip  =  flip const 1 2 == 2
+               && flip div 2 10 == 5
+               && flip mod 3 10 == 1
+
+mapSpec :: ((Int -> Int) -> [Int] -> [Int]) -> Bool
+mapSpec map  =  map (*2) [1,2,3] == [2,4,6]
+             && map abs [0,-1,-2] == [0,1,2]
+
+foldSpec :: ((Int -> Int -> Int) -> Int -> [Int] -> Int) -> Bool
+foldSpec fold  =  fold (+) 0 [1,2,3] == 6
+               && fold (*) 1 [1,2,3] == 6
+               && fold (+) 0 [1,2,3,4] == 10
+               && fold (*) 1 [1,2,3,4] == 24
+
+filterSpec :: ((Int -> Bool) -> [Int] -> [Int]) -> Bool
+filterSpec filter  =  filter (<0) [0,1,-1,2,-2] == [-1,-2]
+                   && filter (>0) [0,1,-1,2,-2] == [1,2]
+                   && filter odd [0,1,2,3,4,5,6] == [1,3,5]
+                   && filter even [0,1,2,3,4,5,6] == [0,2,4,6]
+
+main :: IO ()
+main = do
+  conjureFromSpec "$"      appSpec     primitives
+  conjureFromSpec "."      composeSpec primitives
+  conjureFromSpec "flip"   flipSpec    primitives
+  conjureFromSpec "map"    mapSpec     primitives
+  conjureFromSpec "fold"   foldSpec    primitives
+  conjureFromSpec "filter" filterSpec  primitives
+
+
+primitives :: [Prim]
+primitives  =
+  [ pr ([] :: [Int])
+  , prim ":" ((:) :: Int -> [Int] -> [Int])
+  , prif (undefined :: [Int])
+  ]
diff --git a/eg/higher.out b/eg/higher.out
new file mode 100644
--- /dev/null
+++ b/eg/higher.out
@@ -0,0 +1,69 @@
+($) :: (Int -> Int) -> Int -> Int
+-- pruning with 3/3 rules
+-- looking through 1 candidates of size 1
+-- looking through 1 candidates of size 2
+-- tested 2 candidates
+f $ x  =  f x
+
+(.) :: (Int -> Int) -> (Int -> Int) -> Int -> Int
+-- pruning with 3/3 rules
+-- looking through 1 candidates of size 1
+-- looking through 2 candidates of size 2
+-- looking through 4 candidates of size 3
+-- tested 5 candidates
+(f . g) x  =  f (g x)
+
+flip :: (Int -> Int -> Int) -> Int -> Int -> Int
+-- pruning with 3/3 rules
+-- looking through 2 candidates of size 1
+-- looking through 0 candidates of size 2
+-- looking through 4 candidates of size 3
+-- tested 5 candidates
+flip f x y  =  f y x
+
+map :: (Int -> Int) -> [Int] -> [Int]
+-- pruning with 3/3 rules
+-- looking through 2 candidates of size 1
+-- looking through 1 candidates of size 2
+-- looking through 0 candidates of size 3
+-- looking through 3 candidates of size 4
+-- looking through 2 candidates of size 5
+-- looking through 6 candidates of size 6
+-- looking through 9 candidates of size 7
+-- tested 17 candidates
+map f []  =  []
+map f (x:xs)  =  f x:map f xs
+
+fold :: (Int -> Int -> Int) -> Int -> [Int] -> Int
+-- pruning with 3/3 rules
+-- looking through 1 candidates of size 1
+-- looking through 1 candidates of size 2
+-- looking through 1 candidates of size 3
+-- looking through 6 candidates of size 4
+-- looking through 4 candidates of size 5
+-- looking through 23 candidates of size 6
+-- looking through 26 candidates of size 7
+-- tested 45 candidates
+fold f x []  =  x
+fold f x (y:xs)  =  fold f (f x y) xs
+
+filter :: (Int -> Bool) -> [Int] -> [Int]
+-- pruning with 3/3 rules
+-- looking through 2 candidates of size 1
+-- looking through 1 candidates of size 2
+-- looking through 0 candidates of size 3
+-- looking through 3 candidates of size 4
+-- looking through 0 candidates of size 5
+-- looking through 6 candidates of size 6
+-- looking through 0 candidates of size 7
+-- looking through 22 candidates of size 8
+-- looking through 0 candidates of size 9
+-- looking through 65 candidates of size 10
+-- looking through 0 candidates of size 11
+-- looking through 219 candidates of size 12
+-- tested 166 candidates
+filter f []  =  []
+filter f (x:xs)  =  if f x
+                    then x:filter f xs
+                    else filter f xs
+
diff --git a/eg/id.hs b/eg/id.hs
new file mode 100644
--- /dev/null
+++ b/eg/id.hs
@@ -0,0 +1,12 @@
+-- id.hs: conjuring the identity and const functions
+--
+-- Copyright (C) 2024 Rudy Matela
+-- Distributed under the 3-Clause BSD licence (see the file LICENSE).
+import Conjure
+
+main :: IO ()
+main = do
+  -- conjure needs no primitives
+  -- to figure out the implementation of id and const
+  conjure "id"    (id :: Int -> Int)           []
+  conjure "const" (const :: Int -> Int -> Int) []
diff --git a/eg/id.out b/eg/id.out
new file mode 100644
--- /dev/null
+++ b/eg/id.out
@@ -0,0 +1,14 @@
+id :: Int -> Int
+-- testing 360 combinations of argument values
+-- pruning with 0/0 rules
+-- looking through 1 candidates of size 1
+-- tested 1 candidates
+id x  =  x
+
+const :: Int -> Int -> Int
+-- testing 360 combinations of argument values
+-- pruning with 0/0 rules
+-- looking through 2 candidates of size 1
+-- tested 1 candidates
+const x y  =  x
+
diff --git a/eg/ints.out b/eg/ints.out
--- a/eg/ints.out
+++ b/eg/ints.out
@@ -22,10 +22,10 @@
 -- pruning with 14/25 rules
 -- looking through 2 candidates of size 1
 -- looking through 4 candidates of size 2
--- looking through 3 candidates of size 3
--- looking through 13 candidates of size 4
--- looking through 14 candidates of size 5
--- tested 23 candidates
+-- looking through 2 candidates of size 3
+-- looking through 6 candidates of size 4
+-- looking through 6 candidates of size 5
+-- tested 15 candidates
 sum []  =  0
 sum (x:xs)  =  x + sum xs
 
@@ -34,10 +34,10 @@
 -- pruning with 14/25 rules
 -- looking through 2 candidates of size 1
 -- looking through 4 candidates of size 2
--- looking through 3 candidates of size 3
--- looking through 13 candidates of size 4
--- looking through 14 candidates of size 5
--- tested 33 candidates
+-- looking through 2 candidates of size 3
+-- looking through 6 candidates of size 4
+-- looking through 6 candidates of size 5
+-- tested 20 candidates
 product []  =  1
 product (x:xs)  =  x * product xs
 
@@ -46,9 +46,9 @@
 -- pruning with 15/26 rules
 -- looking through 2 candidates of size 1
 -- looking through 4 candidates of size 2
--- looking through 3 candidates of size 3
--- looking through 16 candidates of size 4
--- tested 10 candidates
+-- looking through 2 candidates of size 3
+-- looking through 9 candidates of size 4
+-- tested 9 candidates
 sum xs  =  foldr (+) 0 xs
 
 product :: [Int] -> Int
@@ -56,8 +56,8 @@
 -- pruning with 15/26 rules
 -- looking through 2 candidates of size 1
 -- looking through 4 candidates of size 2
--- looking through 3 candidates of size 3
--- looking through 16 candidates of size 4
--- tested 12 candidates
+-- looking through 2 candidates of size 3
+-- looking through 9 candidates of size 4
+-- tested 11 candidates
 product xs  =  foldr (*) 1 xs
 
diff --git a/eg/list.hs b/eg/list.hs
--- a/eg/list.hs
+++ b/eg/list.hs
@@ -52,6 +52,12 @@
 ordered' [x,y]  =  x <= y
 ordered' [x,y,z]  =  x <= y && y <= z
 
+zip' :: [Int] -> [Int] -> [(Int,Int)]
+zip' [] []  =  []
+zip' [x] [a]  =  [(x,a)]
+zip' [x,y] [a,b]  =  [(x,a),(y,b)]
+zip' [x,y,z] [a,b,c]  =  [(x,a),(y,b),(z,c)]
+
 main :: IO ()
 main = do
   conjure "length" length'
@@ -75,6 +81,12 @@
     [ pr ([] :: [Int])
     , prim ":" ((:) :: Int -> [Int] -> [Int])
     , prim "foldr" (foldr :: (Int -> [Int] -> [Int]) -> [Int] -> [Int] -> [Int])
+    ]
+
+  conjure "zip" (zip')
+    [ pr ([] :: [(Int,Int)])
+    , prim ":" ((:) :: (Int,Int) -> [(Int,Int)] -> [(Int,Int)])
+    , prim "," ((,) :: Int -> Int -> (Int,Int))
     ]
 
   conjure "\\/" (\/)
diff --git a/eg/list.out b/eg/list.out
--- a/eg/list.out
+++ b/eg/list.out
@@ -3,10 +3,10 @@
 -- pruning with 4/8 rules
 -- looking through 2 candidates of size 1
 -- looking through 2 candidates of size 2
--- looking through 2 candidates of size 3
--- looking through 4 candidates of size 4
--- looking through 5 candidates of size 5
--- tested 13 candidates
+-- looking through 1 candidates of size 3
+-- looking through 2 candidates of size 4
+-- looking through 2 candidates of size 5
+-- tested 9 candidates
 length []  =  0
 length (x:xs)  =  length xs + 1
 
@@ -29,11 +29,11 @@
 -- pruning with 0/0 rules
 -- looking through 3 candidates of size 1
 -- looking through 7 candidates of size 2
--- looking through 9 candidates of size 3
--- looking through 44 candidates of size 4
--- looking through 116 candidates of size 5
--- looking through 80 candidates of size 6
--- tested 233 candidates
+-- looking through 11 candidates of size 3
+-- looking through 37 candidates of size 4
+-- looking through 98 candidates of size 5
+-- looking through 94 candidates of size 6
+-- tested 194 candidates
 [] ++ xs  =  xs
 (x:xs) ++ ys  =  x:(xs ++ ys)
 
@@ -42,21 +42,38 @@
 -- pruning with 2/2 rules
 -- looking through 3 candidates of size 1
 -- looking through 7 candidates of size 2
--- looking through 9 candidates of size 3
--- looking through 48 candidates of size 4
--- tested 54 candidates
+-- looking through 11 candidates of size 3
+-- looking through 41 candidates of size 4
+-- tested 48 candidates
 xs ++ ys  =  foldr (:) ys xs
 
+zip :: [Int] -> [Int] -> [(Int,Int)]
+-- testing 360 combinations of argument values
+-- pruning with 0/0 rules
+-- looking through 1 candidates of size 1
+-- looking through 0 candidates of size 2
+-- looking through 0 candidates of size 3
+-- looking through 8 candidates of size 4
+-- looking through 6 candidates of size 5
+-- looking through 2 candidates of size 6
+-- looking through 14 candidates of size 7
+-- looking through 9 candidates of size 8
+-- looking through 31 candidates of size 9
+-- tested 50 candidates
+zip [] xs  =  []
+zip (x:xs) []  =  []
+zip (x:xs) (y:ys)  =  (x,y):zip xs ys
+
 (\/) :: [Int] -> [Int] -> [Int]
 -- testing 360 combinations of argument values
 -- pruning with 0/0 rules
 -- looking through 3 candidates of size 1
 -- looking through 7 candidates of size 2
--- looking through 9 candidates of size 3
--- looking through 44 candidates of size 4
--- looking through 116 candidates of size 5
--- looking through 80 candidates of size 6
--- tested 235 candidates
+-- looking through 11 candidates of size 3
+-- looking through 37 candidates of size 4
+-- looking through 98 candidates of size 5
+-- looking through 94 candidates of size 6
+-- tested 196 candidates
 [] \/ xs  =  xs
 (x:xs) \/ ys  =  x:ys \/ xs
 
@@ -68,31 +85,31 @@
 -- looking through 3 candidates of size 3
 -- looking through 3 candidates of size 4
 -- looking through 4 candidates of size 5
--- looking through 16 candidates of size 6
--- looking through 28 candidates of size 7
--- looking through 48 candidates of size 8
--- looking through 100 candidates of size 9
--- looking through 226 candidates of size 10
--- looking through 482 candidates of size 11
--- tested 616 candidates
+-- looking through 12 candidates of size 6
+-- looking through 20 candidates of size 7
+-- looking through 30 candidates of size 8
+-- looking through 56 candidates of size 9
+-- looking through 114 candidates of size 10
+-- looking through 216 candidates of size 11
+-- tested 333 candidates
 ordered []  =  True
-ordered (x:xs)  =  (null xs || x <= head xs) && ordered xs
+ordered (x:xs)  =  ordered xs && (null xs || x <= head xs)
 
 merge :: [Int] -> [Int] -> [Int]
 -- testing 360 combinations of argument values
 -- pruning with 1/2 rules
 -- looking through 2 candidates of size 1
 -- looking through 1 candidates of size 2
--- looking through 2 candidates of size 3
+-- looking through 3 candidates of size 3
 -- looking through 12 candidates of size 4
--- looking through 16 candidates of size 5
--- looking through 20 candidates of size 6
--- looking through 84 candidates of size 7
--- looking through 40 candidates of size 8
--- looking through 368 candidates of size 9
--- looking through 216 candidates of size 10
--- looking through 1838 candidates of size 11
--- looking through 1016 candidates of size 12
--- tested 3615 candidates
+-- looking through 22 candidates of size 5
+-- looking through 32 candidates of size 6
+-- looking through 75 candidates of size 7
+-- looking through 108 candidates of size 8
+-- looking through 256 candidates of size 9
+-- looking through 520 candidates of size 10
+-- looking through 1329 candidates of size 11
+-- looking through 2632 candidates of size 12
+-- tested 4992 candidates
 cannot conjure
 
diff --git a/eg/pow.out b/eg/pow.out
--- a/eg/pow.out
+++ b/eg/pow.out
@@ -2,14 +2,14 @@
 -- testing 5 combinations of argument values
 -- pruning with 14/30 rules
 -- looking through 4 candidates of size 1
--- looking through 17 candidates of size 2
--- looking through 92 candidates of size 3
--- looking through 307 candidates of size 4
--- looking through 1632 candidates of size 5
--- looking through 3406 candidates of size 6
--- looking through 21046 candidates of size 7
--- looking through 34728 candidates of size 8
--- tested 27145 candidates
+-- looking through 15 candidates of size 2
+-- looking through 45 candidates of size 3
+-- looking through 168 candidates of size 4
+-- looking through 491 candidates of size 5
+-- looking through 1729 candidates of size 6
+-- looking through 5420 candidates of size 7
+-- looking through 17952 candidates of size 8
+-- tested 8593 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
 -- looking through 4 candidates of size 1
--- looking through 19 candidates of size 2
--- looking through 105 candidates of size 3
--- looking through 360 candidates of size 4
--- looking through 1649 candidates of size 5
--- looking through 4534 candidates of size 6
--- tested 6671 candidates
+-- looking through 17 candidates of size 2
+-- looking through 59 candidates of size 3
+-- looking through 190 candidates of size 4
+-- looking through 594 candidates of size 5
+-- looking through 1784 candidates of size 6
+-- tested 2648 candidates
 cannot conjure
 
diff --git a/eg/replicate.out b/eg/replicate.out
--- a/eg/replicate.out
+++ b/eg/replicate.out
@@ -4,12 +4,12 @@
 -- looking through 1 candidates of size 1
 -- looking through 0 candidates of size 2
 -- looking through 1 candidates of size 3
--- looking through 1 candidates of size 4
--- looking through 3 candidates of size 5
--- looking through 5 candidates of size 6
--- looking through 5 candidates of size 7
--- looking through 8 candidates of size 8
--- tested 17 candidates
+-- looking through 2 candidates of size 4
+-- looking through 4 candidates of size 5
+-- looking through 6 candidates of size 6
+-- looking through 8 candidates of size 7
+-- looking through 19 candidates of size 8
+-- tested 33 candidates
 replicate 0 c  =  ""
 replicate x c  =  c:replicate (x - 1) c
 
@@ -41,12 +41,12 @@
 -- looking through 2 candidates of size 1
 -- looking through 3 candidates of size 2
 -- looking through 7 candidates of size 3
--- looking through 24 candidates of size 4
--- looking through 64 candidates of size 5
--- looking through 161 candidates of size 6
--- looking through 469 candidates of size 7
--- looking through 1303 candidates of size 8
--- tested 791 candidates
+-- looking through 23 candidates of size 4
+-- looking through 62 candidates of size 5
+-- looking through 155 candidates of size 6
+-- looking through 446 candidates of size 7
+-- looking through 1231 candidates of size 8
+-- tested 751 candidates
 replicates "" x  =  ""
 replicates (c:cs) x  =  replicate x c ++ replicates cs x
 
diff --git a/eg/setelem.out b/eg/setelem.out
--- a/eg/setelem.out
+++ b/eg/setelem.out
@@ -4,14 +4,14 @@
 -- looking through 2 candidates of size 1
 -- looking through 3 candidates of size 2
 -- looking through 5 candidates of size 3
--- looking through 28 candidates of size 4
--- looking through 73 candidates of size 5
--- looking through 124 candidates of size 6
--- looking through 305 candidates of size 7
--- looking through 999 candidates of size 8
--- tested 826 candidates
+-- looking through 20 candidates of size 4
+-- looking through 48 candidates of size 5
+-- looking through 75 candidates of size 6
+-- looking through 149 candidates of size 7
+-- looking through 368 candidates of size 8
+-- tested 396 candidates
 elem x []  =  False
-elem x (y:xs)  =  x == y || elem x xs
+elem x (y:xs)  =  elem x xs || x == y
 
 set :: [Int] -> Bool
 -- testing 360 combinations of argument values
@@ -21,10 +21,10 @@
 -- looking through 5 candidates of size 3
 -- looking through 11 candidates of size 4
 -- looking through 20 candidates of size 5
--- looking through 47 candidates of size 6
--- looking through 136 candidates of size 7
--- looking through 348 candidates of size 8
--- tested 256 candidates
+-- looking through 41 candidates of size 6
+-- looking through 100 candidates of size 7
+-- looking through 234 candidates of size 8
+-- tested 200 candidates
 set []  =  True
-set (x:xs)  =  not (elem x xs) && set xs
+set (x:xs)  =  set xs && not (elem x xs)
 
diff --git a/eg/sort.out b/eg/sort.out
--- a/eg/sort.out
+++ b/eg/sort.out
@@ -46,16 +46,16 @@
 -- pruning with 4/4 rules
 -- looking through 3 candidates of size 1
 -- looking through 7 candidates of size 2
--- looking through 9 candidates of size 3
--- looking through 44 candidates of size 4
--- looking through 116 candidates of size 5
--- looking through 80 candidates of size 6
--- looking through 715 candidates of size 7
--- looking through 164 candidates of size 8
--- looking through 3360 candidates of size 9
--- looking through 1448 candidates of size 10
--- looking through 12901 candidates of size 11
--- looking through 15208 candidates of size 12
--- tested 34055 candidates
+-- looking through 11 candidates of size 3
+-- looking through 37 candidates of size 4
+-- looking through 98 candidates of size 5
+-- looking through 94 candidates of size 6
+-- looking through 383 candidates of size 7
+-- looking through 375 candidates of size 8
+-- looking through 1263 candidates of size 9
+-- looking through 2252 candidates of size 10
+-- looking through 4090 candidates of size 11
+-- looking through 13481 candidates of size 12
+-- tested 22094 candidates
 cannot conjure
 
diff --git a/eg/spec.out b/eg/spec.out
--- a/eg/spec.out
+++ b/eg/spec.out
@@ -1,17 +1,17 @@
 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
--- tested 12 candidates
+-- looking through 3 candidates of size 2
+-- looking through 6 candidates of size 3
+-- tested 9 candidates
 square x  =  x * x
 
 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
--- tested 12 candidates
+-- looking through 3 candidates of size 2
+-- looking through 6 candidates of size 3
+-- tested 9 candidates
 square x  =  x * x
 
 sum :: [Int] -> Int
@@ -20,7 +20,7 @@
 -- looking through 2 candidates of size 2
 -- looking through 3 candidates of size 3
 -- looking through 4 candidates of size 4
--- looking through 7 candidates of size 5
+-- looking through 5 candidates of size 5
 -- tested 11 candidates
 sum []  =  0
 sum (x:xs)  =  x + sum xs
@@ -29,11 +29,11 @@
 -- pruning with 3/3 rules
 -- looking through 2 candidates of size 1
 -- looking through 3 candidates of size 2
--- looking through 10 candidates of size 3
--- looking through 27 candidates of size 4
--- looking through 78 candidates of size 5
--- looking through 171 candidates of size 6
--- tested 194 candidates
+-- looking through 11 candidates of size 3
+-- looking through 32 candidates of size 4
+-- looking through 100 candidates of size 5
+-- looking through 244 candidates of size 6
+-- tested 234 candidates
 [] ++ xs  =  xs
 (x:xs) ++ ys  =  x:(xs ++ ys)
 
diff --git a/eg/subset.out b/eg/subset.out
--- a/eg/subset.out
+++ b/eg/subset.out
@@ -3,15 +3,15 @@
 -- pruning with 29/39 rules
 -- looking through 2 candidates of size 1
 -- looking through 4 candidates of size 2
--- looking through 10 candidates of size 3
--- looking through 40 candidates of size 4
--- looking through 160 candidates of size 5
--- looking through 0 candidates of size 6
--- looking through 444 candidates of size 7
--- looking through 784 candidates of size 8
--- tested 1310 candidates
+-- looking through 8 candidates of size 3
+-- looking through 34 candidates of size 4
+-- looking through 88 candidates of size 5
+-- looking through 40 candidates of size 6
+-- looking through 138 candidates of size 7
+-- looking through 644 candidates of size 8
+-- tested 790 candidates
 subset [] xs  =  True
-subset (x:xs) ys  =  elem x ys && subset xs ys
+subset (x:xs) ys  =  subset xs ys && elem x ys
 
 subset :: [Int] -> [Int] -> Bool
 -- testing 44 combinations of argument values
diff --git a/eg/tapps.out b/eg/tapps.out
--- a/eg/tapps.out
+++ b/eg/tapps.out
@@ -3,9 +3,9 @@
 -- pruning with 14/25 rules
 -- looking through 2 candidates of size 1
 -- looking through 5 candidates of size 2
--- looking through 6 candidates of size 3
--- looking through 20 candidates of size 4
--- tested 18 candidates
+-- looking through 5 candidates of size 3
+-- looking through 12 candidates of size 4
+-- tested 16 candidates
 third xs  =  head (tail (tail xs))
 
 product :: [Int] -> Int
@@ -13,10 +13,10 @@
 -- pruning with 14/25 rules
 -- looking through 2 candidates of size 1
 -- looking through 5 candidates of size 2
--- looking through 6 candidates of size 3
--- looking through 20 candidates of size 4
--- looking through 34 candidates of size 5
--- tested 44 candidates
+-- looking through 5 candidates of size 3
+-- looking through 12 candidates of size 4
+-- looking through 18 candidates of size 5
+-- tested 30 candidates
 product []  =  1
 product (x:xs)  =  x * product xs
 
@@ -25,8 +25,8 @@
 -- pruning with 15/26 rules
 -- looking through 2 candidates of size 1
 -- looking through 5 candidates of size 2
--- looking through 6 candidates of size 3
--- looking through 23 candidates of size 4
--- tested 20 candidates
+-- looking through 5 candidates of size 3
+-- looking through 15 candidates of size 4
+-- tested 18 candidates
 product xs  =  foldr (*) 1 xs
 
diff --git a/eg/tree.hs b/eg/tree.hs
--- a/eg/tree.hs
+++ b/eg/tree.hs
@@ -3,27 +3,14 @@
 -- Copyright (C) 2021 Rudy Matela
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 {-# LANGUAGE CPP, TemplateHaskell #-}
-#if __GLASGOW_HASKELL__ == 708
-{-# LANGUAGE DeriveDataTypeable, StandaloneDeriving #-}
-import Data.Typeable (Typeable)
-#endif
 
 import Conjure
 import Test.LeanCheck
 import Data.Express hiding (height,size)
 
--- TODO: remove the following import
--- and fix build on GHC 7.10 and 7.8
--- the generation of -: and ->>>: somehow fails.
-import Test.LeanCheck.Utils
-
 data Tree  =  Leaf
            |  Node Tree Int Tree
   deriving (Eq, Ord, Show, Read)
-
-#if __GLASGOW_HASKELL__ == 708
-deriving instance Typeable Tree
-#endif
 
 deriveExpress ''Tree
 
diff --git a/eg/tree.out b/eg/tree.out
--- a/eg/tree.out
+++ b/eg/tree.out
@@ -10,7 +10,9 @@
 -- looking through 16 candidates of size 7
 -- tested 9 candidates
 leftmost Leaf  =  undefined
-leftmost (Node t1 x t2)  =  if nil t1 then x else leftmost t1
+leftmost (Node t1 x t2)  =  if nil t1
+                            then x
+                            else leftmost t1
 
 rightmost :: Tree -> Int
 -- testing 360 combinations of argument values
@@ -24,20 +26,22 @@
 -- looking through 16 candidates of size 7
 -- tested 18 candidates
 rightmost Leaf  =  undefined
-rightmost (Node t1 x t2)  =  if nil t2 then x else rightmost t2
+rightmost (Node t1 x t2)  =  if nil t2
+                             then x
+                             else rightmost t2
 
 size :: Tree -> Int
 -- testing 360 combinations of argument values
 -- pruning with 4/8 rules
 -- looking through 2 candidates of size 1
 -- looking through 2 candidates of size 2
--- looking through 3 candidates of size 3
--- looking through 4 candidates of size 4
--- looking through 9 candidates of size 5
--- looking through 12 candidates of size 6
--- looking through 25 candidates of size 7
--- looking through 40 candidates of size 8
--- tested 71 candidates
+-- looking through 2 candidates of size 3
+-- looking through 2 candidates of size 4
+-- looking through 4 candidates of size 5
+-- looking through 8 candidates of size 6
+-- looking through 12 candidates of size 7
+-- looking through 24 candidates of size 8
+-- tested 42 candidates
 size Leaf  =  0
 size (Node t1 x t2)  =  size t1 + (size t2 + 1)
 
@@ -46,15 +50,15 @@
 -- pruning with 49/65 rules
 -- looking through 3 candidates of size 1
 -- looking through 3 candidates of size 2
--- looking through 4 candidates of size 3
--- looking through 13 candidates of size 4
--- looking through 30 candidates of size 5
--- looking through 88 candidates of size 6
--- looking through 320 candidates of size 7
--- looking through 1093 candidates of size 8
--- tested 475 candidates
+-- looking through 2 candidates of size 3
+-- looking through 6 candidates of size 4
+-- looking through 14 candidates of size 5
+-- looking through 34 candidates of size 6
+-- looking through 98 candidates of size 7
+-- looking through 283 candidates of size 8
+-- tested 202 candidates
 height Leaf  =  -1
-height (Node t1 x t2)  =  max (height t1) (height t2) + 1
+height (Node t1 x t2)  =  1 + max (height t1) (height t2)
 
 mem :: Int -> Tree -> Bool
 -- testing 360 combinations of argument values
@@ -62,18 +66,18 @@
 -- looking through 1 candidates of size 1
 -- looking through 0 candidates of size 2
 -- looking through 0 candidates of size 3
--- looking through 6 candidates of size 4
+-- looking through 5 candidates of size 4
 -- looking through 0 candidates of size 5
 -- looking through 0 candidates of size 6
 -- looking through 0 candidates of size 7
--- looking through 34 candidates of size 8
+-- looking through 20 candidates of size 8
 -- looking through 0 candidates of size 9
 -- looking through 0 candidates of size 10
 -- looking through 0 candidates of size 11
--- looking through 184 candidates of size 12
--- tested 107 candidates
+-- looking through 96 candidates of size 12
+-- tested 92 candidates
 mem x Leaf  =  False
-mem x (Node t1 y t2)  =  mem x t1 || (x == y || mem x t2)
+mem x (Node t1 y t2)  =  mem x t1 || (mem x t2 || x == y)
 
 ordered :: Tree -> Bool
 -- testing 360 combinations of argument values
@@ -85,12 +89,12 @@
 -- looking through 10 candidates of size 5
 -- looking through 20 candidates of size 6
 -- looking through 0 candidates of size 7
--- looking through 64 candidates of size 8
--- looking through 144 candidates of size 9
--- looking through 112 candidates of size 10
--- looking through 964 candidates of size 11
--- looking through 1480 candidates of size 12
--- tested 2799 candidates
+-- looking through 32 candidates of size 8
+-- looking through 80 candidates of size 9
+-- looking through 56 candidates of size 10
+-- looking through 450 candidates of size 11
+-- looking through 708 candidates of size 12
+-- tested 1361 candidates
 cannot conjure
 
 ordered :: Tree -> Bool
diff --git a/mk/depend.mk b/mk/depend.mk
--- a/mk/depend.mk
+++ b/mk/depend.mk
@@ -159,6 +159,19 @@
   src/Conjure/Conjurable.hs \
   src/Conjure/Conjurable/Derive.hs \
   bench/terpret.hs
+bench/weird: \
+  bench/weird.hs \
+  mk/toplibs
+bench/weird.o: \
+  src/Conjure/Utils.hs \
+  src/Conjure/Prim.hs \
+  src/Conjure.hs \
+  src/Conjure/Expr.hs \
+  src/Conjure/Engine.hs \
+  src/Conjure/Defn.hs \
+  src/Conjure/Conjurable.hs \
+  src/Conjure/Conjurable/Derive.hs \
+  bench/weird.hs
 eg/arith: \
   eg/arith.hs \
   mk/toplibs
@@ -276,6 +289,32 @@
   src/Conjure/Conjurable.hs \
   src/Conjure/Conjurable/Derive.hs \
   eg/gcd.hs
+eg/higher: \
+  eg/higher.hs \
+  mk/toplibs
+eg/higher.o: \
+  src/Conjure/Utils.hs \
+  src/Conjure/Prim.hs \
+  src/Conjure.hs \
+  src/Conjure/Expr.hs \
+  src/Conjure/Engine.hs \
+  src/Conjure/Defn.hs \
+  src/Conjure/Conjurable.hs \
+  src/Conjure/Conjurable/Derive.hs \
+  eg/higher.hs
+eg/id: \
+  eg/id.hs \
+  mk/toplibs
+eg/id.o: \
+  src/Conjure/Utils.hs \
+  src/Conjure/Prim.hs \
+  src/Conjure.hs \
+  src/Conjure/Expr.hs \
+  src/Conjure/Engine.hs \
+  src/Conjure/Defn.hs \
+  src/Conjure/Conjurable.hs \
+  src/Conjure/Conjurable/Derive.hs \
+  eg/id.hs
 eg/ints: \
   eg/ints.hs \
   mk/toplibs
diff --git a/src/Conjure/Conjurable.hs b/src/Conjure/Conjurable.hs
--- a/src/Conjure/Conjurable.hs
+++ b/src/Conjure/Conjurable.hs
@@ -26,7 +26,6 @@
   , conjureAreEqual
   , conjureMkEquation
   , A, B, C, D, E, F
-  , conjureIsDeconstructor
   , conjureIsDeconstruction
   , candidateDeconstructionsFrom
   , candidateDeconstructionsFromHoled
@@ -34,11 +33,14 @@
   , conjureReification
   , conjureReification1
   , conjureDynamicEq
+  , conjureIsNumeric
   , cevaluate
   , ceval
   , cevl
   , Name (..)
   , Express (..)
+  , conjureArgumentPats
+  , conjureMostGeneralCanonicalVariation
   )
 where
 
@@ -259,9 +261,11 @@
 -- >   conjureExpress  =  reifyExpress
 -- >   ...
 reifyExpress :: (Express a, Show a) => a -> Expr -> Expr
-reifyExpress a e  =  case value "expr" (expr -:> a) $$ e of
-  Nothing -> e         -- TODO: consider throwing an error
-  Just e' -> eval e e' -- TODO: consider throwing an error
+reifyExpress a e  =  case exprE $$ e of
+  Nothing -> e -- identity needed for types such as functions
+  Just e' -> eval (error $ "reifyExpress: cannot eval " ++ show e') e'
+  where
+  exprE  =  value "expr" (expr -:> a)
 
 mkExprTiers :: (Listable a, Show a, Typeable a) => a -> [[Expr]]
 mkExprTiers a  =  mapT val (tiers -: [[a]])
@@ -307,6 +311,13 @@
                       ((e':_):_) | typ e' == typ e -> etiers
                       _                            -> tf etc
 
+conjureIsNumeric :: Conjurable f => f -> Expr -> Bool
+conjureIsNumeric f e  =  case concat $ conjureTiersFor f e of
+                         -- We assume tiers of numeric values start with 0
+                         -- not so unfair...
+                         (Value "0" _):_ -> True
+                         _ -> False
+
 -- | Compute variable names for the given 'Expr' type.
 conjureNamesFor :: Conjurable f => f -> Expr -> [String]
 conjureNamesFor f e  =  head
@@ -317,45 +328,27 @@
 conjureMostGeneralCanonicalVariation f  =  canonicalizeWith (conjureNamesFor f)
                                         .  fastMostGeneralVariation
 
--- | Checks if an unary function encoded as an 'Expr' is a deconstructor.
---
--- (cf. 'conjureIsDeconstruction')
-conjureIsDeconstructor :: Conjurable f => f -> Int -> Expr -> Bool
-conjureIsDeconstructor f maxTests e  =  case as of
-  [] -> False
-  (h:_) -> isDec h
-  where
-  as  =  [h | h <- hs, isWellTyped (e:$h), typ (e:$h) == typ h]
-  hs  =  conjureArgumentHoles f
-  isDec h  =  count is gs >= length gs `div` 2
-    where
-    gs  =  take maxTests $ grounds (conjureTiersFor f) h
-    sz  =  head [sz | (_, _, _, _, _, sz) <- conjureReification f
-                    , isWellTyped (sz :$ h)]
-    esz e  =  eval (0::Int) (sz :$ e)
-    is e'  =  errorToFalse $ esz (e :$ e') < esz e'
-
 -- | Checks if an expression is a deconstruction.
 --
 -- There should be a single 'hole' in the expression.
 --
--- 1. The result does not increase the size for at least half the time.
--- 2. The result decreases in size for at least a third of the time.
+-- It should decrease the size of all arguments that have
+-- a size greater than 0.
 --
 -- (cf. 'conjureIsDeconstructor')
 conjureIsDeconstruction :: Conjurable f => f -> Int -> Expr -> Bool
 conjureIsDeconstruction f maxTests ed  =  length (holes ed) == 1
                                        && typ h == typ ed
-                                       && count is gs >= length gs `div` 2
-                                       && count iz gs >= length gs `div` 3
+                                       && all is gs
   where
   gs  =  take maxTests $ grounds (conjureTiersFor f) ed
   [h]  =  holes ed
   sz  =  head [sz | (_, _, _, _, _, sz) <- conjureReification f
                   , isWellTyped (sz :$ h)]
   esz e  =  eval (0::Int) (sz :$ e)
-  is e  =  errorToFalse $ esz e <= esz (holeValue e)
-  iz e  =  errorToFalse $ esz e < esz (holeValue e)
+  x << 0  =  True
+  x << y  =  x < y
+  is e  =  errorToFalse $ esz e << esz (holeValue e)
   holeValue e  =  fromMaybe err
                .  lookup h
                .  fromMaybe err
@@ -429,13 +422,20 @@
   conjureExpress   =  reifyExpress
   conjureEquality  =  reifyEquality
   conjureTiers     =  reifyTiers
-  conjureSize      =  abs
+  conjureSize      =  size            where  size x | x < 0      =  0
+                                                    | otherwise  =  x
 
+-- allows easy modification of the global size function for integer values
+-- duplicated above in the Int instance for performance reasons
+integralSize :: Integral a => a -> Int
+integralSize  =  fromIntegral . size  where  size x | x < 0      =  0
+                                                    | otherwise  =  x
+
 instance Conjurable Integer where
   conjureExpress   =  reifyExpress
   conjureEquality  =  reifyEquality
   conjureTiers     =  reifyTiers
-  conjureSize      =  fromIntegral . abs
+  conjureSize      =  integralSize
 
 instance Conjurable Char where
   conjureExpress   =  reifyExpress
@@ -525,7 +525,7 @@
                       , value "Just" (Just ->: mx) :$ hole x
                       ]
     where
-    x  =  Just undefined -: mx
+    Just x  =  undefined -: mx
   conjureEquality mx  =  from <$> conjureEquality x
     where
     x  =  fromJust mx
@@ -649,23 +649,80 @@
   where
   (nf:nas)  =  words nm ++ repeat ""
 
+
 -- | Computes tiers of sets of patterns for the given function.
 --
 -- > > conjurePats [zero] "f" (undefined :: Int -> Int)
 -- > [[[f x :: Int]],[[f 0 :: Int,f x :: Int]]]
 conjurePats :: Conjurable f => [Expr] -> String -> f -> [[ [Expr] ]]
-conjurePats es nm f  =  mapT (map mkApp . prods) $ cs
+conjurePats  es nm f  =  mapT (map mkApp)
+                      $  combinePatternOptions
+                      $  conjureArgumentPats es f
   where
   mkApp  =  foldApp . (ef:)
          .  unfold
          .  conjureMostGeneralCanonicalVariation f
          .  fold
   ef  =  var (head $ words nm) f  -- TODO: take the tail into account
-  cs  =  products $ zipWith mk (conjureArgumentHoles f) (conjureArgumentCases f)
+
+  -- What a horrible enumeration hack below...
+  -- Good luck to anyone who plans to refactor this.
+
+  -- after application of mkApp, we end up w/  [[ [Pat   ] ]]
+  combinePatternOptions :: [ [[ [Expr] ]] ] -> [[ [[Expr]] ]]
+  combinePatternOptions []            =  [[[[]]]]
+  combinePatternOptions (esss:essss)  =  concatPrefixesWithT esss
+                                      $  combinePatternOptions essss
+
+  -- The three functions below are all transformations over the same type
+  -- [[ [[Expr]] ]]
+  -- That's tiers of complete LHS of function definitions.
+  -- We proceed right to left building all possible patterns.
+
+  -- concatenates all of the possibilities of prefixing
+  -- from tiers of possibilities
+  concatPrefixesWithT :: [[[Expr]]] -> [[ [[Expr]] ]] -> [[ [[Expr]] ]]
+  concatPrefixesWithT esss r  =  concatMapT (`concatPrefixesWith` r) esss
+
+  -- concatenates the possibilities of prefixing from a list of prefixes
+  concatPrefixesWith :: [Expr] -> [[ [[Expr]] ]] -> [[ [[Expr]] ]]
+  concatPrefixesWith es r  =  mapT concat $ products [prefixWith e r | e <- es]
+
+  -- prefixes with the given expression
+  prefixWith :: Expr -> [[ [[Expr]] ]] -> [[ [[Expr]] ]]
+  prefixWith e  =  mapT (map (e:))
+
+  -- this was useful in figuring out the implementations
+  -- of the local functions above
+  --
+  -- > prefixWith2 :: Expr -> Expr -> [[Bs]] -> [[Bs]]
+  -- > prefixWith2 e1 e2 r  =  productWith (++) (mapT (map (e1:)) r)
+  -- >                                          (mapT (map (e2:)) r)
+  --
+  -- A prefixWith3 would follow similarly.
+
+  -- To debug the above function use:
+  -- > import Test.LeanCheck.Tiers (printTiers)
+  -- > printTiers 100 $ newConjurePats [zero] "f" (undefined :: Int -> Int -> Int)
+
+
+-- | Returns a list of tiers of possible patterns for each argument.
+--
+-- The outer list has the same number of elements as the number of arguments
+-- of the given function.
+--
+-- This function is internal and only used in the implementation of 'conjurePats'.
+-- It may be removed from the API without further notice.
+-- It has been temporarily promoted to public to help refactor 'conjurePats'.
+conjureArgumentPats :: Conjurable f => [Expr] -> f -> [ [[ [Expr] ]] ]
+conjureArgumentPats es f = zipWith mk (conjureArgumentHoles f) (conjureArgumentCases f)
+  where
+  -- deal with types that have no cases such as ints.
   mk h []  =  mapT (++ [h]) $ setsOf [[e] | e <- es, typ e == typ h]
+  -- deal with types that have cases, such as lists, maybes, etc.
   mk h cs  =  [[[h]], [cs]]
-  tiersFor  =  conjureTiersFor f
 
+
 prods :: [[a]] -> [[a]]
 prods  =  foldr (productWith (:)) [[]]
   where
@@ -695,55 +752,55 @@
   conjureExpress   =  reifyExpress
   conjureEquality  =  reifyEquality
   conjureTiers     =  reifyTiers
-  conjureSize      =  fromIntegral . abs
+  conjureSize      =  integralSize
 
 instance Conjurable Int16 where
   conjureExpress   =  reifyExpress
   conjureEquality  =  reifyEquality
   conjureTiers     =  reifyTiers
-  conjureSize      =  fromIntegral . abs
+  conjureSize      =  integralSize
 
 instance Conjurable Int32 where
   conjureExpress   =  reifyExpress
   conjureEquality  =  reifyEquality
   conjureTiers     =  reifyTiers
-  conjureSize      =  fromIntegral . abs
+  conjureSize      =  integralSize
 
 instance Conjurable Int64 where
   conjureExpress   =  reifyExpress
   conjureEquality  =  reifyEquality
   conjureTiers     =  reifyTiers
-  conjureSize      =  fromIntegral . abs
+  conjureSize      =  integralSize
 
 instance Conjurable Word where
   conjureExpress   =  reifyExpress
   conjureEquality  =  reifyEquality
   conjureTiers     =  reifyTiers
-  conjureSize      =  fromIntegral . abs
+  conjureSize      =  integralSize
 
 instance Conjurable Word8 where
   conjureExpress   =  reifyExpress
   conjureEquality  =  reifyEquality
   conjureTiers     =  reifyTiers
-  conjureSize      =  fromIntegral . abs
+  conjureSize      =  integralSize
 
 instance Conjurable Word16 where
   conjureExpress   =  reifyExpress
   conjureEquality  =  reifyEquality
   conjureTiers     =  reifyTiers
-  conjureSize      =  fromIntegral . abs
+  conjureSize      =  integralSize
 
 instance Conjurable Word32 where
   conjureExpress   =  reifyExpress
   conjureEquality  =  reifyEquality
   conjureTiers     =  reifyTiers
-  conjureSize      =  fromIntegral . abs
+  conjureSize      =  integralSize
 
 instance Conjurable Word64 where
   conjureExpress   =  reifyExpress
   conjureEquality  =  reifyEquality
   conjureTiers     =  reifyTiers
-  conjureSize      =  fromIntegral . abs
+  conjureSize      =  integralSize
 
 instance (Integral a, Conjurable a, Listable a, Show a, Eq a, Express a) => Conjurable (Ratio a) where
   conjureExpress   =  reifyExpress
@@ -769,37 +826,37 @@
   conjureExpress   =  reifyExpress
   conjureEquality  =  reifyEquality
   conjureTiers     =  reifyTiers
-  conjureSize      =  fromIntegral . abs
+  conjureSize      =  integralSize
 
 instance Conjurable B where
   conjureExpress   =  reifyExpress
   conjureEquality  =  reifyEquality
   conjureTiers     =  reifyTiers
-  conjureSize      =  fromIntegral . abs
+  conjureSize      =  integralSize
 
 instance Conjurable C where
   conjureExpress   =  reifyExpress
   conjureEquality  =  reifyEquality
   conjureTiers     =  reifyTiers
-  conjureSize      =  fromIntegral . abs
+  conjureSize      =  integralSize
 
 instance Conjurable D where
   conjureExpress   =  reifyExpress
   conjureEquality  =  reifyEquality
   conjureTiers     =  reifyTiers
-  conjureSize      =  fromIntegral . abs
+  conjureSize      =  integralSize
 
 instance Conjurable E where
   conjureExpress   =  reifyExpress
   conjureEquality  =  reifyEquality
   conjureTiers     =  reifyTiers
-  conjureSize      =  fromIntegral . abs
+  conjureSize      =  integralSize
 
 instance Conjurable F where
   conjureExpress   =  reifyExpress
   conjureEquality  =  reifyEquality
   conjureTiers     =  reifyTiers
-  conjureSize      =  fromIntegral . abs
+  conjureSize      =  integralSize
 
 
 -- Conjurable tuples --
@@ -926,7 +983,7 @@
                           .  conjureType v
                           .  conjureType u
                           .  conjureType t
-                         where (x,y,z,w,v,u,t) = xyzwvut
+                          where (x,y,z,w,v,u,t) = xyzwvut
   conjureEquality xyzwvut  =  from
                           <$> conjureEquality x
                           <*> conjureEquality y
@@ -954,7 +1011,308 @@
                                                         && u1 .....==. u2
                                                         && t1 ......== t2
 
--- TODO: go up to 12-tuples
+instance ( Conjurable a, Listable a, Show a, Express a
+         , Conjurable b, Listable b, Show b, Express b
+         , Conjurable c, Listable c, Show c, Express c
+         , Conjurable d, Listable d, Show d, Express d
+         , Conjurable e, Listable e, Show e, Express e
+         , Conjurable f, Listable f, Show f, Express f
+         , Conjurable g, Listable g, Show g, Express g
+         , Conjurable h, Listable h, Show h, Express h
+         ) => Conjurable (a,b,c,d,e,f,g,h) where
+  conjureExpress   =  reifyExpress
+  conjureTiers     =  reifyTiers
+  conjureSubTypes xyzwvuts  =  conjureType x
+                            .  conjureType y
+                            .  conjureType z
+                            .  conjureType w
+                            .  conjureType v
+                            .  conjureType u
+                            .  conjureType t
+                            .  conjureType s
+                            where (x,y,z,w,v,u,t,s) = xyzwvuts
+  conjureEquality xyzwvuts  =  from
+                           <$> conjureEquality x
+                           <*> conjureEquality y
+                           <*> conjureEquality z
+                           <*> conjureEquality w
+                           <*> conjureEquality v
+                           <*> conjureEquality u
+                           <*> conjureEquality t
+                           <*> conjureEquality s
+    where
+    (x,y,z,w,v,u,t,s)  =  xyzwvuts
+    from e1 e2 e3 e4 e5 e6 e7 e8  =  value "==" (==)
+      where
+      (==.......)  =  evl e1 ==: x
+      (.==......)  =  evl e2 ==: y
+      (..==.....)  =  evl e3 ==: z
+      (...==....)  =  evl e4 ==: w
+      (....==...)  =  evl e5 ==: v
+      (.....==..)  =  evl e6 ==: u
+      (......==.)  =  evl e7 ==: t
+      (.......==)  =  evl e8 ==: s
+      (x1,y1,z1,w1,v1,u1,t1,s1) == (x2,y2,z2,w2,v2,u2,t2,s2)  =  x1 ==....... x2
+                                                              && y1 .==...... y2
+                                                              && z1 ..==..... z2
+                                                              && w1 ...==.... w2
+                                                              && v1 ....==... v2
+                                                              && u1 .....==.. u2
+                                                              && t1 ......==. t2
+                                                              && s1 .......== s2
+
+instance ( Conjurable a, Listable a, Show a, Express a
+         , Conjurable b, Listable b, Show b, Express b
+         , Conjurable c, Listable c, Show c, Express c
+         , Conjurable d, Listable d, Show d, Express d
+         , Conjurable e, Listable e, Show e, Express e
+         , Conjurable f, Listable f, Show f, Express f
+         , Conjurable g, Listable g, Show g, Express g
+         , Conjurable h, Listable h, Show h, Express h
+         , Conjurable i, Listable i, Show i, Express i
+         ) => Conjurable (a,b,c,d,e,f,g,h,i) where
+  conjureExpress   =  reifyExpress
+  conjureTiers     =  reifyTiers
+  conjureSubTypes xyzwvutsr  =  conjureType x
+                             .  conjureType y
+                             .  conjureType z
+                             .  conjureType w
+                             .  conjureType v
+                             .  conjureType u
+                             .  conjureType t
+                             .  conjureType s
+                             .  conjureType r
+                             where (x,y,z,w,v,u,t,s,r) = xyzwvutsr
+  conjureEquality xyzwvutsr  =  from
+                            <$> conjureEquality x
+                            <*> conjureEquality y
+                            <*> conjureEquality z
+                            <*> conjureEquality w
+                            <*> conjureEquality v
+                            <*> conjureEquality u
+                            <*> conjureEquality t
+                            <*> conjureEquality s
+                            <*> conjureEquality r
+    where
+    (x,y,z,w,v,u,t,s,r)  =  xyzwvutsr
+    from e1 e2 e3 e4 e5 e6 e7 e8 e9  =  value "==" (==)
+      where
+      (==........)  =  evl e1 ==: x
+      (.==.......)  =  evl e2 ==: y
+      (..==......)  =  evl e3 ==: z
+      (...==.....)  =  evl e4 ==: w
+      (....==....)  =  evl e5 ==: v
+      (.....==...)  =  evl e6 ==: u
+      (......==..)  =  evl e7 ==: t
+      (.......==.)  =  evl e8 ==: s
+      (........==)  =  evl e9 ==: r
+      (x1,y1,z1,w1,v1,u1,t1,s1,r1) == (x2,y2,z2,w2,v2,u2,t2,s2,r2)  =  x1 ==........ x2
+                                                                    && y1 .==....... y2
+                                                                    && z1 ..==...... z2
+                                                                    && w1 ...==..... w2
+                                                                    && v1 ....==.... v2
+                                                                    && u1 .....==... u2
+                                                                    && t1 ......==.. t2
+                                                                    && s1 .......==. s2
+                                                                    && r1 ........== r2
+
+instance ( Conjurable a, Listable a, Show a, Express a
+         , Conjurable b, Listable b, Show b, Express b
+         , Conjurable c, Listable c, Show c, Express c
+         , Conjurable d, Listable d, Show d, Express d
+         , Conjurable e, Listable e, Show e, Express e
+         , Conjurable f, Listable f, Show f, Express f
+         , Conjurable g, Listable g, Show g, Express g
+         , Conjurable h, Listable h, Show h, Express h
+         , Conjurable i, Listable i, Show i, Express i
+         , Conjurable j, Listable j, Show j, Express j
+         ) => Conjurable (a,b,c,d,e,f,g,h,i,j) where
+  conjureExpress   =  reifyExpress
+  conjureTiers     =  reifyTiers
+  conjureSubTypes xyzwvutsrq  =  conjureType x
+                              .  conjureType y
+                              .  conjureType z
+                              .  conjureType w
+                              .  conjureType v
+                              .  conjureType u
+                              .  conjureType t
+                              .  conjureType s
+                              .  conjureType r
+                              .  conjureType q
+                              where (x,y,z,w,v,u,t,s,r,q) = xyzwvutsrq
+  conjureEquality xyzwvutsrq  =  from
+                             <$> conjureEquality x
+                             <*> conjureEquality y
+                             <*> conjureEquality z
+                             <*> conjureEquality w
+                             <*> conjureEquality v
+                             <*> conjureEquality u
+                             <*> conjureEquality t
+                             <*> conjureEquality s
+                             <*> conjureEquality r
+                             <*> conjureEquality q
+    where
+    (x,y,z,w,v,u,t,s,r,q)  =  xyzwvutsrq
+    from e1 e2 e3 e4 e5 e6 e7 e8 e9 e10  =  value "==" (==)
+      where
+      (==.........)  =  evl e1  ==: x
+      (.==........)  =  evl e2  ==: y
+      (..==.......)  =  evl e3  ==: z
+      (...==......)  =  evl e4  ==: w
+      (....==.....)  =  evl e5  ==: v
+      (.....==....)  =  evl e6  ==: u
+      (......==...)  =  evl e7  ==: t
+      (.......==..)  =  evl e8  ==: s
+      (........==.)  =  evl e9  ==: r
+      (.........==)  =  evl e10 ==: q
+      (x1,y1,z1,w1,v1,u1,t1,s1,r1,q1) == (x2,y2,z2,w2,v2,u2,t2,s2,r2,q2)  =  x1 ==......... x2
+                                                                          && y1 .==........ y2
+                                                                          && z1 ..==....... z2
+                                                                          && w1 ...==...... w2
+                                                                          && v1 ....==..... v2
+                                                                          && u1 .....==.... u2
+                                                                          && t1 ......==... t2
+                                                                          && s1 .......==.. s2
+                                                                          && r1 ........==. r2
+                                                                          && q1 .........== q2
+
+
+instance ( Conjurable a, Listable a, Show a, Express a
+         , Conjurable b, Listable b, Show b, Express b
+         , Conjurable c, Listable c, Show c, Express c
+         , Conjurable d, Listable d, Show d, Express d
+         , Conjurable e, Listable e, Show e, Express e
+         , Conjurable f, Listable f, Show f, Express f
+         , Conjurable g, Listable g, Show g, Express g
+         , Conjurable h, Listable h, Show h, Express h
+         , Conjurable i, Listable i, Show i, Express i
+         , Conjurable j, Listable j, Show j, Express j
+         , Conjurable k, Listable k, Show k, Express k
+         ) => Conjurable (a,b,c,d,e,f,g,h,i,j,k) where
+  conjureExpress   =  reifyExpress
+  conjureTiers     =  reifyTiers
+  conjureSubTypes xyzwvutsrqp  =  conjureType x
+                               .  conjureType y
+                               .  conjureType z
+                               .  conjureType w
+                               .  conjureType v
+                               .  conjureType u
+                               .  conjureType t
+                               .  conjureType s
+                               .  conjureType r
+                               .  conjureType q
+                               .  conjureType p
+                               where (x,y,z,w,v,u,t,s,r,q,p) = xyzwvutsrqp
+  conjureEquality xyzwvutsrqp  =  from
+                              <$> conjureEquality x
+                              <*> conjureEquality y
+                              <*> conjureEquality z
+                              <*> conjureEquality w
+                              <*> conjureEquality v
+                              <*> conjureEquality u
+                              <*> conjureEquality t
+                              <*> conjureEquality s
+                              <*> conjureEquality r
+                              <*> conjureEquality q
+                              <*> conjureEquality p
+    where
+    (x,y,z,w,v,u,t,s,r,q,p)  =  xyzwvutsrqp
+    from e1 e2 e3 e4 e5 e6 e7 e8 e9 e10 e11  =  value "==" (==)
+      where
+      (==..........)  =  evl e1  ==: x
+      (.==.........)  =  evl e2  ==: y
+      (..==........)  =  evl e3  ==: z
+      (...==.......)  =  evl e4  ==: w
+      (....==......)  =  evl e5  ==: v
+      (.....==.....)  =  evl e6  ==: u
+      (......==....)  =  evl e7  ==: t
+      (.......==...)  =  evl e8  ==: s
+      (........==..)  =  evl e9  ==: r
+      (.........==.)  =  evl e10 ==: q
+      (..........==)  =  evl e11 ==: p
+      (x1,y1,z1,w1,v1,u1,t1,s1,r1,q1,p1) == (x2,y2,z2,w2,v2,u2,t2,s2,r2,q2,p2)  =  x1 ==.......... x2
+                                                                                && y1 .==......... y2
+                                                                                && z1 ..==........ z2
+                                                                                && w1 ...==....... w2
+                                                                                && v1 ....==...... v2
+                                                                                && u1 .....==..... u2
+                                                                                && t1 ......==.... t2
+                                                                                && s1 .......==... s2
+                                                                                && r1 ........==.. r2
+                                                                                && q1 .........==. q2
+                                                                                && p1 ..........== p2
+
+
+instance ( Conjurable a, Listable a, Show a, Express a
+         , Conjurable b, Listable b, Show b, Express b
+         , Conjurable c, Listable c, Show c, Express c
+         , Conjurable d, Listable d, Show d, Express d
+         , Conjurable e, Listable e, Show e, Express e
+         , Conjurable f, Listable f, Show f, Express f
+         , Conjurable g, Listable g, Show g, Express g
+         , Conjurable h, Listable h, Show h, Express h
+         , Conjurable i, Listable i, Show i, Express i
+         , Conjurable j, Listable j, Show j, Express j
+         , Conjurable k, Listable k, Show k, Express k
+         , Conjurable l, Listable l, Show l, Express l
+         ) => Conjurable (a,b,c,d,e,f,g,h,i,j,k,l) where
+  conjureExpress   =  reifyExpress
+  conjureTiers     =  reifyTiers
+  conjureSubTypes xyzwvutsrqpo  =  conjureType x
+                                .  conjureType y
+                                .  conjureType z
+                                .  conjureType w
+                                .  conjureType v
+                                .  conjureType u
+                                .  conjureType t
+                                .  conjureType s
+                                .  conjureType r
+                                .  conjureType q
+                                .  conjureType p
+                                .  conjureType o
+                                where (x,y,z,w,v,u,t,s,r,q,p,o) = xyzwvutsrqpo
+  conjureEquality xyzwvutsrqpo  =  from
+                               <$> conjureEquality x
+                               <*> conjureEquality y
+                               <*> conjureEquality z
+                               <*> conjureEquality w
+                               <*> conjureEquality v
+                               <*> conjureEquality u
+                               <*> conjureEquality t
+                               <*> conjureEquality s
+                               <*> conjureEquality r
+                               <*> conjureEquality q
+                               <*> conjureEquality p
+                               <*> conjureEquality o
+    where
+    (x,y,z,w,v,u,t,s,r,q,p,o)  =  xyzwvutsrqpo
+    from e1 e2 e3 e4 e5 e6 e7 e8 e9 e10 e11 e12  =  value "==" (==)
+      where
+      (==...........)  =  evl e1  ==: x
+      (.==..........)  =  evl e2  ==: y
+      (..==.........)  =  evl e3  ==: z
+      (...==........)  =  evl e4  ==: w
+      (....==.......)  =  evl e5  ==: v
+      (.....==......)  =  evl e6  ==: u
+      (......==.....)  =  evl e7  ==: t
+      (.......==....)  =  evl e8  ==: s
+      (........==...)  =  evl e9  ==: r
+      (.........==..)  =  evl e10 ==: q
+      (..........==.)  =  evl e11 ==: p
+      (...........==)  =  evl e12 ==: o
+      (x1,y1,z1,w1,v1,u1,t1,s1,r1,q1,p1,o1) == (x2,y2,z2,w2,v2,u2,t2,s2,r2,q2,p2,o2)  =  x1 ==........... x2
+                                                                                      && y1 .==.......... y2
+                                                                                      && z1 ..==......... z2
+                                                                                      && w1 ...==........ w2
+                                                                                      && v1 ....==....... v2
+                                                                                      && u1 .....==...... u2
+                                                                                      && t1 ......==..... t2
+                                                                                      && s1 .......==.... s2
+                                                                                      && r1 ........==... r2
+                                                                                      && q1 .........==.. q2
+                                                                                      && p1 ..........==. p2
+                                                                                      && o1 ...........== o2
+
 
 instance Name A
 instance Name B
diff --git a/src/Conjure/Conjurable/Derive.hs b/src/Conjure/Conjurable/Derive.hs
--- a/src/Conjure/Conjurable/Derive.hs
+++ b/src/Conjure/Conjurable/Derive.hs
@@ -127,10 +127,6 @@
                    conjureTiers     =  reifyTiers |]
   -- withTheReturnTypeOfs |++| (cxt |=>| inst)
   cxt |=>| inst `addFun` deriveSize t `mergeI` deriveSubTypes t `mergeI` deriveCases t
--- TODO: derive conjureCases, e.g.:
--- conjureCases mx  =  [ value "Nothing" (Nothing -: mx)
---                     , value "Just" (Just ->: mx) :$ hole x
---                     ]
 
 deriveCases :: Name -> DecsQ
 deriveCases t  =  do
diff --git a/src/Conjure/Defn.hs b/src/Conjure/Defn.hs
--- a/src/Conjure/Defn.hs
+++ b/src/Conjure/Defn.hs
@@ -19,8 +19,26 @@
   , devl
   , devalFast
   , showDefn
+  , printDefn
   , defnApparentlyTerminates
   , isRedundantDefn
+  , isRedundantBySubsumption
+  , isRedundantByRepetition
+  , isRedundantByIntroduction
+  , hasRedundantRecursion
+  , isCompleteDefn
+  , isCompleteBndn
+  , simplifyDefn
+  , canonicalizeBndn
+  , canonicalizeBndnLast
+  , hasUnbound
+  , noUnbound
+  , isUndefined
+  , isDefined
+  , introduceVariableAt
+  , isBaseCase
+  , isRecursiveCase
+  , isRecursiveDefn
   , module Conjure.Expr
   )
 where
@@ -61,8 +79,22 @@
 showDefn :: Defn -> String
 showDefn  =  unlines . map show1
   where
+  show1 (lhs,Value "if" _ :$ c :$ t :$ e)  =  lhseqs ++ "if " ++ showExpr c
+                                   ++ "\n" ++ spaces ++ "then " ++ showExpr t
+                                   ++ "\n" ++ spaces ++ "else " ++ showExpr e
+                                              where
+                                              lhseqs  =  showExpr lhs ++ "  =  "
+                                              spaces  =  map (const ' ') lhseqs
   show1 (lhs,rhs)  =  showExpr lhs ++ "  =  " ++ showExpr rhs
 
+-- | Pretty-prints a 'Defn' to the screen.
+--
+-- > > printDefn sumDefn
+-- > sum []  =  0
+-- > sum (x:xs)  =  x + sum xs
+printDefn :: Defn -> IO ()
+printDefn  =  putStr . showDefn
+
 type Memo  =  [(Expr, Maybe Dynamic)]
 
 -- | Evaluates an 'Expr' to a 'Dynamic' value
@@ -198,38 +230,250 @@
 defnApparentlyTerminates _  =  True
 
 -- | Returns whether the given 'Defn' is redundant
---   with regards to its patterns.
+--   with regards to repetitions on RHSs.
 --
 -- Here is an example of a redundant 'Defn':
 --
--- > 0 ? 0  =  0
--- > 0 ? x  =  0
+-- > 0 ? 0  =  1
+-- > 0 ? x  =  1
 -- > x ? 0  =  x
 -- > x ? y  =  x
 --
 -- It is redundant because it is equivalent to:
 --
--- > 0 ? _  =  0
+-- > 0 ? _  =  1
 -- > x ? _  =  x
 --
--- If the given expression is incomplete ('hasHole')
--- this function returns 'True' as nothing can be said.
+-- This function safely handles holes on the RHSs
+-- by being conservative in cases these are found:
+-- nothing can be said before their fillings.
 isRedundantDefn :: Defn -> Bool
-isRedundantDefn d  =  all isComplete (map snd d)
-                   && any isRedundant1 (unfoldDefnArgs d)
+isRedundantDefn d  =  isRedundantBySubsumption d
+                   || isRedundantByRepetition d
+--                 || isRedundantByIntroduction d
+-- we do not use isRedundantByIntroduction above
+-- as it does not pay off in terms of runtime vs number of pruned candidates
+--
+-- The number of candidates is reduced usually by less than 1%
+-- and the runtime increases by 50% or sometimes 100%.
+
+-- | Returns whether the given 'Defn' is redundant
+--   with regards to repetitions on RHSs.
+--
+-- Here is an example of a redundant 'Defn':
+--
+-- > 0 ? 0  =  1
+-- > 0 ? x  =  1
+-- > x ? 0  =  x
+-- > x ? y  =  x
+--
+-- It is redundant because it is equivalent to:
+--
+-- > 0 ? _  =  1
+-- > x ? _  =  x
+--
+-- @1@ and @x@ are repeated in the results for when
+-- the first arguments are @0@ and @x@.
+isRedundantByRepetition :: Defn -> Bool
+isRedundantByRepetition d  =  any anyAllEqual shovels
   where
-  isRedundant1 :: [(Expr,Expr)] -> Bool
-  isRedundant1  =  all allEqual
-                .  map (map snd)
-                .  classifyOn fst
-                .  map (unfoldPair . canonicalize . foldPair)
+  nArgs  =  length . tail . unfoldApp . fst $ head d
+  shovels :: [Expr -> Expr]
+  shovels  =  [digApp n | n <- [1..nArgs]]
+  anyAllEqual :: (Expr -> Expr) -> Bool
+  anyAllEqual shovel  =  any (\bs -> allEqual2 bs && isDefined bs)
+                      .  classifyOn fst
+                      .  map (canonicalizeBndn . first shovel)
+                      $  d
 
-  -- Returns a list of degenerate 'Defn'
-  -- whose patterns have been "lensed" on each argument.
-  unfoldDefnArgs :: Defn -> [[(Expr,Expr)]]
-  unfoldDefnArgs  =  transpose . map unfoldBndnArgs
-    where
-    unfoldBndnArgs :: Bndn -> [(Expr,Expr)]
-    unfoldBndnArgs (p,r)  =  map (\a -> (a,r)) as
-      where
-      (_:as)  =  unfoldApp p
+-- | Returns whether the given 'Defn' is redundant
+--   with regards to case elimination
+--
+-- The following is redundant according to this criterium:
+--
+-- > foo []  =  []
+-- > foo (x:xs)  =  x:xs
+--
+-- It is equivalent to:
+--
+-- > foo xs = xs
+--
+-- The following is also redundant:
+--
+-- > [] ?? xs  =  []
+-- > (x:xs) ?? ys  =  x:xs
+--
+-- as it is equivalent to:
+--
+-- > xs ?? ys == xs
+--
+-- This function is not used as one of the criteria in 'isRedundantDefn'
+-- because it does not pay-off
+-- in terms of runtime vs number of pruned candidates.
+isRedundantByIntroduction :: Defn -> Bool
+isRedundantByIntroduction d  =  any anyAllEqual [1..nArgs]
+  where
+  nArgs  =  length . tail . unfoldApp . fst $ head d
+  anyAllEqual :: Int -> Bool
+  anyAllEqual i  =  any (\bs -> length bs >= 2 && isDefined bs && noConflicts i bs)
+                 .  classifyOn (digApp i . fst)
+                 .  map (canonicalizeBndnLast i)
+                 $  d
+  noConflicts :: Int -> [Bndn] -> Bool
+  noConflicts i bs  =  case listConflicts (map snd bs) of
+                       [] -> True
+                       [es] -> es == [efxs $!! i | (efxs,_) <- bs]
+                       _ -> False
+
+-- | Returns whether the given 'Defn' is redundant
+--   with regards to recursions
+--
+-- The following is redundant:
+--
+-- > xs ?? []  =  []
+-- > xs ?? (x:ys)  =  xs ?? []
+--
+-- The LHS of a base-case pattern, matches the RHS of a recursive pattern.
+-- The second RHS may be replaced by simply @[]@ which makes it redundant.
+hasRedundantRecursion :: Defn -> Bool
+hasRedundantRecursion d  =  not (null rs) && any matchesRHS bs
+  where
+  (bs,rs)  =  partition isBaseCase d
+  matchesRHS (lhs,_)  =  any ((`hasAppInstanceOf` lhs) . snd) rs
+
+-- | Introduces a hole at a given position in the binding:
+--
+-- > > introduceVariableAt 1 (xxs -?- (yy -:- yys), (yy -:- yys) -++- (yy -:- yys))
+-- > (xs ? (y:ys) :: [Int],(y:ys) ++ (y:ys) :: [Int])
+--
+-- > > introduceVariableAt 2 (xxs -?- (yy -:- yys), (yy -:- yys) -++- (yy -:- yys))
+-- > (xs ? x :: [Int],x ++ x :: [Int])
+--
+-- Relevant occurrences are replaced.
+introduceVariableAt :: Int -> Bndn -> Bndn
+introduceVariableAt i b@(l,r)
+  | isVar p    =  b -- already a variable
+-- | isGround p  =  (newVar, r)  -- enabling catches a different set of candidates
+  | otherwise  =  unfoldPair
+               $  foldPair b // [(p,newVar)]
+  where
+  p  =  l $!! i
+  newVar  =  newName `varAsTypeOf` p
+  newName  =  head $ variableNamesFromTemplate "x" \\ varnames l
+  varnames :: Expr -> [String]
+  varnames e  =  [n | Value ('_':n) _ <- vars e]
+
+-- | Returns whether the given 'Defn' is redundant
+--   with regards to subsumption by latter patterns
+--
+-- Here is an example of a redundant 'Defn' by this criterium:
+--
+-- > foo 0  =  0
+-- > foo x  =  x
+isRedundantBySubsumption :: Defn -> Bool
+isRedundantBySubsumption  =  is . map foldPair . filter isCompleteBndn
+  -- above, we could have used noUnbound instead of isCompleteBndn
+  -- we use isCompleteBndn as it is faster
+  where
+  is []  =  False
+  is (b:bs)  =  any (b `isInstanceOf`) bs || is bs
+
+-- | Returns whether the definition is complete,
+--   i.e., whether it does not have any holes in the RHS.
+isCompleteDefn :: Defn -> Bool
+isCompleteDefn  =  all isCompleteBndn
+
+-- | Returns whether the binding is complete,
+--   i.e., whether it does not have any holes in the RHS.
+isCompleteBndn :: Bndn -> Bool
+isCompleteBndn (_,rhs)  =  isComplete rhs
+
+-- | Simplifies a definition by removing redundant patterns
+--
+-- This may be useful in the following case:
+--
+-- > 0 ^^^ 0  =  0
+-- > 0 ^^^ x  =  x
+-- > x ^^^ 0  =  x
+-- > _ ^^^ _  =  0
+--
+-- The first pattern is subsumed by the last pattern.
+simplifyDefn :: Defn -> Defn
+simplifyDefn []  =  []
+simplifyDefn (b:bs)  =  [b | none (foldPair b `isInstanceOf`) $ map foldPair bs]
+                     ++ simplifyDefn bs
+
+canonicalizeBndn :: Bndn -> Bndn
+canonicalizeBndn  =  unfoldPair . canonicalize . foldPair
+
+canonicalizeBndnLast :: Int -> Bndn -> Bndn
+canonicalizeBndnLast i (lhs,rhs)  =  (updateAppAt i (const ex') lhs', rhs')
+  where
+  (lhs_, ex)  =  extractApp i lhs
+  (lhs', ex', rhs')  =  unfoldTrio . canonicalize . foldTrio $ (lhs_, ex, rhs)
+
+-- | Returns whether a binding has undefined variables,
+--   i.e.,
+--   there are variables in the RHS that are not declared in the LHS.
+--
+-- > > hasUnbound (xx -:- xxs, xxs)
+-- > False
+--
+-- > > hasUnbound (xx -:- xxs, yys)
+-- > True
+--
+-- For 'Defn's, use 'isUndefined'.
+hasUnbound :: Bndn -> Bool
+hasUnbound  =  not . noUnbound
+
+noUnbound :: Bndn -> Bool
+noUnbound (lhs,rhs)  =  all (`elem` nubVars lhs) (vars rhs)
+
+-- | Returns whether a 'Defn' has undefined variables,
+--   i.e.,
+--   there are variables in the RHSs that are not declared in the LHSs.
+--
+-- > > isUndefined [(nil, nil), (xx -:- xxs, xxs)]
+-- > False
+--
+-- > > isUndefined [(nil, xxs), (xx -:- xxs, yys)]
+-- > True
+--
+-- For single 'Bndn's, use 'hasUnbound'.
+isUndefined :: Defn -> Bool
+isUndefined  =  any hasUnbound
+
+isDefined :: Defn -> Bool
+isDefined  =  not . isUndefined
+
+-- | Returns whether a binding is a base case.
+--
+-- > > isBaseCase (ff (xx -:- nil), xx)
+-- > True
+--
+-- > > isBaseCase (ff (xx -:- xxs), ff xxs)
+-- > False
+--
+-- (cf. 'isRecursiveCase')
+isBaseCase :: Bndn -> Bool
+isBaseCase (lhs,rhs)  =  f `notElem` values rhs
+  where
+  (f:_)  =  unfoldApp lhs
+
+-- | Returns whether a binding is a base case.
+--
+-- > > isRecursiveCase (ff (xx -:- nil), xx)
+-- > False
+--
+-- > > isRecursiveCase (ff (xx -:- xxs), ff xxs)
+-- > True
+--
+-- (cf. 'isBaseCase')
+isRecursiveCase :: Bndn -> Bool
+isRecursiveCase (lhs,rhs)  =  f `elem` values rhs
+  where
+  (f:_)  =  unfoldApp lhs
+
+-- | Returns whether a definition is recursive
+isRecursiveDefn :: Defn -> Bool
+isRecursiveDefn  =  any isRecursiveCase
diff --git a/src/Conjure/Engine.hs b/src/Conjure/Engine.hs
--- a/src/Conjure/Engine.hs
+++ b/src/Conjure/Engine.hs
@@ -166,6 +166,7 @@
   , requireDescent        :: Bool -- ^ require recursive calls to deconstruct arguments
   , usePatterns           :: Bool -- ^ use pattern matching to create (recursive) candidates
   , copyBindings          :: Bool -- ^ copy partial definition bindings in candidates
+  , atomicNumbers         :: Bool -- ^ restrict constant/ground numeric expressions to atoms
   , showTheory            :: Bool -- ^ show theory discovered by Speculate used in pruning
   , uniqueCandidates      :: Bool -- ^ unique-modulo-testing candidates
   }
@@ -193,6 +194,7 @@
   , requireDescent         =  True
   , usePatterns            =  True
   , copyBindings           =  True
+  , atomicNumbers          =  True
   , showTheory             =  False
   , uniqueCandidates       =  False
   }
@@ -358,9 +360,8 @@
 -- | Return apparently unique candidate definitions
 --   where there is a single body.
 candidateDefns1 :: Conjurable f => Args -> String -> f -> [Prim] -> ([[Defn]], Thy)
-candidateDefns1 args nm f ps  =  mapFst (mapT toDefn) $ candidateExprs args nm f ps
+candidateDefns1 args nm f ps  =  first (mapT toDefn) $ candidateExprs args nm f ps
   where
-  mapFst f (x,y)  =  (f x, y)
   efxs  =  conjureVarApplication nm f
   toDefn e  =  [(efxs, e)]
 
@@ -385,8 +386,7 @@
   eh  =  holeAsTypeOf efxs
   efxs  =  conjureVarApplication nm f
   (ef:exs)  =  unfoldApp efxs
-  keep  =  isRootNormalE thy . fastMostGeneralVariation
-  ds  =  filter (conjureIsDeconstructor f maxTests) es
+  keep  =  isRootNormalC thy . fastMostGeneralVariation
   keepR | requireDescent  =  descends isDecOf efxs
         | otherwise       =  const True
     where
@@ -414,7 +414,7 @@
 -- | Return apparently unique candidate definitions
 --   using pattern matching.
 candidateDefnsC :: Conjurable f => Args -> String -> f -> [Prim] -> ([[Defn]], Thy)
-candidateDefnsC Args{..} nm f ps  =  (concatMapT fillingsFor fss,thy)
+candidateDefnsC Args{..} nm f ps  =  (discardT hasRedundantRecursion $ concatMapT fillingsFor fss,thy)
   where
   pats  =  conjurePats es nm f
   fss  =  concatMapT ps2fss pats
@@ -424,14 +424,19 @@
   efxs  =  conjureVarApplication nm f
   (ef:exs)  =  unfoldApp efxs
 
-  keep  =  isRootNormal thy . fastMostGeneralVariation
+  keep  =  isRootNormalC thy . fastMostGeneralVariation
 
   appsWith :: Expr -> [Expr] -> [[Expr]]
-  appsWith eh vs  =  enumerateAppsFor eh keep $ vs ++ es
+  appsWith eh vs  =  enumerateAppsFor eh k $ vs ++ es
+    where
+    k | atomicNumbers && conjureIsNumeric f eh  =  \e -> keepNumeric e && keep e
+      | otherwise                               =  keep
+    -- discards non-atomic numeric ground expressions such as 1 + 1
+    keepNumeric e  =  isFun e || isConst e || not (isGround e)
 
   ps2fss :: [Expr] -> [[Defn]]
   ps2fss pats  =  discardT isRedundantDefn
-               .  discardT (allEqual . map snd)
+               .  discardT (allEqual2 . map snd)
                .  products
                $  map p2eess pats
     where
@@ -638,6 +643,16 @@
   where
   trie  =  T.fromList (rules thy)
 
+-- the logic of this function is a bit twisted for performance
+-- but nevertheless correct
+isRootNormalC :: Thy -> Expr -> Bool
+isRootNormalC thy e | not (isRootNormal thy e)  =  False
+isRootNormalC thy (ef :$ ex :$ ey)
+  | ex <= ey  =  True
+  | not (isCommutative thy ef)  =  True
+  | isRootNormal thy (ef :$ ey :$ ex)  =  False
+isRootNormalC _ _  =  True
+
 isRootNormalE :: Thy -> Expr -> Bool
 isRootNormalE thy e  =  isRootNormal thy e
                     &&  null (filter (e ->-) [e2 //- bs | (_,bs,e2) <- T.lookup e trie])
@@ -645,16 +660,27 @@
   trie  =  T.fromList $ equations thy ++ map swap (equations thy)
   (->-)  =  canReduceTo thy
 
+isCommutative :: Thy -> Expr -> Bool
+isCommutative thy eo  =  eo `elem` commutativeOperators thy
 
+commutativeOperators :: Thy -> [Expr]
+commutativeOperators thy  =  [ ef
+                             | (ef :$ ex :$ ey, ef' :$ ey' :$ ex') <- equations thy
+                             , ef == ef'
+                             , ex == ex'
+                             , ey == ey'
+                             ]
+
+
 --- tiers utils ---
 
 productsWith :: ([a] -> a) -> [ [[a]] ] -> [[a]]
 productsWith f  =  mapT f . products
--- TODO: move to LeanCheck?
+-- TODO: move productsWith to LeanCheck?
 
 delayedProductsWith :: ([a] -> a) -> [ [[a]] ] -> [[a]]
 delayedProductsWith f xsss  =  productsWith f xsss `addWeight` length xsss
--- TODO: move to LeanCheck?
+-- TODO: move delayedProductsWith to LeanCheck?
 
 foldAppProducts :: Expr -> [ [[Expr]] ] -> [[Expr]]
 foldAppProducts ef  =  delayedProductsWith (foldApp . (ef:))
diff --git a/src/Conjure/Expr.hs b/src/Conjure/Expr.hs
--- a/src/Conjure/Expr.hs
+++ b/src/Conjure/Expr.hs
@@ -12,7 +12,6 @@
   , module Data.Express.Fixtures
 
   , rehole
-  , (>$$<)
   , funToVar
   , recursexpr
   , apparentlyTerminates
@@ -30,10 +29,20 @@
   , reval
   , useMatches
   , deholings
+  , varToConst
+  , hasAppInstanceOf
 
   , enumerateAppsFor
   , enumerateFillings
 
+  , digApp
+  , extractApp
+  , updateAppAt
+  , ($!!)
+
+  , conflicts
+  , listConflicts
+
   , module Conjure.Utils
   )
 where
@@ -94,6 +103,19 @@
 funToVar (ef :$ ex)  =  funToVar ef :$ ex
 funToVar ef@(Value nm _)  =  nm `varAsTypeOf` ef
 
+-- | Given a variable, returns a constant with the same name
+varToConst :: Expr -> Expr
+varToConst (Value ('_':nm) dyn)  =  Value nm dyn
+varToConst _  =  error "varToConst: can only be applied to variables"
+
+-- | Returns whether the first 'Expr'
+--   has an application instance of the second 'Expr'.
+hasAppInstanceOf :: Expr -> Expr -> Bool
+e `hasAppInstanceOf` efxs  =  constApp e `hasInstanceOf` constApp efxs
+  where
+  constApp e  =  e //- [(ef,varToConst ef)]
+  (ef:_)  =  unfoldApp efxs
+
 -- | Expands recursive calls on an expression
 --   until the given size limit is reached.
 --
@@ -187,18 +209,13 @@
 -- | Creates a case 'Expr' of the type of the given proxy.
 --
 -- > > caseForOrd (undefined :: Int)
--- > case :: Bool -> Int -> Int -> Int -> Int
+-- > case :: Ordering -> Int -> Int -> Int -> Int
 --
 -- > > caseForOrd (undefined :: String)
--- > case :: Bool -> [Char] -> [Char] -> [Char] -> [Char]
+-- > case :: Ordering -> [Char] -> [Char] -> [Char] -> [Char]
 caseForOrd :: Typeable a => a -> Expr
 caseForOrd a  =  value "case" (\o x y z -> case o of LT -> x; EQ -> y; GT -> z `asTypeOf` a)
 
--- | Application cross-product between lists of Exprs
-(>$$<) :: [Expr] -> [Expr] -> [Expr]
-exs >$$< eys  =  catMaybes [ex $$ ey | ex <- exs, ey <- eys]
--- TODO: move >$$< into Data.Express?
-
 -- | Lists terminal values in BFS order.
 --
 -- (cf. 'values', 'holesBFS', 'fillBFS')
@@ -452,6 +469,67 @@
   deh e  =  if typ e == typ e' && isHole e
             then [e']
             else []
+
+-- | Dig a hole in a function application at the given position
+--
+-- > > digApp 1 (one -+- two)
+-- > _ + 2 :: Int
+--
+-- > > digApp 2 (one -+- two)
+-- > 1 + _ :: Int
+digApp :: Int -> Expr -> Expr
+digApp i  =  updateAppAt i holeAsTypeOf
+
+updateAppAt :: Int -> (Expr -> Expr) -> Expr -> Expr
+updateAppAt i f  =  foldApp . updateAt i f . unfoldApp
+
+-- | Extracts the argument of a function application at the given position.
+--
+-- > (one -+- two) $!! 1
+-- 1 :: Int
+--
+-- > (one -+- two) $!! 2
+-- 2 :: Int
+($!!) :: Expr -> Int -> Expr
+e $!! i  =  unfoldApp e !! i
+
+-- | Extracts a value in a function application at the given position
+--
+-- > > extractApp 1 (one -+- two)
+-- > (_ + 2 :: Int, 1 :: Int)
+--
+-- > > extractApp 2 (one -+- two)
+-- > (1 + _ :: Int, 2 :: Int)
+extractApp :: Int -> Expr -> (Expr,Expr)
+extractApp i efxs  =  (foldApp $ updateAt i holeAsTypeOf es, es !! i)
+  where
+  es  =  unfoldApp efxs
+
+
+-- | Lists conflicts between two expressions
+--
+-- > > conflicts (one -+- two) (three -+- four)
+-- > [(1 :: Int,3 :: Int), (2 :: Int,4 :: Int)]
+--
+-- > > conflicts (xx -:- nil) (xx -:- yy -:- yys)
+-- > [(nil, yy -:- yys)]
+--
+-- > > conflicts  (one -:- one -:- nil) (zero -:- zero -:- xx -:- xxs)
+-- > [(1 :: Int,0 :: Int),([] :: [Int],x:xs :: [Int])]
+conflicts :: Expr -> Expr -> [(Expr,Expr)]
+conflicts e1 e2 | typ e1 /= typ e2  =  [(e1,e2)]
+conflicts (ef :$ ex) (eg :$ ey)     =  conflicts ef eg +++ conflicts ex ey
+conflicts e1 e2                     =  [(e1,e2) | e1 /= e2]
+
+listConflicts :: [Expr] -> [[Expr]]
+listConflicts es
+  | not (allEqualOn typ es)  =  [es]
+  | all isApp es             =  listConflicts [ef | ef :$ _ <- es]
+                            +++ listConflicts [ex | _ :$ ex <- es]
+  | otherwise                =  [es | not (allEqual es)]
+  where
+  fun (ef :$ _)  =  ef
+  arg (_ :$ ex)  =  ex
 
 instance Express A where  expr  =  val
 instance Express B where  expr  =  val
diff --git a/src/Conjure/Utils.hs b/src/Conjure/Utils.hs
--- a/src/Conjure/Utils.hs
+++ b/src/Conjure/Utils.hs
@@ -29,6 +29,8 @@
   , sets
   , headOr
   , allEqual
+  , allEqualOn
+  , allEqual2
   , choices
   , choicesThat
   , foldr0
@@ -37,6 +39,12 @@
   , classify   -- from LeanCheck.Stats
   , classifyBy -- from LeanCheck.Stats
   , classifyOn -- from LeanCheck.Stats
+  , none
+  , updateAt
+  , first
+  , second
+  , both
+  , (+++)
   )
 where
 
@@ -51,14 +59,27 @@
 
 import Test.LeanCheck.Stats (classify, classifyBy, classifyOn)
 
+
 -- | Checks if all elements of a list are equal.
+allEqual :: Eq a => [a] -> Bool
+allEqual (x:y:etc)  =  x == y && allEqual (y:etc)
+allEqual _          =  True
+
+
+allEqualOn :: Eq b => (a -> b) -> [a] -> Bool
+allEqualOn f  =  allEqual . map f
+
+
+-- | Checks if all elements of a list are equal.
 --
 -- Exceptionally this function returns false for an empty or unit list.
-allEqual :: Eq a => [a] -> Bool
-allEqual []  =  False
-allEqual [x]  =  False
-allEqual [x,y]  =  x == y
-allEqual (x:y:xs)  =  x == y && allEqual (y:xs)
+--
+-- This returns true when all elements are equal and the list
+-- has a length greater than or equal to two.
+allEqual2 :: Eq a => [a] -> Bool
+allEqual2 []  =  False
+allEqual2 [_]  =  False
+allEqual2 xs  =  allEqual xs
 
 -- | Counts the number of occurrences on a list.
 count :: (a -> Bool) -> [a] -> Int
@@ -129,9 +150,9 @@
 -- | Lists choices of values.
 choices :: [a] -> [(a,[a])]
 choices []  =  []
-choices (x:xs)  =  (x,xs) : map (mapSnd (x:)) (choices xs)
+choices (x:xs)  =  (x,xs) : map (second (x:)) (choices xs)
   where
-  mapSnd f (x,y)  =  (x,f y)
+  second f (x,y)  =  (x,f y)
 
 -- | Lists choices of values that follow a property.
 choicesThat :: (a -> [a] -> Bool) -> [a] -> [(a,[a])]
@@ -149,3 +170,51 @@
 -- | Indents a block of text with the provided amount of spaces
 indentBy :: Int -> String -> String
 indentBy n  =  unlines . map (replicate n ' ' ++) . lines
+
+none :: (a -> Bool) -> [a] -> Bool
+none p  =  not . any p
+
+-- | Updates the value in a list at a given position.
+--
+-- > > updateAt 2 (*10) [1,2,3,4]
+-- > [1,2,30,4]
+updateAt :: Int -> (a -> a) -> [a] -> [a]
+updateAt _ _ []  =  []
+updateAt 0 f (x:xs)  =  f x : xs
+updateAt n f (x:xs)  =  x : updateAt (n-1) f xs
+
+-- | Applies a function to the first element of a pair.
+--   Often known on the wild as @mapFst@.
+--
+-- > > first (*10) (1,2)
+-- > (10,2)
+first :: (a -> a') -> (a,b) -> (a',b)
+first f (x,y)  =  (f x, y)
+
+-- | Applies a function to the second element of a pair.
+--   Often known on the wild as @mapSnd@.
+--
+-- > > second (*100) (1,2)
+-- > (1,200)
+second :: (b -> b') -> (a,b) -> (a,b')
+second f (x,y)  =  (x, f y)
+
+both :: (a -> b) -> (a,a) -> (b,b)
+both f (x,y)  =  (f x, f y)
+
+nubMergeBy :: (a -> a -> Ordering) -> [a] -> [a] -> [a]
+nubMergeBy cmp (x:xs) (y:ys) = case x `cmp` y of
+                                 LT -> x:nubMergeBy cmp xs (y:ys)
+                                 GT -> y:nubMergeBy cmp (x:xs) ys
+                                 EQ -> x:nubMergeBy cmp xs ys
+nubMergeBy _ xs ys = xs ++ ys
+
+nubMergeOn :: Ord b => (a -> b) -> [a] -> [a] -> [a]
+nubMergeOn f = nubMergeBy (compare `on` f)
+
+nubMerge :: Ord a => [a] -> [a] -> [a]
+nubMerge = nubMergeBy compare
+
+(+++) :: Ord a => [a] -> [a] -> [a]
+(+++) = nubMerge
+infixr 5 +++
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -9,6 +9,6 @@
 - .
 
 extra-deps:
-- leancheck-1.0.0
+- leancheck-1.0.2
 - speculate-0.4.14
-- express-1.0.10
+- express-1.0.14
diff --git a/test/conjurable.hs b/test/conjurable.hs
--- a/test/conjurable.hs
+++ b/test/conjurable.hs
@@ -114,6 +114,8 @@
   , isNothing $ conjureEquality (undefined :: (Bool,Bool,Bool,Bool,Bool,Unit,Bool))
   , isNothing $ conjureEquality (undefined :: (Bool,Bool,Bool,Bool,Bool,Bool,Unit))
 
+  , conjureArgumentHoles (undefined :: Bool -> Int -> Bool -> ()) == [b_, i_, b_]
+
   , length (conjureCases (undefined :: ()))      == 1
   , length (conjureCases (undefined :: Bool))    == 2
   , length (conjureCases (undefined :: Int))     == 0
@@ -121,6 +123,15 @@
   , length (conjureCases (undefined :: [Int]))   == 2
   , length (conjureCases (undefined :: [Bool]))  == 2
 
+  , conjureCases (undefined :: Bool) == [false, true]
+  , conjureCases (undefined :: Int) == []
+  , conjureCases (undefined :: [Int]) == [nil, i_ -:- is_]
+  , conjureCases (undefined :: [Bool]) == [nilBool, b_ -:- bs_]
+  , conjureCases (undefined :: Maybe Int) == [nothing, just i_]
+
+  , map length (conjureArgumentCases (undefined :: () -> Bool -> Int -> [Int] -> [Bool] -> ()))
+    == [1, 2, 0, 2, 2]
+
   , conjurePats [zero, one] "f" (undefined :: Int -> Int)
     == [ [ [ ff xx
            ]
@@ -150,7 +161,7 @@
          ]
        ]
 
-  , take 4 (conjurePats [zero, one] "?" (undefined :: Int -> Int -> Int))
+  , take 3 (conjurePats [zero, one] "?" (undefined :: Int -> Int -> Int))
     == [ [ [ xx -?- yy
            ]
          ]
@@ -164,106 +175,27 @@
        , [ [ xx -?- one
            , xx -?- yy
            ]
-         , [ zero -?- zero
-           , zero -?- xx
+         , [ zero -?- xx
            , xx -?- zero
            , xx -?- yy
            ]
-         , [ one -?- xx
-           , xx -?- yy
-           ]
-         ]
-       , [ [ xx -?- zero
-           , xx -?- one
-           , xx -?- yy
-           ]
-         , [ zero -?- one
+         , [ zero -?- zero
            , zero -?- xx
-           , xx -?- one
            , xx -?- yy
            ]
-         , [ one -?- zero
-           , one -?- xx
-           , xx -?- zero
-           , xx -?- yy
-           ]
-         , [ zero -?- xx
-           , one -?- xx
+         , [ one -?- xx
            , xx -?- yy
            ]
          ]
        ]
 
-  , concat (conjurePats [zero, one] "foo" (undefined :: [Int] -> Int -> Int))
-    == [ [ ffoo xxs xx
-         ]
-       , [ ffoo xxs zero
-         , ffoo xxs xx
-         ]
-       , [ ffoo nil xx
-         , ffoo (xx -:- xxs) yy
-         ]
-       , [ ffoo xxs one
-         , ffoo xxs xx
-         ]
-       , [ ffoo nil zero
-         , ffoo nil xx
-         , ffoo (xx -:- xxs) zero
-         , ffoo (xx -:- xxs) yy
-         ]
-       , [ ffoo xxs zero
-         , ffoo xxs one
-         , ffoo xxs xx
-         ]
-       , [ ffoo nil one
-         , ffoo nil xx
-         , ffoo (xx -:- xxs) one
-         , ffoo (xx -:- xxs) yy
-         ]
-       , [ ffoo nil zero
-         , ffoo nil one
-         , ffoo nil xx
-         , ffoo (xx -:- xxs) zero
-         , ffoo (xx -:- xxs) one
-         , ffoo (xx -:- xxs) yy
-         ]
-       ]
+  , mapT length (conjurePats [zero, one] "foo" (undefined :: [Int] -> Int -> Int))
+    == [[1],[2,2],[2,3,3],[3,3,4,3],[4,4,4,4],[5,4,5],[5,5],[6]]
 
-  , concat (conjurePats [zero, one] "foo" (undefined :: Int -> [Int] -> Int))
-    == [ [ ffoo xx xxs
-         ]
-       , [ ffoo xx nil
-         , ffoo xx (yy -:- xxs)
-         ]
-       , [ ffoo zero xxs
-         , ffoo xx xxs
-         ]
-       , [ ffoo zero nil
-         , ffoo zero (xx -:- xxs)
-         , ffoo xx nil
-         , ffoo xx (yy -:- xxs)
-         ]
-       , [ ffoo one xxs
-         , ffoo xx xxs
-         ]
-       , [ ffoo one nil
-         , ffoo one (xx -:- xxs)
-         , ffoo xx nil
-         , ffoo xx (yy -:- xxs)
-         ]
-       , [ ffoo zero xxs
-         , ffoo one xxs
-         , ffoo xx xxs
-         ]
-       , [ ffoo zero nil
-         , ffoo zero (xx -:- xxs)
-         , ffoo one nil
-         , ffoo one (xx -:- xxs)
-         , ffoo xx nil
-         , ffoo xx (yy -:- xxs)
-         ]
-       ]
 
+  , mapT length (conjurePats [zero, one] "foo" (undefined :: Int -> [Int] -> Int))
+    == [[1],[2,2],[3,3,2],[4,3,3,3],[4,4,4,4],[5,5,5],[6]]
+
   , conjurePats [] "foo" (undefined :: [Int] -> [Char] -> Int)
     == [ [ [ ffoo xxs ccs
            ]
@@ -275,6 +207,15 @@
            , ffoo (xx -:- xxs) ccs
            ]
          ]
+       , [ [ ffoo nilInt ccs
+           , ffoo (xx -:- xxs) emptyString
+           , ffoo (xx -:- xxs) (cc -:- ccs)
+           ]
+         , [ ffoo nilInt emptyString
+           , ffoo nilInt (cc -:- ccs)
+           , ffoo (xx -:- xxs) ccs
+           ]
+         ]
        , [ [ ffoo nilInt emptyString
            , ffoo nilInt (cc -:- ccs)
            , ffoo (xx -:- xxs) emptyString
@@ -283,32 +224,18 @@
          ]
        ]
 
-  , conjureIsDeconstructor (undefined :: Int -> Int) 60 (value "dec" (subtract 1 :: Int -> Int))
-    == True
-
-  , conjureIsDeconstructor (undefined :: Int -> Int) 60 (value "halve" ((`div` 2) :: Int -> Int))
-    == True
-
-  , conjureIsDeconstructor (undefined :: Int -> Int) 60 (value "double" ((*2) :: Int -> Int))
-    == False
-
-  , conjureIsDeconstructor (undefined :: Int -> Int) 60 (value "inc" ((+1) :: Int -> Int))
-    == False -- _almost_ converges half the time
-
-  , conjureIsDeconstructor (undefined :: [Int] -> Int) 60 (value "tail" (tail :: [Int] -> [Int]))
-    == True
-
-  , conjureIsDeconstructor (undefined :: [Int] -> Int) 60 (value "prep" ((0:) :: [Int] -> [Int]))
-    == False
-
   , isDecon (minus :$ i_ :$ one) == True
   , isDecon (minusOne -+- i_)    == True
   , isDecon (div' i_ two)        == True
   , isDecon (tail' is_)          == True
   , isDecon (init' is_)          == True
-  , isDecon (mod' i_ two)        == True
-  , isDecon (mod' i_ xx)         == True
 
+  -- counter-intuitive but true: x `mod` y is a deconstruction of y:
+  -- x `mod` y < y  for  y > 0
+  , isDecon (mod' xx i_)         == True
+
+  , isDecon (mod' i_ two)        == False -- does not deconstruct 1
+  , isDecon (mod' i_ xx)         == False -- may not deconstruct 1
   , isDecon (div' xx yy)         == False -- must have a hole to indicate the value being deconstructed
   , isDecon (div' i_ i_)         == False -- two holes are not allowed
   , isDecon (head' is_)          == False -- must deconstruct to the same type
@@ -337,10 +264,19 @@
     == Just False
   , fromDynamic (conjureDynamicEq ((+) :: Int -> Int -> Int) `dynApp` toDyn (1::Int) `dynApp` toDyn (1::Int))
     == Just True
+
+  , isNumeric one
+  , isNumeric (val (1 :: Integer))
+  , isNumeric bee == False
+  , isNumeric (expr [0::Int]) == False
+  , isNumeric true == False
   ]
 
 isDecon :: Expr -> Bool
 isDecon =  conjureIsDeconstruction (undefined :: [Int] -> [Char] -> [Bool]) 60
+
+isNumeric :: Expr -> Bool
+isNumeric  =  conjureIsNumeric (undefined :: [Int] -> [Char] -> [Bool] -> [Integer])
 
 ffs :: Expr -> Expr
 ffs e  =  ffE :$ e
diff --git a/test/defn.hs b/test/defn.hs
--- a/test/defn.hs
+++ b/test/defn.hs
@@ -4,6 +4,7 @@
 import Test
 import Conjure.Defn
 import Test.LeanCheck.Error (errorToLeft)
+import Test.LeanCheck.Function ()
 import Data.Express.Fixtures
 
 main :: IO ()
@@ -73,10 +74,85 @@
   , holds n $ cevl 60 nullDefn   === (null :: [Int] -> Bool)
   , holds n $ cevl 60 appendDefn ==== ((++) :: [Int] -> [Int] -> [Int])
 
+  , holds n $ cevl 60 idDefn      === (id :: Int -> Int)
+  , holds n $ cevl 60 constDefn   ==== (const :: Int -> Int -> Int)
+  , holds n $ cevl 60 appDefn     ==== (($) :: (Int->Int) -> Int -> Int)
+  , holds n $ \f g x -> cevl 60 composeDefn f g x == ((.) :: (Int->Int) -> (Int->Int) -> Int->Int) f g x
+
   -- evaluating at the incorrect types should return Nothing
   , isNothing (cevaluate 60 sumDefn :: Maybe ([Bool] -> Bool))
   , isNothing (cevaluate 60 andDefn :: Maybe ([Int] -> Int))
   , isNothing (cevaluate 60 nullDefn :: Maybe ([Int] -> Int))
+
+  , noUnbound (xx -:- xxs, xxs)
+  , hasUnbound (xx -:- xxs, yys)
+  , isDefined sumDefn
+  , isDefined andDefn
+  , isDefined nullDefn
+  , isDefined [(nil, nil), (xx -:- xxs, xxs)]
+  , isUndefined [(nil, xxs), (xx -:- xxs, yys)]
+
+  , isRedundantDefn sumDefn    == False
+  , isRedundantDefn factDefn   == False
+  , isRedundantDefn fact1Defn  == False
+  , isRedundantDefn nullDefn   == False
+  , isRedundantDefn isZeroDefn == False
+  , isRedundantDefn isOneDefn  == False
+  , isRedundantDefn andDefn    == False
+  , isRedundantDefn orDefn     == False
+  , isRedundantDefn and1Defn   == False
+  , isRedundantDefn or1Defn    == False
+  , isRedundantDefn appendDefn == False
+
+  , isRedundantDefn const0Defn == False
+  , isRedundantDefn const0RedundantDefn
+
+  , isRedundantDefn constDefn == False
+  , isRedundantDefn constRedundantDefn
+  , isRedundantDefn constRedundantRedundantDefn
+
+  , isRedundantDefn redundantDefn1
+  , isRedundantDefn canonicalDefn1 == False
+  , isRedundantDefn redundantDefn2
+
+  , isRedundantDefn constBoolRedundantDefn
+  , isRedundantDefn idListRedundantDefn == False
+    -- NOTE: ^ ByIntroduction is not an active check
+    --         as it does not pay-off in terms of performance
+
+  , isRedundantBySubsumption  constRedundantDefn
+  , isRedundantByRepetition   constRedundantDefn == False
+  , isRedundantByIntroduction constRedundantDefn
+
+  , isRedundantBySubsumption  constBoolRedundantDefn == False
+  , isRedundantByRepetition   constBoolRedundantDefn
+  , isRedundantByIntroduction constBoolRedundantDefn
+
+  , isRedundantBySubsumption  idListRedundantDefn == False
+  , isRedundantByRepetition   idListRedundantDefn == False
+  , isRedundantByIntroduction idListRedundantDefn
+
+  , isRedundantBySubsumption  constNilRedundantDefn == False
+  , isRedundantByRepetition   constNilRedundantDefn
+  , isRedundantByIntroduction constNilRedundantDefn
+
+  , isRedundantBySubsumption  constFalseRedundantDefn == False
+  , isRedundantByRepetition   constFalseRedundantDefn
+  , isRedundantByIntroduction constFalseRedundantDefn == True
+
+  , canonicalizeBndn (introduceVariableAt 2 (const' xxs (yy -:- yys), (yy -:- yys) -++- (yy -:- yys)))
+    == (const' xxs yys, yys -++- yys)
+
+  , canonicalizeBndnLast 1 (introduceVariableAt 2 (const' xxs (yy -:- yys), (yy -:- yys) -++- (yy -:- yys)))
+    == (const' zzs yys, yys -++- yys)
+
+  , canonicalizeBndnLast 2 (introduceVariableAt 2 (const' xxs (yy -:- yys), (yy -:- yys) -++- (yy -:- yys)))
+    == (const' xxs zzs, zzs -++- zzs)
+
+  ,       isBaseCase      (ff (xx -:- nil), xx)
+  , not $ isBaseCase      (ff (xx -:- xxs), ff xxs)
+  ,       isRecursiveCase (ff (xx -:- xxs), ff xxs)
+  , not $ isRecursiveCase (ff (xx -:- nil), xx)
   ]
 
 dvl :: Typeable a => Defn -> Expr -> a
@@ -147,6 +223,91 @@
 appendDefn  =  [ nil -++- xxs  =-  xxs
                , (xx -:- xxs) -++- yys  =-  xx -:- (xxs -++- yys)
                ]  where  exs -++- eys  =  appendV :$ exs :$ eys
+
+const0Defn :: Defn
+const0Defn  =  [ xx  =-  zero ]
+
+const0RedundantDefn :: Defn
+const0RedundantDefn  =  [ zero  =-  zero
+                        , xx    =-  zero
+                        ]
+
+idDefn :: Defn
+idDefn  =  [ id' xx  =-  xx ]
+
+constDefn :: Defn
+constDefn  =  [ const' xx yy  =-  xx ]
+
+appDefn :: Defn
+appDefn  =  [ ffE -$- xx  =-  ff xx ]
+
+composeDefn :: Defn
+composeDefn  =  [ (ffE -.- ggE) :$ xx  =-  ff (gg xx) ]
+
+constRedundantDefn :: Defn
+constRedundantDefn  =  [ const' zero xx  =-  zero
+                       , const' xx   yy  =-  xx
+                       ]
+
+constRedundantRedundantDefn :: Defn
+constRedundantRedundantDefn  =  [ const' zero zero  =-  zero
+                                , const' zero xx    =-  zero
+                                , const' xx   zero  =-  xx
+                                , const' xx   yy    =-  xx
+                                ]
+
+constBoolRedundantDefn :: Defn
+constBoolRedundantDefn  =  [ const' false false  =-  false
+                           , const' false true   =-  false
+                           , const' true false   =-  true
+                           , const' true true    =-  true
+                           ]
+
+idListRedundantDefn :: Defn
+idListRedundantDefn  =  [ id' nil           =-  nil
+                        , id' (xx -:- xxs)  =-  xx -:- xxs
+                        ]
+
+constNilRedundantDefn :: Defn
+constNilRedundantDefn  =  [ id' nil           =-  nil
+                          , id' (xx -:- xxs)  =-  nil
+                          ]
+
+constFalseRedundantDefn :: Defn
+constFalseRedundantDefn  =  [ id' nil           =-  false
+                            , id' (xx -:- xxs)  =-  false
+                            ]
+
+-- Here is an example of a redundant 'Defn':
+--
+-- > 0 ? 0  =  1
+-- > 0 ? x  =  1
+-- > x ? 0  =  x
+-- > x ? y  =  x
+redundantDefn1 :: Defn
+redundantDefn1  =  [ zero -?- zero  =-  one
+                   , zero -?- xx    =-  one
+                   , xx   -?- zero  =-  xx
+                   , xx   -?- yy    =-  xx
+                   ]
+
+-- The above is redundant because it is equivalent to:
+--
+-- > 0 ? _  =  1
+-- > x ? _  =  x
+canonicalDefn1 :: Defn
+canonicalDefn1  =  [ zero -?- xx  =-  one
+                   , xx   -?- yy  =-  xx
+                   ]
+
+-- same as redundantDefn1 but with arguments swapped
+-- (mind the alpha-renaming)
+redundantDefn2 :: Defn
+redundantDefn2  =  [ zero -?- zero  =-  one
+                   , zero -?- xx    =-  xx
+                   , xx   -?- zero  =-  one
+                   , xx   -?- yy    =-  yy
+                   ]
 
 (=-) = (,)
 infixr 0 =-
diff --git a/test/expr.hs b/test/expr.hs
--- a/test/expr.hs
+++ b/test/expr.hs
@@ -35,38 +35,6 @@
   , apparentlyTerminates ffE (if' pp (ff xx) zero) == False
   , apparentlyTerminates ffE (if' (odd' (ff xx)) zero zero) == False
 
-  , [false, true, zero, one] >$$< [notE, andE, orE, plus, times] == []
-  , [notE, andE, orE, plus, times] >$$< [false, true, zero, one]
-    == [ not' false
-       , not' true
-       , andE :$ false
-       , andE :$ true
-       , orE :$ false
-       , orE :$ true
-       , plus :$ zero
-       , plus :$ one
-       , times :$ zero
-       , times :$ one
-       ]
-  , [notE, andE, orE, plus, times] >$$< [false, true, zero, one] >$$< [false, true, zero, one]
-    == [ false -&&- false
-       , false -&&- true
-       , true -&&- false
-       , true -&&- true
-       , false -||- false
-       , false -||- true
-       , true -||- false
-       , true -||- true
-       , zero -+- zero
-       , zero -+- one
-       , one -+- zero
-       , one -+- one
-       , zero -*- zero
-       , zero -*- one
-       , one -*- zero
-       , one -*- one
-       ]
-
   , holds n $ \e -> sort (valuesBFS e) == sort (values e)
   , holds n $ \e -> holesBFS e == filter isHole (valuesBFS e)
   , valuesBFS false == [false]
@@ -174,4 +142,16 @@
   , zero $$   zero  ==  Nothing
   , zero $$|< zero  ==  Nothing
   , zero $$** zero  ==  Just (zero :$ zero)
+
+  , conflicts (one -+- two) (three -+- four) == [(one,three), (two,four)]
+  , conflicts (xx -:- nil) (xx -:- yy -:- yys) == [(nil, yy -:- yys)]
+  , conflicts (one -:- one -:- nil) (zero -:- zero -:- xx -:- xxs)
+    == [(one,zero), (nil,xx -:- xxs)]
+  , listConflicts [(one -+- one), (two -+- two), (three -+- three)] == [[one,two,three]]
+  , listConflicts [(one -+- zz), (two -+- yy), (three -+- xx)] == [[zz,yy,xx],[one,two,three]]
+
+  , holds n $ \e1 e2 -> map listPair (conflicts e1 e2) == listConflicts [e1,e2]
   ]
+
+listPair :: (a,a) -> [a]
+listPair (x,y)  =  [x,y]
