diff --git a/.gitignore b/.gitignore
--- a/.gitignore
+++ b/.gitignore
@@ -37,17 +37,17 @@
 bench/*.pdf
 mk/toplibs
 
-tests/test-compose-dynamic
-tests/test-engine
-tests/test-expr
-tests/test-eval
-tests/test-haexpress
-tests/test-kbc
-tests/test-order
-tests/test-creason
-tests/test-reason
-tests/test-stats
-tests/test-utils
+test/compose-dynamic
+test/engine
+test/expr
+test/eval
+test/haexpress
+test/kbc
+test/order
+test/creason
+test/reason
+test/stats
+test/utils
 eg/eg
 eg/algebraic-graphs
 eg/arith
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
 # Copyright:   (c) 2015-2019 Rudy Matela
 # License:     3-Clause BSD  (see the file LICENSE)
 # Maintainer:  Rudy Matela <rudy@matela.com.br>
-GHCIMPORTDIRS = src:eg:tests
+GHCIMPORTDIRS = src:eg:test
 GHCFLAGS = -O2 \
   $(shell grep -q "Arch Linux" /etc/lsb-release && echo -dynamic)
 # -Wall -Wno-name-shadowing -Wno-orphans -Wno-unused-matches
@@ -16,14 +16,14 @@
 MAXTESTS = 4000
 MAXSIZE = -s4
 TESTS = \
-  tests/test-creason \
-  tests/test-engine \
-  tests/test-eval \
-  tests/test-expr \
-  tests/test-order \
-  tests/test-reason \
-  tests/test-utils \
-  tests/test-stats
+  test/creason \
+  test/engine \
+  test/eval \
+  test/expr \
+  test/order \
+  test/reason \
+  test/utils \
+  test/stats
 MOSTEG = \
   eg/arith \
   eg/arith-negate-abs \
@@ -60,36 +60,36 @@
 # regexes needs regex-tdfa, which may break the build
 # speculate-reason output differs in different GHC versions
 QUICKTESTS = \
-  tests/test-engine \
-  tests/test-eval \
-  tests/test-expr \
-  tests/test-order \
-  tests/test-reason
+  test/engine \
+  test/eval \
+  test/expr \
+  test/order \
+  test/reason
 QUICKEG = \
   eg/arith \
   eg/bool \
   eg/list
-LIST_ALL_HSS = find src tests eg bench/*.hs -name \*.hs
+LIST_ALL_HSS = find src test eg bench/*.hs -name \*.hs
 LIST_LIB_HSS = find src -name \*.hs
 LIB_DEPS = base leancheck express cmdargs containers
 
 all: mk/toplibs
 
-quick-test: $(patsubst %,%.test,$(QUICKTESTS)) \
-            $(patsubst %,%.test-model,$(QUICKEG))
+quick-test: $(patsubst %,%.run,$(QUICKTESTS)) \
+            $(patsubst %,%.diff-test,$(QUICKEG))
 
 test: all test-sdist \
-  $(patsubst %,%.test,$(TESTS)) \
-  $(patsubst %,%.test-model,$(EG) $(wildcard bench/*-c))
+  $(patsubst %,%.run,$(TESTS)) \
+  $(patsubst %,%.diff-test,$(EG) $(wildcard bench/*-c))
 
-test-without-extra-deps: all $(patsubst %,%.test,$(TESTS)) \
-                             $(patsubst %,%.test-model,$(MOSTEG) $(wildcard bench/*-c))
+test-without-extra-deps: all $(patsubst %,%.run,$(TESTS)) \
+                             $(patsubst %,%.diff-test,$(MOSTEG) $(wildcard bench/*-c))
 
-test-extra-deps: all $(patsubst %,%.test,$(TESTS)) \
-                     $(patsubst %,%.test-model,$(EXTRAEG) $(wildcard bench/*-c))
+test-extra-deps: all $(patsubst %,%.run,$(TESTS)) \
+                     $(patsubst %,%.diff-test,$(EXTRAEG) $(wildcard bench/*-c))
 
 test-sdist:
-	./tests/test-sdist
+	./test/sdist
 
 legacy-test:
 	make clean  &&  make -j8 GHC=ghc-8.2   &&  make quick-test -j8 GHC=ghc-8.2
@@ -137,48 +137,48 @@
 slow-test: MAXSIZE =
 slow-test: test
 
-%.test: %
+%.run: %
 	./$< $(MAXTESTS)
 
-bench/%-c.test-model: eg/%
-	./tests/test-model $(MAXSIZE) bench/$*-c
+bench/%-c.diff-test: eg/%
+	./test/diff $(MAXSIZE) bench/$*-c
 
-bench/%-c.update-4-test-model: %
-	./tests/update-test-model -s4 bench/$*-c
+bench/%-c.update-4-diff-test: %
+	./test/update-diff -s4 bench/$*-c
 
-bench/%-c.update-slow-test-model: %
-	./tests/update-test-model     bench/$*-c
+bench/%-c.update-slow-diff-test: %
+	./test/update-diff     bench/$*-c
 
-%.test-model: %
-	./tests/test-model $(MAXSIZE) $<
+%.diff-test: %
+	./test/diff $(MAXSIZE) $<
 
-%.update-test-model: %
-	./tests/update-test-model -s4 $<
-	./tests/update-test-model     $<
+%.update-diff-test: %
+	./test/update-diff -s4 $<
+	./test/update-diff     $<
 
-%.update-4-test-model: %
-	./tests/update-test-model -s4 $<
+%.update-4-diff-test: %
+	./test/update-diff -s4 $<
 
-%.update-slow-test-model: %
-	./tests/update-test-model     $<
+%.update-slow-diff-test: %
+	./test/update-diff     $<
 
-%.update-7-test-model: %
-	./tests/update-test-model -s7 $<
+%.update-7-diff-test: %
+	./test/update-diff -s7 $<
 
-update-test-model: update-4-test-model update-slow-test-model
+update-diff-test: update-4-diff-test update-slow-diff-test
 
-update-4-test-model: $(patsubst %,%.update-4-test-model,$(EG) $(wildcard bench/*-c))
+update-4-diff-test: $(patsubst %,%.update-4-diff-test,$(EG) $(wildcard bench/*-c))
 
-update-slow-test-model: $(patsubst %,%.update-slow-test-model,$(EG) $(wildcard bench/*-c))
+update-slow-diff-test: $(patsubst %,%.update-slow-diff-test,$(EG) $(wildcard bench/*-c))
 
 bench: all
-	./tests/benchmark-cmp $(EG) bench/*-c
+	./test/benchmark-cmp $(EG) bench/*-c
 
 save-bench: all
-	./tests/benchmark-save $(EG) bench/*-c
+	./test/benchmark-save $(EG) bench/*-c
 
 memory-benchmark: all
-	./tests/memory-benchmark $(EG) bench/*-c
+	./test/memory-benchmark $(EG) bench/*-c
 
 qs-bench:
 	make -sC bench/qs1 bench
@@ -189,9 +189,9 @@
 	make -sC bench/qs2 save-bench
 
 update-listable-expr:
-	cp -rav ../express/test/Test/ListableExpr.hs tests/Test/
+	cp -rav ../express/test/Test/ListableExpr.hs test/Test/
 
-ghci: tests/Test.ghci
+ghci: test/Test.ghci
 
 clean: clean-hi-o clean-haddock
 	rm -f $(TESTS) $(EG) eg/*.dot eg/*.pdf TAGS tags mk/toplibs
@@ -199,13 +199,13 @@
 	make clean -C bench/qs2
 	rm -f doc/*.html doc/*.gif doc/*.css doc/*.js doc/*.png
 
-tests/Test.o: src/Test/Speculate.o
+test/Test.o: src/Test/Speculate.o
 
 # NOTE: (very hacky!) the following target allows parallel compilation (-jN) of
 # eg and tests programs so long as they don't share dependencies _not_ stored
-# in src/ and tests/.  Runnable binaries should depend on mk/toplibs instead of
+# in src/ and test/.  Runnable binaries should depend on mk/toplibs instead of
 # actual Haskell source files
-mk/toplibs: src/Test/Speculate.o tests/Test.o
+mk/toplibs: src/Test/Speculate.o test/Test.o
 	touch mk/toplibs
 
 hlint:
diff --git a/TODO.md b/TODO.md
--- a/TODO.md
+++ b/TODO.md
@@ -3,16 +3,14 @@
 
 A list of things to do for Speculate.
 
-* release new Speculate after releasing Express
-  (which will happen after I have a version of Extrapolate that uses Express)
-
-* `-U` / `--auto-constants` is broken, fix it.
+* simpilfy "bench" handing.  Do like in LeanCheck and Extrapolate.
 
-* simplify "test" handling.  Do like in LeanCheck and Extrapolate.
-  instead of having to run `make tests/test-something.test`,
-  run with `make test/something.run`.
+* improve performance of the Reason module:
+  when listing rewrites of a given expression,
+  I can use a custom data structure that computes
+  matches all at once while traversing an expression.
 
-* simpilfy "bench" handing.  Do like in LeanCheck and Extrapolate.
+* fix issues with Dershowitz and Knuth-Bendix orders.
 
 * (code readability) review and document code
 
@@ -25,24 +23,6 @@
   the expensive thing.  But it does not pay off to test x + y = z + w before
   testing x + y = y + x.  The second needs to hold for the first to hold.  And,
   it will be far more common!
-
-* (performance) Improve the performance of KBCompletion.
-  In the process of generating equivalences, the slowest function is complete,
-  accounting for 88 percent of runtime.  Of that:
-  - complete     -- 88%
-  - deduce       -- 79%
-  - normalizedCP -- 78%
-  - normalize    -- 68%
-  I don't think normalizedCriticalPairs / normalize can be optimized any
-  further.  Maybe the problem comes with complete itself, that should deduce
-  less often or even maybe interleave steps more often.  Maybe adding
-  normalizedCriticalPairs as soon as I add a rule?  Running deduce twice less
-  often does not help, as other steps take a bit over and deduce still accounts
-  for a high percentage (let's say 60%).  Possible fixes:
-  - implement deduce2, simplify2, compose2 and collapse2 from unfailing
-    completion
-  - finish groundJoinable from "Ordered Rewriting and Confluence" by
-    adding one last condition
 
 * (performance and interface): actually compute what happens with
   undefined values.  e.g.: head [] == undefined.  This will/may make things
diff --git a/bench/runtime-zero b/bench/runtime-zero
--- a/bench/runtime-zero
+++ b/bench/runtime-zero
@@ -1,35 +1,35 @@
 GHC 8.6.5
-express-0.0.4
+express-0.1.0
 leancheck-0.9.1
-arith               0.230
-arith-c             0.576
-arithficial         0.956
-arith-negate-abs    1.750
-binarytree          1.733
-binarytree0         0.510
-bool                1.503
-bool-c              1.290
-colour              2.066
-digraphs            1.596
-fun                 1.073
-insertsort          8.216
-insertsort0         0.970
-length              0.636
-list                2.606
-list-c              1.613
-minus               0.536
-minus-c             0.916
-monad               0.606
+arith               0.260
+arith-c             0.610
+arithficial         0.976
+arith-negate-abs    1.823
+binarytree          1.793
+binarytree0         0.533
+bool                1.950
+bool-c              1.753
+colour              2.206
+digraphs            1.603
+fun                 1.243
+insertsort          8.320
+insertsort0         1.000
+length              0.640
+list                2.730
+list-c              1.673
+minus               0.580
+minus-c             0.966
+monad               0.653
 nord                0.010
-oddeven             6.753
-plus-abs            3.633
-pretty              8.066
-ratio               9.143
-regexes             7.806
-sets                7.283
-speculate-reason    3.180
-string              0.896
-tauts               4.336
-tuples              1.303
+oddeven             6.930
+plus-abs            3.866
+pretty              9.183
+ratio               9.320
+regexes             8.300
+sets                7.610
+speculate-reason    3.710
+string              0.953
+tauts               4.466
+tuples              1.313
 unit                0.010
-zip                 1.993
+zip                 2.490
diff --git a/bin/compare-arith b/bin/compare-arith
--- a/bin/compare-arith
+++ b/bin/compare-arith
@@ -11,7 +11,7 @@
 sed -e "s/xd/id/" |
 sort > $qs2
 
-cat tests/model/arith |
+cat test/model/arith |
 grep " == " |
 sed -e "s/ *//" |
 sed -e 's/\([^a-z]\) (\([a-z]* .\))/\1 \2/g' |
diff --git a/bin/compare-arithficial b/bin/compare-arithficial
--- a/bin/compare-arithficial
+++ b/bin/compare-arithficial
@@ -17,7 +17,7 @@
 sed -e "s/xd/id/" |
 sort > $qs2
 
-cat tests/model/arithficial |
+cat test/model/arithficial |
 grep " == " |
 sed -e "s/ *//" |
 sed -e 's/\([^a-z]\) (\([a-z]* .\))/\1 \2/g' |
diff --git a/bin/compare-bool b/bin/compare-bool
--- a/bin/compare-bool
+++ b/bin/compare-bool
@@ -10,7 +10,7 @@
 sed -e "y/xyz/pqr/;s/=/==/" |
 sort > $qs2
 
-cat tests/model/bool |
+cat test/model/bool |
 grep " == " |
 sed -e "s/ *//" |
 sed -e 's/\([^a-z]\) (\([a-z]* .\))/\1 \2/g' |
diff --git a/eg/fun.hs b/eg/fun.hs
--- a/eg/fun.hs
+++ b/eg/fun.hs
@@ -6,8 +6,7 @@
   { maxTests = 1000
   , instances = [reifyInstances (undefined :: Int -> Int)]
   , constants =
-      [ hole (undefined :: Int -> Int)
-      , constant "map" (map :: (Int -> Int) -> [Int] -> [Int])
+      [ constant "map" (map :: (Int -> Int) -> [Int] -> [Int])
       , constant "id"  (id  :: Int -> Int)
       , constant "."   ((.) :: (Int -> Int) -> (Int -> Int) -> (Int -> Int))
       ]
diff --git a/eg/monad.hs b/eg/monad.hs
--- a/eg/monad.hs
+++ b/eg/monad.hs
@@ -11,8 +11,7 @@
 main = speculate args
   { instances = [reifyInstances (int >- [int])]
   , constants =
-      [ hole (int >- [int])
-      , constant "return" (return :: A -> [A])
+      [ constant "return" (return :: A -> [A])
       , constant ">>="    ((>>=) :: [A] -> (A -> [B]) -> [B])
       , constant ">=>"    ((>=>) :: (A -> [B]) -> (B -> [C]) -> (A -> [C]))
       ]
diff --git a/mk/depend.mk b/mk/depend.mk
--- a/mk/depend.mk
+++ b/mk/depend.mk
@@ -2,7 +2,6 @@
   bench/arithficial.hs \
   mk/toplibs
 bench/arithficial.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -36,7 +35,6 @@
   bench/nord.hs \
   mk/toplibs
 bench/nord.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -70,7 +68,6 @@
   bench/unit.hs \
   mk/toplibs
 bench/unit.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -104,7 +101,6 @@
   eg/algebraic-graphs.hs \
   mk/toplibs
 eg/algebraic-graphs.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -141,7 +137,6 @@
   eg/arith-negate-abs.hs \
   mk/toplibs
 eg/arith-negate-abs.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -172,7 +167,6 @@
   src/Test/Speculate/Args.hs \
   eg/arith-negate-abs.hs
 eg/arith.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -206,7 +200,6 @@
   eg/binarytree0.hs \
   mk/toplibs
 eg/binarytree0.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -240,7 +233,6 @@
   eg/binarytree.hs \
   mk/toplibs
 eg/binarytree.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -274,7 +266,6 @@
   eg/bool.hs \
   mk/toplibs
 eg/bool.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -308,7 +299,6 @@
   eg/colour.hs \
   mk/toplibs
 eg/colour.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -345,7 +335,6 @@
   eg/Digraph.hs \
   mk/toplibs
 eg/digraphs.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -380,7 +369,6 @@
   eg/fun.hs \
   mk/toplibs
 eg/fun.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -416,7 +404,6 @@
   eg/insertsort0.hs \
   mk/toplibs
 eg/insertsort0.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -450,7 +437,6 @@
   eg/insertsort.hs \
   mk/toplibs
 eg/insertsort.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -484,7 +470,6 @@
   eg/length.hs \
   mk/toplibs
 eg/length.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -518,7 +503,6 @@
   eg/list.hs \
   mk/toplibs
 eg/list.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -552,7 +536,6 @@
   eg/minus.hs \
   mk/toplibs
 eg/minus.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -586,7 +569,6 @@
   eg/monad.hs \
   mk/toplibs
 eg/monad.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -622,7 +604,6 @@
   eg/oddeven.hs \
   mk/toplibs
 eg/oddeven.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -656,7 +637,6 @@
   eg/plus-abs.hs \
   mk/toplibs
 eg/plus-abs.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -690,7 +670,6 @@
   eg/pretty-compact.hs \
   mk/toplibs
 eg/pretty-compact.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -724,7 +703,6 @@
   eg/pretty.hs \
   mk/toplibs
 eg/pretty.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -758,7 +736,6 @@
   eg/ratio.hs \
   mk/toplibs
 eg/ratio.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -793,7 +770,6 @@
   eg/regexes.hs \
   mk/toplibs
 eg/regexes.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -833,7 +809,6 @@
   eg/Set.hs \
   mk/toplibs
 eg/sets.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -865,9 +840,8 @@
   eg/sets.hs \
   eg/Set.hs
 eg/speculate-reason.o: \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
-  src/Test/Speculate/Utils/Typeable.hs \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -898,15 +872,14 @@
   src/Test/Speculate/Args.hs \
   eg/speculate-reason.hs
 eg/speculate-reason: \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
   eg/speculate-reason.hs \
   mk/toplibs
 eg/string: \
   eg/string.hs \
   mk/toplibs
 eg/string.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -946,7 +919,6 @@
   eg/Taut.hs \
   mk/toplibs
 eg/tauts.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -981,7 +953,6 @@
   eg/tuples.hs \
   mk/toplibs
 eg/tuples.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1015,7 +986,6 @@
   eg/zip.hs \
   mk/toplibs
 eg/zip.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1046,7 +1016,6 @@
   src/Test/Speculate/Args.hs \
   eg/zip.hs
 src/Test/Speculate/Args.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1064,7 +1033,6 @@
   src/Test/Speculate/Expr/Core.hs \
   src/Test/Speculate/Args.hs
 src/Test/Speculate/CondReason.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1087,7 +1055,6 @@
 src/Test/Speculate/Engine: \
   mk/toplibs
 src/Test/Speculate/Engine.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1113,11 +1080,9 @@
 src/Test/Speculate/Expr/Core: \
   mk/toplibs
 src/Test/Speculate/Expr/Core.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/List.hs \
   src/Test/Speculate/Expr/Core.hs
 src/Test/Speculate/Expr/Equate.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1132,7 +1097,6 @@
   src/Test/Speculate/Expr/Equate.hs \
   src/Test/Speculate/Expr/Core.hs
 src/Test/Speculate/Expr/Ground.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1148,7 +1112,6 @@
   src/Test/Speculate/Expr/Equate.hs \
   src/Test/Speculate/Expr/Core.hs
 src/Test/Speculate/Expr/Instance.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1162,7 +1125,6 @@
   src/Test/Speculate/Expr/Instance.hs \
   src/Test/Speculate/Expr/Core.hs
 src/Test/Speculate/Expr.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1179,7 +1141,6 @@
   src/Test/Speculate/Expr/Equate.hs \
   src/Test/Speculate/Expr/Core.hs
 src/Test/Speculate/Function/A1000.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1211,7 +1172,6 @@
   src/Test/Speculate/CondReason.hs \
   src/Test/Speculate/Args.hs
 src/Test/Speculate/Function/A100.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1243,7 +1203,6 @@
   src/Test/Speculate/CondReason.hs \
   src/Test/Speculate/Args.hs
 src/Test/Speculate/Function.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1276,7 +1235,6 @@
 src/Test/Speculate: \
   mk/toplibs
 src/Test/Speculate.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1306,7 +1264,6 @@
   src/Test/Speculate/CondReason.hs \
   src/Test/Speculate/Args.hs
 src/Test/Speculate/Pretty.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1329,7 +1286,6 @@
   src/Test/Speculate/Expr/Core.hs \
   src/Test/Speculate/CondReason.hs
 src/Test/Speculate/Reason/Order.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1347,7 +1303,6 @@
   src/Test/Speculate/Expr/Equate.hs \
   src/Test/Speculate/Expr/Core.hs
 src/Test/Speculate/Reason.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1366,7 +1321,6 @@
   src/Test/Speculate/Expr/Equate.hs \
   src/Test/Speculate/Expr/Core.hs
 src/Test/Speculate/Report.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1395,7 +1349,6 @@
   src/Test/Speculate/CondReason.hs \
   src/Test/Speculate/Args.hs
 src/Test/Speculate/Sanity.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1413,7 +1366,6 @@
   src/Test/Speculate/Expr/Equate.hs \
   src/Test/Speculate/Expr/Core.hs
 src/Test/Speculate/SemiReason.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1437,7 +1389,6 @@
 src/Test/Speculate/Utils/Colour.o: \
   src/Test/Speculate/Utils/Colour.hs
 src/Test/Speculate/Utils/Digraph.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1460,7 +1411,6 @@
 src/Test/Speculate/Utils/Ord.o: \
   src/Test/Speculate/Utils/Ord.hs
 src/Test/Speculate/Utils.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1482,14 +1432,10 @@
   src/Test/Speculate/Utils/Timeout.hs
 src/Test/Speculate/Utils/Tuple.o: \
   src/Test/Speculate/Utils/Tuple.hs
-src/Test/Speculate/Utils/Typeable.o: \
-  src/Test/Speculate/Utils/Typeable.hs \
-  src/Test/Speculate/Utils/List.hs
-tests/test-creason.o: \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
-  tests/test-creason.hs \
-  src/Test/Speculate/Utils/Typeable.hs \
+test/creason.o: \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
+  test/creason.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1518,16 +1464,15 @@
   src/Test/Speculate/Engine.hs \
   src/Test/Speculate/CondReason.hs \
   src/Test/Speculate/Args.hs
-tests/test-creason: \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
-  tests/test-creason.hs \
+test/creason: \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
+  test/creason.hs \
   mk/toplibs
-tests/test-engine.o: \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
-  tests/test-engine.hs \
-  src/Test/Speculate/Utils/Typeable.hs \
+test/engine.o: \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
+  test/engine.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1556,16 +1501,15 @@
   src/Test/Speculate/Engine.hs \
   src/Test/Speculate/CondReason.hs \
   src/Test/Speculate/Args.hs
-tests/test-engine: \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
-  tests/test-engine.hs \
+test/engine: \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
+  test/engine.hs \
   mk/toplibs
-tests/test-eval.o: \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
-  tests/test-eval.hs \
-  src/Test/Speculate/Utils/Typeable.hs \
+test/eval.o: \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
+  test/eval.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1594,16 +1538,15 @@
   src/Test/Speculate/Engine.hs \
   src/Test/Speculate/CondReason.hs \
   src/Test/Speculate/Args.hs
-tests/test-eval: \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
-  tests/test-eval.hs \
+test/eval: \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
+  test/eval.hs \
   mk/toplibs
-tests/test-expr.o: \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
-  tests/test-expr.hs \
-  src/Test/Speculate/Utils/Typeable.hs \
+test/expr.o: \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
+  test/expr.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1632,18 +1575,15 @@
   src/Test/Speculate/Engine.hs \
   src/Test/Speculate/CondReason.hs \
   src/Test/Speculate/Args.hs
-tests/test-expr: \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
-  tests/test-expr.hs \
+test/expr: \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
+  test/expr.hs \
   mk/toplibs
-tests/Test/ListableExpr.o: \
-  tests/Test/ListableExpr.hs
-tests/test-order.o: \
-  tests/Test.hs \
-  tests/test-order.hs \
-  tests/Test/ListableExpr.hs \
-  src/Test/Speculate/Utils/Typeable.hs \
+test/order.o: \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
+  test/order.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1672,15 +1612,15 @@
   src/Test/Speculate/Engine.hs \
   src/Test/Speculate/CondReason.hs \
   src/Test/Speculate/Args.hs
-tests/test-order: \
-  tests/Test.hs \
-  tests/test-order.hs \
-  tests/Test/ListableExpr.hs \
+test/order: \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
+  test/order.hs \
   mk/toplibs
-tests/Test.o: \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
-  src/Test/Speculate/Utils/Typeable.hs \
+test/reason.o: \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
+  test/reason.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1709,11 +1649,15 @@
   src/Test/Speculate/Engine.hs \
   src/Test/Speculate/CondReason.hs \
   src/Test/Speculate/Args.hs
-tests/test-reason.o: \
-  tests/test-reason.hs \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
-  src/Test/Speculate/Utils/Typeable.hs \
+test/reason: \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
+  test/reason.hs \
+  mk/toplibs
+test/stats.o: \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
+  test/stats.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1742,16 +1686,16 @@
   src/Test/Speculate/Engine.hs \
   src/Test/Speculate/CondReason.hs \
   src/Test/Speculate/Args.hs
-tests/test-reason: \
-  tests/test-reason.hs \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
+test/stats: \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
+  test/stats.hs \
   mk/toplibs
-tests/test-stats.o: \
-  tests/test-stats.hs \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
-  src/Test/Speculate/Utils/Typeable.hs \
+test/Test/ListableExpr.o: \
+  test/Test/ListableExpr.hs
+test/Test.o: \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1780,20 +1724,14 @@
   src/Test/Speculate/Engine.hs \
   src/Test/Speculate/CondReason.hs \
   src/Test/Speculate/Args.hs
-tests/test-stats: \
-  tests/test-stats.hs \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
-  mk/toplibs
-tests/Test: \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
+test/Test: \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
   mk/toplibs
-tests/test-utils.o: \
-  tests/test-utils.hs \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
-  src/Test/Speculate/Utils/Typeable.hs \
+test/utils.o: \
+  test/utils.hs \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
   src/Test/Speculate/Utils/Tuple.hs \
   src/Test/Speculate/Utils/Timeout.hs \
   src/Test/Speculate/Utils/Tiers.hs \
@@ -1822,8 +1760,8 @@
   src/Test/Speculate/Engine.hs \
   src/Test/Speculate/CondReason.hs \
   src/Test/Speculate/Args.hs
-tests/test-utils: \
-  tests/test-utils.hs \
-  tests/Test.hs \
-  tests/Test/ListableExpr.hs \
+test/utils: \
+  test/utils.hs \
+  test/Test.hs \
+  test/Test/ListableExpr.hs \
   mk/toplibs
diff --git a/speculate.cabal b/speculate.cabal
--- a/speculate.cabal
+++ b/speculate.cabal
@@ -1,5 +1,5 @@
 name:                speculate
-version:             0.4.0
+version:             0.4.1
 synopsis:            discovery of properties about Haskell functions
 description:
   Speculate automatically discovers laws about Haskell functions.
@@ -58,14 +58,14 @@
                   , mk/haddock-i
                   , mk/haskell.mk
                   , stack.yaml
-                  , tests/benchmark
-                  , tests/benchmark-cmp
-                  , tests/benchmark-save
-                  , tests/memory-benchmark
-                  , tests/model/*.out
-                  , tests/test-model
-                  , tests/test-sdist
-                  , tests/update-test-model
+                  , test/benchmark
+                  , test/benchmark-cmp
+                  , test/benchmark-save
+                  , test/memory-benchmark
+                  , test/model/*.out
+                  , test/diff
+                  , test/update-diff
+                  , test/sdist
 
 tested-with: GHC==8.6
            , GHC==8.4
@@ -81,7 +81,7 @@
 source-repository this
   type:            git
   location:        https://github.com/rudymatela/speculate
-  tag:             v0.4.0
+  tag:             v0.4.1
 
 
 library
@@ -116,67 +116,66 @@
                  , Test.Speculate.Utils.Tiers
                  , Test.Speculate.Utils.Timeout
                  , Test.Speculate.Utils.Tuple
-                 , Test.Speculate.Utils.Typeable
   build-depends: base >= 4 && < 5
                , leancheck >= 0.9.1
-               , express >= 0.1.0
+               , express >= 0.1.1
                , cmdargs
                , containers
   hs-source-dirs:    src
   default-language:  Haskell2010
 
 test-suite creason
-  main-is:           test-creason.hs
+  main-is:           creason.hs
   other-modules:     Test, Test.ListableExpr
-  hs-source-dirs:    tests
+  hs-source-dirs:    test
   build-depends:     base >= 4 && < 5, leancheck, express, speculate
   default-language:  Haskell2010
   type:              exitcode-stdio-1.0
 
 test-suite engine
-  main-is:           test-engine.hs
+  main-is:           engine.hs
   other-modules:     Test, Test.ListableExpr
-  hs-source-dirs:    tests
+  hs-source-dirs:    test
   build-depends:     base >= 4 && < 5, leancheck, express, speculate
   default-language:  Haskell2010
   type:              exitcode-stdio-1.0
 
 test-suite eval
-  main-is:           test-eval.hs
+  main-is:           eval.hs
   other-modules:     Test, Test.ListableExpr
-  hs-source-dirs:    tests
+  hs-source-dirs:    test
   build-depends:     base >= 4 && < 5, leancheck, express, speculate
   default-language:  Haskell2010
   type:              exitcode-stdio-1.0
 
 test-suite expr
-  main-is:           test-expr.hs
+  main-is:           expr.hs
   other-modules:     Test, Test.ListableExpr
-  hs-source-dirs:    tests
+  hs-source-dirs:    test
   build-depends:     base >= 4 && < 5, leancheck, express, speculate
   default-language:  Haskell2010
   type:              exitcode-stdio-1.0
 
 test-suite order
-  main-is:           test-order.hs
+  main-is:           order.hs
   other-modules:     Test, Test.ListableExpr
-  hs-source-dirs:    tests
+  hs-source-dirs:    test
   build-depends:     base >= 4 && < 5, leancheck, express, speculate
   default-language:  Haskell2010
   type:              exitcode-stdio-1.0
 
 test-suite reason
-  main-is:           test-reason.hs
+  main-is:           reason.hs
   other-modules:     Test, Test.ListableExpr
-  hs-source-dirs:    tests
+  hs-source-dirs:    test
   build-depends:     base >= 4 && < 5, leancheck, express, speculate
   default-language:  Haskell2010
   type:              exitcode-stdio-1.0
 
 test-suite utils
-  main-is:           test-utils.hs
+  main-is:           utils.hs
   other-modules:     Test, Test.ListableExpr
-  hs-source-dirs:    tests
+  hs-source-dirs:    test
   build-depends:     base >= 4 && < 5, leancheck, express, speculate
   default-language:  Haskell2010
   type:              exitcode-stdio-1.0
@@ -189,9 +188,9 @@
   type:              exitcode-stdio-1.0
 
 benchmark test-stats
-  main-is:           test-stats.hs
+  main-is:           stats.hs
   other-modules:     Test, Test.ListableExpr
-  hs-source-dirs:    tests
+  hs-source-dirs:    test
   build-depends:     base >= 4 && < 5, leancheck, express, speculate
   default-language:  Haskell2010
   type:              exitcode-stdio-1.0
diff --git a/src/Test/Speculate/Args.hs b/src/Test/Speculate/Args.hs
--- a/src/Test/Speculate/Args.hs
+++ b/src/Test/Speculate/Args.hs
@@ -190,7 +190,7 @@
        `union` [val True  | showConds || showDot args]
        `union` [val False | showConds || showDot args]
        `union` (nubSort . catMaybes) [lookupComparison "==" t is | showConds, t <- ts] ]
-         \-/ foldr (\/) [] [lookupTiersT is t | autoConstants args, t <- ts]
+         \-/ foldr (\/) [] [lookupTiersT is t | autoConstants args, t <- ts, isListableT is t]
   where
   ts = types args
   is = computeInstances args
@@ -202,7 +202,7 @@
 
 -- misnomer: these are not all types, but just the star kinded ones...
 types :: Args -> [TypeRep]
-types = nubMergeMap (typesIn . typ) . allConstants
+types = typesInList . map typ . allConstants
 
 foregroundConstants, backgroundConstants :: Args -> [Expr]
 foregroundConstants = fst . partitionByMarkers foreground background . constants
diff --git a/src/Test/Speculate/Engine.hs b/src/Test/Speculate/Engine.hs
--- a/src/Test/Speculate/Engine.hs
+++ b/src/Test/Speculate/Engine.hs
@@ -168,14 +168,15 @@
   | not (s === s) = (thy,sssWs)  -- uncomparable type
   | rehole (normalizeE thy (mostGeneral s)) `elem` ss = (thy,sss)
   | otherwise =
-    ( append thy $ equivalencesBetween (===) s s ++ eqs
+    ( append thy $ equivalencesBetween (-===-) s s ++ eqs
     , if any (\(e1,e2) -> unrepeatedVars e1 && unrepeatedVars e2) eqs
         then sss
         else sssWs )
     where
+    e1 -===- e2  =  normalize thy e1 == normalize thy e2 || e1 === e2
     ss = uptoT sz sss
     sssWs = sss \/ wcons0 sz s
-    eqs = concatMap (equivalencesBetween (===) s) $ filter (s ===) ss
+    eqs = concatMap (equivalencesBetween (-===-) s) $ filter (s ===) ss
     wcons0 :: Int -> a -> [[a]]
     wcons0 n s = replicate (n-1) [] ++ [[s]]
 
@@ -294,11 +295,13 @@
 subConsequence :: Thy -> [Class Expr] -> Expr -> Expr -> Expr -> Bool
 subConsequence thy clpres ((Value "==" _ :$ ea) :$ eb) e1 e2
   -- NOTE: the first 4 are uneeded, but make it a bit faster...
-  | ea `isSubexprOf` e1 && equivalent thy{closureLimit=1} (sub ea eb e1) e2 = True
-  | eb `isSubexprOf` e1 && equivalent thy{closureLimit=1} (sub eb ea e1) e2 = True
-  | ea `isSubexprOf` e2 && equivalent thy{closureLimit=1} (sub ea eb e2) e1 = True
-  | eb `isSubexprOf` e2 && equivalent thy{closureLimit=1} (sub eb ea e2) e1 = True
+  | ea `isSubexprOf` e1 && equivalent thy{closureLimit=1} (e1 / (ea,eb)) e2 = True
+  | eb `isSubexprOf` e1 && equivalent thy{closureLimit=1} (e1 / (eb,ea)) e2 = True
+  | ea `isSubexprOf` e2 && equivalent thy{closureLimit=1} (e2 / (ea,eb)) e1 = True
+  | eb `isSubexprOf` e2 && equivalent thy{closureLimit=1} (e2 / (eb,ea)) e1 = True
   | equivalent ((ea,eb) `insert` thy){closureLimit=1} e1 e2 = True
+  where
+  e / (e1,e2)  =  e // [(e1,e2)]
 subConsequence thy clpres ce e1 e2 = or
   [ subConsequence thy clpres ce' e1 e2
   | (rce,ces) <- clpres, ce == rce, ce' <- ces ]
diff --git a/src/Test/Speculate/Expr.hs b/src/Test/Speculate/Expr.hs
--- a/src/Test/Speculate/Expr.hs
+++ b/src/Test/Speculate/Expr.hs
@@ -12,7 +12,6 @@
   , module Test.Speculate.Expr.Ground
   , module Test.Speculate.Expr.Instance
   , module Test.Speculate.Expr.Equate
-  , module Test.Speculate.Utils.Typeable
   )
 where
 
@@ -20,4 +19,3 @@
 import Test.Speculate.Expr.Ground
 import Test.Speculate.Expr.Instance
 import Test.Speculate.Expr.Equate
-import Test.Speculate.Utils.Typeable
diff --git a/src/Test/Speculate/Expr/Core.hs b/src/Test/Speculate/Expr/Core.hs
--- a/src/Test/Speculate/Expr/Core.hs
+++ b/src/Test/Speculate/Expr/Core.hs
@@ -9,6 +9,7 @@
 -- This module reexports 'Data.Express' along with some extra utilities.
 module Test.Speculate.Expr.Core
   ( module Data.Express
+  , module Data.Express.Utils.Typeable
 
   -- * Order
   , lexicompare
@@ -22,7 +23,6 @@
   -- * Assigning
   , Binds
   , fill
-  , sub
 
   -- * Matching
   , unify
@@ -33,7 +33,7 @@
 where
 
 import Data.Express
-import Test.Speculate.Utils.Typeable
+import Data.Express.Utils.Typeable
 import Test.Speculate.Utils.List
 import Data.Monoid ((<>))
 import Data.Functor ((<$>)) -- for GHC <= 7.8
@@ -85,15 +85,6 @@
                         in (e1' :$ e2', es'')
   fill' eh (e:es) | isHole eh && typ eh == typ e = (e,es)
   fill' e es = (e,es)
-
--- | Substitute matching subexpressios.
---
--- sub (x + y) 0 ((x + y) + z) == (0 + z)
--- sub (x + y) 0 (x + (y + z)) == (x + (y + z))
---
--- TODO: remove
-sub :: Expr -> Expr -> Expr -> Expr
-sub ef et = (// [(ef,et)])
 
 unify :: Expr -> Expr -> Maybe Expr
 unify e1 e2 = (e1 //-) <$> unification e1 e2
diff --git a/src/Test/Speculate/Reason.hs b/src/Test/Speculate/Reason.hs
--- a/src/Test/Speculate/Reason.hs
+++ b/src/Test/Speculate/Reason.hs
@@ -28,7 +28,6 @@
   , criticalPairs
   , normalizedCriticalPairs
   , append
-  , difference
 
   , okThy
   , canonicalEqn
@@ -273,13 +272,12 @@
 append :: Thy -> [Equation] -> Thy
 append thy eqs = updateEquationsBy (nubSort . (++ eqs')) thy
   where
-  eqs' = [ canonicalizeEqn thy (e1,e2)
-         | (e1,e2) <- eqs, normalize thy e1 /= normalize thy e2 ]
-
-difference :: Thy -> Thy -> Thy
-difference thy1@Thy {equations = eqs1, rules = rs1}
-           thy2@Thy {equations = eqs2, rules = rs2} =
-  thy1 {equations = eqs1 \\ eqs2, rules = rs1 \\ rs2}
+  eqs' = [ canonicalizeEqn thy (e1',e2')
+         | (e1,e2) <- eqs
+         , let e1' = normalize thy e1
+         , let e2' = normalize thy e2
+         , e1' /= e2'
+         ]
 
 complete :: Thy -> Thy
 complete = iterateUntil (==)
diff --git a/src/Test/Speculate/Report.hs b/src/Test/Speculate/Report.hs
--- a/src/Test/Speculate/Report.hs
+++ b/src/Test/Speculate/Report.hs
@@ -94,13 +94,13 @@
 warnMissingInstances is ts = putLines
   $  ["Warning: no Listable instance for " ++ show t ++
       ", variables of this type will not be considered"
-     | t <- ts, not (isListableT is t)]
+     | t <- ts, not (isFunTy t), not (isListableT is t)]
   ++ ["Warning: no Eq instance for " ++ show t ++
       ", equations of this type will not be considered"
-     | t <- ts, not (isEqT is t)]
+     | t <- ts, not (isFunTy t), not (isEqT is t)]
   ++ ["Warning: no Ord instance for " ++ show t ++
       ", inequations of this type will not be considered"
-     | t <- ts, not (isOrdT is t)]
+     | t <- ts, not (isFunTy t), not (isOrdT is t)]
 
 reportClassesFor :: Instances -> Int -> [Int] -> Thy -> [Expr] -> IO ()
 reportClassesFor ti nTests nVarss thy res = do
diff --git a/src/Test/Speculate/Sanity.hs b/src/Test/Speculate/Sanity.hs
--- a/src/Test/Speculate/Sanity.hs
+++ b/src/Test/Speculate/Sanity.hs
@@ -30,7 +30,7 @@
 -- returns a list of errors on the Eq instances (if any)
 -- returns an empty list when ok
 eqErrors :: Instances -> Int -> TypeRep -> [String]
-eqErrors is n t =
+eqErrors is n t = takeWhile (const $ isListableT is t) $
      ["not reflexive"  | f   (x -==- x)]
   ++ ["not symmetric"  | f  ((x -==- y) -==- (y -==- x))]
   ++ ["not transitive" | f (((x -==- y) -&&- (y -==- z)) -==>- (x -==- z))]
@@ -44,7 +44,7 @@
 
 -- returns a list of errors on the Ord instance (if any)
 ordErrors :: Instances -> Int -> TypeRep -> [String]
-ordErrors is n t =
+ordErrors is n t = takeWhile (const $ isListableT is t) $
      ["not reflexive"     | f   (x -<=- x)]
   ++ ["not antisymmetric" | f (((x -<=- y) -&&- (y -<=- x)) -==>- (x -==- y))]
   ++ ["not transitive"    | f (((x -<=- y) -&&- (y -<=- z)) -==>- (x -<=- z))]
@@ -60,12 +60,15 @@
 eqOrdErrors :: Instances -> Int -> TypeRep -> [String]
 eqOrdErrors is n t =
      [ "(==) :: " ++ ty ++ "  is not an equiavalence (" ++ intercalate ", " es ++ ")"
-     | let es = eqErrors is n t, isEqT is t, not (null es) ]
+     | listable, eq,  let es = eqErrors  is n t, not (null es) ]
   ++ [ "(<=) :: " ++ ty ++ "  is not an ordering ("     ++ intercalate ", " es ++ ")"
-     | let es = ordErrors is n t, isOrdT is t, not (null es) ]
+     | listable, ord, let es = ordErrors is n t, not (null es) ]
   ++ [ "(==) and (<=) :: " ++ ty ++ " are inconsistent: (x == y) /= (x <= y && y <= x)"
-     | f $ (x -==- y) -==- (x -<=- y -&&- y -<=- x), isEqT is t, isOrdT is t ]
+     | listable, eq, ord, f $ (x -==- y) -==- (x -<=- y -&&- y -<=- x) ]
   where
+  listable = isListableT is t
+  eq       = isEqT       is t
+  ord      = isOrdT      is t
   f = not . isTrue (take n . grounds (lookupTiers is))
   e = holeOfTy is t
   x = "x" `varAsTypeOf` e
diff --git a/src/Test/Speculate/Utils.hs b/src/Test/Speculate/Utils.hs
--- a/src/Test/Speculate/Utils.hs
+++ b/src/Test/Speculate/Utils.hs
@@ -18,7 +18,6 @@
   , module Test.Speculate.Utils.String
   , module Test.Speculate.Utils.List
   , module Test.Speculate.Utils.Tiers
-  , module Test.Speculate.Utils.Typeable
   , module Test.Speculate.Utils.Timeout
   , module Test.Speculate.Utils.Ord
   , module Test.Speculate.Utils.Memoize
@@ -31,7 +30,6 @@
 import Test.Speculate.Utils.String
 import Test.Speculate.Utils.List
 import Test.Speculate.Utils.Tiers
-import Test.Speculate.Utils.Typeable
 import Test.Speculate.Utils.Timeout
 import Test.Speculate.Utils.Ord
 import Test.Speculate.Utils.Memoize
diff --git a/src/Test/Speculate/Utils/Typeable.hs b/src/Test/Speculate/Utils/Typeable.hs
deleted file mode 100644
--- a/src/Test/Speculate/Utils/Typeable.hs
+++ /dev/null
@@ -1,28 +0,0 @@
--- |
--- Module      : Test.Speculate.Utils.Typeable
--- Copyright   : (c) 2016-2019 Rudy Matela
--- License     : 3-Clause BSD  (see the file LICENSE)
--- Maintainer  : Rudy Matela <rudy@matela.com.br>
---
--- This module is part of Speculate.
---
--- Utilities to manipulate 'TypeRep's (of 'Typeable' values).
-module Test.Speculate.Utils.Typeable
-  ( module Data.Express.Utils.Typeable
-  , typesIn
-  )
-where
-
-import Data.Express.Utils.Typeable
-import Test.Speculate.Utils.List ((+++))
-
--- | For a given type, return all *-kinded types.
---   (all non-function types)
---
--- > typesIn (typeOf (undefined :: (Int -> Int) -> Int -> Bool))
--- >   == [Bool,Int]
-typesIn :: TypeRep -> [TypeRep]
-typesIn t
-  | isFunTy t = typesIn (argumentTy t)
-            +++ typesIn (resultTy   t)
-  | otherwise = [t]
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -5,7 +5,7 @@
 
 extra-deps:
 - leancheck-0.9.1
-- express-0.1.0
+- express-0.1.1
 
 flags: {}
 
diff --git a/test/Test.hs b/test/Test.hs
new file mode 100644
--- /dev/null
+++ b/test/Test.hs
@@ -0,0 +1,237 @@
+-- | This module defines utilities to test 'Speculate' itself.
+--
+-- It should never be exported in a cabal package, and should not be included
+-- in Haddock documentation.  Hence the weird name, simply "Test".
+--
+-- This module exports a Listable Expr instance, that does not, by any means,
+-- list all possible expressions.  But instead, list expressions based on the
+-- names exported by this module.
+module Test
+  (
+  -- * Module exports
+    module Test.LeanCheck
+  , module Test.LeanCheck.Utils
+  , module Test.Speculate
+  , module Data.Express.Fixtures
+  , module Test.ListableExpr
+
+  -- * Test reporting
+  , reportTests
+  , getMaxTestsFromArgs
+  , mainTest
+  , printLines
+
+  -- * Test types
+  , listThyInefficient
+
+  , Thyght (..)
+  , Equation (..)
+
+  -- * Test fixtures
+  , foo, goo
+
+  -- * Enumerate expressions
+  , expressionsT
+  )
+where
+
+import Test.LeanCheck
+import Test.LeanCheck.Utils hiding (comparison)
+
+import Data.Express.Fixtures
+
+import System.Environment (getArgs)
+import System.Exit (exitFailure)
+import Data.List (elemIndices)
+
+import Test.Speculate hiding (getArgs)
+import Test.Speculate.Reason
+import Test.Speculate.Reason.Order
+
+import Data.List (sort)
+
+import Test.Speculate.Utils
+
+import Test.ListableExpr
+
+
+-- test reporting --
+
+reportTests :: [Bool] -> IO ()
+reportTests tests  =  case elemIndices False tests of
+  [] -> putStrLn "+++ Tests passed!"
+  is -> putStrLn ("*** Failed tests:" ++ show is) >> exitFailure
+
+getMaxTestsFromArgs :: Int -> IO Int
+getMaxTestsFromArgs n = do
+  as <- getArgs
+  return $ case as of
+             (s:_) -> read s
+             _     -> n
+
+mainTest :: (Int -> [Bool]) -> Int -> IO ()
+mainTest tests n' = do
+  n <- getMaxTestsFromArgs n'
+  reportTests (tests n)
+
+printLines :: Show a => [a] -> IO ()
+printLines = putStrLn . unlines . map show
+
+
+-- test fixtures --
+
+foo :: Expr -> Expr
+foo = (value "f" (undefined :: Int -> Int) :$)
+
+goo :: Expr -> Expr
+goo = (value "g" (undefined :: Int -> Int) :$)
+
+
+-- test types --
+
+data Rule = Rule Expr Expr deriving (Show, Eq, Ord)
+data Equation = Equation Expr Expr deriving (Show, Eq, Ord)
+newtype RuleSet = RuleSet [(Expr,Expr)] deriving Show
+newtype EquationSet = EquationSet [(Expr,Expr)] deriving Show
+newtype Thyght = Thyght { unThyght :: Thy } deriving Show
+
+
+-- Listable instances --
+
+-- beware: enumerating beyond 600 values will  make this very slow as it is
+-- very hard to satisfy canonicalEqn and ->-.  In practice, this should not be a
+-- problem as we enumerate far less than that when enerating 'Thy's.
+instance Listable Rule where
+  tiers = (`ofWeight` 0)
+        . filterT (\(Rule e1 e2) -> canonicalRule (e1,e2) && e1 ->- e2)
+        . mapT (uncurry Rule . orientRule)
+        . filterT (uncurry (<))
+        . mapT unSameTypeE
+        $ tiers
+    where
+    (->-) = canReduceTo emptyThy
+    orientRule (e1,e2) | e1 ->- e2 = (e1,e2)
+                       | otherwise = (e2,e1)
+
+instance Listable Equation where
+  tiers = (`ofWeight` 0)
+        . mapT (uncurry Equation)
+        . filterT (canonicalEqn emptyThy)
+        . mapT orientEqn
+        . filterT (uncurry (<=))
+        . mapT unSameTypeE
+        $ tiers
+    where
+    orientEqn (e1,e2) | e1 `compare` e2 == LT = (e2,e1)
+                      | otherwise             = (e1,e2)
+
+instance Listable RuleSet where
+  tiers = setCons (RuleSet . map unRule) `ofWeight` 0
+    where
+    unRule (Rule e1 e2) = (e1,e2)
+
+instance Listable EquationSet where
+  tiers = setCons (EquationSet . map unEquation) `ofWeight` 0
+    where
+    unEquation (Equation e1 e2) = (e1,e2)
+
+instance Listable Thy where
+  tiers = concatMapT expandCanReduceTo
+        $ concatMapT expandClosureLimit
+        $ concatMapT expandKeepE
+        $ cons2 (\(RuleSet rs) (EquationSet eqs)
+                   -> emptyThy { rules     = sort rs
+                               , equations = sort eqs })
+
+instance Listable Thyght where
+  tiers = mapT Thyght
+        $ concatMapT expandCanReduceTo
+        $ concatMapT expandClosureLimit
+        $ mapT defaultKeep
+        $ cons2 (\(RuleSet rs) (EquationSet eqs)
+                   -> emptyThy { rules     = sort rs
+                               , equations = sort eqs })
+
+expandKeepE :: Thy -> [[Thy]]
+expandKeepE thy = cons0 thy
+               \/ cons0 thy {keepE = keepUpToLength (maxLen + 0)} `ofWeight` 1
+               \/ cons0 thy {keepE = keepUpToLength (maxLen + 1)} `ofWeight` 2
+               \/ cons0 thy {keepE = keepUpToLength (maxLen + 2)} `ofWeight` 4
+               \/ cons0 thy {keepE = keepUpToLength (maxLen + 3)} `ofWeight` 6
+               \/ cons0 thy {keepE = keepUpToLength (maxLen + 4)} `ofWeight` 8
+  where
+  maxLen = maximum . (0:) . map size . catPairs $ equations thy ++ rules thy
+
+expandClosureLimit :: Thy -> [[Thy]]
+expandClosureLimit thy = cons0 thy {closureLimit = 3}
+                      \/ cons0 thy {closureLimit = 0} `ofWeight` 1
+                      \/ cons0 thy {closureLimit = 2} `ofWeight` 2
+                      \/ cons0 thy {closureLimit = 1} `ofWeight` 3
+
+-- TODO: make Listable Thy enumeration complete w.r.t: canReduceTo
+-- for a complete version, Listable Rule will have to be transformed on a
+-- higher order function that take canReduceTo.  (harder to maintain)
+expandCanReduceTo :: Thy -> [[Thy]]
+expandCanReduceTo thy = cons0 thy
+                     \/ if all (uncurry (|>|)) (rules thy)
+                          then cons0 thy {canReduceTo = (|>|)} `ofWeight` 1
+                          else []
+-- FIXME: KBO is broken ATM:
+--                   \/ if all (uncurry ( >|)) (rules thy)
+--                        then cons0 thy {canReduceTo = ( >|)} `ofWeight` 2
+--                        else []
+
+listThyInefficient :: [Thy]
+listThyInefficient = concat
+                   . concatMapT expandCanReduceTo
+                   . concatMapT expandClosureLimit
+                   . concatMapT expandKeepE
+                   $ cons2 (\(SameTypedPairsE rs) (SameTypedPairsE eqs)
+                              -> emptyThy { rules     = sort rs
+                                          , equations = sort eqs
+                                          }) `suchThat` okThy
+
+-- Quick and Dirty!
+instance Show Thy where
+  show Thy { rules = rs
+           , equations = eqs
+           , canReduceTo = (->-)
+           , closureLimit = cl
+           , keepE = keep
+           }
+    = "Thy { rules = "
+   ++ drop 14 (indent 14 . listLines $ map showEquation rs)
+   ++ "    , equations = "
+   ++ drop 18 (indent 18 . listLines $ map showEquation eqs)
+   ++ "    , canReduceTo = " ++ showCanReduceTo (->-) ++ "\n"
+   ++ "    , closureLimit = " ++ show cl ++ "\n"
+   ++ "    , keepE = " ++ showKeepE keep ++ "\n"
+   ++ "    }"
+    where
+    showEquation (e1,e2) = showExpr e1 ++ " == " ++ showExpr e2
+    listLines [] = "[]"
+    listLines ss = '[':(tail . unlines $ map (", " ++) ss) ++ "]"
+    showCanReduceTo (->-) | holds 1000 $ (->-) ==== (|>|) = "(|>|)"
+                          | holds 1000 $ (->-) ==== ( >|) =  "(>|)"
+                          | holds 1000 $ (->-) ==== (|> ) = "(|>)"
+                          | otherwise = "(??)"
+    showKeepE keep | holds 1000 $ keep === const True = "const True"
+                   | holds 1000 $ keep === keepUpToLength 0 = "keepUpToLength 0"
+                   | holds 1000 $ keep === keepUpToLength 1 = "keepUpToLength 1"
+                   | holds 1000 $ keep === keepUpToLength 2 = "keepUpToLength 2"
+                   | holds 1000 $ keep === keepUpToLength 3 = "keepUpToLength 3"
+                   | holds 1000 $ keep === keepUpToLength 4 = "keepUpToLength 4"
+                   | holds 1000 $ keep === keepUpToLength 5 = "keepUpToLength 5"
+                   | holds 1000 $ keep === keepUpToLength 6 = "keepUpToLength 6"
+                   | holds 1000 $ keep === keepUpToLength 7 = "keepUpToLength 7"
+                   | holds 1000 $ keep === keepUpToLength 8 = "keepUpToLength 8"
+                   | holds 1000 $ keep === keepUpToLength 9 = "keepUpToLength 9"
+                   | otherwise = "\\e -> ??"
+
+expressionsT :: [Expr] -> [[Expr]]
+expressionsT ds = [ds] \/ productMaybeWith ($$) es es `addWeight` 1
+  where
+  es = expressionsT ds
+-- TODO: maybe use expressionsT as the main function to generate Exprs.
+-- By using it, I speculate a 20% increase in runtime.  But the code will
+-- certainly be smaller and easier to maintain.
diff --git a/test/Test/ListableExpr.hs b/test/Test/ListableExpr.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/ListableExpr.hs
@@ -0,0 +1,272 @@
+module Test.ListableExpr
+  (
+  -- * The Expr type
+    Expr
+
+  -- * Expressions of a type
+  , IntE (..)
+  , BoolE (..)
+  , IntsE (..)
+  , CharE (..)
+
+  , IntE0 (..)
+  , IntEV (..)
+  , BoolE0 (..)
+  , BoolEV (..)
+  , IntsE0 (..)
+  , IntsEV (..)
+  , CharE0 (..)
+  , CharEV (..)
+
+  -- ** Functional values
+  , IntToIntE (..)
+  , IntToIntToIntE (..)
+  , BoolToBoolE (..)
+  , BoolToBoolToBoolE (..)
+
+  , SameTypeE (..)
+  , unSameTypeE
+  , SameTypedPairsE (..)
+
+  -- * Terminal expressions
+  , E0 (..)
+  , EV (..)
+
+  -- * Ill typed expressions
+  , Ill (..)
+  )
+where
+
+-- TODO: StringE
+
+import Test.LeanCheck
+import Test.LeanCheck.Function.ShowFunction
+import Data.Express.Fixtures
+import Data.Function (on)
+
+-- | Terminal constants.
+newtype E0  =  E0 { unE0 :: Expr }
+
+-- | Variables.
+newtype EV  =  EV { unEV :: Expr }
+
+-- | Expression of 'Int' type.
+newtype IntE  =  IntE { unIntE :: Expr }
+
+-- | Constant terminal value of 'Int' type.
+newtype IntE0  =  IntE0 { unIntE0 :: Expr }
+
+-- | Varialbe of 'Int' type.
+newtype IntEV  =  IntEV { unIntEV :: Expr }
+
+-- | Functions from Int to Int
+newtype IntToIntE  =  IntToIntE { unIntToIntE :: Expr }
+newtype IntToIntToIntE  =  IntToIntToIntE { unIntToIntToIntE :: Expr }
+
+-- | Expression of 'Bool' type.
+newtype BoolE  =  BoolE { unBoolE :: Expr }
+
+-- | Constant terminal value of 'Bool' type.
+newtype BoolE0  =  BoolE0 { unBoolE0 :: Expr }
+
+-- | Varialbe of 'Bool' type.
+newtype BoolEV  =  BoolEV { unBoolEV :: Expr }
+
+-- | Functions from Bool to Bool
+newtype BoolToBoolE  =  BoolToBoolE { unBoolToBoolE :: Expr }
+newtype BoolToBoolToBoolE  =  BoolToBoolToBoolE { unBoolToBoolToBoolE :: Expr }
+
+newtype CharE  =  CharE { unCharE :: Expr }
+
+newtype CharE0  =  CharE0 { unCharE0 :: Expr }
+
+newtype CharEV  =  CharEV { unCharEV :: Expr }
+
+data SameTypeE  =  SameTypeE Expr Expr
+
+unSameTypeE :: SameTypeE -> (Expr,Expr)
+unSameTypeE (SameTypeE e1 e2)  =  (e1,e2)
+
+data SameTypedPairsE  =  SameTypedPairsE { unSameTypedPairsE :: [(Expr,Expr)] }
+
+-- | Ill typed expressions.
+newtype Ill  =  Ill { unIll :: Expr }
+
+
+instance Show E0  where  show (E0 e) = show e
+instance Show EV  where  show (EV e) = show e
+
+instance Show IntE  where  show (IntE e) = show e
+
+instance Show IntE0  where  show (IntE0 e) = show e
+instance Show IntEV  where  show (IntEV e) = show e
+
+instance Show IntToIntE  where  show (IntToIntE e) = show e
+instance Show IntToIntToIntE  where  show (IntToIntToIntE e) = show e
+
+instance Show BoolE  where  show (BoolE e) = show e
+
+instance Show BoolE0  where  show (BoolE0 e) = show e
+instance Show BoolEV  where  show (BoolEV e) = show e
+
+instance Show BoolToBoolE  where  show (BoolToBoolE e) = show e
+instance Show BoolToBoolToBoolE  where  show (BoolToBoolToBoolE e) = show e
+
+instance Show IntsE  where  show (IntsE e) = show e
+
+instance Show IntsE0  where  show (IntsE0 e) = show e
+instance Show IntsEV  where  show (IntsEV e) = show e
+
+instance Show CharE  where  show (CharE e) = show e
+
+instance Show CharE0  where  show (CharE0 e) = show e
+instance Show CharEV  where  show (CharEV e) = show e
+
+instance Show SameTypeE  where  show (SameTypeE e1 e2) = show (e1,e2)
+
+instance Show SameTypedPairsE  where  show (SameTypedPairsE ees)  =  show ees
+
+-- | Expression of 'Ints' type.
+newtype IntsE  =  IntsE { unIntsE :: Expr }
+
+-- | Constant terminal value of 'Ints' type.
+newtype IntsE0  =  IntsE0 { unIntsE0 :: Expr }
+
+-- | Varialbe of 'Ints' type.
+newtype IntsEV  =  IntsEV { unIntsEV :: Expr }
+
+instance Show Ill where  show (Ill e) = show e
+
+instance Listable IntE  where
+  tiers  =  mapT IntE
+         $  cons0 i_
+         \/ cons1 unIntEV
+         \/ cons1 unIntE0
+         \/ cons2 (\(IntToIntE f) (IntE xx) -> f :$ xx)
+         \/ cons1 (head' . unIntsE) `ofWeight` 2
+         \/ cons1 (ord' . unCharE) `ofWeight` 2
+
+instance Listable IntE0 where
+  tiers  =  (IntE0 . val) `mapT` (tiers :: [[Int]])
+
+instance Listable IntEV where
+  list  =  map IntEV $ listVars "x" (undefined :: Int)
+
+instance Listable IntToIntE where
+  tiers  =  mapT IntToIntE
+         $  cons0 idE
+         \/ cons0 negateE `addWeight` 1
+         \/ cons0 absE    `addWeight` 1
+         \/ cons2 (\(IntToIntToIntE ef) (IntE ex) -> ef :$ ex)
+         \/ toTiers (listVars "f" (undefined :: Int -> Int)) `addWeight` 2
+
+instance Listable IntToIntToIntE where
+  list  =  map IntToIntToIntE [plus, times]
+
+instance Listable IntsE  where
+  tiers  =  mapT IntsE
+         $  cons0 is_
+         \/ cons1 unIntsEV
+         \/ cons1 unIntsE0
+         \/ cons2 (\(IntE ex) (IntsE exs) -> ex -:- exs)
+         \/ cons1 (tail' . unIntsE) `ofWeight` 2
+         \/ cons2 (\(IntsE exs) (IntsE eys) -> exs -++- eys) `ofWeight` 2
+         \/ cons1 (\(IntsE exs) -> sort' exs) `ofWeight` 3
+         \/ cons2 (\(IntE ex) (IntsE exs) -> insert' ex exs) `ofWeight` 3
+
+instance Listable IntsE0 where
+  tiers  =  (IntsE0 . val) `mapT` (tiers :: [[ [Int] ]])
+
+instance Listable IntsEV where
+  list  =  map IntsEV $ listVars "xs" (undefined :: [Int])
+
+instance Listable BoolE  where
+  tiers  =  mapT BoolE
+         $  cons0 b_
+         \/ cons1 unBoolEV
+         \/ cons1 unBoolE0
+         \/ cons2 (\(BoolToBoolE ef) (BoolE ep) -> ef :$ ep)
+         \/ cons2 ((-==-) `on` unIntE)  `addWeight` 2
+         \/ cons2 ((-==-) `on` unBoolE) `addWeight` 2
+         \/ cons2 ((-<=-) `on` unIntE)  `addWeight` 3
+         \/ cons2 ((-<=-) `on` unBoolE) `addWeight` 3
+         \/ cons2 ((-<-)  `on` unIntE)  `addWeight` 4
+         \/ cons2 ((-<-)  `on` unBoolE) `addWeight` 4
+         \/ cons2 ((-/=-) `on` unIntE)  `addWeight` 5
+         \/ cons2 ((-/=-) `on` unBoolE) `addWeight` 5
+         \/ cons1 (odd'  . unIntE) `addWeight` 2
+         \/ cons1 (even' . unIntE) `addWeight` 2
+         \/ cons2 (\(IntE ex) (IntsE exs) -> elem' ex exs) `addWeight` 2
+
+instance Listable BoolE0 where
+  tiers  =  (BoolE0 . val) `mapT` (tiers :: [[Bool]])
+
+instance Listable BoolEV where
+  list  =  map BoolEV $ listVars "p" (undefined :: Bool)
+
+instance Listable BoolToBoolE where
+  tiers  =  mapT BoolToBoolE
+         $  cons0 notE
+         \/ cons2 (\(BoolToBoolToBoolE ef) (BoolE ex) -> ef :$ ex)
+
+instance Listable BoolToBoolToBoolE where
+  list  =  map BoolToBoolToBoolE [orE, andE, implies]
+
+instance Listable CharE where
+  tiers  =  mapT CharE $ cons0 c_
+                      \/ cons1 unCharEV
+                      \/ cons1 unCharE0
+
+instance Listable CharEV where
+  list  =  map CharEV $ listVars "c" (undefined :: Char)
+
+instance Listable CharE0 where
+  tiers  =  (CharE0 . val) `mapT` (tiers :: [[Char]])
+
+instance Listable SameTypeE where
+  tiers = cons1 (\(IntE  e1, IntE  e2) -> SameTypeE e1 e2) `ofWeight` 0
+       \/ cons1 (\(BoolE e1, BoolE e2) -> SameTypeE e1 e2) `ofWeight` 1
+       \/ cons1 (\(IntsE e1, IntsE e2) -> SameTypeE e1 e2) `ofWeight` 1
+       \/ cons1 (\(CharE e1, CharE e2) -> SameTypeE e1 e2) `ofWeight` 2
+       \/ cons1 (\(IntToIntE e1, IntToIntE e2)     -> SameTypeE e1 e2) `ofWeight` 2
+       \/ cons1 (\(BoolToBoolE e1, BoolToBoolE e2) -> SameTypeE e1 e2) `ofWeight` 2
+       \/ cons1 (\(BoolToBoolToBoolE e1, BoolToBoolToBoolE e2) -> SameTypeE e1 e2) `ofWeight` 2
+       \/ cons1 (\(IntToIntToIntE e1, IntToIntToIntE e2)       -> SameTypeE e1 e2) `ofWeight` 2
+
+instance Listable SameTypedPairsE where
+  tiers = cons1 (SameTypedPairsE . map unSameTypeE) `ofWeight` 0
+
+instance Listable E0 where
+  tiers  =  mapT E0
+         $  cons1 unIntE0  `ofWeight` 0
+         \/ cons1 unBoolE0 `ofWeight` 1
+         \/ cons1 unIntsE0 `ofWeight` 1
+
+instance Listable EV where
+  tiers  =  mapT EV
+         $  cons1 unIntEV  `ofWeight` 0
+         \/ cons1 unBoolEV `ofWeight` 1
+         \/ cons1 unIntsEV `ofWeight` 1
+
+
+instance Listable Expr where
+  tiers  =  reset (cons1 unIntE)
+         \/ cons1 unBoolE
+         \/ cons1 unCharE
+         \/ cons1 unIntsE
+         \/ cons1 unIntToIntE         `addWeight` 1
+         \/ cons1 unIntToIntToIntE    `addWeight` 1
+         \/ cons1 unBoolToBoolE       `addWeight` 2
+         \/ cons1 unBoolToBoolToBoolE `addWeight` 2
+
+
+-- | This listable instance only produces Ill typed expressions
+instance Listable Ill where
+  tiers  =  mapT Ill
+         $  cons2 (\(IntE ef) (IntE ex) -> ef :$ ex) `ofWeight` 0
+         \/ cons2 (\(IntToIntE ef) (IntToIntE ex) -> ef :$ ex)
+         \/ cons2 (\(Ill ef) ex -> ef :$ ex)
+         \/ cons2 (\ef (Ill ex)-> ef :$ ex)
+
+
+instance ShowFunction Expr where bindtiers  =  bindtiersShow
diff --git a/test/benchmark b/test/benchmark
new file mode 100644
--- /dev/null
+++ b/test/benchmark
@@ -0,0 +1,74 @@
+#!/bin/bash
+top=`dirname $0`/..
+eg=$top/eg
+model=$top/test/model
+
+case "$1" in
+	-*) sz="$1"
+	    shift
+		;;
+esac
+
+diff-() {
+	$1 $sz | diff -rud $model/$2$sz.out - || exit 1
+}
+
+update-diff-() {
+	$1 $sz > $model/$2$sz.out
+}
+
+tym() {
+	/usr/bin/time -f%e "$@"
+}
+
+spc() {
+	/usr/bin/time -f%M "$@"
+}
+
+mean() {
+	sum="`echo -n $* | sed -e "s/ / + /g"`"
+	mean="`echo "scale = 3; ($sum) / $#" | bc`"
+	printf "%3.3f\n" $mean
+}
+export -f mean
+
+div1024() {
+	printf "%3.0f\n" "`echo "$1 / 1024" | bc`"
+}
+export -f div1024
+
+benchmark-() {
+	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
+	printf "%-18s  " "$2$sz"
+	for run in {1..3}
+	do
+		tym $1 $sz 2>&1 >/dev/null
+	done | xargs bash -c 'mean "$@"' mean
+}
+
+memory-benchmark-() {
+	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
+	printf "%-18s  " "$2$sz"
+	for run in {1..3}
+	do
+		spc $1 $sz 2>&1 >/dev/null
+	done | xargs bash -c 'mean    "$@"' mean |
+	       xargs bash -c 'div1024 "$@"' div1024
+}
+
+benchmark-cmp-() {
+	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
+	grep "^ *$2$sz " bench/runtime-$HOSTNAME | tr '\n' ' '
+	echo -n ' '
+	for run in {1..1}
+	do
+		tym $1 $sz 2>&1 >/dev/null
+	done | xargs bash -c 'mean "$@"' mean
+}
+
+find $* | sed -e "s/^bench/     /;s/^eg/  /" |
+sort -b | sed -e "s/^     /bench/;s/^  /eg/" |
+while read e
+do
+	`basename $0`- $top/$e `basename $e`
+done
diff --git a/test/benchmark-cmp b/test/benchmark-cmp
new file mode 100644
--- /dev/null
+++ b/test/benchmark-cmp
@@ -0,0 +1,74 @@
+#!/bin/bash
+top=`dirname $0`/..
+eg=$top/eg
+model=$top/test/model
+
+case "$1" in
+	-*) sz="$1"
+	    shift
+		;;
+esac
+
+diff-() {
+	$1 $sz | diff -rud $model/$2$sz.out - || exit 1
+}
+
+update-diff-() {
+	$1 $sz > $model/$2$sz.out
+}
+
+tym() {
+	/usr/bin/time -f%e "$@"
+}
+
+spc() {
+	/usr/bin/time -f%M "$@"
+}
+
+mean() {
+	sum="`echo -n $* | sed -e "s/ / + /g"`"
+	mean="`echo "scale = 3; ($sum) / $#" | bc`"
+	printf "%3.3f\n" $mean
+}
+export -f mean
+
+div1024() {
+	printf "%3.0f\n" "`echo "$1 / 1024" | bc`"
+}
+export -f div1024
+
+benchmark-() {
+	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
+	printf "%-18s  " "$2$sz"
+	for run in {1..3}
+	do
+		tym $1 $sz 2>&1 >/dev/null
+	done | xargs bash -c 'mean "$@"' mean
+}
+
+memory-benchmark-() {
+	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
+	printf "%-18s  " "$2$sz"
+	for run in {1..3}
+	do
+		spc $1 $sz 2>&1 >/dev/null
+	done | xargs bash -c 'mean    "$@"' mean |
+	       xargs bash -c 'div1024 "$@"' div1024
+}
+
+benchmark-cmp-() {
+	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
+	grep "^ *$2$sz " bench/runtime-$HOSTNAME | tr '\n' ' '
+	echo -n ' '
+	for run in {1..1}
+	do
+		tym $1 $sz 2>&1 >/dev/null
+	done | xargs bash -c 'mean "$@"' mean
+}
+
+find $* | sed -e "s/^bench/     /;s/^eg/  /" |
+sort -b | sed -e "s/^     /bench/;s/^  /eg/" |
+while read e
+do
+	`basename $0`- $top/$e `basename $e`
+done
diff --git a/test/benchmark-save b/test/benchmark-save
new file mode 100644
--- /dev/null
+++ b/test/benchmark-save
@@ -0,0 +1,23 @@
+#!/bin/bash
+top=`dirname $0`
+get-ghc-v() {
+	ghc --version | sed -e "s/.* version/GHC/"
+}
+get-express-v() {
+	ghc-pkg list express 2>/dev/null |
+	grep " express-" |
+	sed -e "s/^ *//" |
+	tail -1
+}
+get-leancheck-v() {
+	ghc-pkg list leancheck 2>/dev/null |
+	grep " leancheck-" |
+	sed -e "s/^ *//" |
+	tail -1
+}
+(
+	get-ghc-v
+	get-express-v
+	get-leancheck-v
+	$top/benchmark "$@"
+) | tee bench/runtime-$HOSTNAME
diff --git a/test/creason.hs b/test/creason.hs
new file mode 100644
--- /dev/null
+++ b/test/creason.hs
@@ -0,0 +1,61 @@
+-- Test library
+import Test
+
+-- Functions under test
+import Test.Speculate.CondReason
+
+-- Utils
+import Test.Speculate.Reason (canonicalEqn, canonicalizeEqn, emptyThy)
+import Test.Speculate.Expr (val)
+
+main :: IO ()
+main = mainTest tests 10000
+
+tests :: Int -> [Bool]
+tests n =
+  [ True
+
+  , creductions1 (zero -<=- yy) (yy -+- abs' yy) (zero -<=- xx, abs' xx, xx)
+    == [yy -+- yy]
+
+  , creductions1 (zero -<=- yy) (abs' yy -+- abs' yy) (zero -<=- xx, abs' xx, xx)
+    == [yy -+- abs' yy, abs' yy -+- yy]
+
+  , cnormalize
+      emptyChy{cequations = [(zero -<=- xx, abs' xx, xx)]}
+      (zero -<=- yy) (abs' yy -+- abs' yy)
+    == yy -+- yy
+
+  , not
+  $ cequivalent
+      emptyChy{cequations = []}
+      (zero -<=- yy) (abs' yy -+- yy) (yy -+- yy)
+
+  , cequivalent
+      emptyChy{cequations = [(zero -<=- xx, abs' xx, xx)]}
+      (zero -<=- yy) (abs' yy -+- yy) (yy -+- yy)
+
+  , holds n $ \e1 e2    -> canonicalCEqn compare (val False,e1,e2) == canonicalEqn emptyThy (e1,e2)
+  , holds n $ \e1 e2    -> sndTrd (canonicalizeCEqn compare (val False,e1,e2))
+                        == canonicalizeEqn emptyThy (e1,e2)
+  , holds n $ \e1 e2 ce -> sndTrd (canonicalizeCEqn compare (val False,e1,e2))
+                        == sndTrd (canonicalizeCEqn compare (ce,    e1,e2))
+
+  , const True -- TODO: make the following test pass!
+  $ let chy = cinsert ( elem' xx xxs
+                      , insert' xx (xxs -++- yys)
+                      , insert' xx xxs -++- yys
+                      )
+                      emptyChy
+    in cnormalize chy (elem' xx xxs) (insert' xx (xxs -++- yys)) == insert' xx xxs -++- yys
+
+  , const True -- TODO: make the following test pass!
+  $ creductions1 (elem' xx xxs) (insert' xx (xxs -++- yys))
+      ( elem' xx xxs, insert' xx (xxs -++- yys), insert' xx xxs -++- yys)
+    == [insert' xx xxs -++- yys]
+
+  , const True -- TODO: make the following test pass!
+  $ holds n $ \(BoolE ce) (SameTypeE e1 e2) -> creductions1 ce e1 (ce,e1,e2) == [e2]
+  ]
+  where
+  sndTrd (_,y,z) = (y,z)
diff --git a/test/diff b/test/diff
new file mode 100644
--- /dev/null
+++ b/test/diff
@@ -0,0 +1,74 @@
+#!/bin/bash
+top=`dirname $0`/..
+eg=$top/eg
+model=$top/test/model
+
+case "$1" in
+	-*) sz="$1"
+	    shift
+		;;
+esac
+
+diff-() {
+	$1 $sz | diff -rud $model/$2$sz.out - || exit 1
+}
+
+update-diff-() {
+	$1 $sz > $model/$2$sz.out
+}
+
+tym() {
+	/usr/bin/time -f%e "$@"
+}
+
+spc() {
+	/usr/bin/time -f%M "$@"
+}
+
+mean() {
+	sum="`echo -n $* | sed -e "s/ / + /g"`"
+	mean="`echo "scale = 3; ($sum) / $#" | bc`"
+	printf "%3.3f\n" $mean
+}
+export -f mean
+
+div1024() {
+	printf "%3.0f\n" "`echo "$1 / 1024" | bc`"
+}
+export -f div1024
+
+benchmark-() {
+	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
+	printf "%-18s  " "$2$sz"
+	for run in {1..3}
+	do
+		tym $1 $sz 2>&1 >/dev/null
+	done | xargs bash -c 'mean "$@"' mean
+}
+
+memory-benchmark-() {
+	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
+	printf "%-18s  " "$2$sz"
+	for run in {1..3}
+	do
+		spc $1 $sz 2>&1 >/dev/null
+	done | xargs bash -c 'mean    "$@"' mean |
+	       xargs bash -c 'div1024 "$@"' div1024
+}
+
+benchmark-cmp-() {
+	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
+	grep "^ *$2$sz " bench/runtime-$HOSTNAME | tr '\n' ' '
+	echo -n ' '
+	for run in {1..1}
+	do
+		tym $1 $sz 2>&1 >/dev/null
+	done | xargs bash -c 'mean "$@"' mean
+}
+
+find $* | sed -e "s/^bench/     /;s/^eg/  /" |
+sort -b | sed -e "s/^     /bench/;s/^  /eg/" |
+while read e
+do
+	`basename $0`- $top/$e `basename $e`
+done
diff --git a/test/engine.hs b/test/engine.hs
new file mode 100644
--- /dev/null
+++ b/test/engine.hs
@@ -0,0 +1,93 @@
+-- Test library
+import Test
+
+-- Functions under test
+import Test.Speculate.Engine
+
+-- Helper functions
+import Test.Speculate.Reason (emptyThy)
+import Test.Speculate.Utils
+
+main :: IO ()
+main = mainTest tests 10000
+
+tests :: Int -> [Bool]
+tests n =
+  [ True
+  
+  , holds n $ \e -> mostGeneral  e == head (fastCanonicalVariations e)
+  , holds n $ \e -> mostSpecific e == last (fastCanonicalVariations e)
+  , holds n $ \e -> allLater (\e1 e0 -> not (e0 `isInstanceOf` e1))
+                  $ fastCanonicalVariations e
+
+  , equivalencesBetween (===) (i_ -+- i_) (i_ -+- i_)
+    == [ ( xx -+- yy, yy -+- xx ) ]
+
+  , equivalencesBetween (===) (i_ -+- (i_ -+- i_)) ((i_ -+- i_) -+- i_)
+    == [ ( xx -+- (yy -+- zz), (xx -+- yy) -+- zz )
+       , ( xx -+- (yy -+- zz), (xx -+- zz) -+- yy )
+       , ( xx -+- (yy -+- zz), (yy -+- xx) -+- zz )
+       , ( xx -+- (yy -+- zz), (yy -+- zz) -+- xx )
+       , ( xx -+- (yy -+- zz), (zz -+- xx) -+- yy )
+       , ( xx -+- (yy -+- zz), (zz -+- yy) -+- xx ) ]
+
+-- TODO: make the following pass (add ValueE and SameTypeValueE to Test)
+--, holds n $ \(SameTypeE e1 e2) (SameTypeE e3 e4)
+--         -> subConsequence emptyThy (e1 -==- e2) e3 e4
+--         == subConsequence emptyThy (e2 -==- e1) e3 e4
+--, holds n $ \(SameTypeE e1 e2) (SameTypeE e3 e4)
+--         -> subConsequence emptyThy (e1 -==- e2) e3 e4
+--         == subConsequence emptyThy (e1 -==- e2) e4 e3
+--, holds n $ \...
+--         -> not $ subConsequence emptyThy (e1 -<=- e2) e3 e4
+  ,       subConsequence emptyThy [] (xx -==- yy) (xx -+- yy) (xx -+- xx)
+  , not $ subConsequence emptyThy [] (xx -<=- yy) (xx -+- yy) (xx -+- xx)
+  ,       subConsequence emptyThy [(xx -<=- yy, [xx -==- yy])]
+                                     (xx -<=- yy) (xx -+- yy) (xx -+- xx)
+  ,       subConsequence emptyThy [] (abs' xx -==- abs' yy) (abs' xx) (abs' yy)
+  , not $ subConsequence emptyThy [] (abs' xx -<=- abs' yy) (abs' xx) (abs' yy)
+  , not $ subConsequence emptyThy [] (abs' xx -==- one) (xx -+- abs' xx) zero
+
+  , holds n $ \e -> length (expansions preludeInstances 1 e) == 1
+
+  , expansions preludeInstances 2 (i_ -+- i_)
+    == [ xx -+- xx
+       , xx -+- yy
+       , yy -+- xx
+       , yy -+- yy ]
+
+  , expansions preludeInstances 2 (i_ -+- i_ -+- ord' c_)
+    == [ xx -+- xx -+- ord' cc
+       , xx -+- xx -+- ord' dd
+       , xx -+- yy -+- ord' cc
+       , xx -+- yy -+- ord' dd
+       , yy -+- xx -+- ord' cc
+       , yy -+- xx -+- ord' dd
+       , yy -+- yy -+- ord' cc
+       , yy -+- yy -+- ord' dd ]
+
+  , expansionsOfType i_ ["x","y"] (i_ -+- i_ -+- ord' c_)
+    == [ xx -+- xx -+- ord' c_
+       , xx -+- yy -+- ord' c_
+       , yy -+- xx -+- ord' c_
+       , yy -+- yy -+- ord' c_ ]
+
+  , expansionsOfType i_ [] (i_ -+- i_ -+- ord' c_) == []
+
+  , expansionsWith [xx, yy]     (i_ -+- i_ -+- ord' c_)
+    == [ xx -+- xx -+- ord' c_
+       , xx -+- yy -+- ord' c_
+       , yy -+- xx -+- ord' c_
+       , yy -+- yy -+- ord' c_ ]
+
+  , expansionsWith [cc]         (i_ -+- i_ -+- ord' c_)
+    == [ i_ -+- i_ -+- ord' cc ]
+
+  , expansionsWith [xx, yy, cc] (i_ -+- i_ -+- ord' c_)
+    == [ xx -+- xx -+- ord' cc
+       , xx -+- yy -+- ord' cc
+       , yy -+- xx -+- ord' cc
+       , yy -+- yy -+- ord' cc ]
+  ]
+  where
+  x === y = equal preludeInstances 1000 x y
diff --git a/test/eval.hs b/test/eval.hs
new file mode 100644
--- /dev/null
+++ b/test/eval.hs
@@ -0,0 +1,61 @@
+-- Test library
+import Test
+
+-- Functions under test
+import Test.Speculate.Expr.Ground
+import Test.Speculate.Expr
+
+-- TODO: rename test-eval to test-ground
+
+main :: IO ()
+main = mainTest tests 10000
+
+tests :: Int -> [Bool]
+tests n =
+  [ True
+
+  ,                                    xx -+- yy === yy -+- xx
+  , holds n' $ \(IntE e1) (IntE e2) -> notUndefined e1 && notUndefined e2
+                                   ==> e1 -+- e2 === e2 -+- e1
+  ,                                    xx -+- yy =/= xx -+- xx
+  ,                                      abs' xx === abs' (abs' xx)
+  ,                      abs' (xx -+- abs' xx) === (xx -+- abs' xx) -- 2*x or 0
+  , holds n' $ \e1 e2 -> typ e1 /= typ e2 ==> e1 =/= e2
+
+  , holds n' $ \e1 e2 -> let e1e2 = mkEquation preludeInstances e1 e2
+                         in  notUndefined e1 && notUndefined e2 && isEquation e1e2
+                         ==> condEqual preludeInstances 500 e1e2 e1 e2
+  , holds n' $ \e1 e2 -> let e1e2 = mkEquation preludeInstances e1 e2
+                         in  notUndefined e1 && notUndefined e2 && isEquation e1e2
+                         ==> condEqualM preludeInstances 500 0 e1e2 e1 e2
+  , fails n' $ \e1 e2 -> let e1e2 = mkEquation preludeInstances e1 e2
+                         in  isEquation e1e2
+                         ==> condEqualM preludeInstances 500 500 e1e2 e1 e2
+
+  , holds n $ ordOK -:> int
+  , holds n $ ordOK -:> ()
+  , holds n $ ordOK -:> bool
+  , holds n $ ordOK -:> [int]
+  ]
+  where
+  notUndefined e = e === e
+  n' = n `div` 50
+  x === y = equal preludeInstances 500 x y
+  infix 4 ===
+  x =/= y = not (x === y)
+  infix 4 =/=
+
+(*==*), (*/=*), (*<=*), (*<*) :: (Show a, Typeable a) => a -> a -> Bool
+x *==* y = eval undefined $ val x -==- val y
+x */=* y = eval undefined $ val x -/=- val y
+x *<=* y = eval undefined $ val x -<=- val y
+x *<*  y = eval undefined $ val x -<-  val y
+
+eqOK :: (Eq a, Show a, Typeable a) => a -> a -> Bool
+eqOK x y =  (x *==* y) == (x == y)
+         && (x */=* y) == (x /= y)
+
+ordOK :: (Eq a, Ord a, Show a, Typeable a) => a -> a -> Bool
+ordOK x y =  eqOK x y
+          && (x *<=* y) == (x <= y)
+          && (x *<*  y) == (x <  y)
diff --git a/test/expr.hs b/test/expr.hs
new file mode 100644
--- /dev/null
+++ b/test/expr.hs
@@ -0,0 +1,71 @@
+-- Test library
+import Test
+
+-- Functions under test
+import Test.Speculate.Expr
+
+-- Helper functions
+import Data.Functor ((<$>)) -- for GHC < 7.10
+
+main :: IO ()
+main = mainTest tests 10000
+
+tests :: Int -> [Bool]
+tests n =
+  [ True
+
+  , holds n $ \(SameTypeE e1 e2) -> unify e1 e2 =$ fmap canonicalize $= unify e2 e1
+
+  , unification xx yy == Just [(xx,yy)]
+  , (canonicalize <$> unify xx yy) == Just xx
+  , unification zero zero == Just []
+  , unification zero one  == Nothing
+  , unification xx one == Just [(xx,one)]
+  , unification (zero -+- xx) (zero -+- one) == Just [(xx,one)]
+  , unification (zero -+- xx) (yy -+- one) == Just [(xx,one),(yy,zero)]
+  , unify (zero -+- xx) (yy -+- one) == Just (zero -+- one)
+  , unification (foo xx) (foo (goo yy)) == Just [(xx,goo yy)]
+  , unification (foo xx -+- xx) (yy -+- zero) == Just [(xx,zero),(yy,foo zero)]
+  , unify (foo xx -+- xx) (yy -+- zero) == Just (foo zero -+- zero)
+  , unification (foo xx) (goo yy) == Nothing
+  , unification (foo xx) (foo yy) == unification xx yy
+  , (canonicalize <$> unify (negate' (negate' xx) -+- yy) (zz -+- zero))
+    == Just (negate' (negate' xx) -+- zero)
+  , unification (xx -+- one) (one -+- xx) == Just [(xx,one)]
+  , unification (xx -+- xx) (one -+- one) == Just [(xx,one)]
+  , unification (zz -+- zz) (xx -+- yy) == Just [(xx,yy),(zz,yy)]
+  , unification (xx     -*- (-+-) xx xx)
+                (foo zz -*- (-+-) xx yy) == Just [(yy,foo zz),(xx,foo zz)]
+
+  -- The following two tests are adapted from Baader and Snyder:
+  -- Example 2.8, Chapter 8, Handbook of Automated Reasoning (page 453).
+  , unification (hh5 yy zz (ff2 ii ii) (ff2 jj jj) kk) (hh5 (ff2 xx xx) (ff2 yy yy) jj kk zz)
+    == Just [ (ii,xx)
+            , (kk,ff2 (ff2 xx xx) (ff2 xx xx))
+            , (jj,ff2 xx xx)
+            , (zz,ff2 (ff2 xx xx) (ff2 xx xx))
+            , (yy,ff2 xx xx)
+            ]
+  , unification (hh7 yy zz xx' (ff2 ii ii) (ff2 jj jj) (ff2 kk kk) ii')
+                (hh7 (ff2 xx xx) (ff2 yy yy) (ff2 zz zz) jj kk ii' xx')
+    == Just [ (ii,xx)
+            , (ii',ff2 (ff2 (ff2 xx xx) (ff2 xx xx)) (ff2 (ff2 xx xx) (ff2 xx xx)))
+            , (kk,ff2 (ff2 xx xx) (ff2 xx xx))
+            , (jj,ff2 xx xx)
+            , (xx',ff2 (ff2 (ff2 xx xx) (ff2 xx xx)) (ff2 (ff2 xx xx) (ff2 xx xx)))
+            , (zz,ff2 (ff2 xx xx) (ff2 xx xx))
+            , (yy,ff2 xx xx)
+            ]
+  ]
+
+ff2 :: Expr -> Expr -> Expr
+ff2 e1 e2 = ffE :$ e1 :$ e2
+  where ffE = value "f" (undefined :: Int -> Int -> Int)
+
+hh5 :: Expr -> Expr -> Expr -> Expr -> Expr -> Expr
+hh5 e1 e2 e3 e4 e5 = hhE :$ e1 :$ e2 :$ e3 :$ e4 :$ e5
+  where hhE = value "h" (undefined :: Int -> Int -> Int -> Int -> Int -> Int)
+
+hh7 :: Expr -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr
+hh7 e1 e2 e3 e4 e5 e6 e7 = hhE :$ e1 :$ e2 :$ e3 :$ e4 :$ e5 :$ e6 :$ e7
+  where hhE = value "h" (undefined :: Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int)
diff --git a/test/memory-benchmark b/test/memory-benchmark
new file mode 100644
--- /dev/null
+++ b/test/memory-benchmark
@@ -0,0 +1,74 @@
+#!/bin/bash
+top=`dirname $0`/..
+eg=$top/eg
+model=$top/test/model
+
+case "$1" in
+	-*) sz="$1"
+	    shift
+		;;
+esac
+
+diff-() {
+	$1 $sz | diff -rud $model/$2$sz.out - || exit 1
+}
+
+update-diff-() {
+	$1 $sz > $model/$2$sz.out
+}
+
+tym() {
+	/usr/bin/time -f%e "$@"
+}
+
+spc() {
+	/usr/bin/time -f%M "$@"
+}
+
+mean() {
+	sum="`echo -n $* | sed -e "s/ / + /g"`"
+	mean="`echo "scale = 3; ($sum) / $#" | bc`"
+	printf "%3.3f\n" $mean
+}
+export -f mean
+
+div1024() {
+	printf "%3.0f\n" "`echo "$1 / 1024" | bc`"
+}
+export -f div1024
+
+benchmark-() {
+	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
+	printf "%-18s  " "$2$sz"
+	for run in {1..3}
+	do
+		tym $1 $sz 2>&1 >/dev/null
+	done | xargs bash -c 'mean "$@"' mean
+}
+
+memory-benchmark-() {
+	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
+	printf "%-18s  " "$2$sz"
+	for run in {1..3}
+	do
+		spc $1 $sz 2>&1 >/dev/null
+	done | xargs bash -c 'mean    "$@"' mean |
+	       xargs bash -c 'div1024 "$@"' div1024
+}
+
+benchmark-cmp-() {
+	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
+	grep "^ *$2$sz " bench/runtime-$HOSTNAME | tr '\n' ' '
+	echo -n ' '
+	for run in {1..1}
+	do
+		tym $1 $sz 2>&1 >/dev/null
+	done | xargs bash -c 'mean "$@"' mean
+}
+
+find $* | sed -e "s/^bench/     /;s/^eg/  /" |
+sort -b | sed -e "s/^     /bench/;s/^  /eg/" |
+while read e
+do
+	`basename $0`- $top/$e `basename $e`
+done
diff --git a/test/model/algebraic-graphs-s4.out b/test/model/algebraic-graphs-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/algebraic-graphs-s4.out
@@ -0,0 +1,51 @@
+max expr size  =    4
+max  #-tests   = 1080
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool  (holes: Bool)
+_ :: Int  (holes: Int)
+_ :: Nat3  (holes: Nat3)
+_ :: Graph Nat3  (holes: Graph Nat3)
+0 :: Nat3
+0 :: Int
+True :: Bool
+empty :: Graph Nat3
+vertex :: Nat3 -> Graph Nat3
+(+) :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
+(*) :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
+overlay :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
+connect :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
+edge :: Nat3 -> Nat3 -> Graph Nat3
+length :: Graph Nat3 -> Int
+size :: Graph Nat3 -> Int
+
+length (vertex i) == length (vertex j)
+  size (vertex i) == length (vertex 0)
+length (edge i j) == length (edge k i')
+length (edge i j) == size (edge k i')
+   length (x * y) == length (x + y)
+     size (x * y) == size (x + y)
+            x + x == x
+        x + empty == x
+        x * empty == x
+        empty * x == x
+            x + y == y + x
+      overlay x y == x + y
+      connect x y == x * y
+
+                0 <= length x
+                0 <= size x
+         length x <= size x
+       size empty <= size x
+         length x <= length (x + y)
+           size x <= size (x + y)
+         length x <= size (y + x)
+length (edge i i) <= size x
+            empty <= x
+                x <= x + y
+                x <= x * y
+                x <= y * x
+         vertex i <= edge i j
+         vertex i <= edge j i
+            x + y <= x * y
+
diff --git a/test/model/algebraic-graphs-s7.out b/test/model/algebraic-graphs-s7.out
new file mode 100644
--- /dev/null
+++ b/test/model/algebraic-graphs-s7.out
@@ -0,0 +1,64 @@
+max expr size  =    7
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   = 1080
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool  (holes: Bool)
+_ :: Int  (holes: Int)
+_ :: Nat3  (holes: Nat3)
+_ :: Graph Nat3  (holes: Graph Nat3)
+0 :: Nat3
+0 :: Int
+True :: Bool
+empty :: Graph Nat3
+vertex :: Nat3 -> Graph Nat3
+(+) :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
+(*) :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
+overlay :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
+connect :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
+edge :: Nat3 -> Nat3 -> Graph Nat3
+length :: Graph Nat3 -> Int
+size :: Graph Nat3 -> Int
+
+    length (vertex i) == length (vertex j)
+      size (vertex i) == length (vertex 0)
+       length (x * y) == length (x + y)
+         size (x * y) == size (x + y)
+length (x + vertex i) == length (x + vertex j)
+  size (x + vertex i) == size (x + vertex j)
+   length (x * y + z) == length (x + (y + z))
+     size (x * y + z) == size (x + (y + z))
+                x + x == x
+            x + empty == x
+            x * empty == x
+            empty * x == x
+                x + y == y + x
+          overlay x y == x + y
+          connect x y == x * y
+            x + x * y == x * y
+            x + y * x == y * x
+             edge i j == vertex i * vertex j
+          (x + y) + z == x + (y + z)
+          (x * y) * z == x * (y * z)
+      x + y * (x * z) == y * (x * z)
+      x + y * (z * x) == y * (z * x)
+          x * (y + z) == x * y + x * z
+          (x + y) * z == x * z + y * z
+          x * (x * y) == x * x + x * y
+          x * (y * y) == x * y + y * y
+    x * (y * (x * z)) == x * (y * x) + x * (y * z)
+
+         0 <= length x
+         0 <= size x
+  length x <= size x
+size empty <= size x
+         x <= size (y + z)
+  length x <= length (edge i i)
+  length x <= length (x + y)
+     empty <= x
+         x <= x + y
+         x <= x * y
+         x <= y * x
+     x + y <= x * y
+
diff --git a/test/model/algebraic-graphs.out b/test/model/algebraic-graphs.out
new file mode 100644
--- /dev/null
+++ b/test/model/algebraic-graphs.out
@@ -0,0 +1,58 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   = 1080
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool  (holes: Bool)
+_ :: Int  (holes: Int)
+_ :: Nat3  (holes: Nat3)
+_ :: Graph Nat3  (holes: Graph Nat3)
+0 :: Nat3
+0 :: Int
+True :: Bool
+empty :: Graph Nat3
+vertex :: Nat3 -> Graph Nat3
+(+) :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
+(*) :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
+overlay :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
+connect :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
+edge :: Nat3 -> Nat3 -> Graph Nat3
+length :: Graph Nat3 -> Int
+size :: Graph Nat3 -> Int
+
+    length (vertex i) == length (vertex j)
+      size (vertex i) == length (vertex 0)
+       length (x * y) == length (x + y)
+         size (x * y) == size (x + y)
+length (x + vertex i) == length (x + vertex j)
+  size (x + vertex i) == size (x + vertex j)
+                x + x == x
+            x + empty == x
+            x * empty == x
+            empty * x == x
+                x + y == y + x
+          overlay x y == x + y
+          connect x y == x * y
+            x + x * y == x * y
+            x + y * x == y * x
+             edge i j == vertex i * vertex j
+          (x + y) + z == x + (y + z)
+          (x * y) * z == x * (y * z)
+          x * (x * y) == x * (x + y)
+          (x + y) * x == y * (x * x)
+
+         0 <= length x
+         0 <= size x
+  length x <= size x
+size empty <= size x
+  length x <= length (x + y)
+    size x <= size (x + y)
+  length x <= size (y + x)
+size empty <= length (edge i i)
+     empty <= x
+         x <= x + y
+         x <= x * y
+         x <= y * x
+     x + y <= x * y
+
diff --git a/test/model/arith-c-s4.out b/test/model/arith-c-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/arith-c-s4.out
@@ -0,0 +1,183 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+0 :: Int
+1 :: Int
+(+) :: Int -> Int -> Int
+(*) :: Int -> Int -> Int
+
+_ :: Int
+0 :: Int
+1 :: Int
+_ + _ :: Int
+_ + 1 :: Int
+1 + 1 :: Int
+_ * _ :: Int
+_ + (_ + _) :: Int
+_ + (_ + 1) :: Int
+_ + (1 + 1) :: Int
+_ + _ * _ :: Int
+1 + (1 + 1) :: Int
+1 + _ * _ :: Int
+_ * (_ + _) :: Int
+_ * (_ + 1) :: Int
+_ * (_ * _) :: Int
+
+x :: Int
+0 :: Int
+1 :: Int
+x + x :: Int
+x + 1 :: Int
+1 + 1 :: Int
+x * x :: Int
+x + (x + x) :: Int
+x + (x + 1) :: Int
+x + (1 + 1) :: Int
+x + x * x :: Int
+1 + (1 + 1) :: Int
+1 + x * x :: Int
+x * (x + x) :: Int
+x * (x * x) :: Int
+
+x :: Int
+y :: Int
+0 :: Int
+1 :: Int
+x + x :: Int
+x + y :: Int
+y + y :: Int
+x + 1 :: Int
+y + 1 :: Int
+1 + 1 :: Int
+x * x :: Int
+x * y :: Int
+y * y :: Int
+x + (x + x) :: Int
+x + (x + y) :: Int
+x + (y + y) :: Int
+y + (y + y) :: Int
+x + (x + 1) :: Int
+x + (y + 1) :: Int
+y + (y + 1) :: Int
+x + (1 + 1) :: Int
+y + (1 + 1) :: Int
+x + x * x :: Int
+x + x * y :: Int
+x + y * y :: Int
+y + x * x :: Int
+y + x * y :: Int
+y + y * y :: Int
+1 + (1 + 1) :: Int
+1 + x * x :: Int
+1 + x * y :: Int
+1 + y * y :: Int
+x * (x + x) :: Int
+x * (x + y) :: Int
+x * (y + y) :: Int
+y * (x + y) :: Int
+y * (y + y) :: Int
+x * (x * x) :: Int
+x * (x * y) :: Int
+x * (y * y) :: Int
+y * (y * y) :: Int
+
+x :: Int
+y :: Int
+z :: Int
+0 :: Int
+1 :: Int
+x + x :: Int
+x + y :: Int
+x + z :: Int
+y + y :: Int
+y + z :: Int
+z + z :: Int
+x + 1 :: Int
+y + 1 :: Int
+z + 1 :: Int
+1 + 1 :: Int
+x * x :: Int
+x * y :: Int
+x * z :: Int
+y * y :: Int
+y * z :: Int
+z * z :: Int
+x + (x + x) :: Int
+x + (x + y) :: Int
+x + (x + z) :: Int
+x + (y + y) :: Int
+x + (y + z) :: Int
+x + (z + z) :: Int
+y + (y + y) :: Int
+y + (y + z) :: Int
+y + (z + z) :: Int
+z + (z + z) :: Int
+x + (x + 1) :: Int
+x + (y + 1) :: Int
+x + (z + 1) :: Int
+y + (y + 1) :: Int
+y + (z + 1) :: Int
+z + (z + 1) :: Int
+x + (1 + 1) :: Int
+y + (1 + 1) :: Int
+z + (1 + 1) :: Int
+x + x * x :: Int
+x + x * y :: Int
+x + x * z :: Int
+x + y * y :: Int
+x + y * z :: Int
+x + z * z :: Int
+y + x * x :: Int
+y + x * y :: Int
+y + x * z :: Int
+y + y * y :: Int
+y + y * z :: Int
+y + z * z :: Int
+z + x * x :: Int
+z + x * y :: Int
+z + x * z :: Int
+z + y * y :: Int
+z + y * z :: Int
+z + z * z :: Int
+1 + (1 + 1) :: Int
+1 + x * x :: Int
+1 + x * y :: Int
+1 + x * z :: Int
+1 + y * y :: Int
+1 + y * z :: Int
+1 + z * z :: Int
+x * (x + x) :: Int
+x * (x + y) :: Int
+x * (x + z) :: Int
+x * (y + y) :: Int
+x * (y + z) :: Int
+x * (z + z) :: Int
+y * (x + y) :: Int
+y * (x + z) :: Int
+y * (y + y) :: Int
+y * (y + z) :: Int
+y * (z + z) :: Int
+z * (x + y) :: Int
+z * (x + z) :: Int
+z * (y + z) :: Int
+z * (z + z) :: Int
+x * (x * x) :: Int
+x * (x * y) :: Int
+x * (x * z) :: Int
+x * (y * y) :: Int
+x * (y * z) :: Int
+x * (z * z) :: Int
+y * (y * y) :: Int
+y * (y * z) :: Int
+y * (z * z) :: Int
+z * (z * z) :: Int
+
+Number of Eq schema classes: 16
+Number of Eq 1-var classes: 15
+Number of Eq 2-var classes: 41
+Number of Eq 3-var classes: 90
diff --git a/test/model/arith-c.out b/test/model/arith-c.out
new file mode 100644
--- /dev/null
+++ b/test/model/arith-c.out
@@ -0,0 +1,183 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+0 :: Int
+1 :: Int
+(+) :: Int -> Int -> Int
+(*) :: Int -> Int -> Int
+
+_ :: Int
+0 :: Int
+1 :: Int
+_ + _ :: Int
+_ + 1 :: Int
+1 + 1 :: Int
+_ * _ :: Int
+_ + (_ + _) :: Int
+_ + (_ + 1) :: Int
+_ + (1 + 1) :: Int
+_ + _ * _ :: Int
+1 + (1 + 1) :: Int
+1 + _ * _ :: Int
+_ * (_ + _) :: Int
+_ * (_ + 1) :: Int
+_ * (_ * _) :: Int
+
+x :: Int
+0 :: Int
+1 :: Int
+x + x :: Int
+x + 1 :: Int
+1 + 1 :: Int
+x * x :: Int
+x + (x + x) :: Int
+x + (x + 1) :: Int
+x + (1 + 1) :: Int
+x + x * x :: Int
+1 + (1 + 1) :: Int
+1 + x * x :: Int
+x * (x + x) :: Int
+x * (x * x) :: Int
+
+x :: Int
+y :: Int
+0 :: Int
+1 :: Int
+x + x :: Int
+x + y :: Int
+y + y :: Int
+x + 1 :: Int
+y + 1 :: Int
+1 + 1 :: Int
+x * x :: Int
+x * y :: Int
+y * y :: Int
+x + (x + x) :: Int
+x + (x + y) :: Int
+x + (y + y) :: Int
+y + (y + y) :: Int
+x + (x + 1) :: Int
+x + (y + 1) :: Int
+y + (y + 1) :: Int
+x + (1 + 1) :: Int
+y + (1 + 1) :: Int
+x + x * x :: Int
+x + x * y :: Int
+x + y * y :: Int
+y + x * x :: Int
+y + x * y :: Int
+y + y * y :: Int
+1 + (1 + 1) :: Int
+1 + x * x :: Int
+1 + x * y :: Int
+1 + y * y :: Int
+x * (x + x) :: Int
+x * (x + y) :: Int
+x * (y + y) :: Int
+y * (x + y) :: Int
+y * (y + y) :: Int
+x * (x * x) :: Int
+x * (x * y) :: Int
+x * (y * y) :: Int
+y * (y * y) :: Int
+
+x :: Int
+y :: Int
+z :: Int
+0 :: Int
+1 :: Int
+x + x :: Int
+x + y :: Int
+x + z :: Int
+y + y :: Int
+y + z :: Int
+z + z :: Int
+x + 1 :: Int
+y + 1 :: Int
+z + 1 :: Int
+1 + 1 :: Int
+x * x :: Int
+x * y :: Int
+x * z :: Int
+y * y :: Int
+y * z :: Int
+z * z :: Int
+x + (x + x) :: Int
+x + (x + y) :: Int
+x + (x + z) :: Int
+x + (y + y) :: Int
+x + (y + z) :: Int
+x + (z + z) :: Int
+y + (y + y) :: Int
+y + (y + z) :: Int
+y + (z + z) :: Int
+z + (z + z) :: Int
+x + (x + 1) :: Int
+x + (y + 1) :: Int
+x + (z + 1) :: Int
+y + (y + 1) :: Int
+y + (z + 1) :: Int
+z + (z + 1) :: Int
+x + (1 + 1) :: Int
+y + (1 + 1) :: Int
+z + (1 + 1) :: Int
+x + x * x :: Int
+x + x * y :: Int
+x + x * z :: Int
+x + y * y :: Int
+x + y * z :: Int
+x + z * z :: Int
+y + x * x :: Int
+y + x * y :: Int
+y + x * z :: Int
+y + y * y :: Int
+y + y * z :: Int
+y + z * z :: Int
+z + x * x :: Int
+z + x * y :: Int
+z + x * z :: Int
+z + y * y :: Int
+z + y * z :: Int
+z + z * z :: Int
+1 + (1 + 1) :: Int
+1 + x * x :: Int
+1 + x * y :: Int
+1 + x * z :: Int
+1 + y * y :: Int
+1 + y * z :: Int
+1 + z * z :: Int
+x * (x + x) :: Int
+x * (x + y) :: Int
+x * (x + z) :: Int
+x * (y + y) :: Int
+x * (y + z) :: Int
+x * (z + z) :: Int
+y * (x + y) :: Int
+y * (x + z) :: Int
+y * (y + y) :: Int
+y * (y + z) :: Int
+y * (z + z) :: Int
+z * (x + y) :: Int
+z * (x + z) :: Int
+z * (y + z) :: Int
+z * (z + z) :: Int
+x * (x * x) :: Int
+x * (x * y) :: Int
+x * (x * z) :: Int
+x * (y * y) :: Int
+x * (y * z) :: Int
+x * (z * z) :: Int
+y * (y * y) :: Int
+y * (y * z) :: Int
+y * (z * z) :: Int
+z * (z * z) :: Int
+
+Number of Eq schema classes: 16
+Number of Eq 1-var classes: 15
+Number of Eq 2-var classes: 41
+Number of Eq 3-var classes: 90
diff --git a/test/model/arith-negate-abs-s4.out b/test/model/arith-negate-abs-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/arith-negate-abs-s4.out
@@ -0,0 +1,40 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+0 :: Int
+1 :: Int
+id :: Int -> Int
+abs :: Int -> Int
+negate :: Int -> Int
+(+) :: Int -> Int -> Int
+(*) :: Int -> Int -> Int
+
+             id x == x
+negate (negate x) == x
+            x + 0 == x
+            x * 1 == x
+            x * 0 == 0
+      abs (abs x) == abs x
+   abs (negate x) == abs x
+     x + negate x == 0
+            x + y == y + x
+            x * y == y * x
+      abs (x * x) == x * x
+     x * negate y == negate (x * y)
+
+             x <= abs x
+             0 <= abs x
+             x <= x * x
+             x <= x + 1
+             0 <= x * x
+      negate x <= abs x
+negate (abs x) <= x
+negate (abs x) <= 0
+         abs x <= x * x
+negate (abs x) <= negate x
+
diff --git a/test/model/arith-negate-abs.out b/test/model/arith-negate-abs.out
new file mode 100644
--- /dev/null
+++ b/test/model/arith-negate-abs.out
@@ -0,0 +1,68 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+0 :: Int
+1 :: Int
+id :: Int -> Int
+abs :: Int -> Int
+negate :: Int -> Int
+(+) :: Int -> Int -> Int
+(*) :: Int -> Int -> Int
+
+             id x == x
+negate (negate x) == x
+            x + 0 == x
+            x * 1 == x
+            x * 0 == 0
+      abs (abs x) == abs x
+   abs (negate x) == abs x
+     x + negate x == 0
+            x + y == y + x
+            x * y == y * x
+      abs (x * x) == x * x
+     x * negate y == negate (x * y)
+  abs (x * abs y) == abs (x * y)
+     negate x + y == negate (x + negate y)
+    abs x * abs y == abs (x * y)
+  abs (x + abs x) == x + abs x
+    abs x + abs x == abs (x + x)
+  abs (1 + abs x) == 1 + abs x
+      (x + y) + z == x + (y + z)
+      (x * y) * z == x * (y * z)
+      (x + x) * y == x * (y + y)
+      x * (y + 1) == x + x * y
+
+             x <= abs x
+             0 <= abs x
+             x <= x * x
+             x <= x + 1
+             0 <= x * x
+      negate x <= abs x
+negate (abs x) <= x
+negate (abs x) <= 0
+             x <= x + abs y
+             x <= abs (x + x)
+         abs x <= x * x
+negate (x * x) <= x
+negate (abs x) <= negate x
+             x <= 1 + abs x
+             0 <= x + abs x
+negate (x * x) <= 0
+  x + negate 1 <= x
+         abs x <= abs (x + x)
+negate (x * x) <= negate x
+negate (x + 1) <= negate x
+         x + y <= x + abs y
+     x * abs x <= x * x
+negate (x * x) <= negate (abs x)
+     x * abs y <= abs (x * y)
+  x + negate y <= x + abs y
+     x + abs x <= abs (x + x)
+negate (x * x) <= x * abs x
+   abs (x + 1) <= 1 + abs x
+
diff --git a/test/model/arith-s4.out b/test/model/arith-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/arith-s4.out
@@ -0,0 +1,23 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+0 :: Int
+1 :: Int
+(+) :: Int -> Int -> Int
+(*) :: Int -> Int -> Int
+
+x + 0 == x
+x * 1 == x
+x * 0 == 0
+x + y == y + x
+x * y == y * x
+
+x <= x * x
+x <= x + 1
+0 <= x * x
+
diff --git a/test/model/arith.out b/test/model/arith.out
new file mode 100644
--- /dev/null
+++ b/test/model/arith.out
@@ -0,0 +1,27 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+0 :: Int
+1 :: Int
+(+) :: Int -> Int -> Int
+(*) :: Int -> Int -> Int
+
+      x + 0 == x
+      x * 1 == x
+      x * 0 == 0
+      x + y == y + x
+      x * y == y * x
+(x + y) + z == x + (y + z)
+(x * y) * z == x * (y * z)
+(x + x) * y == x * (y + y)
+x * (y + 1) == x + x * y
+
+x <= x * x
+x <= x + 1
+0 <= x * x
+
diff --git a/test/model/arithficial-s4.out b/test/model/arithficial-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/arithficial-s4.out
@@ -0,0 +1,26 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+0 :: Int
+id :: Int -> Int
+(+) :: Int -> Int -> Int
+f :: Int -> Int -> Int
+g :: Int -> Int -> Int
+h :: Int -> Int -> Int
+
+ id x == x
+x + 0 == x
+g x y == g z x'
+f x y == f x z
+h x y == h z y
+x + y == y + x
+
+x <= g y y
+x <= f 0 y
+x <= h y 0
+
diff --git a/test/model/arithficial.out b/test/model/arithficial.out
new file mode 100644
--- /dev/null
+++ b/test/model/arithficial.out
@@ -0,0 +1,27 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+0 :: Int
+id :: Int -> Int
+(+) :: Int -> Int -> Int
+f :: Int -> Int -> Int
+g :: Int -> Int -> Int
+h :: Int -> Int -> Int
+
+       id x == x
+      x + 0 == x
+      g x y == g z x'
+      f x y == f x z
+      h x y == h z y
+      x + y == y + x
+(x + y) + z == x + (y + z)
+
+x <= g y y
+x <= f 0 y
+x <= h y 0
+
diff --git a/test/model/binarytree-s4.out b/test/model/binarytree-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/binarytree-s4.out
@@ -0,0 +1,41 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Word2
+_ :: BT Word2
+_ :: [Word2]
+Null :: BT Word2
+insert :: Word2 -> BT Word2 -> BT Word2
+delete :: Word2 -> BT Word2 -> BT Word2
+isIn :: Word2 -> BT Word2 -> Bool
+(<=) :: Word2 -> Word2 -> Bool
+(/=) :: Word2 -> Word2 -> Bool
+ordered :: [Word2] -> Bool
+strictlyOrdered :: [Word2] -> Bool
+toList :: BT Word2 -> [Word2]
+fromList :: [Word2] -> BT Word2
+isSearch :: BT Word2 -> Bool
+[] :: [Word2]
+True :: Bool
+False :: Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: Word2 -> Word2 -> Bool
+(==) :: BT Word2 -> BT Word2 -> Bool
+(==) :: [Word2] -> [Word2] -> Bool
+
+  isIn x Null == False
+   (xs == []) == (Null == fromList xs)
+delete x Null == Null
+
+         Null <= t
+            t <= insert x t
+   delete x t <= t
+insert x Null <= insert x t
+
+isIn x t ==> insert x t == t
+
diff --git a/test/model/binarytree.out b/test/model/binarytree.out
new file mode 100644
--- /dev/null
+++ b/test/model/binarytree.out
@@ -0,0 +1,55 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Word2
+_ :: BT Word2
+_ :: [Word2]
+Null :: BT Word2
+insert :: Word2 -> BT Word2 -> BT Word2
+delete :: Word2 -> BT Word2 -> BT Word2
+isIn :: Word2 -> BT Word2 -> Bool
+(<=) :: Word2 -> Word2 -> Bool
+(/=) :: Word2 -> Word2 -> Bool
+ordered :: [Word2] -> Bool
+strictlyOrdered :: [Word2] -> Bool
+toList :: BT Word2 -> [Word2]
+fromList :: [Word2] -> BT Word2
+isSearch :: BT Word2 -> Bool
+[] :: [Word2]
+True :: Bool
+False :: Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: Word2 -> Word2 -> Bool
+(==) :: BT Word2 -> BT Word2 -> Bool
+(==) :: [Word2] -> [Word2] -> Bool
+
+           isIn x Null == False
+   isIn x (insert x t) == True
+   isIn x (delete x t) == False
+  (Null == insert x t) == False
+            (xs == []) == (Null == fromList xs)
+     (t == insert x t) == isIn x t
+              (x == y) == isIn x (insert y Null)
+     (t == delete x t) == (False == isIn x t)
+isIn x (insert y Null) == isIn y (insert x Null)
+   (False == (x /= y)) == isIn x (insert y Null)
+         delete x Null == Null
+ insert x (insert x t) == insert x t
+ delete x (delete x t) == delete x t
+ insert x (delete x t) == insert x t
+ delete x (insert x t) == delete x t
+ insert x (insert y t) == insert y (insert x t)
+ delete x (delete y t) == delete y (delete x t)
+
+         Null <= t
+            t <= insert x t
+   delete x t <= t
+insert x Null <= insert x t
+
+x /= y ==> delete y (insert x t) == insert x (delete y t)
+
diff --git a/test/model/binarytree0-s4.out b/test/model/binarytree0-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/binarytree0-s4.out
@@ -0,0 +1,31 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Word2
+_ :: BT Word2
+Null :: BT Word2
+insert :: Word2 -> BT Word2 -> BT Word2
+delete :: Word2 -> BT Word2 -> BT Word2
+isIn :: Word2 -> BT Word2 -> Bool
+(/=) :: Word2 -> Word2 -> Bool
+True :: Bool
+False :: Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: Word2 -> Word2 -> Bool
+(==) :: BT Word2 -> BT Word2 -> Bool
+
+  isIn x Null == False
+delete x Null == Null
+
+         Null <= t
+            t <= insert x t
+   delete x t <= t
+insert x Null <= insert x t
+
+isIn x t ==> insert x t == t
+
diff --git a/test/model/binarytree0.out b/test/model/binarytree0.out
new file mode 100644
--- /dev/null
+++ b/test/model/binarytree0.out
@@ -0,0 +1,45 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Word2
+_ :: BT Word2
+Null :: BT Word2
+insert :: Word2 -> BT Word2 -> BT Word2
+delete :: Word2 -> BT Word2 -> BT Word2
+isIn :: Word2 -> BT Word2 -> Bool
+(/=) :: Word2 -> Word2 -> Bool
+True :: Bool
+False :: Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: Word2 -> Word2 -> Bool
+(==) :: BT Word2 -> BT Word2 -> Bool
+
+           isIn x Null == False
+   isIn x (insert x t) == True
+   isIn x (delete x t) == False
+  (Null == insert x t) == False
+     (t == insert x t) == isIn x t
+              (x == y) == isIn x (insert y Null)
+     (t == delete x t) == (False == isIn x t)
+isIn x (insert y Null) == isIn y (insert x Null)
+   (False == (x /= y)) == isIn x (insert y Null)
+         delete x Null == Null
+ insert x (insert x t) == insert x t
+ delete x (delete x t) == delete x t
+ insert x (delete x t) == insert x t
+ delete x (insert x t) == delete x t
+ insert x (insert y t) == insert y (insert x t)
+ delete x (delete y t) == delete y (delete x t)
+
+         Null <= t
+            t <= insert x t
+   delete x t <= t
+insert x Null <= insert x t
+
+x /= y ==> delete y (insert x t) == insert x (delete y t)
+
diff --git a/test/model/bool-c-s4.out b/test/model/bool-c-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/bool-c-s4.out
@@ -0,0 +1,124 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+False :: Bool
+True :: Bool
+not :: Bool -> Bool
+(&&) :: Bool -> Bool -> Bool
+(||) :: Bool -> Bool -> Bool
+(==) :: Bool -> Bool -> Bool
+
+
+_ :: Bool
+False :: Bool
+True :: Bool
+not _ :: Bool
+_ && _ :: Bool
+_ || _ :: Bool
+_ == _ :: Bool
+not (_ && _) :: Bool
+not (_ || _) :: Bool
+not (_ == _) :: Bool
+_ && not _ :: Bool
+_ || not _ :: Bool
+_ && (_ && _) :: Bool
+_ && (_ || _) :: Bool
+_ && _ == _ :: Bool
+_ || _ && _ :: Bool
+_ || (_ || _) :: Bool
+_ || _ == _ :: Bool
+_ == (_ && _) :: Bool
+_ == (_ || _) :: Bool
+_ == (_ == _) :: Bool
+
+p :: Bool
+False :: Bool
+True :: Bool
+not p :: Bool
+
+p :: Bool
+q :: Bool
+False :: Bool
+True :: Bool
+not p :: Bool
+not q :: Bool
+p && q :: Bool
+p || q :: Bool
+p == q :: Bool
+not (p && q) :: Bool
+not (p || q) :: Bool
+not (p == q) :: Bool
+p && not q :: Bool
+q && not p :: Bool
+p || not q :: Bool
+q || not p :: Bool
+
+p :: Bool
+q :: Bool
+r :: Bool
+False :: Bool
+True :: Bool
+not p :: Bool
+not q :: Bool
+not r :: Bool
+p && q :: Bool
+p && r :: Bool
+q && r :: Bool
+p || q :: Bool
+p || r :: Bool
+q || r :: Bool
+p == q :: Bool
+p == r :: Bool
+q == r :: Bool
+not (p && q) :: Bool
+not (p && r) :: Bool
+not (q && r) :: Bool
+not (p || q) :: Bool
+not (p || r) :: Bool
+not (q || r) :: Bool
+not (p == q) :: Bool
+not (p == r) :: Bool
+not (q == r) :: Bool
+p && not q :: Bool
+p && not r :: Bool
+q && not p :: Bool
+q && not r :: Bool
+r && not p :: Bool
+r && not q :: Bool
+p || not q :: Bool
+p || not r :: Bool
+q || not p :: Bool
+q || not r :: Bool
+r || not p :: Bool
+r || not q :: Bool
+p && (q && r) :: Bool
+p && (q || r) :: Bool
+q && (p || r) :: Bool
+r && (p || q) :: Bool
+p && q == r :: Bool
+q && p == r :: Bool
+r && p == q :: Bool
+p || q && r :: Bool
+q || p && r :: Bool
+r || p && q :: Bool
+p || (q || r) :: Bool
+p || q == r :: Bool
+q || p == r :: Bool
+r || p == q :: Bool
+p == (q && r) :: Bool
+q == (p && r) :: Bool
+r == (p && q) :: Bool
+p == (q || r) :: Bool
+q == (p || r) :: Bool
+r == (p || q) :: Bool
+p == (q == r) :: Bool
+
+Number of Eq schema classes: 21
+Number of Eq 1-var classes: 4
+Number of Eq 2-var classes: 16
+Number of Eq 3-var classes: 59
diff --git a/test/model/bool-c.out b/test/model/bool-c.out
new file mode 100644
--- /dev/null
+++ b/test/model/bool-c.out
@@ -0,0 +1,124 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+False :: Bool
+True :: Bool
+not :: Bool -> Bool
+(&&) :: Bool -> Bool -> Bool
+(||) :: Bool -> Bool -> Bool
+(==) :: Bool -> Bool -> Bool
+
+
+_ :: Bool
+False :: Bool
+True :: Bool
+not _ :: Bool
+_ && _ :: Bool
+_ || _ :: Bool
+_ == _ :: Bool
+not (_ && _) :: Bool
+not (_ || _) :: Bool
+not (_ == _) :: Bool
+_ && not _ :: Bool
+_ || not _ :: Bool
+_ && (_ && _) :: Bool
+_ && (_ || _) :: Bool
+_ && _ == _ :: Bool
+_ || _ && _ :: Bool
+_ || (_ || _) :: Bool
+_ || _ == _ :: Bool
+_ == (_ && _) :: Bool
+_ == (_ || _) :: Bool
+_ == (_ == _) :: Bool
+
+p :: Bool
+False :: Bool
+True :: Bool
+not p :: Bool
+
+p :: Bool
+q :: Bool
+False :: Bool
+True :: Bool
+not p :: Bool
+not q :: Bool
+p && q :: Bool
+p || q :: Bool
+p == q :: Bool
+not (p && q) :: Bool
+not (p || q) :: Bool
+not (p == q) :: Bool
+p && not q :: Bool
+q && not p :: Bool
+p || not q :: Bool
+q || not p :: Bool
+
+p :: Bool
+q :: Bool
+r :: Bool
+False :: Bool
+True :: Bool
+not p :: Bool
+not q :: Bool
+not r :: Bool
+p && q :: Bool
+p && r :: Bool
+q && r :: Bool
+p || q :: Bool
+p || r :: Bool
+q || r :: Bool
+p == q :: Bool
+p == r :: Bool
+q == r :: Bool
+not (p && q) :: Bool
+not (p && r) :: Bool
+not (q && r) :: Bool
+not (p || q) :: Bool
+not (p || r) :: Bool
+not (q || r) :: Bool
+not (p == q) :: Bool
+not (p == r) :: Bool
+not (q == r) :: Bool
+p && not q :: Bool
+p && not r :: Bool
+q && not p :: Bool
+q && not r :: Bool
+r && not p :: Bool
+r && not q :: Bool
+p || not q :: Bool
+p || not r :: Bool
+q || not p :: Bool
+q || not r :: Bool
+r || not p :: Bool
+r || not q :: Bool
+p && (q && r) :: Bool
+p && (q || r) :: Bool
+q && (p || r) :: Bool
+r && (p || q) :: Bool
+p && q == r :: Bool
+q && p == r :: Bool
+r && p == q :: Bool
+p || q && r :: Bool
+q || p && r :: Bool
+r || p && q :: Bool
+p || (q || r) :: Bool
+p || q == r :: Bool
+q || p == r :: Bool
+r || p == q :: Bool
+p == (q && r) :: Bool
+q == (p && r) :: Bool
+r == (p && q) :: Bool
+p == (q || r) :: Bool
+q == (p || r) :: Bool
+r == (p || q) :: Bool
+p == (q == r) :: Bool
+
+Number of Eq schema classes: 21
+Number of Eq 1-var classes: 4
+Number of Eq 2-var classes: 16
+Number of Eq 3-var classes: 59
diff --git a/test/model/bool-s4.out b/test/model/bool-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/bool-s4.out
@@ -0,0 +1,38 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+False :: Bool
+True :: Bool
+not :: Bool -> Bool
+(&&) :: Bool -> Bool -> Bool
+(||) :: Bool -> Bool -> Bool
+(==) :: Bool -> Bool -> Bool
+
+    (p && p) == p
+    (p || p) == p
+ not (not p) == p
+ (p && True) == p
+(p || False) == p
+    (p == p) == True
+ (p == True) == p
+(p && False) == False
+ (p || True) == True
+(p && not p) == False
+(p || not p) == True
+(p == False) == not p
+    (p && q) == (q && p)
+    (p || q) == (q || p)
+(p == not q) == not (p == q)
+
+     p ==> True
+ False ==> p
+     p ==> p || q
+p && q ==> p
+p && q ==> p == q
+
+
diff --git a/test/model/bool.out b/test/model/bool.out
new file mode 100644
--- /dev/null
+++ b/test/model/bool.out
@@ -0,0 +1,55 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+False :: Bool
+True :: Bool
+not :: Bool -> Bool
+(&&) :: Bool -> Bool -> Bool
+(||) :: Bool -> Bool -> Bool
+(==) :: Bool -> Bool -> Bool
+
+       (p && p) == p
+       (p || p) == p
+    not (not p) == p
+    (p && True) == p
+   (p || False) == p
+       (p == p) == True
+    (p == True) == p
+   (p && False) == False
+    (p || True) == True
+   (p && not p) == False
+   (p == False) == not p
+       (p && q) == (q && p)
+       (p || q) == (q || p)
+(p && (p || q)) == p
+  (p || p && q) == p
+  (p && p == q) == (p && q)
+   (p == not q) == not (p == q)
+   not (p || q) == (not p && not q)
+   (p || not q) == not (q && not p)
+((p && q) && r) == (p && (q && r))
+((p || q) || r) == (p || (q || r))
+(p == (p && q)) == not (p && not q)
+  (p || p == q) == not (q && not p)
+(p == (p || q)) == not (q && not p)
+
+           p ==> True
+       False ==> p
+           p ==> p || q
+      p && q ==> p
+      p && q ==> p == q
+       not p ==> not (p && q)
+not (p || q) ==> p == q
+not (p == q) ==> p || q
+  p && not q ==> q || p
+      p == q ==> p || not q
+  p && not q ==> not (q && p)
+not (p == q) ==> not (p && q)
+  p && not q ==> not (p == q)
+
+
diff --git a/test/model/colour-s4.out b/test/model/colour-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/colour-s4.out
@@ -0,0 +1,89 @@
+max expr size  =    4
+  |- on ineqs  =    2
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Colour
+_ :: Integer
+_ :: Maybe (Ratio Integer)
+_ :: Ratio Integer
+(+) :: Colour -> Colour -> Colour
+(-) :: Colour -> Colour -> Colour
+chroma :: Colour -> Ratio Integer
+hue :: Colour -> Maybe (Ratio Integer)
+saturation :: Colour -> Ratio Integer
+value :: Colour -> Ratio Integer
+lightness :: Colour -> Ratio Integer
+fromHSV :: Ratio Integer -> Ratio Integer -> Ratio Integer -> Colour
+fromHSL :: Ratio Integer -> Ratio Integer -> Ratio Integer -> Colour
+mix :: Colour -> Colour -> Colour
+black :: Colour
+white :: Colour
+red :: Colour
+grey :: Colour
+green :: Colour
+blue :: Colour
+Just :: Ratio Integer -> Maybe (Ratio Integer)
+Nothing :: Maybe (Ratio Integer)
+0 % 1 :: Ratio Integer
+1 % 1 :: Ratio Integer
+1 % 2 :: Ratio Integer
+
+Warning: (<=) :: Colour -> Colour -> Bool  is not an ordering (not antisymmetric)
+Warning: (==) and (<=) :: Colour -> Colour -> Bool are inconsistent: (x == y) /= (x <= y && y <= x)
+
+                  mix c c == c
+                c + black == c
+                    c - c == black
+                c - black == c
+                c + white == white
+                black - c == black
+                c - white == black
+      fromHSV q r (0 % 1) == black
+      fromHSL q r (0 % 1) == black
+      fromHSL q r (1 % 1) == white
+fromHSL q (0 % 1) (1 % 2) == grey
+                    c + d == d + c
+                  mix c d == mix d c
+      fromHSL q (0 % 1) r == fromHSL s (0 % 1) r
+      fromHSV q (0 % 1) r == fromHSL s (0 % 1) r
+      fromHSV (1 % 1) q r == fromHSV (0 % 1) q r
+      fromHSL (1 % 1) q r == fromHSL (0 % 1) q r
+fromHSL q (1 % 1) (1 % 2) == fromHSV q (1 % 1) (1 % 1)
+        hue (mix c black) == hue c
+        hue (mix c white) == hue c
+         hue (mix c grey) == hue c
+              hue (c + c) == hue (c + grey)
+          value (c + red) == 1 % 1
+        value (c + green) == 1 % 1
+         value (c + blue) == 1 % 1
+       chroma (white - c) == chroma c
+ saturation (mix c black) == saturation c
+        chroma (grey - c) == chroma (c + grey)
+     chroma (mix c white) == chroma (mix c black)
+      chroma (mix c grey) == chroma (mix c black)
+     saturation (c + red) == chroma (c + red)
+   saturation (c + green) == chroma (c + green)
+    saturation (c + blue) == chroma (c + blue)
+          value (c - red) == chroma (c - red)
+        value (c - green) == chroma (c - green)
+         value (c - blue) == chroma (c - blue)
+          value (red - c) == chroma (red - c)
+        value (green - c) == chroma (green - c)
+         value (blue - c) == chroma (blue - c)
+
+       hue c <= Just (1 % 1)
+       0 % 1 <= chroma c
+       0 % 1 <= saturation c
+       0 % 1 <= value c
+       0 % 1 <= lightness c
+    chroma c <= 1 % 1
+saturation c <= 1 % 1
+     value c <= 1 % 1
+ lightness c <= 1 % 1
+    chroma c <= saturation c
+    chroma c <= value c
+ lightness c <= value c
+
diff --git a/test/model/colour.out b/test/model/colour.out
new file mode 100644
--- /dev/null
+++ b/test/model/colour.out
@@ -0,0 +1,89 @@
+max expr size  =    4
+  |- on ineqs  =    2
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Colour
+_ :: Integer
+_ :: Maybe (Ratio Integer)
+_ :: Ratio Integer
+(+) :: Colour -> Colour -> Colour
+(-) :: Colour -> Colour -> Colour
+chroma :: Colour -> Ratio Integer
+hue :: Colour -> Maybe (Ratio Integer)
+saturation :: Colour -> Ratio Integer
+value :: Colour -> Ratio Integer
+lightness :: Colour -> Ratio Integer
+fromHSV :: Ratio Integer -> Ratio Integer -> Ratio Integer -> Colour
+fromHSL :: Ratio Integer -> Ratio Integer -> Ratio Integer -> Colour
+mix :: Colour -> Colour -> Colour
+black :: Colour
+white :: Colour
+red :: Colour
+grey :: Colour
+green :: Colour
+blue :: Colour
+Just :: Ratio Integer -> Maybe (Ratio Integer)
+Nothing :: Maybe (Ratio Integer)
+0 % 1 :: Ratio Integer
+1 % 1 :: Ratio Integer
+1 % 2 :: Ratio Integer
+
+Warning: (<=) :: Colour -> Colour -> Bool  is not an ordering (not antisymmetric)
+Warning: (==) and (<=) :: Colour -> Colour -> Bool are inconsistent: (x == y) /= (x <= y && y <= x)
+
+                  mix c c == c
+                c + black == c
+                    c - c == black
+                c - black == c
+                c + white == white
+                black - c == black
+                c - white == black
+      fromHSV q r (0 % 1) == black
+      fromHSL q r (0 % 1) == black
+      fromHSL q r (1 % 1) == white
+fromHSL q (0 % 1) (1 % 2) == grey
+                    c + d == d + c
+                  mix c d == mix d c
+      fromHSL q (0 % 1) r == fromHSL s (0 % 1) r
+      fromHSV q (0 % 1) r == fromHSL s (0 % 1) r
+      fromHSV (1 % 1) q r == fromHSV (0 % 1) q r
+      fromHSL (1 % 1) q r == fromHSL (0 % 1) q r
+fromHSL q (1 % 1) (1 % 2) == fromHSV q (1 % 1) (1 % 1)
+        hue (mix c black) == hue c
+        hue (mix c white) == hue c
+         hue (mix c grey) == hue c
+              hue (c + c) == hue (c + grey)
+          value (c + red) == 1 % 1
+        value (c + green) == 1 % 1
+         value (c + blue) == 1 % 1
+       chroma (white - c) == chroma c
+ saturation (mix c black) == saturation c
+        chroma (grey - c) == chroma (c + grey)
+     chroma (mix c white) == chroma (mix c black)
+      chroma (mix c grey) == chroma (mix c black)
+     saturation (c + red) == chroma (c + red)
+   saturation (c + green) == chroma (c + green)
+    saturation (c + blue) == chroma (c + blue)
+          value (c - red) == chroma (c - red)
+        value (c - green) == chroma (c - green)
+         value (c - blue) == chroma (c - blue)
+          value (red - c) == chroma (red - c)
+        value (green - c) == chroma (green - c)
+         value (blue - c) == chroma (blue - c)
+
+       hue c <= Just (1 % 1)
+       0 % 1 <= chroma c
+       0 % 1 <= saturation c
+       0 % 1 <= value c
+       0 % 1 <= lightness c
+    chroma c <= 1 % 1
+saturation c <= 1 % 1
+     value c <= 1 % 1
+ lightness c <= 1 % 1
+    chroma c <= saturation c
+    chroma c <= value c
+ lightness c <= value c
+
diff --git a/test/model/digraphs-s4.out b/test/model/digraphs-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/digraphs-s4.out
@@ -0,0 +1,41 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Nat
+_ :: Digraph Nat
+_ :: [Nat]
+[] :: [Nat]
+elem :: Nat -> [Nat] -> Bool
+empty :: Digraph Nat
+addNode :: Nat -> Digraph Nat -> Digraph Nat
+addEdge :: Nat -> Nat -> Digraph Nat -> Digraph Nat
+isNode :: Nat -> Digraph Nat -> Bool
+isEdge :: Nat -> Nat -> Digraph Nat -> Bool
+isPath :: Nat -> Nat -> Digraph Nat -> Bool
+subgraph :: [Nat] -> Digraph Nat -> Digraph Nat
+True :: Bool
+False :: Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: Nat -> Nat -> Bool
+(==) :: Digraph Nat -> Digraph Nat -> Bool
+(==) :: [Nat] -> [Nat] -> Bool
+
+   isNode x empty == False
+ isEdge x y empty == False
+ isPath x y empty == False
+     isPath x x a == isNode x a
+subgraph xs empty == empty
+    subgraph [] a == empty
+
+          empty <= a
+              a <= addNode x a
+  subgraph xs a <= a
+addNode x empty <= addNode x a
+
+isNode x a ==> addNode x a == a
+
diff --git a/test/model/digraphs.out b/test/model/digraphs.out
new file mode 100644
--- /dev/null
+++ b/test/model/digraphs.out
@@ -0,0 +1,59 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Nat
+_ :: Digraph Nat
+_ :: [Nat]
+[] :: [Nat]
+elem :: Nat -> [Nat] -> Bool
+empty :: Digraph Nat
+addNode :: Nat -> Digraph Nat -> Digraph Nat
+addEdge :: Nat -> Nat -> Digraph Nat -> Digraph Nat
+isNode :: Nat -> Digraph Nat -> Bool
+isEdge :: Nat -> Nat -> Digraph Nat -> Bool
+isPath :: Nat -> Nat -> Digraph Nat -> Bool
+subgraph :: [Nat] -> Digraph Nat -> Digraph Nat
+True :: Bool
+False :: Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: Nat -> Nat -> Bool
+(==) :: Digraph Nat -> Digraph Nat -> Bool
+(==) :: [Nat] -> [Nat] -> Bool
+
+             isNode x empty == False
+           isEdge x y empty == False
+           isPath x y empty == False
+     isNode x (addNode x a) == True
+     (empty == addNode x a) == False
+               isPath x x a == isNode x a
+         (a == addNode x a) == isNode x a
+                   (x == y) == isNode x (addNode y empty)
+ isNode x (addNode y empty) == isNode y (addNode x empty)
+          subgraph xs empty == empty
+              subgraph [] a == empty
+    addNode x (addNode x a) == addNode x a
+subgraph xs (subgraph xs a) == subgraph xs a
+    addNode x (addNode y a) == addNode y (addNode x a)
+subgraph xs (subgraph ys a) == subgraph ys (subgraph xs a)
+
+     isEdge x y a ==> isNode x a
+     isEdge x y a ==> isNode y a
+     isPath x y a ==> isNode x a
+     isPath x y a ==> isNode y a
+     isEdge x y a ==> isPath x y a
+            empty <=  a
+                a <=  addNode x a
+    subgraph xs a <=  a
+                a <=  addEdge x y a
+  addNode x empty <=  addNode x a
+      addNode x a <=  addEdge x y a
+addEdge x y empty <=  addEdge x y a
+
+isEdge x y a ==>             addEdge x y a == a
+   elem x xs ==> subgraph xs (addNode x a) == addNode x (subgraph xs a)
+
diff --git a/test/model/fun-s4.out b/test/model/fun-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/fun-s4.out
@@ -0,0 +1,21 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   = 1000
+min  #-tests   =   50  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+_ :: [Int]
+_ :: Int -> Int
+map :: (Int -> Int) -> [Int] -> [Int]
+id :: Int -> Int
+(.) :: (Int -> Int) -> (Int -> Int) -> Int -> Int
+
+     id x == x
+  f (g x) == (f . g) x
+map id xs == xs
+   f . id == f
+   id . f == f
+
+
diff --git a/test/model/fun.out b/test/model/fun.out
new file mode 100644
--- /dev/null
+++ b/test/model/fun.out
@@ -0,0 +1,23 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   = 1000
+min  #-tests   =   50  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+_ :: [Int]
+_ :: Int -> Int
+map :: (Int -> Int) -> [Int] -> [Int]
+id :: Int -> Int
+(.) :: (Int -> Int) -> (Int -> Int) -> Int -> Int
+
+          id x == x
+       f (g x) == (f . g) x
+     map id xs == xs
+map (f . g) xs == map f (map g xs)
+        f . id == f
+        id . f == f
+   (f . g) . h == f . (g . h)
+
+
diff --git a/test/model/insertsort-s4.out b/test/model/insertsort-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/insertsort-s4.out
@@ -0,0 +1,41 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Int
+_ :: [Int]
+False :: Bool
+True :: Bool
+[] :: [Int]
+(:) :: Int -> [Int] -> [Int]
+(++) :: [Int] -> [Int] -> [Int]
+elem :: Int -> [Int] -> Bool
+ordered :: [Int] -> Bool
+all :: (Int -> Bool) -> [Int] -> Bool
+insert :: Int -> [Int] -> [Int]
+sort :: [Int] -> [Int]
+(==) :: Int -> Int -> Bool
+(<=) :: Int -> Int -> Bool
+(<) :: Int -> Int -> Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: [Int] -> [Int] -> Bool
+
+    ordered (sort xs) == True
+ordered (insert x xs) == ordered xs
+      (xs == sort xs) == ordered xs
+     elem x (sort xs) == elem x xs
+      (sort xs == []) == (xs == [])
+       sort (sort xs) == sort xs
+          insert x [] == [x]
+      sort (xs ++ ys) == sort (ys ++ xs)
+   sort (insert x xs) == insert x (sort xs)
+          sort (x:xs) == insert x (sort xs)
+
+    sort xs <= xs
+insert x xs <= x:xs
+
+
diff --git a/test/model/insertsort.out b/test/model/insertsort.out
new file mode 100644
--- /dev/null
+++ b/test/model/insertsort.out
@@ -0,0 +1,71 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Int
+_ :: [Int]
+False :: Bool
+True :: Bool
+[] :: [Int]
+(:) :: Int -> [Int] -> [Int]
+(++) :: [Int] -> [Int] -> [Int]
+elem :: Int -> [Int] -> Bool
+ordered :: [Int] -> Bool
+all :: (Int -> Bool) -> [Int] -> Bool
+insert :: Int -> [Int] -> [Int]
+sort :: [Int] -> [Int]
+(==) :: Int -> Int -> Bool
+(<=) :: Int -> Int -> Bool
+(<) :: Int -> Int -> Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: [Int] -> [Int] -> Bool
+
+      ordered (sort xs) == True
+  ordered (insert x xs) == ordered xs
+    (xs == insert x xs) == False
+    ([] == insert x xs) == False
+        (xs == sort xs) == ordered xs
+       elem x (sort xs) == elem x xs
+        (sort xs == []) == (xs == [])
+   all (x ==) (sort xs) == all (x ==) xs
+    all (x <) (sort xs) == all (x <) xs
+          all (x <=) xs == ordered (x:sort xs)
+ordered (xs ++ sort xs) == ordered (xs ++ xs)
+ordered (sort xs ++ xs) == ordered (xs ++ xs)
+   elem x (insert y xs) == elem x (y:xs)
+         sort (sort xs) == sort xs
+            insert x [] == [x]
+        sort (xs ++ ys) == sort (ys ++ xs)
+     sort (insert x xs) == insert x (sort xs)
+            sort (x:xs) == insert x (sort xs)
+   sort (xs ++ sort ys) == sort (xs ++ ys)
+ insert x (insert y xs) == insert y (insert x xs)
+        insert x (x:xs) == x:x:xs
+           insert x [y] == insert y [x]
+
+  xs == sort ys ==> ordered xs
+        sort xs <=  xs
+    insert x xs <=  x:xs
+      x:sort xs <=  x:xs
+  xs ++ sort ys <=  xs ++ ys
+  sort xs ++ ys <=  xs ++ ys
+    sort (x:xs) <=  insert x xs
+sort (xs ++ ys) <=  xs ++ sort ys
+sort (xs ++ ys) <=  sort xs ++ ys
+  sort xs ++ xs <=  xs ++ sort xs
+
+     all (x <=) xs ==>         insert x xs == x:xs
+ordered (ys ++ xs) ==>       ys ++ sort xs == sort (xs ++ ys)
+ordered (ys ++ xs) ==>       sort ys ++ xs == sort (xs ++ ys)
+     all (x <=) xs ==>           x:sort xs == sort (x:xs)
+         elem x xs ==> insert x (xs ++ ys) == insert x xs ++ ys
+            x <= y ==>     insert x (y:xs) == x:y:xs
+             x < y ==>     insert y (x:xs) == x:insert y xs
+ordered (ys ++ xs) ==>  sort ys ++ sort xs == sort (xs ++ ys)
+     all (x <=) xs ==>     insert y (x:xs) == insert x (insert y xs)
+     all (x <=) ys ==> insert x (xs ++ ys) == insert x xs ++ ys
+
diff --git a/test/model/insertsort0-s4.out b/test/model/insertsort0-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/insertsort0-s4.out
@@ -0,0 +1,30 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Int
+_ :: [Int]
+[] :: [Int]
+(:) :: Int -> [Int] -> [Int]
+insert :: Int -> [Int] -> [Int]
+sort :: [Int] -> [Int]
+(<=) :: Int -> Int -> Bool
+(<) :: Int -> Int -> Bool
+True :: Bool
+False :: Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: Int -> Int -> Bool
+(==) :: [Int] -> [Int] -> Bool
+
+   (sort xs == []) == (xs == [])
+           sort [] == []
+    sort (sort xs) == sort xs
+       insert x [] == [x]
+sort (insert x xs) == insert x (sort xs)
+       sort (x:xs) == insert x (sort xs)
+
+
diff --git a/test/model/insertsort0.out b/test/model/insertsort0.out
new file mode 100644
--- /dev/null
+++ b/test/model/insertsort0.out
@@ -0,0 +1,37 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Int
+_ :: [Int]
+[] :: [Int]
+(:) :: Int -> [Int] -> [Int]
+insert :: Int -> [Int] -> [Int]
+sort :: [Int] -> [Int]
+(<=) :: Int -> Int -> Bool
+(<) :: Int -> Int -> Bool
+True :: Bool
+False :: Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: Int -> Int -> Bool
+(==) :: [Int] -> [Int] -> Bool
+
+   (xs == insert x xs) == False
+   ([] == insert x xs) == False
+       (sort xs == []) == (xs == [])
+               sort [] == []
+        sort (sort xs) == sort xs
+           insert x [] == [x]
+    sort (insert x xs) == insert x (sort xs)
+           sort (x:xs) == insert x (sort xs)
+insert x (insert y xs) == insert y (insert x xs)
+       insert x (x:xs) == x:x:xs
+          insert x [y] == insert y [x]
+
+x <= y ==> insert x (y:xs) == x:y:xs
+ x < y ==> insert y (x:xs) == x:insert y xs
+
diff --git a/test/model/length-s4.out b/test/model/length-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/length-s4.out
@@ -0,0 +1,20 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+_ :: [Int]
+[] :: [Int]
+(:) :: Int -> [Int] -> [Int]
+(++) :: [Int] -> [Int] -> [Int]
+0 :: Int
+length :: [Int] -> Int
+
+    length (x:xs) == length (y:xs)
+length (xs ++ ys) == length (ys ++ xs)
+
+0 <= length xs
+
diff --git a/test/model/length.out b/test/model/length.out
new file mode 100644
--- /dev/null
+++ b/test/model/length.out
@@ -0,0 +1,23 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+_ :: [Int]
+[] :: [Int]
+(:) :: Int -> [Int] -> [Int]
+(++) :: [Int] -> [Int] -> [Int]
+0 :: Int
+length :: [Int] -> Int
+
+    length (x:xs) == length (y:xs)
+length (xs ++ ys) == length (ys ++ xs)
+
+         0 <= length xs
+ length xs <= length (x:xs)
+ length xs <= length (xs ++ ys)
+length [x] <= length (x:xs)
+
diff --git a/test/model/list-c-s4.out b/test/model/list-c-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/list-c-s4.out
@@ -0,0 +1,777 @@
+max expr size  =    5
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    3  (for inequational and conditional laws)
+
+_ :: Int
+_ :: [Int]
+[] :: [Int]
+(:) :: Int -> [Int] -> [Int]
+(++) :: [Int] -> [Int] -> [Int]
+head :: [Int] -> Int
+tail :: [Int] -> [Int]
+
+_ :: Int
+_ :: [Int]
+[] :: [Int]
+head _ :: Int
+head [] :: Int
+tail _ :: [Int]
+tail [] :: [Int]
+head (tail _) :: Int
+head (tail []) :: Int
+tail (tail _) :: [Int]
+tail (tail []) :: [Int]
+_:_ :: [Int]
+[_] :: [Int]
+_ ++ _ :: [Int]
+head (tail (tail _)) :: Int
+head (tail (tail [])) :: Int
+head (_ ++ _) :: Int
+tail (tail (tail _)) :: [Int]
+tail (tail (tail [])) :: [Int]
+tail (_ ++ _) :: [Int]
+_:tail _ :: [Int]
+_:tail [] :: [Int]
+_ ++ tail _ :: [Int]
+_ ++ tail [] :: [Int]
+[] ++ tail _ :: [Int]
+[] ++ tail [] :: [Int]
+head _:_ :: [Int]
+[head _] :: [Int]
+head []:_ :: [Int]
+[head []] :: [Int]
+tail _ ++ _ :: [Int]
+tail _ ++ [] :: [Int]
+tail [] ++ _ :: [Int]
+tail [] ++ [] :: [Int]
+head (tail (tail (tail _))) :: Int
+head (tail (tail (tail []))) :: Int
+head (tail (_ ++ _)) :: Int
+head (_ ++ tail _) :: Int
+head (_ ++ tail []) :: Int
+head ([] ++ tail _) :: Int
+head ([] ++ tail []) :: Int
+head (head _:_) :: Int
+head [head _] :: Int
+head (head []:_) :: Int
+head [head []] :: Int
+head (tail _ ++ _) :: Int
+head (tail _ ++ []) :: Int
+head (tail [] ++ _) :: Int
+head (tail [] ++ []) :: Int
+tail (tail (tail (tail _))) :: [Int]
+tail (tail (tail (tail []))) :: [Int]
+tail (tail (_ ++ _)) :: [Int]
+tail (_:tail _) :: [Int]
+tail (_:tail []) :: [Int]
+tail (_ ++ tail _) :: [Int]
+tail (_ ++ tail []) :: [Int]
+tail ([] ++ tail _) :: [Int]
+tail ([] ++ tail []) :: [Int]
+tail (tail _ ++ _) :: [Int]
+tail (tail _ ++ []) :: [Int]
+tail (tail [] ++ _) :: [Int]
+tail (tail [] ++ []) :: [Int]
+_:tail (tail _) :: [Int]
+_:tail (tail []) :: [Int]
+_:_:_ :: [Int]
+[_,_] :: [Int]
+_:(_ ++ _) :: [Int]
+_ ++ tail (tail _) :: [Int]
+_ ++ tail (tail []) :: [Int]
+_ ++ (_:_) :: [Int]
+_ ++ [_] :: [Int]
+_ ++ (_ ++ _) :: [Int]
+[] ++ tail (tail _) :: [Int]
+[] ++ tail (tail []) :: [Int]
+head _:tail _ :: [Int]
+head _:tail [] :: [Int]
+head []:tail _ :: [Int]
+head []:tail [] :: [Int]
+tail _ ++ tail _ :: [Int]
+tail _ ++ tail [] :: [Int]
+tail [] ++ tail _ :: [Int]
+tail [] ++ tail [] :: [Int]
+head (tail _):_ :: [Int]
+[head (tail _)] :: [Int]
+head (tail []):_ :: [Int]
+[head (tail [])] :: [Int]
+tail (tail _) ++ _ :: [Int]
+tail (tail _) ++ [] :: [Int]
+tail (tail []) ++ _ :: [Int]
+tail (tail []) ++ [] :: [Int]
+
+x :: Int
+xs :: [Int]
+[] :: [Int]
+head xs :: Int
+head [] :: Int
+tail xs :: [Int]
+tail [] :: [Int]
+head (tail xs) :: Int
+head (tail []) :: Int
+tail (tail xs) :: [Int]
+tail (tail []) :: [Int]
+x:xs :: [Int]
+[x] :: [Int]
+xs ++ xs :: [Int]
+head (tail (tail xs)) :: Int
+head (tail (tail [])) :: Int
+head (xs ++ xs) :: Int
+tail (tail (tail xs)) :: [Int]
+tail (tail (tail [])) :: [Int]
+tail (xs ++ xs) :: [Int]
+x:tail xs :: [Int]
+x:tail [] :: [Int]
+xs ++ tail xs :: [Int]
+xs ++ tail [] :: [Int]
+head xs:xs :: [Int]
+[head xs] :: [Int]
+head []:xs :: [Int]
+[head []] :: [Int]
+tail xs ++ xs :: [Int]
+tail [] ++ xs :: [Int]
+head (tail (tail (tail xs))) :: Int
+head (tail (tail (tail []))) :: Int
+head (tail (xs ++ xs)) :: Int
+head (xs ++ tail xs) :: Int
+head (xs ++ tail []) :: Int
+head (tail xs ++ xs) :: Int
+head (tail [] ++ xs) :: Int
+tail (tail (tail (tail xs))) :: [Int]
+tail (tail (tail (tail []))) :: [Int]
+tail (tail (xs ++ xs)) :: [Int]
+tail (xs ++ tail xs) :: [Int]
+tail (xs ++ tail []) :: [Int]
+tail (tail xs ++ xs) :: [Int]
+tail (tail [] ++ xs) :: [Int]
+x:tail (tail xs) :: [Int]
+x:tail (tail []) :: [Int]
+x:x:xs :: [Int]
+[x,x] :: [Int]
+x:(xs ++ xs) :: [Int]
+xs ++ tail (tail xs) :: [Int]
+xs ++ tail (tail []) :: [Int]
+xs ++ (x:xs) :: [Int]
+xs ++ [x] :: [Int]
+xs ++ (xs ++ xs) :: [Int]
+head xs:tail xs :: [Int]
+head xs:tail [] :: [Int]
+head []:tail xs :: [Int]
+head []:tail [] :: [Int]
+tail xs ++ tail xs :: [Int]
+tail xs ++ tail [] :: [Int]
+tail [] ++ tail xs :: [Int]
+tail [] ++ tail [] :: [Int]
+head (tail xs):xs :: [Int]
+[head (tail xs)] :: [Int]
+head (tail []):xs :: [Int]
+[head (tail [])] :: [Int]
+tail (tail xs) ++ xs :: [Int]
+tail (tail []) ++ xs :: [Int]
+
+x :: Int
+y :: Int
+xs :: [Int]
+ys :: [Int]
+[] :: [Int]
+head xs :: Int
+head ys :: Int
+head [] :: Int
+tail xs :: [Int]
+tail ys :: [Int]
+tail [] :: [Int]
+head (tail xs) :: Int
+head (tail ys) :: Int
+head (tail []) :: Int
+tail (tail xs) :: [Int]
+tail (tail ys) :: [Int]
+tail (tail []) :: [Int]
+x:xs :: [Int]
+x:ys :: [Int]
+y:xs :: [Int]
+y:ys :: [Int]
+[x] :: [Int]
+[y] :: [Int]
+xs ++ xs :: [Int]
+xs ++ ys :: [Int]
+ys ++ xs :: [Int]
+ys ++ ys :: [Int]
+head (tail (tail xs)) :: Int
+head (tail (tail ys)) :: Int
+head (tail (tail [])) :: Int
+head (xs ++ xs) :: Int
+head (xs ++ ys) :: Int
+head (ys ++ xs) :: Int
+head (ys ++ ys) :: Int
+tail (tail (tail xs)) :: [Int]
+tail (tail (tail ys)) :: [Int]
+tail (tail (tail [])) :: [Int]
+tail (xs ++ xs) :: [Int]
+tail (xs ++ ys) :: [Int]
+tail (ys ++ xs) :: [Int]
+tail (ys ++ ys) :: [Int]
+x:tail xs :: [Int]
+x:tail ys :: [Int]
+y:tail xs :: [Int]
+y:tail ys :: [Int]
+x:tail [] :: [Int]
+y:tail [] :: [Int]
+xs ++ tail xs :: [Int]
+xs ++ tail ys :: [Int]
+ys ++ tail xs :: [Int]
+ys ++ tail ys :: [Int]
+xs ++ tail [] :: [Int]
+ys ++ tail [] :: [Int]
+head xs:xs :: [Int]
+head xs:ys :: [Int]
+head ys:xs :: [Int]
+head ys:ys :: [Int]
+[head xs] :: [Int]
+[head ys] :: [Int]
+head []:xs :: [Int]
+head []:ys :: [Int]
+[head []] :: [Int]
+tail xs ++ xs :: [Int]
+tail xs ++ ys :: [Int]
+tail ys ++ xs :: [Int]
+tail ys ++ ys :: [Int]
+tail [] ++ xs :: [Int]
+tail [] ++ ys :: [Int]
+head (tail (tail (tail xs))) :: Int
+head (tail (tail (tail ys))) :: Int
+head (tail (tail (tail []))) :: Int
+head (tail (xs ++ xs)) :: Int
+head (tail (xs ++ ys)) :: Int
+head (tail (ys ++ xs)) :: Int
+head (tail (ys ++ ys)) :: Int
+head (xs ++ tail xs) :: Int
+head (xs ++ tail ys) :: Int
+head (ys ++ tail xs) :: Int
+head (ys ++ tail ys) :: Int
+head (xs ++ tail []) :: Int
+head (ys ++ tail []) :: Int
+head (tail xs ++ xs) :: Int
+head (tail xs ++ ys) :: Int
+head (tail ys ++ xs) :: Int
+head (tail ys ++ ys) :: Int
+head (tail [] ++ xs) :: Int
+head (tail [] ++ ys) :: Int
+tail (tail (tail (tail xs))) :: [Int]
+tail (tail (tail (tail ys))) :: [Int]
+tail (tail (tail (tail []))) :: [Int]
+tail (tail (xs ++ xs)) :: [Int]
+tail (tail (xs ++ ys)) :: [Int]
+tail (tail (ys ++ xs)) :: [Int]
+tail (tail (ys ++ ys)) :: [Int]
+tail (xs ++ tail xs) :: [Int]
+tail (xs ++ tail ys) :: [Int]
+tail (ys ++ tail xs) :: [Int]
+tail (ys ++ tail ys) :: [Int]
+tail (xs ++ tail []) :: [Int]
+tail (ys ++ tail []) :: [Int]
+tail (tail xs ++ xs) :: [Int]
+tail (tail xs ++ ys) :: [Int]
+tail (tail ys ++ xs) :: [Int]
+tail (tail ys ++ ys) :: [Int]
+tail (tail [] ++ xs) :: [Int]
+tail (tail [] ++ ys) :: [Int]
+x:tail (tail xs) :: [Int]
+x:tail (tail ys) :: [Int]
+y:tail (tail xs) :: [Int]
+y:tail (tail ys) :: [Int]
+x:tail (tail []) :: [Int]
+y:tail (tail []) :: [Int]
+x:x:xs :: [Int]
+x:x:ys :: [Int]
+x:y:xs :: [Int]
+x:y:ys :: [Int]
+y:x:xs :: [Int]
+y:x:ys :: [Int]
+y:y:xs :: [Int]
+y:y:ys :: [Int]
+[x,x] :: [Int]
+[x,y] :: [Int]
+[y,x] :: [Int]
+[y,y] :: [Int]
+x:(xs ++ xs) :: [Int]
+x:(xs ++ ys) :: [Int]
+x:(ys ++ xs) :: [Int]
+x:(ys ++ ys) :: [Int]
+y:(xs ++ xs) :: [Int]
+y:(xs ++ ys) :: [Int]
+y:(ys ++ xs) :: [Int]
+y:(ys ++ ys) :: [Int]
+xs ++ tail (tail xs) :: [Int]
+xs ++ tail (tail ys) :: [Int]
+ys ++ tail (tail xs) :: [Int]
+ys ++ tail (tail ys) :: [Int]
+xs ++ tail (tail []) :: [Int]
+ys ++ tail (tail []) :: [Int]
+xs ++ (x:xs) :: [Int]
+xs ++ (y:xs) :: [Int]
+xs ++ (x:ys) :: [Int]
+xs ++ (y:ys) :: [Int]
+ys ++ (x:xs) :: [Int]
+ys ++ (y:xs) :: [Int]
+ys ++ (x:ys) :: [Int]
+ys ++ (y:ys) :: [Int]
+xs ++ [x] :: [Int]
+xs ++ [y] :: [Int]
+ys ++ [x] :: [Int]
+ys ++ [y] :: [Int]
+xs ++ (xs ++ xs) :: [Int]
+xs ++ (xs ++ ys) :: [Int]
+xs ++ (ys ++ xs) :: [Int]
+xs ++ (ys ++ ys) :: [Int]
+ys ++ (xs ++ xs) :: [Int]
+ys ++ (xs ++ ys) :: [Int]
+ys ++ (ys ++ xs) :: [Int]
+ys ++ (ys ++ ys) :: [Int]
+head xs:tail xs :: [Int]
+head xs:tail ys :: [Int]
+head ys:tail xs :: [Int]
+head ys:tail ys :: [Int]
+head xs:tail [] :: [Int]
+head ys:tail [] :: [Int]
+head []:tail xs :: [Int]
+head []:tail ys :: [Int]
+head []:tail [] :: [Int]
+tail xs ++ tail xs :: [Int]
+tail xs ++ tail ys :: [Int]
+tail ys ++ tail xs :: [Int]
+tail ys ++ tail ys :: [Int]
+tail xs ++ tail [] :: [Int]
+tail ys ++ tail [] :: [Int]
+tail [] ++ tail xs :: [Int]
+tail [] ++ tail ys :: [Int]
+tail [] ++ tail [] :: [Int]
+head (tail xs):xs :: [Int]
+head (tail xs):ys :: [Int]
+head (tail ys):xs :: [Int]
+head (tail ys):ys :: [Int]
+[head (tail xs)] :: [Int]
+[head (tail ys)] :: [Int]
+head (tail []):xs :: [Int]
+head (tail []):ys :: [Int]
+[head (tail [])] :: [Int]
+tail (tail xs) ++ xs :: [Int]
+tail (tail xs) ++ ys :: [Int]
+tail (tail ys) ++ xs :: [Int]
+tail (tail ys) ++ ys :: [Int]
+tail (tail []) ++ xs :: [Int]
+tail (tail []) ++ ys :: [Int]
+
+x :: Int
+y :: Int
+z :: Int
+xs :: [Int]
+ys :: [Int]
+zs :: [Int]
+[] :: [Int]
+head xs :: Int
+head ys :: Int
+head zs :: Int
+head [] :: Int
+tail xs :: [Int]
+tail ys :: [Int]
+tail zs :: [Int]
+tail [] :: [Int]
+head (tail xs) :: Int
+head (tail ys) :: Int
+head (tail zs) :: Int
+head (tail []) :: Int
+tail (tail xs) :: [Int]
+tail (tail ys) :: [Int]
+tail (tail zs) :: [Int]
+tail (tail []) :: [Int]
+x:xs :: [Int]
+x:ys :: [Int]
+x:zs :: [Int]
+y:xs :: [Int]
+y:ys :: [Int]
+y:zs :: [Int]
+z:xs :: [Int]
+z:ys :: [Int]
+z:zs :: [Int]
+[x] :: [Int]
+[y] :: [Int]
+[z] :: [Int]
+xs ++ xs :: [Int]
+xs ++ ys :: [Int]
+xs ++ zs :: [Int]
+ys ++ xs :: [Int]
+ys ++ ys :: [Int]
+ys ++ zs :: [Int]
+zs ++ xs :: [Int]
+zs ++ ys :: [Int]
+zs ++ zs :: [Int]
+head (tail (tail xs)) :: Int
+head (tail (tail ys)) :: Int
+head (tail (tail zs)) :: Int
+head (tail (tail [])) :: Int
+head (xs ++ xs) :: Int
+head (xs ++ ys) :: Int
+head (xs ++ zs) :: Int
+head (ys ++ xs) :: Int
+head (ys ++ ys) :: Int
+head (ys ++ zs) :: Int
+head (zs ++ xs) :: Int
+head (zs ++ ys) :: Int
+head (zs ++ zs) :: Int
+tail (tail (tail xs)) :: [Int]
+tail (tail (tail ys)) :: [Int]
+tail (tail (tail zs)) :: [Int]
+tail (tail (tail [])) :: [Int]
+tail (xs ++ xs) :: [Int]
+tail (xs ++ ys) :: [Int]
+tail (xs ++ zs) :: [Int]
+tail (ys ++ xs) :: [Int]
+tail (ys ++ ys) :: [Int]
+tail (ys ++ zs) :: [Int]
+tail (zs ++ xs) :: [Int]
+tail (zs ++ ys) :: [Int]
+tail (zs ++ zs) :: [Int]
+x:tail xs :: [Int]
+x:tail ys :: [Int]
+x:tail zs :: [Int]
+y:tail xs :: [Int]
+y:tail ys :: [Int]
+y:tail zs :: [Int]
+z:tail xs :: [Int]
+z:tail ys :: [Int]
+z:tail zs :: [Int]
+x:tail [] :: [Int]
+y:tail [] :: [Int]
+z:tail [] :: [Int]
+xs ++ tail xs :: [Int]
+xs ++ tail ys :: [Int]
+xs ++ tail zs :: [Int]
+ys ++ tail xs :: [Int]
+ys ++ tail ys :: [Int]
+ys ++ tail zs :: [Int]
+zs ++ tail xs :: [Int]
+zs ++ tail ys :: [Int]
+zs ++ tail zs :: [Int]
+xs ++ tail [] :: [Int]
+ys ++ tail [] :: [Int]
+zs ++ tail [] :: [Int]
+head xs:xs :: [Int]
+head xs:ys :: [Int]
+head xs:zs :: [Int]
+head ys:xs :: [Int]
+head ys:ys :: [Int]
+head ys:zs :: [Int]
+head zs:xs :: [Int]
+head zs:ys :: [Int]
+head zs:zs :: [Int]
+[head xs] :: [Int]
+[head ys] :: [Int]
+[head zs] :: [Int]
+head []:xs :: [Int]
+head []:ys :: [Int]
+head []:zs :: [Int]
+[head []] :: [Int]
+tail xs ++ xs :: [Int]
+tail xs ++ ys :: [Int]
+tail xs ++ zs :: [Int]
+tail ys ++ xs :: [Int]
+tail ys ++ ys :: [Int]
+tail ys ++ zs :: [Int]
+tail zs ++ xs :: [Int]
+tail zs ++ ys :: [Int]
+tail zs ++ zs :: [Int]
+tail [] ++ xs :: [Int]
+tail [] ++ ys :: [Int]
+tail [] ++ zs :: [Int]
+head (tail (tail (tail xs))) :: Int
+head (tail (tail (tail ys))) :: Int
+head (tail (tail (tail zs))) :: Int
+head (tail (tail (tail []))) :: Int
+head (tail (xs ++ xs)) :: Int
+head (tail (xs ++ ys)) :: Int
+head (tail (xs ++ zs)) :: Int
+head (tail (ys ++ xs)) :: Int
+head (tail (ys ++ ys)) :: Int
+head (tail (ys ++ zs)) :: Int
+head (tail (zs ++ xs)) :: Int
+head (tail (zs ++ ys)) :: Int
+head (tail (zs ++ zs)) :: Int
+head (xs ++ tail xs) :: Int
+head (xs ++ tail ys) :: Int
+head (xs ++ tail zs) :: Int
+head (ys ++ tail xs) :: Int
+head (ys ++ tail ys) :: Int
+head (ys ++ tail zs) :: Int
+head (zs ++ tail xs) :: Int
+head (zs ++ tail ys) :: Int
+head (zs ++ tail zs) :: Int
+head (xs ++ tail []) :: Int
+head (ys ++ tail []) :: Int
+head (zs ++ tail []) :: Int
+head (tail xs ++ xs) :: Int
+head (tail xs ++ ys) :: Int
+head (tail xs ++ zs) :: Int
+head (tail ys ++ xs) :: Int
+head (tail ys ++ ys) :: Int
+head (tail ys ++ zs) :: Int
+head (tail zs ++ xs) :: Int
+head (tail zs ++ ys) :: Int
+head (tail zs ++ zs) :: Int
+head (tail [] ++ xs) :: Int
+head (tail [] ++ ys) :: Int
+head (tail [] ++ zs) :: Int
+tail (tail (tail (tail xs))) :: [Int]
+tail (tail (tail (tail ys))) :: [Int]
+tail (tail (tail (tail zs))) :: [Int]
+tail (tail (tail (tail []))) :: [Int]
+tail (tail (xs ++ xs)) :: [Int]
+tail (tail (xs ++ ys)) :: [Int]
+tail (tail (xs ++ zs)) :: [Int]
+tail (tail (ys ++ xs)) :: [Int]
+tail (tail (ys ++ ys)) :: [Int]
+tail (tail (ys ++ zs)) :: [Int]
+tail (tail (zs ++ xs)) :: [Int]
+tail (tail (zs ++ ys)) :: [Int]
+tail (tail (zs ++ zs)) :: [Int]
+tail (xs ++ tail xs) :: [Int]
+tail (xs ++ tail ys) :: [Int]
+tail (xs ++ tail zs) :: [Int]
+tail (ys ++ tail xs) :: [Int]
+tail (ys ++ tail ys) :: [Int]
+tail (ys ++ tail zs) :: [Int]
+tail (zs ++ tail xs) :: [Int]
+tail (zs ++ tail ys) :: [Int]
+tail (zs ++ tail zs) :: [Int]
+tail (xs ++ tail []) :: [Int]
+tail (ys ++ tail []) :: [Int]
+tail (zs ++ tail []) :: [Int]
+tail (tail xs ++ xs) :: [Int]
+tail (tail xs ++ ys) :: [Int]
+tail (tail xs ++ zs) :: [Int]
+tail (tail ys ++ xs) :: [Int]
+tail (tail ys ++ ys) :: [Int]
+tail (tail ys ++ zs) :: [Int]
+tail (tail zs ++ xs) :: [Int]
+tail (tail zs ++ ys) :: [Int]
+tail (tail zs ++ zs) :: [Int]
+tail (tail [] ++ xs) :: [Int]
+tail (tail [] ++ ys) :: [Int]
+tail (tail [] ++ zs) :: [Int]
+x:tail (tail xs) :: [Int]
+x:tail (tail ys) :: [Int]
+x:tail (tail zs) :: [Int]
+y:tail (tail xs) :: [Int]
+y:tail (tail ys) :: [Int]
+y:tail (tail zs) :: [Int]
+z:tail (tail xs) :: [Int]
+z:tail (tail ys) :: [Int]
+z:tail (tail zs) :: [Int]
+x:tail (tail []) :: [Int]
+y:tail (tail []) :: [Int]
+z:tail (tail []) :: [Int]
+x:x:xs :: [Int]
+x:x:ys :: [Int]
+x:x:zs :: [Int]
+x:y:xs :: [Int]
+x:y:ys :: [Int]
+x:y:zs :: [Int]
+x:z:xs :: [Int]
+x:z:ys :: [Int]
+x:z:zs :: [Int]
+y:x:xs :: [Int]
+y:x:ys :: [Int]
+y:x:zs :: [Int]
+y:y:xs :: [Int]
+y:y:ys :: [Int]
+y:y:zs :: [Int]
+y:z:xs :: [Int]
+y:z:ys :: [Int]
+y:z:zs :: [Int]
+z:x:xs :: [Int]
+z:x:ys :: [Int]
+z:x:zs :: [Int]
+z:y:xs :: [Int]
+z:y:ys :: [Int]
+z:y:zs :: [Int]
+z:z:xs :: [Int]
+z:z:ys :: [Int]
+z:z:zs :: [Int]
+[x,x] :: [Int]
+[x,y] :: [Int]
+[x,z] :: [Int]
+[y,x] :: [Int]
+[y,y] :: [Int]
+[y,z] :: [Int]
+[z,x] :: [Int]
+[z,y] :: [Int]
+[z,z] :: [Int]
+x:(xs ++ xs) :: [Int]
+x:(xs ++ ys) :: [Int]
+x:(xs ++ zs) :: [Int]
+x:(ys ++ xs) :: [Int]
+x:(ys ++ ys) :: [Int]
+x:(ys ++ zs) :: [Int]
+x:(zs ++ xs) :: [Int]
+x:(zs ++ ys) :: [Int]
+x:(zs ++ zs) :: [Int]
+y:(xs ++ xs) :: [Int]
+y:(xs ++ ys) :: [Int]
+y:(xs ++ zs) :: [Int]
+y:(ys ++ xs) :: [Int]
+y:(ys ++ ys) :: [Int]
+y:(ys ++ zs) :: [Int]
+y:(zs ++ xs) :: [Int]
+y:(zs ++ ys) :: [Int]
+y:(zs ++ zs) :: [Int]
+z:(xs ++ xs) :: [Int]
+z:(xs ++ ys) :: [Int]
+z:(xs ++ zs) :: [Int]
+z:(ys ++ xs) :: [Int]
+z:(ys ++ ys) :: [Int]
+z:(ys ++ zs) :: [Int]
+z:(zs ++ xs) :: [Int]
+z:(zs ++ ys) :: [Int]
+z:(zs ++ zs) :: [Int]
+xs ++ tail (tail xs) :: [Int]
+xs ++ tail (tail ys) :: [Int]
+xs ++ tail (tail zs) :: [Int]
+ys ++ tail (tail xs) :: [Int]
+ys ++ tail (tail ys) :: [Int]
+ys ++ tail (tail zs) :: [Int]
+zs ++ tail (tail xs) :: [Int]
+zs ++ tail (tail ys) :: [Int]
+zs ++ tail (tail zs) :: [Int]
+xs ++ tail (tail []) :: [Int]
+ys ++ tail (tail []) :: [Int]
+zs ++ tail (tail []) :: [Int]
+xs ++ (x:xs) :: [Int]
+xs ++ (y:xs) :: [Int]
+xs ++ (z:xs) :: [Int]
+xs ++ (x:ys) :: [Int]
+xs ++ (y:ys) :: [Int]
+xs ++ (z:ys) :: [Int]
+xs ++ (x:zs) :: [Int]
+xs ++ (y:zs) :: [Int]
+xs ++ (z:zs) :: [Int]
+ys ++ (x:xs) :: [Int]
+ys ++ (y:xs) :: [Int]
+ys ++ (z:xs) :: [Int]
+ys ++ (x:ys) :: [Int]
+ys ++ (y:ys) :: [Int]
+ys ++ (z:ys) :: [Int]
+ys ++ (x:zs) :: [Int]
+ys ++ (y:zs) :: [Int]
+ys ++ (z:zs) :: [Int]
+zs ++ (x:xs) :: [Int]
+zs ++ (y:xs) :: [Int]
+zs ++ (z:xs) :: [Int]
+zs ++ (x:ys) :: [Int]
+zs ++ (y:ys) :: [Int]
+zs ++ (z:ys) :: [Int]
+zs ++ (x:zs) :: [Int]
+zs ++ (y:zs) :: [Int]
+zs ++ (z:zs) :: [Int]
+xs ++ [x] :: [Int]
+xs ++ [y] :: [Int]
+xs ++ [z] :: [Int]
+ys ++ [x] :: [Int]
+ys ++ [y] :: [Int]
+ys ++ [z] :: [Int]
+zs ++ [x] :: [Int]
+zs ++ [y] :: [Int]
+zs ++ [z] :: [Int]
+xs ++ (xs ++ xs) :: [Int]
+xs ++ (xs ++ ys) :: [Int]
+xs ++ (xs ++ zs) :: [Int]
+xs ++ (ys ++ xs) :: [Int]
+xs ++ (ys ++ ys) :: [Int]
+xs ++ (ys ++ zs) :: [Int]
+xs ++ (zs ++ xs) :: [Int]
+xs ++ (zs ++ ys) :: [Int]
+xs ++ (zs ++ zs) :: [Int]
+ys ++ (xs ++ xs) :: [Int]
+ys ++ (xs ++ ys) :: [Int]
+ys ++ (xs ++ zs) :: [Int]
+ys ++ (ys ++ xs) :: [Int]
+ys ++ (ys ++ ys) :: [Int]
+ys ++ (ys ++ zs) :: [Int]
+ys ++ (zs ++ xs) :: [Int]
+ys ++ (zs ++ ys) :: [Int]
+ys ++ (zs ++ zs) :: [Int]
+zs ++ (xs ++ xs) :: [Int]
+zs ++ (xs ++ ys) :: [Int]
+zs ++ (xs ++ zs) :: [Int]
+zs ++ (ys ++ xs) :: [Int]
+zs ++ (ys ++ ys) :: [Int]
+zs ++ (ys ++ zs) :: [Int]
+zs ++ (zs ++ xs) :: [Int]
+zs ++ (zs ++ ys) :: [Int]
+zs ++ (zs ++ zs) :: [Int]
+head xs:tail xs :: [Int]
+head xs:tail ys :: [Int]
+head xs:tail zs :: [Int]
+head ys:tail xs :: [Int]
+head ys:tail ys :: [Int]
+head ys:tail zs :: [Int]
+head zs:tail xs :: [Int]
+head zs:tail ys :: [Int]
+head zs:tail zs :: [Int]
+head xs:tail [] :: [Int]
+head ys:tail [] :: [Int]
+head zs:tail [] :: [Int]
+head []:tail xs :: [Int]
+head []:tail ys :: [Int]
+head []:tail zs :: [Int]
+head []:tail [] :: [Int]
+tail xs ++ tail xs :: [Int]
+tail xs ++ tail ys :: [Int]
+tail xs ++ tail zs :: [Int]
+tail ys ++ tail xs :: [Int]
+tail ys ++ tail ys :: [Int]
+tail ys ++ tail zs :: [Int]
+tail zs ++ tail xs :: [Int]
+tail zs ++ tail ys :: [Int]
+tail zs ++ tail zs :: [Int]
+tail xs ++ tail [] :: [Int]
+tail ys ++ tail [] :: [Int]
+tail zs ++ tail [] :: [Int]
+tail [] ++ tail xs :: [Int]
+tail [] ++ tail ys :: [Int]
+tail [] ++ tail zs :: [Int]
+tail [] ++ tail [] :: [Int]
+head (tail xs):xs :: [Int]
+head (tail xs):ys :: [Int]
+head (tail xs):zs :: [Int]
+head (tail ys):xs :: [Int]
+head (tail ys):ys :: [Int]
+head (tail ys):zs :: [Int]
+head (tail zs):xs :: [Int]
+head (tail zs):ys :: [Int]
+head (tail zs):zs :: [Int]
+[head (tail xs)] :: [Int]
+[head (tail ys)] :: [Int]
+[head (tail zs)] :: [Int]
+head (tail []):xs :: [Int]
+head (tail []):ys :: [Int]
+head (tail []):zs :: [Int]
+[head (tail [])] :: [Int]
+tail (tail xs) ++ xs :: [Int]
+tail (tail xs) ++ ys :: [Int]
+tail (tail xs) ++ zs :: [Int]
+tail (tail ys) ++ xs :: [Int]
+tail (tail ys) ++ ys :: [Int]
+tail (tail ys) ++ zs :: [Int]
+tail (tail zs) ++ xs :: [Int]
+tail (tail zs) ++ ys :: [Int]
+tail (tail zs) ++ zs :: [Int]
+tail (tail []) ++ xs :: [Int]
+tail (tail []) ++ ys :: [Int]
+tail (tail []) ++ zs :: [Int]
+
+Number of Eq schema classes: 90
+Number of Eq 1-var classes: 68
+Number of Eq 2-var classes: 191
+Number of Eq 3-var classes: 406
diff --git a/test/model/list-c.out b/test/model/list-c.out
new file mode 100644
--- /dev/null
+++ b/test/model/list-c.out
@@ -0,0 +1,777 @@
+max expr size  =    5
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    3  (for inequational and conditional laws)
+
+_ :: Int
+_ :: [Int]
+[] :: [Int]
+(:) :: Int -> [Int] -> [Int]
+(++) :: [Int] -> [Int] -> [Int]
+head :: [Int] -> Int
+tail :: [Int] -> [Int]
+
+_ :: Int
+_ :: [Int]
+[] :: [Int]
+head _ :: Int
+head [] :: Int
+tail _ :: [Int]
+tail [] :: [Int]
+head (tail _) :: Int
+head (tail []) :: Int
+tail (tail _) :: [Int]
+tail (tail []) :: [Int]
+_:_ :: [Int]
+[_] :: [Int]
+_ ++ _ :: [Int]
+head (tail (tail _)) :: Int
+head (tail (tail [])) :: Int
+head (_ ++ _) :: Int
+tail (tail (tail _)) :: [Int]
+tail (tail (tail [])) :: [Int]
+tail (_ ++ _) :: [Int]
+_:tail _ :: [Int]
+_:tail [] :: [Int]
+_ ++ tail _ :: [Int]
+_ ++ tail [] :: [Int]
+[] ++ tail _ :: [Int]
+[] ++ tail [] :: [Int]
+head _:_ :: [Int]
+[head _] :: [Int]
+head []:_ :: [Int]
+[head []] :: [Int]
+tail _ ++ _ :: [Int]
+tail _ ++ [] :: [Int]
+tail [] ++ _ :: [Int]
+tail [] ++ [] :: [Int]
+head (tail (tail (tail _))) :: Int
+head (tail (tail (tail []))) :: Int
+head (tail (_ ++ _)) :: Int
+head (_ ++ tail _) :: Int
+head (_ ++ tail []) :: Int
+head ([] ++ tail _) :: Int
+head ([] ++ tail []) :: Int
+head (head _:_) :: Int
+head [head _] :: Int
+head (head []:_) :: Int
+head [head []] :: Int
+head (tail _ ++ _) :: Int
+head (tail _ ++ []) :: Int
+head (tail [] ++ _) :: Int
+head (tail [] ++ []) :: Int
+tail (tail (tail (tail _))) :: [Int]
+tail (tail (tail (tail []))) :: [Int]
+tail (tail (_ ++ _)) :: [Int]
+tail (_:tail _) :: [Int]
+tail (_:tail []) :: [Int]
+tail (_ ++ tail _) :: [Int]
+tail (_ ++ tail []) :: [Int]
+tail ([] ++ tail _) :: [Int]
+tail ([] ++ tail []) :: [Int]
+tail (tail _ ++ _) :: [Int]
+tail (tail _ ++ []) :: [Int]
+tail (tail [] ++ _) :: [Int]
+tail (tail [] ++ []) :: [Int]
+_:tail (tail _) :: [Int]
+_:tail (tail []) :: [Int]
+_:_:_ :: [Int]
+[_,_] :: [Int]
+_:(_ ++ _) :: [Int]
+_ ++ tail (tail _) :: [Int]
+_ ++ tail (tail []) :: [Int]
+_ ++ (_:_) :: [Int]
+_ ++ [_] :: [Int]
+_ ++ (_ ++ _) :: [Int]
+[] ++ tail (tail _) :: [Int]
+[] ++ tail (tail []) :: [Int]
+head _:tail _ :: [Int]
+head _:tail [] :: [Int]
+head []:tail _ :: [Int]
+head []:tail [] :: [Int]
+tail _ ++ tail _ :: [Int]
+tail _ ++ tail [] :: [Int]
+tail [] ++ tail _ :: [Int]
+tail [] ++ tail [] :: [Int]
+head (tail _):_ :: [Int]
+[head (tail _)] :: [Int]
+head (tail []):_ :: [Int]
+[head (tail [])] :: [Int]
+tail (tail _) ++ _ :: [Int]
+tail (tail _) ++ [] :: [Int]
+tail (tail []) ++ _ :: [Int]
+tail (tail []) ++ [] :: [Int]
+
+x :: Int
+xs :: [Int]
+[] :: [Int]
+head xs :: Int
+head [] :: Int
+tail xs :: [Int]
+tail [] :: [Int]
+head (tail xs) :: Int
+head (tail []) :: Int
+tail (tail xs) :: [Int]
+tail (tail []) :: [Int]
+x:xs :: [Int]
+[x] :: [Int]
+xs ++ xs :: [Int]
+head (tail (tail xs)) :: Int
+head (tail (tail [])) :: Int
+head (xs ++ xs) :: Int
+tail (tail (tail xs)) :: [Int]
+tail (tail (tail [])) :: [Int]
+tail (xs ++ xs) :: [Int]
+x:tail xs :: [Int]
+x:tail [] :: [Int]
+xs ++ tail xs :: [Int]
+xs ++ tail [] :: [Int]
+head xs:xs :: [Int]
+[head xs] :: [Int]
+head []:xs :: [Int]
+[head []] :: [Int]
+tail xs ++ xs :: [Int]
+tail [] ++ xs :: [Int]
+head (tail (tail (tail xs))) :: Int
+head (tail (tail (tail []))) :: Int
+head (tail (xs ++ xs)) :: Int
+head (xs ++ tail xs) :: Int
+head (xs ++ tail []) :: Int
+head (tail xs ++ xs) :: Int
+head (tail [] ++ xs) :: Int
+tail (tail (tail (tail xs))) :: [Int]
+tail (tail (tail (tail []))) :: [Int]
+tail (tail (xs ++ xs)) :: [Int]
+tail (xs ++ tail xs) :: [Int]
+tail (xs ++ tail []) :: [Int]
+tail (tail xs ++ xs) :: [Int]
+tail (tail [] ++ xs) :: [Int]
+x:tail (tail xs) :: [Int]
+x:tail (tail []) :: [Int]
+x:x:xs :: [Int]
+[x,x] :: [Int]
+x:(xs ++ xs) :: [Int]
+xs ++ tail (tail xs) :: [Int]
+xs ++ tail (tail []) :: [Int]
+xs ++ (x:xs) :: [Int]
+xs ++ [x] :: [Int]
+xs ++ (xs ++ xs) :: [Int]
+head xs:tail xs :: [Int]
+head xs:tail [] :: [Int]
+head []:tail xs :: [Int]
+head []:tail [] :: [Int]
+tail xs ++ tail xs :: [Int]
+tail xs ++ tail [] :: [Int]
+tail [] ++ tail xs :: [Int]
+tail [] ++ tail [] :: [Int]
+head (tail xs):xs :: [Int]
+[head (tail xs)] :: [Int]
+head (tail []):xs :: [Int]
+[head (tail [])] :: [Int]
+tail (tail xs) ++ xs :: [Int]
+tail (tail []) ++ xs :: [Int]
+
+x :: Int
+y :: Int
+xs :: [Int]
+ys :: [Int]
+[] :: [Int]
+head xs :: Int
+head ys :: Int
+head [] :: Int
+tail xs :: [Int]
+tail ys :: [Int]
+tail [] :: [Int]
+head (tail xs) :: Int
+head (tail ys) :: Int
+head (tail []) :: Int
+tail (tail xs) :: [Int]
+tail (tail ys) :: [Int]
+tail (tail []) :: [Int]
+x:xs :: [Int]
+x:ys :: [Int]
+y:xs :: [Int]
+y:ys :: [Int]
+[x] :: [Int]
+[y] :: [Int]
+xs ++ xs :: [Int]
+xs ++ ys :: [Int]
+ys ++ xs :: [Int]
+ys ++ ys :: [Int]
+head (tail (tail xs)) :: Int
+head (tail (tail ys)) :: Int
+head (tail (tail [])) :: Int
+head (xs ++ xs) :: Int
+head (xs ++ ys) :: Int
+head (ys ++ xs) :: Int
+head (ys ++ ys) :: Int
+tail (tail (tail xs)) :: [Int]
+tail (tail (tail ys)) :: [Int]
+tail (tail (tail [])) :: [Int]
+tail (xs ++ xs) :: [Int]
+tail (xs ++ ys) :: [Int]
+tail (ys ++ xs) :: [Int]
+tail (ys ++ ys) :: [Int]
+x:tail xs :: [Int]
+x:tail ys :: [Int]
+y:tail xs :: [Int]
+y:tail ys :: [Int]
+x:tail [] :: [Int]
+y:tail [] :: [Int]
+xs ++ tail xs :: [Int]
+xs ++ tail ys :: [Int]
+ys ++ tail xs :: [Int]
+ys ++ tail ys :: [Int]
+xs ++ tail [] :: [Int]
+ys ++ tail [] :: [Int]
+head xs:xs :: [Int]
+head xs:ys :: [Int]
+head ys:xs :: [Int]
+head ys:ys :: [Int]
+[head xs] :: [Int]
+[head ys] :: [Int]
+head []:xs :: [Int]
+head []:ys :: [Int]
+[head []] :: [Int]
+tail xs ++ xs :: [Int]
+tail xs ++ ys :: [Int]
+tail ys ++ xs :: [Int]
+tail ys ++ ys :: [Int]
+tail [] ++ xs :: [Int]
+tail [] ++ ys :: [Int]
+head (tail (tail (tail xs))) :: Int
+head (tail (tail (tail ys))) :: Int
+head (tail (tail (tail []))) :: Int
+head (tail (xs ++ xs)) :: Int
+head (tail (xs ++ ys)) :: Int
+head (tail (ys ++ xs)) :: Int
+head (tail (ys ++ ys)) :: Int
+head (xs ++ tail xs) :: Int
+head (xs ++ tail ys) :: Int
+head (ys ++ tail xs) :: Int
+head (ys ++ tail ys) :: Int
+head (xs ++ tail []) :: Int
+head (ys ++ tail []) :: Int
+head (tail xs ++ xs) :: Int
+head (tail xs ++ ys) :: Int
+head (tail ys ++ xs) :: Int
+head (tail ys ++ ys) :: Int
+head (tail [] ++ xs) :: Int
+head (tail [] ++ ys) :: Int
+tail (tail (tail (tail xs))) :: [Int]
+tail (tail (tail (tail ys))) :: [Int]
+tail (tail (tail (tail []))) :: [Int]
+tail (tail (xs ++ xs)) :: [Int]
+tail (tail (xs ++ ys)) :: [Int]
+tail (tail (ys ++ xs)) :: [Int]
+tail (tail (ys ++ ys)) :: [Int]
+tail (xs ++ tail xs) :: [Int]
+tail (xs ++ tail ys) :: [Int]
+tail (ys ++ tail xs) :: [Int]
+tail (ys ++ tail ys) :: [Int]
+tail (xs ++ tail []) :: [Int]
+tail (ys ++ tail []) :: [Int]
+tail (tail xs ++ xs) :: [Int]
+tail (tail xs ++ ys) :: [Int]
+tail (tail ys ++ xs) :: [Int]
+tail (tail ys ++ ys) :: [Int]
+tail (tail [] ++ xs) :: [Int]
+tail (tail [] ++ ys) :: [Int]
+x:tail (tail xs) :: [Int]
+x:tail (tail ys) :: [Int]
+y:tail (tail xs) :: [Int]
+y:tail (tail ys) :: [Int]
+x:tail (tail []) :: [Int]
+y:tail (tail []) :: [Int]
+x:x:xs :: [Int]
+x:x:ys :: [Int]
+x:y:xs :: [Int]
+x:y:ys :: [Int]
+y:x:xs :: [Int]
+y:x:ys :: [Int]
+y:y:xs :: [Int]
+y:y:ys :: [Int]
+[x,x] :: [Int]
+[x,y] :: [Int]
+[y,x] :: [Int]
+[y,y] :: [Int]
+x:(xs ++ xs) :: [Int]
+x:(xs ++ ys) :: [Int]
+x:(ys ++ xs) :: [Int]
+x:(ys ++ ys) :: [Int]
+y:(xs ++ xs) :: [Int]
+y:(xs ++ ys) :: [Int]
+y:(ys ++ xs) :: [Int]
+y:(ys ++ ys) :: [Int]
+xs ++ tail (tail xs) :: [Int]
+xs ++ tail (tail ys) :: [Int]
+ys ++ tail (tail xs) :: [Int]
+ys ++ tail (tail ys) :: [Int]
+xs ++ tail (tail []) :: [Int]
+ys ++ tail (tail []) :: [Int]
+xs ++ (x:xs) :: [Int]
+xs ++ (y:xs) :: [Int]
+xs ++ (x:ys) :: [Int]
+xs ++ (y:ys) :: [Int]
+ys ++ (x:xs) :: [Int]
+ys ++ (y:xs) :: [Int]
+ys ++ (x:ys) :: [Int]
+ys ++ (y:ys) :: [Int]
+xs ++ [x] :: [Int]
+xs ++ [y] :: [Int]
+ys ++ [x] :: [Int]
+ys ++ [y] :: [Int]
+xs ++ (xs ++ xs) :: [Int]
+xs ++ (xs ++ ys) :: [Int]
+xs ++ (ys ++ xs) :: [Int]
+xs ++ (ys ++ ys) :: [Int]
+ys ++ (xs ++ xs) :: [Int]
+ys ++ (xs ++ ys) :: [Int]
+ys ++ (ys ++ xs) :: [Int]
+ys ++ (ys ++ ys) :: [Int]
+head xs:tail xs :: [Int]
+head xs:tail ys :: [Int]
+head ys:tail xs :: [Int]
+head ys:tail ys :: [Int]
+head xs:tail [] :: [Int]
+head ys:tail [] :: [Int]
+head []:tail xs :: [Int]
+head []:tail ys :: [Int]
+head []:tail [] :: [Int]
+tail xs ++ tail xs :: [Int]
+tail xs ++ tail ys :: [Int]
+tail ys ++ tail xs :: [Int]
+tail ys ++ tail ys :: [Int]
+tail xs ++ tail [] :: [Int]
+tail ys ++ tail [] :: [Int]
+tail [] ++ tail xs :: [Int]
+tail [] ++ tail ys :: [Int]
+tail [] ++ tail [] :: [Int]
+head (tail xs):xs :: [Int]
+head (tail xs):ys :: [Int]
+head (tail ys):xs :: [Int]
+head (tail ys):ys :: [Int]
+[head (tail xs)] :: [Int]
+[head (tail ys)] :: [Int]
+head (tail []):xs :: [Int]
+head (tail []):ys :: [Int]
+[head (tail [])] :: [Int]
+tail (tail xs) ++ xs :: [Int]
+tail (tail xs) ++ ys :: [Int]
+tail (tail ys) ++ xs :: [Int]
+tail (tail ys) ++ ys :: [Int]
+tail (tail []) ++ xs :: [Int]
+tail (tail []) ++ ys :: [Int]
+
+x :: Int
+y :: Int
+z :: Int
+xs :: [Int]
+ys :: [Int]
+zs :: [Int]
+[] :: [Int]
+head xs :: Int
+head ys :: Int
+head zs :: Int
+head [] :: Int
+tail xs :: [Int]
+tail ys :: [Int]
+tail zs :: [Int]
+tail [] :: [Int]
+head (tail xs) :: Int
+head (tail ys) :: Int
+head (tail zs) :: Int
+head (tail []) :: Int
+tail (tail xs) :: [Int]
+tail (tail ys) :: [Int]
+tail (tail zs) :: [Int]
+tail (tail []) :: [Int]
+x:xs :: [Int]
+x:ys :: [Int]
+x:zs :: [Int]
+y:xs :: [Int]
+y:ys :: [Int]
+y:zs :: [Int]
+z:xs :: [Int]
+z:ys :: [Int]
+z:zs :: [Int]
+[x] :: [Int]
+[y] :: [Int]
+[z] :: [Int]
+xs ++ xs :: [Int]
+xs ++ ys :: [Int]
+xs ++ zs :: [Int]
+ys ++ xs :: [Int]
+ys ++ ys :: [Int]
+ys ++ zs :: [Int]
+zs ++ xs :: [Int]
+zs ++ ys :: [Int]
+zs ++ zs :: [Int]
+head (tail (tail xs)) :: Int
+head (tail (tail ys)) :: Int
+head (tail (tail zs)) :: Int
+head (tail (tail [])) :: Int
+head (xs ++ xs) :: Int
+head (xs ++ ys) :: Int
+head (xs ++ zs) :: Int
+head (ys ++ xs) :: Int
+head (ys ++ ys) :: Int
+head (ys ++ zs) :: Int
+head (zs ++ xs) :: Int
+head (zs ++ ys) :: Int
+head (zs ++ zs) :: Int
+tail (tail (tail xs)) :: [Int]
+tail (tail (tail ys)) :: [Int]
+tail (tail (tail zs)) :: [Int]
+tail (tail (tail [])) :: [Int]
+tail (xs ++ xs) :: [Int]
+tail (xs ++ ys) :: [Int]
+tail (xs ++ zs) :: [Int]
+tail (ys ++ xs) :: [Int]
+tail (ys ++ ys) :: [Int]
+tail (ys ++ zs) :: [Int]
+tail (zs ++ xs) :: [Int]
+tail (zs ++ ys) :: [Int]
+tail (zs ++ zs) :: [Int]
+x:tail xs :: [Int]
+x:tail ys :: [Int]
+x:tail zs :: [Int]
+y:tail xs :: [Int]
+y:tail ys :: [Int]
+y:tail zs :: [Int]
+z:tail xs :: [Int]
+z:tail ys :: [Int]
+z:tail zs :: [Int]
+x:tail [] :: [Int]
+y:tail [] :: [Int]
+z:tail [] :: [Int]
+xs ++ tail xs :: [Int]
+xs ++ tail ys :: [Int]
+xs ++ tail zs :: [Int]
+ys ++ tail xs :: [Int]
+ys ++ tail ys :: [Int]
+ys ++ tail zs :: [Int]
+zs ++ tail xs :: [Int]
+zs ++ tail ys :: [Int]
+zs ++ tail zs :: [Int]
+xs ++ tail [] :: [Int]
+ys ++ tail [] :: [Int]
+zs ++ tail [] :: [Int]
+head xs:xs :: [Int]
+head xs:ys :: [Int]
+head xs:zs :: [Int]
+head ys:xs :: [Int]
+head ys:ys :: [Int]
+head ys:zs :: [Int]
+head zs:xs :: [Int]
+head zs:ys :: [Int]
+head zs:zs :: [Int]
+[head xs] :: [Int]
+[head ys] :: [Int]
+[head zs] :: [Int]
+head []:xs :: [Int]
+head []:ys :: [Int]
+head []:zs :: [Int]
+[head []] :: [Int]
+tail xs ++ xs :: [Int]
+tail xs ++ ys :: [Int]
+tail xs ++ zs :: [Int]
+tail ys ++ xs :: [Int]
+tail ys ++ ys :: [Int]
+tail ys ++ zs :: [Int]
+tail zs ++ xs :: [Int]
+tail zs ++ ys :: [Int]
+tail zs ++ zs :: [Int]
+tail [] ++ xs :: [Int]
+tail [] ++ ys :: [Int]
+tail [] ++ zs :: [Int]
+head (tail (tail (tail xs))) :: Int
+head (tail (tail (tail ys))) :: Int
+head (tail (tail (tail zs))) :: Int
+head (tail (tail (tail []))) :: Int
+head (tail (xs ++ xs)) :: Int
+head (tail (xs ++ ys)) :: Int
+head (tail (xs ++ zs)) :: Int
+head (tail (ys ++ xs)) :: Int
+head (tail (ys ++ ys)) :: Int
+head (tail (ys ++ zs)) :: Int
+head (tail (zs ++ xs)) :: Int
+head (tail (zs ++ ys)) :: Int
+head (tail (zs ++ zs)) :: Int
+head (xs ++ tail xs) :: Int
+head (xs ++ tail ys) :: Int
+head (xs ++ tail zs) :: Int
+head (ys ++ tail xs) :: Int
+head (ys ++ tail ys) :: Int
+head (ys ++ tail zs) :: Int
+head (zs ++ tail xs) :: Int
+head (zs ++ tail ys) :: Int
+head (zs ++ tail zs) :: Int
+head (xs ++ tail []) :: Int
+head (ys ++ tail []) :: Int
+head (zs ++ tail []) :: Int
+head (tail xs ++ xs) :: Int
+head (tail xs ++ ys) :: Int
+head (tail xs ++ zs) :: Int
+head (tail ys ++ xs) :: Int
+head (tail ys ++ ys) :: Int
+head (tail ys ++ zs) :: Int
+head (tail zs ++ xs) :: Int
+head (tail zs ++ ys) :: Int
+head (tail zs ++ zs) :: Int
+head (tail [] ++ xs) :: Int
+head (tail [] ++ ys) :: Int
+head (tail [] ++ zs) :: Int
+tail (tail (tail (tail xs))) :: [Int]
+tail (tail (tail (tail ys))) :: [Int]
+tail (tail (tail (tail zs))) :: [Int]
+tail (tail (tail (tail []))) :: [Int]
+tail (tail (xs ++ xs)) :: [Int]
+tail (tail (xs ++ ys)) :: [Int]
+tail (tail (xs ++ zs)) :: [Int]
+tail (tail (ys ++ xs)) :: [Int]
+tail (tail (ys ++ ys)) :: [Int]
+tail (tail (ys ++ zs)) :: [Int]
+tail (tail (zs ++ xs)) :: [Int]
+tail (tail (zs ++ ys)) :: [Int]
+tail (tail (zs ++ zs)) :: [Int]
+tail (xs ++ tail xs) :: [Int]
+tail (xs ++ tail ys) :: [Int]
+tail (xs ++ tail zs) :: [Int]
+tail (ys ++ tail xs) :: [Int]
+tail (ys ++ tail ys) :: [Int]
+tail (ys ++ tail zs) :: [Int]
+tail (zs ++ tail xs) :: [Int]
+tail (zs ++ tail ys) :: [Int]
+tail (zs ++ tail zs) :: [Int]
+tail (xs ++ tail []) :: [Int]
+tail (ys ++ tail []) :: [Int]
+tail (zs ++ tail []) :: [Int]
+tail (tail xs ++ xs) :: [Int]
+tail (tail xs ++ ys) :: [Int]
+tail (tail xs ++ zs) :: [Int]
+tail (tail ys ++ xs) :: [Int]
+tail (tail ys ++ ys) :: [Int]
+tail (tail ys ++ zs) :: [Int]
+tail (tail zs ++ xs) :: [Int]
+tail (tail zs ++ ys) :: [Int]
+tail (tail zs ++ zs) :: [Int]
+tail (tail [] ++ xs) :: [Int]
+tail (tail [] ++ ys) :: [Int]
+tail (tail [] ++ zs) :: [Int]
+x:tail (tail xs) :: [Int]
+x:tail (tail ys) :: [Int]
+x:tail (tail zs) :: [Int]
+y:tail (tail xs) :: [Int]
+y:tail (tail ys) :: [Int]
+y:tail (tail zs) :: [Int]
+z:tail (tail xs) :: [Int]
+z:tail (tail ys) :: [Int]
+z:tail (tail zs) :: [Int]
+x:tail (tail []) :: [Int]
+y:tail (tail []) :: [Int]
+z:tail (tail []) :: [Int]
+x:x:xs :: [Int]
+x:x:ys :: [Int]
+x:x:zs :: [Int]
+x:y:xs :: [Int]
+x:y:ys :: [Int]
+x:y:zs :: [Int]
+x:z:xs :: [Int]
+x:z:ys :: [Int]
+x:z:zs :: [Int]
+y:x:xs :: [Int]
+y:x:ys :: [Int]
+y:x:zs :: [Int]
+y:y:xs :: [Int]
+y:y:ys :: [Int]
+y:y:zs :: [Int]
+y:z:xs :: [Int]
+y:z:ys :: [Int]
+y:z:zs :: [Int]
+z:x:xs :: [Int]
+z:x:ys :: [Int]
+z:x:zs :: [Int]
+z:y:xs :: [Int]
+z:y:ys :: [Int]
+z:y:zs :: [Int]
+z:z:xs :: [Int]
+z:z:ys :: [Int]
+z:z:zs :: [Int]
+[x,x] :: [Int]
+[x,y] :: [Int]
+[x,z] :: [Int]
+[y,x] :: [Int]
+[y,y] :: [Int]
+[y,z] :: [Int]
+[z,x] :: [Int]
+[z,y] :: [Int]
+[z,z] :: [Int]
+x:(xs ++ xs) :: [Int]
+x:(xs ++ ys) :: [Int]
+x:(xs ++ zs) :: [Int]
+x:(ys ++ xs) :: [Int]
+x:(ys ++ ys) :: [Int]
+x:(ys ++ zs) :: [Int]
+x:(zs ++ xs) :: [Int]
+x:(zs ++ ys) :: [Int]
+x:(zs ++ zs) :: [Int]
+y:(xs ++ xs) :: [Int]
+y:(xs ++ ys) :: [Int]
+y:(xs ++ zs) :: [Int]
+y:(ys ++ xs) :: [Int]
+y:(ys ++ ys) :: [Int]
+y:(ys ++ zs) :: [Int]
+y:(zs ++ xs) :: [Int]
+y:(zs ++ ys) :: [Int]
+y:(zs ++ zs) :: [Int]
+z:(xs ++ xs) :: [Int]
+z:(xs ++ ys) :: [Int]
+z:(xs ++ zs) :: [Int]
+z:(ys ++ xs) :: [Int]
+z:(ys ++ ys) :: [Int]
+z:(ys ++ zs) :: [Int]
+z:(zs ++ xs) :: [Int]
+z:(zs ++ ys) :: [Int]
+z:(zs ++ zs) :: [Int]
+xs ++ tail (tail xs) :: [Int]
+xs ++ tail (tail ys) :: [Int]
+xs ++ tail (tail zs) :: [Int]
+ys ++ tail (tail xs) :: [Int]
+ys ++ tail (tail ys) :: [Int]
+ys ++ tail (tail zs) :: [Int]
+zs ++ tail (tail xs) :: [Int]
+zs ++ tail (tail ys) :: [Int]
+zs ++ tail (tail zs) :: [Int]
+xs ++ tail (tail []) :: [Int]
+ys ++ tail (tail []) :: [Int]
+zs ++ tail (tail []) :: [Int]
+xs ++ (x:xs) :: [Int]
+xs ++ (y:xs) :: [Int]
+xs ++ (z:xs) :: [Int]
+xs ++ (x:ys) :: [Int]
+xs ++ (y:ys) :: [Int]
+xs ++ (z:ys) :: [Int]
+xs ++ (x:zs) :: [Int]
+xs ++ (y:zs) :: [Int]
+xs ++ (z:zs) :: [Int]
+ys ++ (x:xs) :: [Int]
+ys ++ (y:xs) :: [Int]
+ys ++ (z:xs) :: [Int]
+ys ++ (x:ys) :: [Int]
+ys ++ (y:ys) :: [Int]
+ys ++ (z:ys) :: [Int]
+ys ++ (x:zs) :: [Int]
+ys ++ (y:zs) :: [Int]
+ys ++ (z:zs) :: [Int]
+zs ++ (x:xs) :: [Int]
+zs ++ (y:xs) :: [Int]
+zs ++ (z:xs) :: [Int]
+zs ++ (x:ys) :: [Int]
+zs ++ (y:ys) :: [Int]
+zs ++ (z:ys) :: [Int]
+zs ++ (x:zs) :: [Int]
+zs ++ (y:zs) :: [Int]
+zs ++ (z:zs) :: [Int]
+xs ++ [x] :: [Int]
+xs ++ [y] :: [Int]
+xs ++ [z] :: [Int]
+ys ++ [x] :: [Int]
+ys ++ [y] :: [Int]
+ys ++ [z] :: [Int]
+zs ++ [x] :: [Int]
+zs ++ [y] :: [Int]
+zs ++ [z] :: [Int]
+xs ++ (xs ++ xs) :: [Int]
+xs ++ (xs ++ ys) :: [Int]
+xs ++ (xs ++ zs) :: [Int]
+xs ++ (ys ++ xs) :: [Int]
+xs ++ (ys ++ ys) :: [Int]
+xs ++ (ys ++ zs) :: [Int]
+xs ++ (zs ++ xs) :: [Int]
+xs ++ (zs ++ ys) :: [Int]
+xs ++ (zs ++ zs) :: [Int]
+ys ++ (xs ++ xs) :: [Int]
+ys ++ (xs ++ ys) :: [Int]
+ys ++ (xs ++ zs) :: [Int]
+ys ++ (ys ++ xs) :: [Int]
+ys ++ (ys ++ ys) :: [Int]
+ys ++ (ys ++ zs) :: [Int]
+ys ++ (zs ++ xs) :: [Int]
+ys ++ (zs ++ ys) :: [Int]
+ys ++ (zs ++ zs) :: [Int]
+zs ++ (xs ++ xs) :: [Int]
+zs ++ (xs ++ ys) :: [Int]
+zs ++ (xs ++ zs) :: [Int]
+zs ++ (ys ++ xs) :: [Int]
+zs ++ (ys ++ ys) :: [Int]
+zs ++ (ys ++ zs) :: [Int]
+zs ++ (zs ++ xs) :: [Int]
+zs ++ (zs ++ ys) :: [Int]
+zs ++ (zs ++ zs) :: [Int]
+head xs:tail xs :: [Int]
+head xs:tail ys :: [Int]
+head xs:tail zs :: [Int]
+head ys:tail xs :: [Int]
+head ys:tail ys :: [Int]
+head ys:tail zs :: [Int]
+head zs:tail xs :: [Int]
+head zs:tail ys :: [Int]
+head zs:tail zs :: [Int]
+head xs:tail [] :: [Int]
+head ys:tail [] :: [Int]
+head zs:tail [] :: [Int]
+head []:tail xs :: [Int]
+head []:tail ys :: [Int]
+head []:tail zs :: [Int]
+head []:tail [] :: [Int]
+tail xs ++ tail xs :: [Int]
+tail xs ++ tail ys :: [Int]
+tail xs ++ tail zs :: [Int]
+tail ys ++ tail xs :: [Int]
+tail ys ++ tail ys :: [Int]
+tail ys ++ tail zs :: [Int]
+tail zs ++ tail xs :: [Int]
+tail zs ++ tail ys :: [Int]
+tail zs ++ tail zs :: [Int]
+tail xs ++ tail [] :: [Int]
+tail ys ++ tail [] :: [Int]
+tail zs ++ tail [] :: [Int]
+tail [] ++ tail xs :: [Int]
+tail [] ++ tail ys :: [Int]
+tail [] ++ tail zs :: [Int]
+tail [] ++ tail [] :: [Int]
+head (tail xs):xs :: [Int]
+head (tail xs):ys :: [Int]
+head (tail xs):zs :: [Int]
+head (tail ys):xs :: [Int]
+head (tail ys):ys :: [Int]
+head (tail ys):zs :: [Int]
+head (tail zs):xs :: [Int]
+head (tail zs):ys :: [Int]
+head (tail zs):zs :: [Int]
+[head (tail xs)] :: [Int]
+[head (tail ys)] :: [Int]
+[head (tail zs)] :: [Int]
+head (tail []):xs :: [Int]
+head (tail []):ys :: [Int]
+head (tail []):zs :: [Int]
+[head (tail [])] :: [Int]
+tail (tail xs) ++ xs :: [Int]
+tail (tail xs) ++ ys :: [Int]
+tail (tail xs) ++ zs :: [Int]
+tail (tail ys) ++ xs :: [Int]
+tail (tail ys) ++ ys :: [Int]
+tail (tail ys) ++ zs :: [Int]
+tail (tail zs) ++ xs :: [Int]
+tail (tail zs) ++ ys :: [Int]
+tail (tail zs) ++ zs :: [Int]
+tail (tail []) ++ xs :: [Int]
+tail (tail []) ++ ys :: [Int]
+tail (tail []) ++ zs :: [Int]
+
+Number of Eq schema classes: 90
+Number of Eq 1-var classes: 68
+Number of Eq 2-var classes: 191
+Number of Eq 3-var classes: 406
diff --git a/test/model/list-s4.out b/test/model/list-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/list-s4.out
@@ -0,0 +1,26 @@
+max expr size  =    4
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    3  (for inequational and conditional laws)
+
+_ :: Int
+_ :: [Int]
+[] :: [Int]
+(:) :: Int -> [Int] -> [Int]
+(++) :: [Int] -> [Int] -> [Int]
+head :: [Int] -> Int
+tail :: [Int] -> [Int]
+
+head (x:xs) == x
+   xs ++ [] == xs
+   [] ++ xs == xs
+tail (x:xs) == xs
+
+ [] <= xs
+ xs <= x:xs
+ xs <= xs ++ ys
+ xs <= ys ++ xs
+ xs <= tail (xs ++ xs)
+[x] <= x:xs
+
diff --git a/test/model/list.out b/test/model/list.out
new file mode 100644
--- /dev/null
+++ b/test/model/list.out
@@ -0,0 +1,37 @@
+max expr size  =    5
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    3  (for inequational and conditional laws)
+
+_ :: Int
+_ :: [Int]
+[] :: [Int]
+(:) :: Int -> [Int] -> [Int]
+(++) :: [Int] -> [Int] -> [Int]
+head :: [Int] -> Int
+tail :: [Int] -> [Int]
+
+     head (x:xs) == x
+        xs ++ [] == xs
+        [] ++ xs == xs
+     tail (x:xs) == xs
+(xs ++ ys) ++ zs == xs ++ (ys ++ zs)
+    (x:xs) ++ ys == x:(xs ++ ys)
+
+       [] <= xs
+       xs <= x:xs
+       xs <= xs ++ ys
+       xs <= ys ++ xs
+       xs <= tail (xs ++ xs)
+      [x] <= x:xs
+       xs <= head xs:tail xs
+     x:xs <= x:y:xs
+ xs ++ ys <= xs ++ (ys ++ zs)
+ xs ++ ys <= xs ++ (zs ++ ys)
+     x:xs <= x:(xs ++ ys)
+     x:xs <= x:(ys ++ xs)
+ xs ++ ys <= xs ++ (x:ys)
+    [x,y] <= x:y:xs
+xs ++ [x] <= xs ++ (x:ys)
+
diff --git a/test/model/minus-c-s4.out b/test/model/minus-c-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/minus-c-s4.out
@@ -0,0 +1,232 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+0 :: Int
+1 :: Int
+id :: Int -> Int
+(+) :: Int -> Int -> Int
+negate :: Int -> Int
+(-) :: Int -> Int -> Int
+
+_ :: Int
+0 :: Int
+1 :: Int
+negate _ :: Int
+negate 1 :: Int
+_ + _ :: Int
+_ + 1 :: Int
+1 + 1 :: Int
+_ - _ :: Int
+_ - 1 :: Int
+1 - _ :: Int
+negate (_ + _) :: Int
+negate (_ + 1) :: Int
+negate (1 + 1) :: Int
+_ + (_ + _) :: Int
+_ + (_ + 1) :: Int
+_ + (1 + 1) :: Int
+_ + (_ - _) :: Int
+_ + (_ - 1) :: Int
+_ + (1 - _) :: Int
+1 + (1 + 1) :: Int
+1 + (1 - _) :: Int
+_ - (_ + _) :: Int
+_ - (_ + 1) :: Int
+_ - (1 + 1) :: Int
+1 - (_ + _) :: Int
+
+x :: Int
+0 :: Int
+1 :: Int
+negate x :: Int
+negate 1 :: Int
+x + x :: Int
+x + 1 :: Int
+1 + 1 :: Int
+x - 1 :: Int
+1 - x :: Int
+negate (x + x) :: Int
+negate (x + 1) :: Int
+negate (1 + 1) :: Int
+x + (x + x) :: Int
+x + (x + 1) :: Int
+x + (1 + 1) :: Int
+x + (x - 1) :: Int
+1 + (1 + 1) :: Int
+1 + (1 - x) :: Int
+x - (1 + 1) :: Int
+1 - (x + x) :: Int
+
+x :: Int
+y :: Int
+0 :: Int
+1 :: Int
+negate x :: Int
+negate y :: Int
+negate 1 :: Int
+x + x :: Int
+x + y :: Int
+y + y :: Int
+x + 1 :: Int
+y + 1 :: Int
+1 + 1 :: Int
+x - y :: Int
+y - x :: Int
+x - 1 :: Int
+y - 1 :: Int
+1 - x :: Int
+1 - y :: Int
+negate (x + x) :: Int
+negate (x + y) :: Int
+negate (y + y) :: Int
+negate (x + 1) :: Int
+negate (y + 1) :: Int
+negate (1 + 1) :: Int
+x + (x + x) :: Int
+x + (x + y) :: Int
+x + (y + y) :: Int
+y + (y + y) :: Int
+x + (x + 1) :: Int
+x + (y + 1) :: Int
+y + (y + 1) :: Int
+x + (1 + 1) :: Int
+y + (1 + 1) :: Int
+x + (x - y) :: Int
+y + (y - x) :: Int
+x + (x - 1) :: Int
+x + (y - 1) :: Int
+y + (y - 1) :: Int
+x + (1 - y) :: Int
+y + (1 - x) :: Int
+1 + (1 + 1) :: Int
+1 + (1 - x) :: Int
+1 + (1 - y) :: Int
+x - (y + y) :: Int
+y - (x + x) :: Int
+x - (y + 1) :: Int
+y - (x + 1) :: Int
+x - (1 + 1) :: Int
+y - (1 + 1) :: Int
+1 - (x + x) :: Int
+1 - (x + y) :: Int
+1 - (y + y) :: Int
+
+x :: Int
+y :: Int
+z :: Int
+0 :: Int
+1 :: Int
+negate x :: Int
+negate y :: Int
+negate z :: Int
+negate 1 :: Int
+x + x :: Int
+x + y :: Int
+x + z :: Int
+y + y :: Int
+y + z :: Int
+z + z :: Int
+x + 1 :: Int
+y + 1 :: Int
+z + 1 :: Int
+1 + 1 :: Int
+x - y :: Int
+x - z :: Int
+y - x :: Int
+y - z :: Int
+z - x :: Int
+z - y :: Int
+x - 1 :: Int
+y - 1 :: Int
+z - 1 :: Int
+1 - x :: Int
+1 - y :: Int
+1 - z :: Int
+negate (x + x) :: Int
+negate (x + y) :: Int
+negate (x + z) :: Int
+negate (y + y) :: Int
+negate (y + z) :: Int
+negate (z + z) :: Int
+negate (x + 1) :: Int
+negate (y + 1) :: Int
+negate (z + 1) :: Int
+negate (1 + 1) :: Int
+x + (x + x) :: Int
+x + (x + y) :: Int
+x + (x + z) :: Int
+x + (y + y) :: Int
+x + (y + z) :: Int
+x + (z + z) :: Int
+y + (y + y) :: Int
+y + (y + z) :: Int
+y + (z + z) :: Int
+z + (z + z) :: Int
+x + (x + 1) :: Int
+x + (y + 1) :: Int
+x + (z + 1) :: Int
+y + (y + 1) :: Int
+y + (z + 1) :: Int
+z + (z + 1) :: Int
+x + (1 + 1) :: Int
+y + (1 + 1) :: Int
+z + (1 + 1) :: Int
+x + (x - y) :: Int
+x + (x - z) :: Int
+x + (y - z) :: Int
+x + (z - y) :: Int
+y + (y - x) :: Int
+y + (y - z) :: Int
+y + (z - x) :: Int
+z + (z - x) :: Int
+z + (z - y) :: Int
+x + (x - 1) :: Int
+x + (y - 1) :: Int
+x + (z - 1) :: Int
+y + (y - 1) :: Int
+y + (z - 1) :: Int
+z + (z - 1) :: Int
+x + (1 - y) :: Int
+x + (1 - z) :: Int
+y + (1 - x) :: Int
+y + (1 - z) :: Int
+z + (1 - x) :: Int
+z + (1 - y) :: Int
+1 + (1 + 1) :: Int
+1 + (1 - x) :: Int
+1 + (1 - y) :: Int
+1 + (1 - z) :: Int
+x - (y + y) :: Int
+x - (y + z) :: Int
+x - (z + z) :: Int
+y - (x + x) :: Int
+y - (x + z) :: Int
+y - (z + z) :: Int
+z - (x + x) :: Int
+z - (x + y) :: Int
+z - (y + y) :: Int
+x - (y + 1) :: Int
+x - (z + 1) :: Int
+y - (x + 1) :: Int
+y - (z + 1) :: Int
+z - (x + 1) :: Int
+z - (y + 1) :: Int
+x - (1 + 1) :: Int
+y - (1 + 1) :: Int
+z - (1 + 1) :: Int
+1 - (x + x) :: Int
+1 - (x + y) :: Int
+1 - (x + z) :: Int
+1 - (y + y) :: Int
+1 - (y + z) :: Int
+1 - (z + z) :: Int
+
+Number of Eq schema classes: 26
+Number of Eq 1-var classes: 21
+Number of Eq 2-var classes: 53
+Number of Eq 3-var classes: 109
diff --git a/test/model/minus-c.out b/test/model/minus-c.out
new file mode 100644
--- /dev/null
+++ b/test/model/minus-c.out
@@ -0,0 +1,232 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+0 :: Int
+1 :: Int
+id :: Int -> Int
+(+) :: Int -> Int -> Int
+negate :: Int -> Int
+(-) :: Int -> Int -> Int
+
+_ :: Int
+0 :: Int
+1 :: Int
+negate _ :: Int
+negate 1 :: Int
+_ + _ :: Int
+_ + 1 :: Int
+1 + 1 :: Int
+_ - _ :: Int
+_ - 1 :: Int
+1 - _ :: Int
+negate (_ + _) :: Int
+negate (_ + 1) :: Int
+negate (1 + 1) :: Int
+_ + (_ + _) :: Int
+_ + (_ + 1) :: Int
+_ + (1 + 1) :: Int
+_ + (_ - _) :: Int
+_ + (_ - 1) :: Int
+_ + (1 - _) :: Int
+1 + (1 + 1) :: Int
+1 + (1 - _) :: Int
+_ - (_ + _) :: Int
+_ - (_ + 1) :: Int
+_ - (1 + 1) :: Int
+1 - (_ + _) :: Int
+
+x :: Int
+0 :: Int
+1 :: Int
+negate x :: Int
+negate 1 :: Int
+x + x :: Int
+x + 1 :: Int
+1 + 1 :: Int
+x - 1 :: Int
+1 - x :: Int
+negate (x + x) :: Int
+negate (x + 1) :: Int
+negate (1 + 1) :: Int
+x + (x + x) :: Int
+x + (x + 1) :: Int
+x + (1 + 1) :: Int
+x + (x - 1) :: Int
+1 + (1 + 1) :: Int
+1 + (1 - x) :: Int
+x - (1 + 1) :: Int
+1 - (x + x) :: Int
+
+x :: Int
+y :: Int
+0 :: Int
+1 :: Int
+negate x :: Int
+negate y :: Int
+negate 1 :: Int
+x + x :: Int
+x + y :: Int
+y + y :: Int
+x + 1 :: Int
+y + 1 :: Int
+1 + 1 :: Int
+x - y :: Int
+y - x :: Int
+x - 1 :: Int
+y - 1 :: Int
+1 - x :: Int
+1 - y :: Int
+negate (x + x) :: Int
+negate (x + y) :: Int
+negate (y + y) :: Int
+negate (x + 1) :: Int
+negate (y + 1) :: Int
+negate (1 + 1) :: Int
+x + (x + x) :: Int
+x + (x + y) :: Int
+x + (y + y) :: Int
+y + (y + y) :: Int
+x + (x + 1) :: Int
+x + (y + 1) :: Int
+y + (y + 1) :: Int
+x + (1 + 1) :: Int
+y + (1 + 1) :: Int
+x + (x - y) :: Int
+y + (y - x) :: Int
+x + (x - 1) :: Int
+x + (y - 1) :: Int
+y + (y - 1) :: Int
+x + (1 - y) :: Int
+y + (1 - x) :: Int
+1 + (1 + 1) :: Int
+1 + (1 - x) :: Int
+1 + (1 - y) :: Int
+x - (y + y) :: Int
+y - (x + x) :: Int
+x - (y + 1) :: Int
+y - (x + 1) :: Int
+x - (1 + 1) :: Int
+y - (1 + 1) :: Int
+1 - (x + x) :: Int
+1 - (x + y) :: Int
+1 - (y + y) :: Int
+
+x :: Int
+y :: Int
+z :: Int
+0 :: Int
+1 :: Int
+negate x :: Int
+negate y :: Int
+negate z :: Int
+negate 1 :: Int
+x + x :: Int
+x + y :: Int
+x + z :: Int
+y + y :: Int
+y + z :: Int
+z + z :: Int
+x + 1 :: Int
+y + 1 :: Int
+z + 1 :: Int
+1 + 1 :: Int
+x - y :: Int
+x - z :: Int
+y - x :: Int
+y - z :: Int
+z - x :: Int
+z - y :: Int
+x - 1 :: Int
+y - 1 :: Int
+z - 1 :: Int
+1 - x :: Int
+1 - y :: Int
+1 - z :: Int
+negate (x + x) :: Int
+negate (x + y) :: Int
+negate (x + z) :: Int
+negate (y + y) :: Int
+negate (y + z) :: Int
+negate (z + z) :: Int
+negate (x + 1) :: Int
+negate (y + 1) :: Int
+negate (z + 1) :: Int
+negate (1 + 1) :: Int
+x + (x + x) :: Int
+x + (x + y) :: Int
+x + (x + z) :: Int
+x + (y + y) :: Int
+x + (y + z) :: Int
+x + (z + z) :: Int
+y + (y + y) :: Int
+y + (y + z) :: Int
+y + (z + z) :: Int
+z + (z + z) :: Int
+x + (x + 1) :: Int
+x + (y + 1) :: Int
+x + (z + 1) :: Int
+y + (y + 1) :: Int
+y + (z + 1) :: Int
+z + (z + 1) :: Int
+x + (1 + 1) :: Int
+y + (1 + 1) :: Int
+z + (1 + 1) :: Int
+x + (x - y) :: Int
+x + (x - z) :: Int
+x + (y - z) :: Int
+x + (z - y) :: Int
+y + (y - x) :: Int
+y + (y - z) :: Int
+y + (z - x) :: Int
+z + (z - x) :: Int
+z + (z - y) :: Int
+x + (x - 1) :: Int
+x + (y - 1) :: Int
+x + (z - 1) :: Int
+y + (y - 1) :: Int
+y + (z - 1) :: Int
+z + (z - 1) :: Int
+x + (1 - y) :: Int
+x + (1 - z) :: Int
+y + (1 - x) :: Int
+y + (1 - z) :: Int
+z + (1 - x) :: Int
+z + (1 - y) :: Int
+1 + (1 + 1) :: Int
+1 + (1 - x) :: Int
+1 + (1 - y) :: Int
+1 + (1 - z) :: Int
+x - (y + y) :: Int
+x - (y + z) :: Int
+x - (z + z) :: Int
+y - (x + x) :: Int
+y - (x + z) :: Int
+y - (z + z) :: Int
+z - (x + x) :: Int
+z - (x + y) :: Int
+z - (y + y) :: Int
+x - (y + 1) :: Int
+x - (z + 1) :: Int
+y - (x + 1) :: Int
+y - (z + 1) :: Int
+z - (x + 1) :: Int
+z - (y + 1) :: Int
+x - (1 + 1) :: Int
+y - (1 + 1) :: Int
+z - (1 + 1) :: Int
+1 - (x + x) :: Int
+1 - (x + y) :: Int
+1 - (x + z) :: Int
+1 - (y + y) :: Int
+1 - (y + z) :: Int
+1 - (z + z) :: Int
+
+Number of Eq schema classes: 26
+Number of Eq 1-var classes: 21
+Number of Eq 2-var classes: 53
+Number of Eq 3-var classes: 109
diff --git a/test/model/minus-s4.out b/test/model/minus-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/minus-s4.out
@@ -0,0 +1,25 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+0 :: Int
+1 :: Int
+id :: Int -> Int
+(+) :: Int -> Int -> Int
+negate :: Int -> Int
+(-) :: Int -> Int -> Int
+
+             id x == x
+negate (negate x) == x
+            x + 0 == x
+     x + negate x == 0
+            x + y == y + x
+            x - y == x + negate y
+
+    x <= x + 1
+x - 1 <= x
+
diff --git a/test/model/minus.out b/test/model/minus.out
new file mode 100644
--- /dev/null
+++ b/test/model/minus.out
@@ -0,0 +1,27 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+0 :: Int
+1 :: Int
+id :: Int -> Int
+(+) :: Int -> Int -> Int
+negate :: Int -> Int
+(-) :: Int -> Int -> Int
+
+             id x == x
+negate (negate x) == x
+            x + 0 == x
+     x + negate x == 0
+            x + y == y + x
+            x - y == x + negate y
+   negate (x + y) == negate x + negate y
+      (x + y) + z == x + (y + z)
+
+    x <= x + 1
+x - 1 <= x
+
diff --git a/test/model/monad-s4.out b/test/model/monad-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/monad-s4.out
@@ -0,0 +1,21 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+_ :: [Int]
+_ :: Int -> [Int]
+return :: Int -> [Int]
+(>>=) :: [Int] -> (Int -> [Int]) -> [Int]
+(>=>) :: (Int -> [Int]) -> (Int -> [Int]) -> Int -> [Int]
+
+(xs >>= return) == xs
+            f x == (return x >>= f)
+    (f x >>= g) == (f >=> g) x
+ (f >=> return) == f
+ (return >=> f) == f
+
+
diff --git a/test/model/monad.out b/test/model/monad.out
new file mode 100644
--- /dev/null
+++ b/test/model/monad.out
@@ -0,0 +1,23 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Int
+_ :: [Int]
+_ :: Int -> [Int]
+return :: Int -> [Int]
+(>>=) :: [Int] -> (Int -> [Int]) -> [Int]
+(>=>) :: (Int -> [Int]) -> (Int -> [Int]) -> Int -> [Int]
+
+   (xs >>= return) == xs
+               f x == (return x >>= f)
+       (f x >>= g) == (f >=> g) x
+((xs >>= f) >>= g) == (xs >>= (f >=> g))
+    (f >=> return) == f
+    (return >=> f) == f
+ ((f >=> g) >=> h) == (f >=> (g >=> h))
+
+
diff --git a/test/model/nord-s4.out b/test/model/nord-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/nord-s4.out
@@ -0,0 +1,15 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: EqButNotOrd
+C0 :: EqButNotOrd
+id :: EqButNotOrd -> EqButNotOrd
+
+Warning: no Ord instance for EqButNotOrd, inequations of this type will not be considered
+
+
+
diff --git a/test/model/nord.out b/test/model/nord.out
new file mode 100644
--- /dev/null
+++ b/test/model/nord.out
@@ -0,0 +1,15 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: EqButNotOrd
+C0 :: EqButNotOrd
+id :: EqButNotOrd -> EqButNotOrd
+
+Warning: no Ord instance for EqButNotOrd, inequations of this type will not be considered
+
+
+
diff --git a/test/model/oddeven-s4.out b/test/model/oddeven-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/oddeven-s4.out
@@ -0,0 +1,44 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Int
+0 :: Int
+1 :: Int
+2 :: Int
+False :: Bool
+True :: Bool
+odd :: Int -> Bool
+even :: Int -> Bool
+mod :: Int -> Int -> Int
+(==) :: Int -> Int -> Bool
+(==) :: Bool -> Bool -> Bool
+
+         (x == x) == True
+         (p == p) == True
+      (p == True) == p
+         (x == y) == (y == x)
+  odd (x `mod` 2) == odd x
+ even (x `mod` 2) == even x
+ (False == odd x) == even x
+(False == even x) == odd x
+        x `mod` 1 == 0
+
+        p ==> True
+    False ==> p
+   x == 0 ==> even x
+   x == 1 ==> odd x
+   x == 2 ==> even x
+x `mod` 2 <=  2
+        0 <=  x `mod` 2
+x `mod` 2 <=  1
+
+ odd x ==> x `mod` x == 0
+ odd x ==> 0 `mod` x == 0
+ odd x ==> x `mod` 2 == 1
+even x ==> x `mod` 2 == 0
+
diff --git a/test/model/oddeven.out b/test/model/oddeven.out
new file mode 100644
--- /dev/null
+++ b/test/model/oddeven.out
@@ -0,0 +1,52 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Int
+0 :: Int
+1 :: Int
+2 :: Int
+False :: Bool
+True :: Bool
+odd :: Int -> Bool
+even :: Int -> Bool
+mod :: Int -> Int -> Int
+(==) :: Int -> Int -> Bool
+(==) :: Bool -> Bool -> Bool
+
+           (x == x) == True
+           (p == p) == True
+        (p == True) == p
+           (x == y) == (y == x)
+    odd (x `mod` 2) == odd x
+   even (x `mod` 2) == even x
+   (False == odd x) == even x
+  (False == even x) == odd x
+  (odd x == even x) == False
+   (2 == x `mod` 2) == False
+   (0 == x `mod` 2) == even x
+   (1 == x `mod` 2) == odd x
+  (even x == odd y) == (odd x == even y)
+ (even x == even y) == (odd x == odd y)
+          x `mod` 1 == 0
+(x `mod` 2) `mod` 2 == x `mod` 2
+
+        p ==> True
+    False ==> p
+   x == 0 ==> even x
+   x == 1 ==> odd x
+   x == 2 ==> even x
+x `mod` 2 <=  2
+        0 <=  x `mod` 2
+x `mod` 2 <=  1
+
+ odd x ==>           x `mod` x == 0
+ odd x ==>           0 `mod` x == 0
+ odd x ==>           x `mod` 2 == 1
+even x ==>           x `mod` 2 == 0
+ odd y ==> (x `mod` y) `mod` y == x `mod` y
+
diff --git a/test/model/plus-abs-s4.out b/test/model/plus-abs-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/plus-abs-s4.out
@@ -0,0 +1,40 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Int
+(+) :: Int -> Int -> Int
+id :: Int -> Int
+abs :: Int -> Int
+0 :: Int
+1 :: Int
+(<=) :: Int -> Int -> Bool
+(<) :: Int -> Int -> Bool
+True :: Bool
+False :: Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: Int -> Int -> Bool
+
+(x <= abs x) == True
+ (abs x < x) == False
+(0 <= abs x) == True
+ (abs x < 0) == False
+(abs x <= x) == (0 <= x)
+ (x < abs x) == (x < 0)
+(x == abs x) == (0 <= x)
+    (x == 0) == (abs x <= 0)
+        id x == x
+       x + 0 == x
+ abs (abs x) == abs x
+       x + y == y + x
+
+x <= abs x
+0 <= abs x
+x <= x + 1
+
+x <= 0 ==> x + abs x == 0
+
diff --git a/test/model/plus-abs.out b/test/model/plus-abs.out
new file mode 100644
--- /dev/null
+++ b/test/model/plus-abs.out
@@ -0,0 +1,68 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Int
+(+) :: Int -> Int -> Int
+id :: Int -> Int
+abs :: Int -> Int
+0 :: Int
+1 :: Int
+(<=) :: Int -> Int -> Bool
+(<) :: Int -> Int -> Bool
+True :: Bool
+False :: Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: Int -> Int -> Bool
+
+       (x <= abs x) == True
+       (0 <= abs x) == True
+       (1 == x + x) == False
+       (abs x <= x) == (0 <= x)
+       (x == abs x) == (0 <= x)
+           (x == 0) == (abs x <= 0)
+           (0 <= x) == (y <= x + y)
+       (x + y <= x) == (y <= 0)
+            (x < y) == (x + 1 <= y)
+       (0 <= x + x) == (0 <= x)
+       (1 <= x + x) == (1 <= x)
+       (x + x <= 0) == (x <= 0)
+       (x + x <= 1) == (x <= 0)
+       (x == x + y) == (abs y <= 0)
+(False == (x <= y)) == (y + 1 <= x)
+               id x == x
+              x + 0 == x
+        abs (abs x) == abs x
+              x + y == y + x
+        abs (x + x) == abs x + abs x
+    abs (x + abs x) == x + abs x
+    abs (1 + abs x) == 1 + abs x
+        (x + y) + z == x + (y + z)
+
+     x <= y ==> x <= abs y
+ abs x <= y ==> x <= y
+  abs x < y ==> x < y
+     x <= 0 ==> x <= abs y
+ abs x <= y ==> 0 <= y
+  abs x < y ==> 1 <= y
+     x == 1 ==> 1 == abs x
+      x < 0 ==> 1 <= abs x
+          x <=  abs x
+          0 <=  abs x
+          x <=  x + 1
+          x <=  x + abs y
+          x <=  abs (x + x)
+          x <=  1 + abs x
+          0 <=  x + abs x
+      x + y <=  x + abs y
+abs (x + 1) <=  1 + abs x
+
+    x <= 0 ==>       x + abs x == 0
+abs x <= y ==>     abs (x + y) == x + y
+abs y <= x ==>     abs (x + y) == x + y
+    y <= x ==> abs (x + abs y) == x + abs y
+
diff --git a/test/model/pretty-compact-s4.out b/test/model/pretty-compact-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/pretty-compact-s4.out
@@ -0,0 +1,32 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  360
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Char  (holes: Char)
+_ :: Int  (holes: Int)
+_ :: ODoc Any  (holes: ODoc Any)
+_ :: [Char]  (holes: [Char])
+text :: [Char] -> ODoc Any
+char :: Char -> ODoc Any
+flush :: ODoc Any -> ODoc Any
+hang :: Int -> ODoc Any -> ODoc Any -> ODoc Any
+(<>) :: ODoc Any -> ODoc Any -> ODoc Any
+(<+>) :: ODoc Any -> ODoc Any -> ODoc Any
+($$) :: ODoc Any -> ODoc Any -> ODoc Any
+(</>) :: ODoc Any -> ODoc Any -> ODoc Any
+(<//>) :: ODoc Any -> ODoc Any -> ODoc Any
+(<$$>) :: ODoc Any -> ODoc Any -> ODoc Any
+
+        d1 $$ d2 == flush d1 <> d2
+      d1 <$$> d2 == flush d1 <> d2
+ flush d1 </> d2 == flush (flush d1) <> d2
+flush d1 <//> d2 == flush (flush d1) <> d2
+
+      d1 <= flush d1
+      d1 <= d1 $$ d2
+      d1 <= d1 </> d2
+      d1 <= d1 <//> d2
+flush d1 <= d1 $$ d2
+
diff --git a/test/model/pretty-compact.out b/test/model/pretty-compact.out
new file mode 100644
--- /dev/null
+++ b/test/model/pretty-compact.out
@@ -0,0 +1,32 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  360
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Char  (holes: Char)
+_ :: Int  (holes: Int)
+_ :: ODoc Any  (holes: ODoc Any)
+_ :: [Char]  (holes: [Char])
+text :: [Char] -> ODoc Any
+char :: Char -> ODoc Any
+flush :: ODoc Any -> ODoc Any
+hang :: Int -> ODoc Any -> ODoc Any -> ODoc Any
+(<>) :: ODoc Any -> ODoc Any -> ODoc Any
+(<+>) :: ODoc Any -> ODoc Any -> ODoc Any
+($$) :: ODoc Any -> ODoc Any -> ODoc Any
+(</>) :: ODoc Any -> ODoc Any -> ODoc Any
+(<//>) :: ODoc Any -> ODoc Any -> ODoc Any
+(<$$>) :: ODoc Any -> ODoc Any -> ODoc Any
+
+        d1 $$ d2 == flush d1 <> d2
+      d1 <$$> d2 == flush d1 <> d2
+ flush d1 </> d2 == flush (flush d1) <> d2
+flush d1 <//> d2 == flush (flush d1) <> d2
+
+      d1 <= flush d1
+      d1 <= d1 $$ d2
+      d1 <= d1 </> d2
+      d1 <= d1 <//> d2
+flush d1 <= d1 $$ d2
+
diff --git a/test/model/pretty-s4.out b/test/model/pretty-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/pretty-s4.out
@@ -0,0 +1,21 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    3  (for inequational and conditional laws)
+
+_ :: Char
+_ :: Doc
+_ :: Int
+_ :: [Char]
+($$) :: Doc -> Doc -> Doc
+(<>) :: Doc -> Doc -> Doc
+nest :: Int -> Doc -> Doc
+(++) :: [Char] -> [Char] -> [Char]
+length :: [Char] -> Int
+
+
+d1 <= d1 $$ d2
+d1 <= d1 <> d2
+
diff --git a/test/model/pretty.out b/test/model/pretty.out
new file mode 100644
--- /dev/null
+++ b/test/model/pretty.out
@@ -0,0 +1,34 @@
+max expr size  =    7
+  |- on ineqs  =    6
+  |- on conds  =    6
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    3  (for inequational and conditional laws)
+
+_ :: Char
+_ :: Doc
+_ :: Int
+_ :: [Char]
+($$) :: Doc -> Doc -> Doc
+(<>) :: Doc -> Doc -> Doc
+nest :: Int -> Doc -> Doc
+(++) :: [Char] -> [Char] -> [Char]
+length :: [Char] -> Int
+
+            d1 <> nest x d2 == d1 <> d2
+           (d1 $$ d2) $$ d3 == d1 $$ (d2 $$ d3)
+           (d1 <> d2) <> d3 == d1 <> (d2 <> d3)
+         nest x (nest y d1) == nest y (nest x d1)
+           (d1 $$ d2) <> d3 == d1 $$ (d2 <> d3)
+          nest x (d1 <> d2) == nest x d1 <> d2
+    d1 <> (nest x d2 <> d3) == d1 <> (d2 <> d3)
+          nest x (d1 $$ d2) == nest x d1 $$ nest x d2
+nest (length (cs ++ ds)) d1 == nest (length cs) (nest (length ds) d1)
+
+      d1 <= d1 $$ d2
+      d1 <= d1 <> d2
+d1 $$ d2 <= d1 $$ (d2 $$ d3)
+d1 <> d2 <= d1 <> (d2 <> d3)
+d1 $$ d2 <= d1 $$ (d2 <> d3)
+d1 <> d2 <= d1 <> (d2 $$ d3)
+
diff --git a/test/model/ratio-s4.out b/test/model/ratio-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/ratio-s4.out
@@ -0,0 +1,59 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Integer
+_ :: Ratio Integer
+id :: Ratio Integer -> Ratio Integer
+abs :: Ratio Integer -> Ratio Integer
+negate :: Ratio Integer -> Ratio Integer
+(+) :: Ratio Integer -> Ratio Integer -> Ratio Integer
+(*) :: Ratio Integer -> Ratio Integer -> Ratio Integer
+(/) :: Ratio Integer -> Ratio Integer -> Ratio Integer
+(%) :: Integer -> Integer -> Ratio Integer
+recip :: Ratio Integer -> Ratio Integer
+numerator :: Ratio Integer -> Integer
+denominator :: Ratio Integer -> Integer
+0 % 1 :: Ratio Integer
+1 % 1 :: Ratio Integer
+0 :: Integer
+1 :: Integer
+
+    denominator (abs q) == denominator q
+ denominator (negate q) == denominator q
+      numerator (x % 1) == x
+    denominator (x % 1) == 1
+denominator (q + 1 % 1) == denominator q
+                   id q == q
+      negate (negate q) == q
+              q + 0 % 1 == q
+            q * (1 % 1) == q
+            q / (1 % 1) == q
+            q * (0 % 1) == 0 % 1
+            abs (abs q) == abs q
+         abs (negate q) == abs q
+           q + negate q == 0 % 1
+      0 % denominator q == 0 % 1
+                  q + r == r + q
+                  q * r == r * q
+     q / negate (1 % 1) == negate q
+            abs (q * q) == q * q
+           q * negate r == negate (q * r)
+
+                   0 <= denominator q
+                   1 <= denominator q
+                   0 <= numerator (abs q)
+         numerator q <= numerator (abs q)
+numerator (negate q) <= numerator (abs q)
+                   q <= abs q
+               0 % 1 <= abs q
+                   q <= q + 1 % 1
+               0 % 1 <= q * q
+            negate q <= abs q
+      negate (abs q) <= q
+      negate (abs q) <= 0 % 1
+      negate (abs q) <= negate q
+
diff --git a/test/model/ratio.out b/test/model/ratio.out
new file mode 100644
--- /dev/null
+++ b/test/model/ratio.out
@@ -0,0 +1,114 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Integer
+_ :: Ratio Integer
+id :: Ratio Integer -> Ratio Integer
+abs :: Ratio Integer -> Ratio Integer
+negate :: Ratio Integer -> Ratio Integer
+(+) :: Ratio Integer -> Ratio Integer -> Ratio Integer
+(*) :: Ratio Integer -> Ratio Integer -> Ratio Integer
+(/) :: Ratio Integer -> Ratio Integer -> Ratio Integer
+(%) :: Integer -> Integer -> Ratio Integer
+recip :: Ratio Integer -> Ratio Integer
+numerator :: Ratio Integer -> Integer
+denominator :: Ratio Integer -> Integer
+0 % 1 :: Ratio Integer
+1 % 1 :: Ratio Integer
+0 :: Integer
+1 :: Integer
+
+            denominator (abs q) == denominator q
+         denominator (negate q) == denominator q
+              numerator (x % 1) == x
+            denominator (x % 1) == 1
+        denominator (q + 1 % 1) == denominator q
+  numerator (1 % denominator q) == 1
+denominator (1 % denominator q) == denominator q
+        denominator (q * abs r) == denominator (q * r)
+                           id q == q
+              negate (negate q) == q
+                      q + 0 % 1 == q
+                    q * (1 % 1) == q
+                    q / (1 % 1) == q
+                    q * (0 % 1) == 0 % 1
+                    abs (abs q) == abs q
+                 abs (negate q) == abs q
+                   q + negate q == 0 % 1
+              0 % denominator q == 0 % 1
+                          q + r == r + q
+                          q * r == r * q
+    numerator q % denominator q == q
+             q / negate (1 % 1) == negate q
+  denominator q % denominator q == 1 % 1
+                    abs (q * q) == q * q
+                   q * negate r == negate (q * r)
+                abs (q * abs r) == abs (q * r)
+                   negate q + r == negate (q + negate r)
+                  abs q * abs r == abs (q * r)
+                abs (q + abs q) == q + abs q
+                  abs q + abs q == abs (q + q)
+            abs (1 % 1 + abs q) == 1 % 1 + abs q
+        abs (1 % denominator q) == 1 % denominator q
+        abs (denominator q % 1) == denominator q % 1
+      recip (1 % denominator q) == denominator q % 1
+      recip (denominator q % 1) == 1 % denominator q
+ x % numerator (negate (1 % 1)) == negate (x % 1)
+                    (q + r) + s == q + (r + s)
+                    (q * r) * s == q * (r * s)
+                    (q + q) * r == q * (r + r)
+                q * (r + 1 % 1) == q + q * r
+          numerator (abs q) % 1 == abs (numerator q % 1)
+       numerator (negate q) % 1 == negate (numerator q % 1)
+
+                         0 <= denominator q
+                         1 <= denominator q
+                         0 <= numerator (abs q)
+               numerator q <= numerator (abs q)
+                         0 <= numerator (q * q)
+numerator (negate (abs q)) <= 0
+               numerator q <= numerator (q * q)
+             denominator q <= denominator (q * q)
+       denominator (q + q) <= denominator q
+               numerator q <= numerator (q + 1 % 1)
+      numerator (negate q) <= numerator (abs q)
+numerator (negate (abs q)) <= numerator q
+         numerator (abs q) <= numerator (q * q)
+numerator (negate (abs q)) <= numerator (negate q)
+                         q <= abs q
+                     0 % 1 <= abs q
+                         q <= q + 1 % 1
+                     0 % 1 <= q * q
+                  negate q <= abs q
+            negate (abs q) <= q
+            negate (abs q) <= 0 % 1
+                         q <= q + abs r
+                         q <= abs (q + q)
+            negate (abs q) <= negate q
+                         q <= 1 % 1 + abs q
+                     0 % 1 <= q + abs q
+            negate (q * q) <= 0 % 1
+        q + negate (1 % 1) <= q
+                     0 % 1 <= 1 % denominator q
+                     0 % 1 <= denominator q % 1
+                     1 % 1 <= denominator q % 1
+         1 % denominator q <= 1 % 1
+                     abs q <= abs (q + q)
+        negate (q + 1 % 1) <= negate q
+                     q + r <= q + abs r
+                 q * abs q <= q * q
+        negate (q + 1 % 1) <= q * q
+            negate (q * q) <= q + 1 % 1
+        q + negate (1 % 1) <= q * q
+                 q * abs r <= abs (q * r)
+              q + negate r <= q + abs r
+         x % denominator q <= abs (x % 1)
+                 q + abs q <= abs (q + q)
+            negate (q * q) <= q * abs q
+            negate (q * q) <= 1 % 1 + negate q
+           abs (q + 1 % 1) <= 1 % 1 + abs q
+
diff --git a/test/model/regexes-s4.out b/test/model/regexes-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/regexes-s4.out
@@ -0,0 +1,46 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =   30
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Symbol
+_ :: RE Symbol
+Empty :: RE Symbol
+None :: RE Symbol
+Star :: RE Symbol -> RE Symbol
+(:+) :: RE Symbol -> RE Symbol -> RE Symbol
+(:.) :: RE Symbol -> RE Symbol -> RE Symbol
+(<=) :: RE Symbol -> RE Symbol -> Bool
+(==) :: RE Symbol -> RE Symbol -> Bool
+False :: Bool
+True :: Bool
+
+     (r <= Empty) == True
+      (None <= r) == True
+    (r <= Star s) == True
+ (Star r <= None) == False
+     (r == Empty) == (Empty <= r)
+      (r == None) == (r <= None)
+    (r == Star s) == (Star s <= r)
+           r :+ r == r
+        r :+ None == r
+       r :. Empty == r
+        r :. None == None
+    Star (Star r) == Star r
+           r :+ s == s :+ r
+           r :. s == s :. r
+      r :+ Star r == Star r
+Star (r :+ Empty) == Star r
+  Empty :+ Star r == Star r
+
+ r <= None ==> r <= s
+      None <=  r
+         r <=  Star r
+     Empty <=  Star r
+         r <=  r :+ s
+    r :. r <=  Star r
+r :+ Empty <=  Star r
+    r :. s <=  r :+ s
+
diff --git a/test/model/regexes.out b/test/model/regexes.out
new file mode 100644
--- /dev/null
+++ b/test/model/regexes.out
@@ -0,0 +1,46 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =   30
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Symbol
+_ :: RE Symbol
+Empty :: RE Symbol
+None :: RE Symbol
+Star :: RE Symbol -> RE Symbol
+(:+) :: RE Symbol -> RE Symbol -> RE Symbol
+(:.) :: RE Symbol -> RE Symbol -> RE Symbol
+(<=) :: RE Symbol -> RE Symbol -> Bool
+(==) :: RE Symbol -> RE Symbol -> Bool
+False :: Bool
+True :: Bool
+
+     (r <= Empty) == True
+      (None <= r) == True
+    (r <= Star s) == True
+ (Star r <= None) == False
+     (r == Empty) == (Empty <= r)
+      (r == None) == (r <= None)
+    (r == Star s) == (Star s <= r)
+           r :+ r == r
+        r :+ None == r
+       r :. Empty == r
+        r :. None == None
+    Star (Star r) == Star r
+           r :+ s == s :+ r
+           r :. s == s :. r
+      r :+ Star r == Star r
+Star (r :+ Empty) == Star r
+  Empty :+ Star r == Star r
+
+ r <= None ==> r <= s
+      None <=  r
+         r <=  Star r
+     Empty <=  Star r
+         r <=  r :+ s
+    r :. r <=  Star r
+r :+ Empty <=  Star r
+    r :. s <=  r :+ s
+
diff --git a/test/model/sets-s4.out b/test/model/sets-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/sets-s4.out
@@ -0,0 +1,50 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Int
+_ :: Set Int
+emptyS :: Set Int
+singleS :: Int -> Set Int
+insertS :: Int -> Set Int -> Set Int
+deleteS :: Int -> Set Int -> Set Int
+sizeS :: Set Int -> Int
+(<~) :: Int -> Set Int -> Bool
+(\/) :: Set Int -> Set Int -> Set Int
+(/\) :: Set Int -> Set Int -> Set Int
+False :: Bool
+True :: Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: Int -> Int -> Bool
+(==) :: Set Int -> Set Int -> Bool
+
+          x <~ emptyS == False
+       x <~ singleS x == True
+(emptyS == singleS x) == False
+             (x == y) == x <~ singleS y
+       x <~ singleS y == y <~ singleS x
+    sizeS (singleS x) == sizeS (singleS y)
+               s \/ s == s
+               s /\ s == s
+          s \/ emptyS == s
+     deleteS x emptyS == emptyS
+          s /\ emptyS == emptyS
+     insertS x emptyS == singleS x
+deleteS x (singleS x) == emptyS
+               s \/ t == t \/ s
+               s /\ t == t /\ s
+insertS x (singleS x) == singleS x
+       s \/ singleS x == insertS x s
+insertS x (singleS y) == insertS y (singleS x)
+
+          sizeS emptyS <= sizeS s
+                emptyS <= s
+singleS (sizeS emptyS) <= singleS (sizeS s)
+
+x <~ s ==>    insertS x s == s
+x <~ s ==> s /\ singleS x == singleS x
+
diff --git a/test/model/sets.out b/test/model/sets.out
new file mode 100644
--- /dev/null
+++ b/test/model/sets.out
@@ -0,0 +1,81 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Int
+_ :: Set Int
+emptyS :: Set Int
+singleS :: Int -> Set Int
+insertS :: Int -> Set Int -> Set Int
+deleteS :: Int -> Set Int -> Set Int
+sizeS :: Set Int -> Int
+(<~) :: Int -> Set Int -> Bool
+(\/) :: Set Int -> Set Int -> Set Int
+(/\) :: Set Int -> Set Int -> Set Int
+False :: Bool
+True :: Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: Int -> Int -> Bool
+(==) :: Set Int -> Set Int -> Bool
+
+                  x <~ emptyS == False
+               x <~ singleS x == True
+        (emptyS == singleS x) == False
+             x <~ insertS x s == True
+             x <~ deleteS x s == False
+      (emptyS == insertS x s) == False
+                     (x == y) == x <~ singleS y
+           (s == insertS x s) == x <~ s
+               x <~ singleS y == y <~ singleS x
+     (singleS x == singleS y) == x <~ singleS y
+                (s /\ t == s) == (t == s \/ t)
+           (s == deleteS x s) == (False == x <~ s)
+            sizeS (singleS x) == sizeS (singleS y)
+sizeS (deleteS x (singleS y)) == sizeS (deleteS y (singleS x))
+                       s \/ s == s
+                       s /\ s == s
+                  s \/ emptyS == s
+             deleteS x emptyS == emptyS
+                  s /\ emptyS == emptyS
+             insertS x emptyS == singleS x
+        deleteS x (singleS x) == emptyS
+                       s \/ t == t \/ s
+                       s /\ t == t /\ s
+             s \/ deleteS x s == s
+                s \/ (s /\ t) == s
+             s /\ insertS x s == s
+                s /\ (s \/ t) == s
+        insertS x (singleS x) == singleS x
+               s \/ singleS x == insertS x s
+      insertS x (insertS x s) == insertS x s
+      deleteS x (deleteS x s) == deleteS x s
+      insertS x (deleteS x s) == insertS x s
+      deleteS x (insertS x s) == deleteS x s
+        insertS x (singleS y) == insertS y (singleS x)
+      insertS x (insertS y s) == insertS y (insertS x s)
+      deleteS x (deleteS y s) == deleteS y (deleteS x s)
+                (s \/ t) \/ u == s \/ (t \/ u)
+                (s /\ t) /\ u == s /\ (t /\ u)
+             s \/ insertS x t == insertS x (s \/ t)
+             s /\ deleteS x t == deleteS x (s /\ t)
+
+          s == singleS x ==> x <~ s
+            sizeS emptyS <=  sizeS s
+                 sizeS s <=  sizeS (insertS x s)
+                 sizeS s <=  sizeS (s \/ t)
+     sizeS (deleteS x s) <=  sizeS s
+          sizeS (s /\ t) <=  sizeS s
+       sizeS (singleS x) <=  sizeS (insertS y s)
+     sizeS (deleteS x s) <=  sizeS (t \/ s)
+                  emptyS <=  s
+   deleteS x (singleS y) <=  singleS y
+          s /\ singleS x <=  singleS x
+  singleS (sizeS emptyS) <=  singleS (sizeS s)
+insertS (sizeS emptyS) s <=  singleS (sizeS s)
+insertS (sizeS emptyS) s <=  singleS (sizeS (singleS x))
+
+
diff --git a/test/model/speculate-reason-s4.out b/test/model/speculate-reason-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/speculate-reason-s4.out
@@ -0,0 +1,28 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   = 6000
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Equation
+_ :: Expr
+_ :: Thyght
+_ :: [Expr]
+okThy :: Thyght -> Bool
+insert :: Expr -> Thyght -> Thyght
+complete :: Thyght -> Thyght
+normalize :: Thyght -> Expr -> Expr
+equivalent :: Thyght -> Expr -> Expr -> Bool
+append :: Thyght -> [Expr] -> Thyght
+emptyThy :: Thyght
+True :: Bool
+False :: Bool
+Equation :: Expr -> Expr -> Equation
+
+              okThy t == True
+     equivalent t e e == True
+     equivalent t e f == equivalent t f e
+ normalize emptyThy e == e
+complete (complete t) == complete t
+
diff --git a/test/model/speculate-reason.out b/test/model/speculate-reason.out
new file mode 100644
--- /dev/null
+++ b/test/model/speculate-reason.out
@@ -0,0 +1,28 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   = 6000
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Equation
+_ :: Expr
+_ :: Thyght
+_ :: [Expr]
+okThy :: Thyght -> Bool
+insert :: Expr -> Thyght -> Thyght
+complete :: Thyght -> Thyght
+normalize :: Thyght -> Expr -> Expr
+equivalent :: Thyght -> Expr -> Expr -> Bool
+append :: Thyght -> [Expr] -> Thyght
+emptyThy :: Thyght
+True :: Bool
+False :: Bool
+Equation :: Expr -> Expr -> Equation
+
+              okThy t == True
+     equivalent t e e == True
+     equivalent t e f == equivalent t f e
+ normalize emptyThy e == e
+complete (complete t) == complete t
+
diff --git a/test/model/string-s4.out b/test/model/string-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/string-s4.out
@@ -0,0 +1,48 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Char
+_ :: [Char]
+_ :: [[Char]]
+"" :: [Char]
+" " :: [Char]
+"\n" :: [Char]
+lines :: [Char] -> [[Char]]
+words :: [Char] -> [[Char]]
+unlines :: [[Char]] -> [Char]
+unwords :: [[Char]] -> [Char]
+(++) :: [Char] -> [Char] -> [Char]
+
+                     cs ++ "" == cs
+                     "" ++ cs == cs
+unlines (lines (unlines css)) == unlines css
+   lines (unlines (lines cs)) == lines cs
+   words (unlines (words cs)) == words cs
+   lines (unlines (words cs)) == words cs
+   words (unlines (lines cs)) == words cs
+          words (unwords css) == words (unlines css)
+            words (cs ++ " ") == words cs
+           words (cs ++ "\n") == words cs
+            words (" " ++ cs) == words cs
+           words ("\n" ++ cs) == words cs
+
+                 "" <= cs
+                 cs <= cs ++ ds
+                 cs <= unlines (lines cs)
+               "\n" <= cs ++ "\n"
+               "\n" <= cs ++ " "
+         "\n" ++ cs <= " "
+ unwords (lines cs) <= cs ++ ds
+         "\n" ++ cs <= ds ++ " "
+ unlines (lines cs) <= cs ++ cs
+         "\n" ++ cs <= cs ++ "\n"
+         cs ++ "\n" <= cs ++ " "
+ unlines (lines cs) <= cs ++ " "
+ unlines (lines cs) <= cs ++ "\n"
+           lines "" <= css
+lines (unlines css) <= css
+
diff --git a/test/model/string.out b/test/model/string.out
new file mode 100644
--- /dev/null
+++ b/test/model/string.out
@@ -0,0 +1,74 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Char
+_ :: [Char]
+_ :: [[Char]]
+"" :: [Char]
+" " :: [Char]
+"\n" :: [Char]
+lines :: [Char] -> [[Char]]
+words :: [Char] -> [[Char]]
+unlines :: [[Char]] -> [Char]
+unwords :: [[Char]] -> [Char]
+(++) :: [Char] -> [Char] -> [Char]
+
+                            cs ++ "" == cs
+                            "" ++ cs == cs
+       unlines (lines (unlines css)) == unlines css
+unwords (lines (unwords (lines cs))) == unwords (lines cs)
+unwords (lines (unwords (words cs))) == unwords (words cs)
+        unlines (lines (cs ++ "\n")) == cs ++ "\n"
+                    (cs ++ ds) ++ es == cs ++ (ds ++ es)
+            cs ++ unlines (lines cs) == unlines (lines (cs ++ cs))
+           cs ++ unlines (lines " ") == unlines (lines (cs ++ " "))
+           " " ++ unwords (lines cs) == unwords (lines (" " ++ cs))
+          "\n" ++ unlines (lines cs) == unlines (lines ("\n" ++ cs))
+           unlines (lines " ") ++ cs == " " ++ ("\n" ++ cs)
+          lines (unlines (lines cs)) == lines cs
+          words (unlines (words cs)) == words cs
+          lines (unlines (words cs)) == words cs
+          words (unlines (lines cs)) == words cs
+                 words (unwords css) == words (unlines css)
+                   words (cs ++ " ") == words cs
+                  words (cs ++ "\n") == words cs
+                   words (" " ++ cs) == words cs
+                  words ("\n" ++ cs) == words cs
+           words (cs ++ unwords css) == words (cs ++ unlines css)
+
+                           "" <= cs
+                           cs <= cs ++ ds
+                           cs <= unlines (lines cs)
+                         "\n" <= cs ++ "\n"
+                         "\n" <= cs ++ " "
+                   "\n" ++ cs <= " "
+           unwords (lines cs) <= cs ++ ds
+                   "\n" ++ cs <= ds ++ " "
+           unlines (lines cs) <= cs ++ cs
+unwords (lines (unwords css)) <= unwords css
+                   "\n" ++ cs <= cs ++ "\n"
+                  unwords css <= unwords (lines (unlines css))
+                   cs ++ "\n" <= cs ++ " "
+                  unlines css <= unwords css ++ " "
+                  unlines css <= unwords css ++ "\n"
+           unlines (lines cs) <= cs ++ " "
+           unlines (lines cs) <= cs ++ "\n"
+unwords (lines (unlines css)) <= unwords css ++ cs
+           unlines css ++ " " <= unwords css ++ " "
+                     lines "" <= css
+          lines (unlines css) <= css
+                     lines cs <= lines (cs ++ ds)
+                     words cs <= words (cs ++ ds)
+                     words cs <= lines (unwords (words cs))
+                   lines "\n" <= lines (cs ++ "\n")
+                   lines "\n" <= lines (cs ++ " ")
+           lines ("\n" ++ cs) <= lines " "
+   lines (unwords (lines cs)) <= lines (cs ++ ds)
+           lines ("\n" ++ cs) <= lines (ds ++ " ")
+           lines ("\n" ++ cs) <= lines (cs ++ "\n")
+           lines (cs ++ "\n") <= lines (cs ++ " ")
+
diff --git a/test/model/tauts-s4.out b/test/model/tauts-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/tauts-s4.out
@@ -0,0 +1,33 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   = 4000
+min  #-tests   =  200  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Name
+_ :: Prop
+False :: Bool
+True :: Bool
+(==) :: Prop -> Prop -> Bool
+eval :: Prop -> Prop
+varOf :: Prop -> Name
+subst :: Name -> Bool -> Prop -> Prop
+taut :: Prop -> Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: Name -> Name -> Bool
+
+     (p == p) == True
+     (p == p) == True
+  (p == True) == p
+     (n == n) == True
+taut (eval p) == taut p
+     (p == q) == (q == p)
+eval (eval p) == eval p
+
+    p ==> True
+False ==> p
+
+p ==> subst n True q == subst n p q
+
diff --git a/test/model/tauts.out b/test/model/tauts.out
new file mode 100644
--- /dev/null
+++ b/test/model/tauts.out
@@ -0,0 +1,37 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   = 4000
+min  #-tests   =  200  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Name
+_ :: Prop
+False :: Bool
+True :: Bool
+(==) :: Prop -> Prop -> Bool
+eval :: Prop -> Prop
+varOf :: Prop -> Name
+subst :: Name -> Bool -> Prop -> Prop
+taut :: Prop -> Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: Name -> Name -> Bool
+
+     (p == p) == True
+     (p == p) == True
+  (p == True) == p
+     (n == n) == True
+taut (eval p) == taut p
+     (p == q) == (q == p)
+eval (eval p) == eval p
+
+              p ==> True
+          False ==> p
+    p == eval q ==> p == eval p
+    subst n p q <=  q
+    subst n p q <=  subst n True q
+subst n False p <=  subst n q p
+
+taut q ==> subst n (taut q) p == subst n True p
+
diff --git a/test/model/tuples-s4.out b/test/model/tuples-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/tuples-s4.out
@@ -0,0 +1,36 @@
+max expr size  =    4
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    3  (for inequational and conditional laws)
+
+_ :: ()
+_ :: Int
+_ :: (Int,Int)
+_ :: (Int,Int,Int)
+() :: ()
+id :: () -> ()
+id :: Int -> Int
+id :: (Int,Int) -> (Int,Int)
+id :: (Int,Int,Int) -> (Int,Int,Int)
+(,) :: Int -> Int -> (Int,Int)
+(,,) :: Int -> Int -> Int -> (Int,Int,Int)
+fst :: (Int,Int) -> Int
+snd :: (Int,Int) -> Int
+swap :: (Int,Int) -> (Int,Int)
+right :: (Int,Int,Int) -> (Int,Int,Int)
+left :: (Int,Int,Int) -> (Int,Int,Int)
+
+                     id x == x
+                fst (x,y) == x
+                snd (x,y) == y
+            fst (swap xy) == snd xy
+            snd (swap xy) == fst xy
+                    id xy == xy
+           swap (swap xy) == xy
+               swap (x,y) == (y,x)
+                   id xyz == xyz
+right (right (right xyz)) == xyz
+                 left xyz == right (right xyz)
+
+
diff --git a/test/model/tuples.out b/test/model/tuples.out
new file mode 100644
--- /dev/null
+++ b/test/model/tuples.out
@@ -0,0 +1,35 @@
+max expr size  =    5
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    3  (for inequational and conditional laws)
+
+_ :: ()
+_ :: Int
+_ :: (Int,Int)
+_ :: (Int,Int,Int)
+() :: ()
+id :: () -> ()
+id :: Int -> Int
+id :: (Int,Int) -> (Int,Int)
+id :: (Int,Int,Int) -> (Int,Int,Int)
+(,) :: Int -> Int -> (Int,Int)
+(,,) :: Int -> Int -> Int -> (Int,Int,Int)
+fst :: (Int,Int) -> Int
+snd :: (Int,Int) -> Int
+swap :: (Int,Int) -> (Int,Int)
+right :: (Int,Int,Int) -> (Int,Int,Int)
+left :: (Int,Int,Int) -> (Int,Int,Int)
+
+                     id x == x
+                fst (x,y) == x
+                snd (x,y) == y
+                    id xy == xy
+          (fst xy,snd xy) == xy
+                  swap xy == (snd xy,fst xy)
+                   id xyz == xyz
+right (right (right xyz)) == xyz
+                 left xyz == right (right xyz)
+            right (x,y,z) == (z,x,y)
+
+
diff --git a/test/model/unit-s4.out b/test/model/unit-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/unit-s4.out
@@ -0,0 +1,13 @@
+max expr size  =    4
+  |- on ineqs  =    3
+  |- on conds  =    3
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: ()
+() :: ()
+id :: () -> ()
+
+
+
diff --git a/test/model/unit.out b/test/model/unit.out
new file mode 100644
--- /dev/null
+++ b/test/model/unit.out
@@ -0,0 +1,13 @@
+max expr size  =    5
+  |- on ineqs  =    4
+  |- on conds  =    4
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    2  (for inequational and conditional laws)
+
+_ :: ()
+() :: ()
+id :: () -> ()
+
+
+
diff --git a/test/model/zip-s4.out b/test/model/zip-s4.out
new file mode 100644
--- /dev/null
+++ b/test/model/zip-s4.out
@@ -0,0 +1,25 @@
+max expr size  =    4
+  |- on ineqs  =    5
+  |- on conds  =    5
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    3  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Int
+_ :: [Int]
+_ :: [(Int,Int)]
+_ :: (Int,Int)
+(++) :: [Int] -> [Int] -> [Int]
+(==) :: Int -> Int -> Bool
+length :: [Int] -> Int
+zip :: [Int] -> [Int] -> [(Int,Int)]
+True :: Bool
+False :: Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: [Int] -> [Int] -> Bool
+(==) :: [(Int,Int)] -> [(Int,Int)] -> Bool
+(==) :: (Int,Int) -> (Int,Int) -> Bool
+
+
+
diff --git a/test/model/zip.out b/test/model/zip.out
new file mode 100644
--- /dev/null
+++ b/test/model/zip.out
@@ -0,0 +1,27 @@
+max expr size  =    5
+max  #-tests   =  500
+min  #-tests   =   25  (to consider p ==> q true)
+max  #-vars    =    3  (for inequational and conditional laws)
+
+_ :: Bool
+_ :: Int
+_ :: [Int]
+_ :: [(Int,Int)]
+_ :: (Int,Int)
+(++) :: [Int] -> [Int] -> [Int]
+(==) :: Int -> Int -> Bool
+length :: [Int] -> Int
+zip :: [Int] -> [Int] -> [(Int,Int)]
+True :: Bool
+False :: Bool
+(==) :: Bool -> Bool -> Bool
+(==) :: [Int] -> [Int] -> Bool
+(==) :: [(Int,Int)] -> [(Int,Int)] -> Bool
+(==) :: (Int,Int) -> (Int,Int) -> Bool
+
+zip xs (xs ++ ys) == zip xs xs
+zip (xs ++ ys) xs == zip xs xs
+
+length xs == length ys ==> zip xs (ys ++ zs) == zip xs ys
+length xs == length ys ==> zip (xs ++ zs) ys == zip xs ys
+
diff --git a/test/order.hs b/test/order.hs
new file mode 100644
--- /dev/null
+++ b/test/order.hs
@@ -0,0 +1,141 @@
+{-# Language DeriveDataTypeable, StandaloneDeriving #-} -- Travis
+import Test
+import Test.Speculate.Utils
+import qualified Test.LeanCheck.Utils as LC (comparison)
+
+import Test.Speculate.Expr
+import Test.Speculate.Reason (emptyThy)
+import Test.Speculate.Reason.Order
+
+import Data.Monoid ((<>))
+
+-- for Travis:
+deriving instance Typeable Thyght
+deriving instance Typeable Equation
+
+main :: IO ()
+main = mainTest tests 10000
+
+tests :: Int -> [Bool]
+tests n =
+  [ True -- see test-expr.hs for general Expr orders
+
+  , holds n $ compare ==== (compareComplexity <> lexicompare)
+  , holds n $ LC.comparison lexicompare
+  , holds n $ LC.comparison compareComplexity
+
+  , holds n $ \(IntToIntE e1) (IntToIntE e2) (IntE e3) -> let cmp = lexicompare in
+                e1 `cmp` e2 == (e1 :$ e3) `cmp` (e2 :$ e3)
+  , holds n $ \(IntToIntE e1) (IntToIntE e2) (IntE e3) -> let cmp = lexicompareBy (flip compare) in
+                e1 `cmp` e2 == (e1 :$ e3) `cmp` (e2 :$ e3)
+  , holds n $ \(BoolToBoolE e1) (BoolToBoolE e2) (BoolE e3) -> let cmp = lexicompare in
+                e1 `cmp` e2 == (e1 :$ e3) `cmp` (e2 :$ e3)
+  , holds n $ \(BoolToBoolE e1) (BoolToBoolE e2) (BoolE e3) -> let cmp = lexicompareBy (flip compare) in
+                e1 `cmp` e2 == (e1 :$ e3) `cmp` (e2 :$ e3)
+
+  -- some tests of order
+  , value "xx" xx < zero
+  , value "xxeqxx" (Equation xx xx) < value "xx" xx
+  , value "xx" xx < value "emptyThyght" (Thyght emptyThy)
+
+  , holds n $ simplificationOrder (|>|)
+  , fails n $ simplificationOrder ( >|) -- TODO: make this pass (holds)
+  , fails n $ closedUnderSub ( >|) -- reason for the above, I believe this is an actual bug in >|
+-- > > checkFor 5040 $ closedUnderSub ( >|)
+-- > *** Failed! Falsifiable (after 3707 tests):
+-- > (id _ :: Int) (id 0 :: Int) (0 :: Int)
+-- > > closedUnderSub (>|) (id' xx) (id' zero) zero
+-- > False
+--
+-- The above bug did exist before the introduction of Express and probably
+-- since the creation of (>|).
+
+-- TODO: fix the following two tests
+-- > > checkFor 10080 $ simplificationOrder (dwoBy (<))
+-- > *** Failed! Falsifiable (after 6901 tests):
+-- > (f _ :: Int) (id _ :: Int) (_ :: Int)
+-- > > checkFor 10080 $ simplificationOrder (|> )
+-- > *** Failed! Falsifiable (after 6901 tests):
+-- > (f _ :: Int) (id _ :: Int) (_ :: Int)
+
+  -- TODO: fix the following two tests with 10000 tests:
+  , holds 5040 $ simplificationOrder (|> )
+  , holds 5040 $ simplificationOrder (dwoBy (<))
+  , fails 10080 $ compatible (|>)
+-- TODO: fix the following two tests
+-- > > checkFor 10080 $ compatible    (|>)
+-- > *** Failed! Falsifiable (after 6901 tests):
+-- > (f _ :: Int) (id _ :: Int) (_ :: Int)
+-- Like the one above
+-- Compatibility fails whenever there are function variables.
+
+
+  , fails n $ \e1 e2 -> (e1 |>| e2) == (e1 |>  e2)
+  , fails n $ \e1 e2 -> (e1 |>| e2) == (e1  >| e2)
+  , fails n $ \e1 e2 -> (e1 |>  e2) == (e1  >| e2)
+
+  , not $ zero |> xx
+  , not $ xx |> zero
+  , negate' xx |> zero
+  , negate' xx -+- xx |> zero
+  , zero > xx
+  , negateE > zero
+
+  , weight xx                            == 1
+  , weight zero                          == 1
+  , weight (xx -+- zero)                 == 2
+  , weight (one -+- yy)                  == 2
+  , weight (xx -*- (yy -+- zz))          == 3
+  , weight ((xx -*- yy) -+- (xx -*- zz)) == 4
+  , holds n $ \e1 e2 -> weight (e1 -+- e2)  == weight e1 + weight e2
+  , holds n $ \e     -> weight (e -+- zero) == 1 + weight e
+  , holds n $ \e     -> weight (abs' e)     == 1 + weight e
+  , holds n $ \e     -> weightExcept absE (abs' e)    <= weight e
+  , holds n $ \e     -> weightExcept absE (negate' e) <= weight e + 1
+  , holds n $ \e     -> weightExcept absE (abs' e)    == weightExcept absE e
+  , holds n $ \e     -> weightExcept absE (negate' e) == weightExcept absE e + 1
+
+  -- lexicompare is compatible (almost as if by coincidence)
+  , fails n $ simplificationOrder lgt
+  , holds n $ compatible          lgt
+  , fails n $ closedUnderSub      lgt
+  , fails n $ subtermProperty     lgt
+
+  -- compare has the subtermProperty (Expr)
+  , fails n $ simplificationOrder cgt
+  , fails n $ compatible          cgt
+  , fails n $ closedUnderSub      cgt
+  , holds n $ subtermProperty     cgt
+  ]
+  where
+  e1 `lgt` e2 = e1 `lexicompare` e2 == GT
+  e1 `cgt` e2 = e1 `compare` e2 == GT
+
+simplificationOrder :: (Expr -> Expr -> Bool) -> Expr -> Expr -> Expr -> Bool
+simplificationOrder (>) = \e1 e2 e3 -> reductionOrder  (>) e1 e2 e3
+                                    && subtermProperty (>) e1
+
+subtermProperty :: (Expr -> Expr -> Bool) -> Expr -> Bool
+subtermProperty (>) = \e -> all (e >)
+                          . filter (\e' -> e' /= e && typ e' == typ e)
+                          $ subexprs e -- isn't this subexprsV? I don't think so
+
+reductionOrder :: (Expr -> Expr -> Bool) -> Expr -> Expr -> Expr -> Bool
+reductionOrder (>) = \e1 e2 e3 -> strictPartialOrder (>) e1 e2 e3
+                               && compatible         (>) e1 e2 e3
+                               && closedUnderSub     (>) e1 e2 e3
+
+compatible :: (Expr -> Expr -> Bool) -> Expr -> Expr -> Expr -> Bool
+compatible (>) = \e e1 e2 -> e1 > e2 && typ e1 == typ e2
+                         ==> and [ (e //- [(v,e1)]) > (e //- [(v,e2)])
+                                 | v <- vars e
+                                 , typ v == typ e1
+                                 , typ v == typ e2 ]
+
+-- The formal definition contains multiple assignments,
+-- here, just a single variable is assigned.
+closedUnderSub :: (Expr -> Expr -> Bool) -> Expr -> Expr -> Expr -> Bool
+closedUnderSub (>) = \e1 e2 e -> e1 > e2
+                             ==> and [ (e1 //- [(v,e)]) > (e2 //- [(v,e)])
+                                     | v <- vars e1 `nubMerge` vars e2
+                                     , typ v == typ e ]
diff --git a/test/reason.hs b/test/reason.hs
new file mode 100644
--- /dev/null
+++ b/test/reason.hs
@@ -0,0 +1,258 @@
+{-# LANGUAGE CPP #-}
+-- Test library
+import Test
+import Test.Speculate.Utils
+
+-- Functions under test
+import Test.Speculate.Expr
+import Test.Speculate.Reason
+import Test.Speculate.Reason.Order
+import Data.Tuple (swap)
+import Data.Function (on)
+import Data.List (permutations)
+
+theorize' :: [(Expr,Expr)] -> Thy
+theorize' eqs = finalize $ foldl (flip insert) emptyThy {closureLimit = 3, keepE = keepMaxOf eqs} eqs
+
+theorize'' :: [(Expr,Expr)] -> Thy
+theorize'' eqs = finalize $ foldr insert emptyThy {closureLimit = 3, keepE = keepMaxOf eqs} eqs
+
+main :: IO ()
+main = do
+  n <- getMaxTestsFromArgs 10000
+
+  reportTests (tests n)
+
+  putStrLn "\nlength (rules $ theorize eqs)"
+  reportCountsBy (\(SameTypedPairsE eqs) -> show . length . rules $ theorize eqs)
+                 (take n list)
+
+  putStrLn "length (equations $ theorize eqs)"
+  reportCountsBy (\(SameTypedPairsE eqs) -> show . length . equations $ theorize eqs)
+                 (take n list)
+
+  putStrLn "\\e1 e2 e3 -> e1 > e2 && typ e1 == typ e2,  length (vars e3)"
+  reportCountsBy (\(e1,e2,e3) -> if e1 > e2 && typ e1 == typ e2
+                                   then "OK, length " ++ show (length $ vars e3)
+                                   else "Not OK")
+                 (take n list)
+
+  putStrLn "\\e e1 e2 -> length $ reductions 1 e (e1,e2)"
+  reportCountsBy (\(e,e1,e2) -> if e1 > e2 && typ e1 == typ e2
+                                  then "OK, length " ++ show (length $ reductions1 e (e1,e2))
+                                  else "Not OK")
+                 (take n list)
+
+(~~) :: Expr -> Expr -> (Expr,Expr)
+(~~) = (,)
+infix 4 ~~
+
+mkThy :: [(Expr,Expr)] -> [(Expr,Expr)] -> Thy
+mkThy rs eqs = emptyThy
+             { rules     = rs
+             , equations = eqs }
+
+tests :: Int -> [Bool]
+tests n =
+  [ True
+
+  -- Listable Thy sound and complete:
+  , holds n $ okThy
+  , all (`elem` take n list) (take (n`div`10) listThyInefficient)
+
+  , holds n $ \(SameTypedPairsE eqs) -> theorize eqs == theorize (map swap eqs)
+  , holds n $ \(SameTypedPairsE eqs) -> theorize eqs == theorize (reverse eqs)
+
+-- TODO: make the following two pass
+-- > > let eqs = [(xx, id' xx), (zero, id' xx)]
+-- > > theorize' eqs == theorize eqs
+-- > False
+-- > > theorize' eqs
+-- > Thy { rules = [ id x == x
+-- >               ]
+-- >     , equations = [ 0 == x
+-- >                   ]
+-- >     , canReduceTo = (|>)
+-- >     , closureLimit = 3
+-- >     , keepE = keepUpToLength 3
+-- >     }
+-- > > theorize eqs
+-- > Thy { rules = [ id x == x
+-- >               , id x == 0
+-- >               ]
+-- >     , equations = [ 0 == x
+-- >                   ]
+-- >     , canReduceTo = (|>)
+-- >     , closureLimit = 3
+-- >     , keepE = keepUpToLength 3
+-- >     }
+--
+-- This issue did exist before the introduction of Express,
+-- it just wasn't found because Expr enumeration wasn't that good.
+--, holds n $ \(SameTypedPairsE eqs) -> theorize'  eqs == theorize eqs
+--, holds n $ \(SameTypedPairsE eqs) -> theorize'' eqs == theorize eqs
+
+  , holds n $ okThy . deduce
+  , holds n $ idempotent deduce
+  , holds n $ \thy -> ((>=) `on` length . equations) (deduce thy) thy
+  , holds n $ \thy -> ((==) `on` rules)              (deduce thy) thy
+
+  , holds n $ okThy . simplify
+  , holds n $ idempotent simplify
+  , holds n $ \thy -> ((<=) `on` length . equations) (simplify thy) thy
+  , holds n $ \thy -> ((==) `on` rules)              (simplify thy) thy
+
+  , holds n $ okThy . delete
+  , holds n $ idempotent delete
+  , holds n $ \thy -> ((<=) `on` length . equations) (delete thy) thy
+  , holds n $ \thy -> ((==) `on` rules)              (delete thy) thy
+
+  , holds n $ okThy . orient
+  , holds n $ idempotent orient
+  , holds n $ \thy -> ((<=) `on` length . equations) (orient thy) thy
+  , holds n $ \thy -> ((>=) `on` length . rules)     (orient thy) thy
+  , holds n $ \thy -> length (equations thy)      - length (equations $ orient thy)
+                   >= length (rules $ orient thy) - length (rules thy)
+
+  , holds n $ okThy . compose
+  , holds n $ idempotent compose
+  , holds n $ \thy -> ((<=) `on` length . rules)     (compose thy) thy
+  , holds n $ \thy -> ((==) `on` equations)          (compose thy) thy
+
+  , holds n $ okThy . collapse
+  , holds n $ idempotent collapse
+  , holds n $ \thy -> ((<=) `on` length . rules)     (collapse thy) thy
+  , holds n $ \thy -> ((>=) `on` length . equations) (collapse thy) thy
+
+  , holds n $ okThy . complete . unThyght
+
+  , holds n $ \(Thyght thy') (SameTypedPairsE eqs) ->
+                let thy = complete thy'
+                in  foldr insert thy eqs == complete (append thy eqs)
+
+  -- TODO: make the following pass with n `div` 10
+  -- Inference order should not matter:
+  , holds 100
+  $ \(Thyght thy) -> all (\steps -> iterateUntil (==) (chain steps) thy == complete thy)
+                   $ permutations [collapse, compose, orient, delete . simplify, deduce]
+  -- I now think the above property is not true in all cases, investigate.
+
+  -- NOTE: the following does not hold in general, only for most of the cases
+  , holds 4000
+  $ \(Thyght thy') (SameTypeE e1 e2) -> closureLimit thy' > 0 ==>
+       let thy = insert (e1,e2)
+               $ thy' { keepE = keepUpToLength (max (size e1) (size e2)) }
+       in  equivalent thy e1 e2
+
+  , holds n $ idempotent finalize
+
+  , criticalPairs emptyThy { rules = [ ((xx -+- yy) -+- zz,xx -+- (yy -+- zz))
+                                     , (negate' xx -+- xx, zero) ] }
+      == [ (negate' xx -+- (xx -+- yy),zero -+- yy)
+         , ((xx -+- (yy -+- zz)) -+- xx', (xx -+- yy) -+- (zz -+- xx')) ]
+
+  , criticalPairs emptyThy { rules = [ (negate' (negate' xx), id' xx) ] }
+      == [ (negate' (id' xx), id' (negate' xx)) ]
+
+  , criticalPairs emptyThy { canReduceTo = dwoBy (\e1 e2 -> e1 `lexicompare` e2 == GT)
+                           , rules = [ (foo (goo (foo xx)), xx)
+                                     , (foo (goo xx), goo (foo xx)) ] }
+      == (let sortuple (x,y) | x < y     = (y,x)
+                             | otherwise = (x,y)
+          in nubSort . map sortuple
+           $ [ (goo xx,                   foo (goo (goo (foo xx))))
+             , (goo (foo xx),             foo (goo xx))
+             , (goo (foo (foo xx)),       xx)
+             , (goo (foo (foo (goo xx))), goo xx) ])
+
+  , criticalPairs emptyThy { rules = [ (foo (goo (foo xx)), xx)
+                                     , (foo (goo xx), goo (foo xx)) ] }
+      == [ (goo (foo xx),             foo (goo xx))
+         , (goo (foo (foo xx)),       xx)
+         , (foo (goo (goo (foo xx))), goo xx)
+         , (goo (foo (foo (goo xx))), goo xx) ]
+
+  , theorize [ (xx -*- yy) -*- (yy -*- zz)  ~~  yy ]
+    |==|
+    [ (xx -*- yy) -*- (yy -*- zz)  ~~  yy
+    , xx -*- ((xx -*- yy) -*- zz)  ~~  xx -*- yy
+    , (xx -*- (yy -*- zz)) -*- zz  ~~  yy -*- zz
+    ] `mkThy` []
+
+  , theorize [ xx -*- (yy -+- zz)  ~~  (xx -*- yy) -+- (xx -*- zz)
+             , (xx -+- yy) -*- zz  ~~  (xx -*- zz) -+- (yy -*- zz) ]
+    |==|
+    [ (xx -*- yy) -+- (xx -*- zz)  ~~  xx -*- (yy -+- zz)
+    , (xx -*- yy) -+- (zz -*- yy)  ~~  (xx -+- zz) -*- yy
+    ] `mkThy` [ (xx -+- xx) -*- yy  ~~  xx -*- (yy -+- yy) ]
+
+  , theorizeBy (|>|) [ xx -+- zero      ~~  xx
+                     , xx -+- succ' yy  ~~  succ' (xx -+- yy) ]
+    |==|
+    [ xx -+- zero  ~~  xx
+    ] `mkThy` [ xx -+- succ' yy  ~~  succ' (xx -+- yy) ]
+
+  , theorizeBy (kboBy weight (<))
+    [ xx -+- zero      ~~  xx
+    , xx -+- succ' yy  ~~  succ' (xx -+- yy) ]
+    |==|
+    [                 xx -+- zero  ~~  xx
+    , succ' (xx -+- yy)            ~~  xx -+- succ' yy
+    , xx -+-         succ' zero    ~~         succ' xx
+    , xx -+- (succ' (succ' zero))  ~~  succ' (succ' xx)
+    ] `mkThy` []
+
+  , theorizeBy (|>) [ xx -+- zero      ~~  xx
+                    , xx -+- succ' yy  ~~  succ' (xx -+- yy) ]
+    |==|
+    [ xx -+- zero      ~~  xx
+    , xx -+- succ' yy  ~~  succ' (xx -+- yy)
+    ] `mkThy` []
+
+  -- TODO: fix order under GHC <= 7.8
+#if __GLASGOW_HASKELL >= 800
+  , theorizeBy (dwoBy $ \e1 e2 -> if typ e1 == typ e2
+                                      then e1 > e2
+                                      else typ e1 < typ e2)
+    [ ( xx -+- zero, xx )
+    , ( xx -+- succ' yy, succ' (xx -+- yy) ) ]
+    |==|
+    [ ( xx -+- zero, xx )
+    , ( succ' (xx -+- yy), xx -+- (succ' yy) )
+    ] `mkThy` [ xx -+- (succ' zero)  ~~  succ' xx]
+#endif
+
+  , theorizeBy (|>) [ ( zero -+- xx, xx )
+                    , ( negate' xx -+- xx, zero )
+                    , ( (xx -+- yy) -+- zz, xx -+- (yy -+- zz) ) ]
+    |==| [ ( zero -+- xx                , xx )
+         , ( negate' xx -+- xx          , zero )
+         , ( (xx -+- yy) -+- zz         , xx -+- (yy -+- zz) )
+         , ( negate' xx -+- (xx -+- yy) , yy )
+         , ( xx -+- zero                , xx )
+         , ( xx -+- (negate' xx -+- yy) , yy )
+         , ( negate' (negate' xx)         , xx )
+         , ( negate' zero                 , zero )
+         , ( xx -+- negate' xx            , zero )
+         ] `mkThy` []
+
+  , theorizeBy (kboBy (weightExcept negateE) (gtExcept (>) negateE))
+      [ ( zero -+- xx, xx )
+      , ( negate' xx -+- xx, zero )
+      , ( (xx -+- yy) -+- zz, xx -+- (yy -+- zz) ) ]
+    |==| [ ( zero -+- xx                , xx )
+         , ( negate' xx -+- xx          , zero )
+         , ( (xx -+- yy) -+- zz         , xx -+- (yy -+- zz) )
+         , ( negate' xx -+- (xx -+- yy) , yy )
+         , ( negate' zero -+- xx        , xx )
+         , ( xx -+- zero                , xx )
+         , ( xx -+- (negate' xx -+- yy) , yy )
+         , ( negate' (negate' xx)         , xx )
+         , ( xx -+- negate' xx            , zero )
+         ] `mkThy` [( negate' zero, zero )]
+
+  -- TODO: restore tests losts after removing test-kbc
+  ]
+
+succ' :: Expr -> Expr
+succ'  =  (value "succ" ((1+) :: Int -> Int) :$)
diff --git a/test/sdist b/test/sdist
new file mode 100644
--- /dev/null
+++ b/test/sdist
@@ -0,0 +1,33 @@
+#!/bin/bash
+#
+# test-sdist: tests the package generated by "cabal sdist".
+#
+# Copyright (c) 2015-2018 Rudy Matela.
+# Distributed under the 3-Clause BSD licence.
+export LC_ALL=C  # consistent sort
+pkgver=` cat *.cabal | grep "^version:" | sed -e "s/version: *//"`
+pkgname=`cat *.cabal | grep "^name:"    | sed -e "s/name: *//"`
+pkg=$pkgname-$pkgver
+set -x
+cabal sdist &&
+cd dist &&
+tar -tf $pkg.tar.gz | sort --ignore-case          > ls-cabal-i  &&
+tar -tf $pkg.tar.gz | sort --ignore-case --unique > ls-cabal-iu &&
+diff -rud ls-cabal-i ls-cabal-iu &&
+rm -f ls-cabal ls-cabal-ignore-case &&
+if [ -d ../.git ]
+then
+	# on git repo, test if files are the same
+	git -C .. ls-files                                      | sort > ls-git   &&
+	tar -tf $pkg.tar.gz | grep -v "/$" | sed -e "s,$pkg/,," | sort > ls-cabal &&
+	diff -rud ls-git ls-cabal &&
+	rm -f ls-git ls-cabal
+else
+	# outside of git repo, test build
+	rm -rf $pkg/ &&
+	tar -xzf $pkg.tar.gz &&
+	cd $pkg/ &&
+	cabal configure --enable-tests --enable-benchmarks &&
+	cabal build &&
+	cabal test
+fi
diff --git a/test/stats.hs b/test/stats.hs
new file mode 100644
--- /dev/null
+++ b/test/stats.hs
@@ -0,0 +1,41 @@
+-- Test library
+import Test
+
+-- Functions under test
+import Test.Speculate.Reason
+import Test.Speculate.Utils
+
+main :: IO ()
+main = do
+  n <- getMaxTestsFromArgs 10000
+
+  putStrLn "typ (e :: Expr)"
+  reportCountsBy typ            (take n list :: [Expr])
+
+  putStrLn "size (e :: Expr)"
+  reportCountsBy sizeInterval (take n list :: [Expr])
+
+  putStrLn "typ (e1 :: Expr) == typ (e2 :: Expr)"
+  reportCountsBy equalTypes (take n list)
+
+  putStrLn "typ (e1 :: Expr) == typ (e2 :: Expr)"
+  reportCountsBy equalTypes . map unSameTypeE . take n $ list
+
+  putStrLn "okThy thy"
+  reportCountsBy (show . okThy) (take n list)
+
+  putStrLn "length (equations thy)"
+  reportCountsBy (show . length . equations) (take n list)
+
+  putStrLn "length (rules thy)"
+  reportCountsBy (show . length . rules) (take n list)
+
+  putStrLn "length (equations thy + rules thy)"
+  reportCountsBy (show . length . (\thy -> rules thy ++ equations thy)) (take n list)
+
+sizeInterval :: Expr -> (Int,Int)
+sizeInterval e = (l, l+2) where l = (size e `div` 3) * 3
+
+equalTypes :: (Expr,Expr) -> String
+equalTypes (e1,e2) | typ e1 == typ e2 = show (typ e1)
+                   | otherwise        = "invalid"
diff --git a/test/update-diff b/test/update-diff
new file mode 100644
--- /dev/null
+++ b/test/update-diff
@@ -0,0 +1,74 @@
+#!/bin/bash
+top=`dirname $0`/..
+eg=$top/eg
+model=$top/test/model
+
+case "$1" in
+	-*) sz="$1"
+	    shift
+		;;
+esac
+
+diff-() {
+	$1 $sz | diff -rud $model/$2$sz.out - || exit 1
+}
+
+update-diff-() {
+	$1 $sz > $model/$2$sz.out
+}
+
+tym() {
+	/usr/bin/time -f%e "$@"
+}
+
+spc() {
+	/usr/bin/time -f%M "$@"
+}
+
+mean() {
+	sum="`echo -n $* | sed -e "s/ / + /g"`"
+	mean="`echo "scale = 3; ($sum) / $#" | bc`"
+	printf "%3.3f\n" $mean
+}
+export -f mean
+
+div1024() {
+	printf "%3.0f\n" "`echo "$1 / 1024" | bc`"
+}
+export -f div1024
+
+benchmark-() {
+	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
+	printf "%-18s  " "$2$sz"
+	for run in {1..3}
+	do
+		tym $1 $sz 2>&1 >/dev/null
+	done | xargs bash -c 'mean "$@"' mean
+}
+
+memory-benchmark-() {
+	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
+	printf "%-18s  " "$2$sz"
+	for run in {1..3}
+	do
+		spc $1 $sz 2>&1 >/dev/null
+	done | xargs bash -c 'mean    "$@"' mean |
+	       xargs bash -c 'div1024 "$@"' div1024
+}
+
+benchmark-cmp-() {
+	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
+	grep "^ *$2$sz " bench/runtime-$HOSTNAME | tr '\n' ' '
+	echo -n ' '
+	for run in {1..1}
+	do
+		tym $1 $sz 2>&1 >/dev/null
+	done | xargs bash -c 'mean "$@"' mean
+}
+
+find $* | sed -e "s/^bench/     /;s/^eg/  /" |
+sort -b | sed -e "s/^     /bench/;s/^  /eg/" |
+while read e
+do
+	`basename $0`- $top/$e `basename $e`
+done
diff --git a/test/utils.hs b/test/utils.hs
new file mode 100644
--- /dev/null
+++ b/test/utils.hs
@@ -0,0 +1,108 @@
+-- Test library
+import Test
+
+-- Functions under test
+import Test.Speculate.Utils
+
+-- Helper functions
+import Data.List
+import Data.Function
+
+import Test.LeanCheck.Utils (comparison)
+
+main :: IO ()
+main = mainTest tests 10000
+
+tests :: Int -> [Bool]
+tests n =
+  [ True
+  
+  , holds 100 $ \xs ys -> strictlyOrdered xs && strictlyOrdered ys
+                      ==> strictlyOrdered (nubMerge xs (ys::[Int]))
+  , and [ nubMerge xs xs == xs | n <- [0..10], let xs = [0..n] :: [Int] ]
+
+  , collectOn snd [(1,2),(2,2),(2,3),(3,3)::(Int,Int)] == [[(1,2),(2,2)],[(2,3),(3,3)]]
+  , collectOn fst [(1,2),(2,2),(2,3),(3,3)::(Int,Int)] == [[(1,2)],[(2,2),(2,3)],[(3,3)]]
+  , collectOn (uncurry (+)) [(1,2),(2,2),(2,3),(3,3)::(Int,Int)] == [[(1,2)],[(2,2)],[(2,3)],[(3,3)]]
+  , collectBy (compare `on` snd) [(1,2),(2,2),(2,3),(3,3)::(Int,Int)] == [[(1,2),(2,2)],[(2,3),(3,3)]]
+
+  , holds n $ \x           -> medianate (,) [x::Int]           == [(x,x)]
+  , holds n $ \x y         -> medianate (,) [x::Int,y]         == [(x,y)]
+  , holds n $ \x y z       -> medianate (,) [x::Int,y,z]       == [(x,z),(y,y)]
+  , holds n $ \x y z w     -> medianate (,) [x::Int,y,z,w]     == [(x,w),(y,z)]
+  , holds n $ \x y z w v   -> medianate (,) [x::Int,y,z,w,v]   == [(x,v),(y,w),(z,z)]
+  , holds n $ \x y z w v u -> medianate (,) [x::Int,y,z,w,v,u] == [(x,u),(y,v),(z,w)]
+
+  , all (\f -> discardOthers f [] == ([]::[Int])) [(<=),(>=),(<),(>),(==),(/=),\x y -> True]
+  , holds n $ \x -> all (\f -> discardOthers f [x] == [x::Int])
+                        [(<=),(>=),(<),(>),(==),(/=),\x y -> True]
+  , holds n $ \xs -> not (null xs) ==> discardOthers (<=) xs == [maximum xs::Int]
+  , holds n $ \xs -> not (null xs) ==> discardOthers (>=) xs == [minimum xs::Int]
+  , holds n $ \xs -> not (null xs) ==>
+      discardOthers (<) xs == replicate (count (maximum xs) xs) (maximum xs::Int)
+  , holds n $ \xs -> not (null xs) ==>
+      discardOthers (>) xs == replicate (count (minimum xs) xs) (minimum xs::Int)
+
+  , table "l  l  l" [ ["asdf", "qwer",     "zxvc\nzxvc"]
+                    , ["0",    "1",        "2"]
+                    , ["123",  "456\n789", "3"] ] ==
+      "asdf  qwer  zxvc\n\
+      \            zxvc\n\
+      \0     1     2\n\
+      \123   456   3\n\
+      \      789\n"
+
+  , table "r  l  l" [ ["asdf", "qwer",     "zxvc\nzxvc"]
+                    , ["0",    "1",        "2"]
+                    , ["123",  "456\n789", "3"] ] ==
+      "asdf  qwer  zxvc\n\
+      \            zxvc\n\
+      \   0  1     2\n\
+      \ 123  456   3\n\
+      \      789\n"
+
+  , table "r  r  l" [ ["asdf", "qwer",     "zxvc\nzxvc"]
+                    , ["0",    "1",        "2"]
+                    , ["123",  "456\n789", "3"] ] ==
+      "asdf  qwer  zxvc\n\
+      \            zxvc\n\
+      \   0     1  2\n\
+      \ 123   456  3\n\
+      \       789\n"
+
+  , splitAtCommas "1,2,3" == ["1","2","3"]
+  , splitAtCommas "123,456,789," == ["123","456","789"]
+  , splitAtCommas "123 456,789"  == ["123","456","789"] -- weird behaviour, but fine for speculate
+
+  , compareIndex [3,2,1::Int] 3 1 == LT
+  , compareIndex [3,2,1::Int] 1 3 == GT
+  , compareIndex [3,2,1::Int] 4 1 == GT
+  , compareIndex [3,2,1::Int] 1 0 == LT
+  , holds n $ \xs -> comparison (compareIndex (xs::[Int]))
+
+  , partitionByMarkers '#' '*' "" == ("","")
+  , partitionByMarkers '#' '*' "abc*def" == ("abc","def")
+  , partitionByMarkers '#' '*'  "abcdef" == ("abcdef","")
+  , partitionByMarkers '#' '*' "#abcdef" == ("abcdef","")
+  , partitionByMarkers '#' '*' "abc#def" == ("abcdef","")
+  , partitionByMarkers '#' '*' "*ab#cd" == ("cd","ab")
+  , partitionByMarkers '#' '*' "abc#def*ghi*jkl#mno*pqr#stu" == ("abcdefmnostu","ghijklpqr")
+  , partitionByMarkers '#' '*' "#foreground*background#foreground" == ("foregroundforeground","background")
+
+  , holds n $ \xs ys -> strictlyOrdered xs && strictlyOrdered ys
+                    ==> strictlyOrdered (xs +++ ys :: [Int])
+  , holds n $ \xs ys -> xs +++ ys == ys +++ (xs :: [Int])
+  , holds n $ \xs ys -> strictlyOrdered xs && strictlyOrdered ys
+                    ==> xs +++ ys == nubSort (xs ++ ys :: [Int])
+
+  , holds n $ nubSort === nub . sort -:> [int]
+
+  , halve []             == ([],[]::[Int])
+  , halve [1::Int]       == ([],[1])
+  , halve [1,2::Int]     == ([1],[2])
+  , halve [1,2,3::Int]   == ([1],[2,3])
+  , halve [1,2,3,4::Int] == ([1,2],[3,4])
+
+  , holds n $ \n xss -> 0 <  n && n <  length xss ==> xss ! n == (xss !! n :: [Int])
+  , holds n $ \n xss -> 0 >= n && n >= length xss ==> xss ! n == ([] :: [Int])
+  ]
diff --git a/tests/Test.hs b/tests/Test.hs
deleted file mode 100644
--- a/tests/Test.hs
+++ /dev/null
@@ -1,237 +0,0 @@
--- | This module defines utilities to test 'Speculate' itself.
---
--- It should never be exported in a cabal package, and should not be included
--- in Haddock documentation.  Hence the weird name, simply "Test".
---
--- This module exports a Listable Expr instance, that does not, by any means,
--- list all possible expressions.  But instead, list expressions based on the
--- names exported by this module.
-module Test
-  (
-  -- * Module exports
-    module Test.LeanCheck
-  , module Test.LeanCheck.Utils
-  , module Test.Speculate
-  , module Data.Express.Fixtures
-  , module Test.ListableExpr
-
-  -- * Test reporting
-  , reportTests
-  , getMaxTestsFromArgs
-  , mainTest
-  , printLines
-
-  -- * Test types
-  , listThyInefficient
-
-  , Thyght (..)
-  , Equation (..)
-
-  -- * Test fixtures
-  , foo, goo
-
-  -- * Enumerate expressions
-  , expressionsT
-  )
-where
-
-import Test.LeanCheck
-import Test.LeanCheck.Utils hiding (comparison)
-
-import Data.Express.Fixtures
-
-import System.Environment (getArgs)
-import System.Exit (exitFailure)
-import Data.List (elemIndices)
-
-import Test.Speculate hiding (getArgs)
-import Test.Speculate.Reason
-import Test.Speculate.Reason.Order
-
-import Data.List (sort)
-
-import Test.Speculate.Utils
-
-import Test.ListableExpr
-
-
--- test reporting --
-
-reportTests :: [Bool] -> IO ()
-reportTests tests  =  case elemIndices False tests of
-  [] -> putStrLn "+++ Tests passed!"
-  is -> putStrLn ("*** Failed tests:" ++ show is) >> exitFailure
-
-getMaxTestsFromArgs :: Int -> IO Int
-getMaxTestsFromArgs n = do
-  as <- getArgs
-  return $ case as of
-             (s:_) -> read s
-             _     -> n
-
-mainTest :: (Int -> [Bool]) -> Int -> IO ()
-mainTest tests n' = do
-  n <- getMaxTestsFromArgs n'
-  reportTests (tests n)
-
-printLines :: Show a => [a] -> IO ()
-printLines = putStrLn . unlines . map show
-
-
--- test fixtures --
-
-foo :: Expr -> Expr
-foo = (value "f" (undefined :: Int -> Int) :$)
-
-goo :: Expr -> Expr
-goo = (value "g" (undefined :: Int -> Int) :$)
-
-
--- test types --
-
-data Rule = Rule Expr Expr deriving (Show, Eq, Ord)
-data Equation = Equation Expr Expr deriving (Show, Eq, Ord)
-newtype RuleSet = RuleSet [(Expr,Expr)] deriving Show
-newtype EquationSet = EquationSet [(Expr,Expr)] deriving Show
-newtype Thyght = Thyght { unThyght :: Thy } deriving Show
-
-
--- Listable instances --
-
--- beware: enumerating beyond 600 values will  make this very slow as it is
--- very hard to satisfy canonicalEqn and ->-.  In practice, this should not be a
--- problem as we enumerate far less than that when enerating 'Thy's.
-instance Listable Rule where
-  tiers = (`ofWeight` 0)
-        . filterT (\(Rule e1 e2) -> canonicalRule (e1,e2) && e1 ->- e2)
-        . mapT (uncurry Rule . orientRule)
-        . filterT (uncurry (<))
-        . mapT unSameTypeE
-        $ tiers
-    where
-    (->-) = canReduceTo emptyThy
-    orientRule (e1,e2) | e1 ->- e2 = (e1,e2)
-                       | otherwise = (e2,e1)
-
-instance Listable Equation where
-  tiers = (`ofWeight` 0)
-        . mapT (uncurry Equation)
-        . filterT (canonicalEqn emptyThy)
-        . mapT orientEqn
-        . filterT (uncurry (<=))
-        . mapT unSameTypeE
-        $ tiers
-    where
-    orientEqn (e1,e2) | e1 `compare` e2 == LT = (e2,e1)
-                      | otherwise             = (e1,e2)
-
-instance Listable RuleSet where
-  tiers = setCons (RuleSet . map unRule) `ofWeight` 0
-    where
-    unRule (Rule e1 e2) = (e1,e2)
-
-instance Listable EquationSet where
-  tiers = setCons (EquationSet . map unEquation) `ofWeight` 0
-    where
-    unEquation (Equation e1 e2) = (e1,e2)
-
-instance Listable Thy where
-  tiers = concatMapT expandCanReduceTo
-        $ concatMapT expandClosureLimit
-        $ concatMapT expandKeepE
-        $ cons2 (\(RuleSet rs) (EquationSet eqs)
-                   -> emptyThy { rules     = sort rs
-                               , equations = sort eqs })
-
-instance Listable Thyght where
-  tiers = mapT Thyght
-        $ concatMapT expandCanReduceTo
-        $ concatMapT expandClosureLimit
-        $ mapT defaultKeep
-        $ cons2 (\(RuleSet rs) (EquationSet eqs)
-                   -> emptyThy { rules     = sort rs
-                               , equations = sort eqs })
-
-expandKeepE :: Thy -> [[Thy]]
-expandKeepE thy = cons0 thy
-               \/ cons0 thy {keepE = keepUpToLength (maxLen + 0)} `ofWeight` 1
-               \/ cons0 thy {keepE = keepUpToLength (maxLen + 1)} `ofWeight` 2
-               \/ cons0 thy {keepE = keepUpToLength (maxLen + 2)} `ofWeight` 4
-               \/ cons0 thy {keepE = keepUpToLength (maxLen + 3)} `ofWeight` 6
-               \/ cons0 thy {keepE = keepUpToLength (maxLen + 4)} `ofWeight` 8
-  where
-  maxLen = maximum . (0:) . map size . catPairs $ equations thy ++ rules thy
-
-expandClosureLimit :: Thy -> [[Thy]]
-expandClosureLimit thy = cons0 thy {closureLimit = 3}
-                      \/ cons0 thy {closureLimit = 0} `ofWeight` 1
-                      \/ cons0 thy {closureLimit = 2} `ofWeight` 2
-                      \/ cons0 thy {closureLimit = 1} `ofWeight` 3
-
--- TODO: make Listable Thy enumeration complete w.r.t: canReduceTo
--- for a complete version, Listable Rule will have to be transformed on a
--- higher order function that take canReduceTo.  (harder to maintain)
-expandCanReduceTo :: Thy -> [[Thy]]
-expandCanReduceTo thy = cons0 thy
-                     \/ if all (uncurry (|>|)) (rules thy)
-                          then cons0 thy {canReduceTo = (|>|)} `ofWeight` 1
-                          else []
--- FIXME: KBO is broken ATM:
---                   \/ if all (uncurry ( >|)) (rules thy)
---                        then cons0 thy {canReduceTo = ( >|)} `ofWeight` 2
---                        else []
-
-listThyInefficient :: [Thy]
-listThyInefficient = concat
-                   . concatMapT expandCanReduceTo
-                   . concatMapT expandClosureLimit
-                   . concatMapT expandKeepE
-                   $ cons2 (\(SameTypedPairsE rs) (SameTypedPairsE eqs)
-                              -> emptyThy { rules     = sort rs
-                                          , equations = sort eqs
-                                          }) `suchThat` okThy
-
--- Quick and Dirty!
-instance Show Thy where
-  show Thy { rules = rs
-           , equations = eqs
-           , canReduceTo = (->-)
-           , closureLimit = cl
-           , keepE = keep
-           }
-    = "Thy { rules = "
-   ++ drop 14 (indent 14 . listLines $ map showEquation rs)
-   ++ "    , equations = "
-   ++ drop 18 (indent 18 . listLines $ map showEquation eqs)
-   ++ "    , canReduceTo = " ++ showCanReduceTo (->-) ++ "\n"
-   ++ "    , closureLimit = " ++ show cl ++ "\n"
-   ++ "    , keepE = " ++ showKeepE keep ++ "\n"
-   ++ "    }"
-    where
-    showEquation (e1,e2) = showExpr e1 ++ " == " ++ showExpr e2
-    listLines [] = "[]"
-    listLines ss = '[':(tail . unlines $ map (", " ++) ss) ++ "]"
-    showCanReduceTo (->-) | holds 1000 $ (->-) ==== (|>|) = "(|>|)"
-                          | holds 1000 $ (->-) ==== ( >|) =  "(>|)"
-                          | holds 1000 $ (->-) ==== (|> ) = "(|>)"
-                          | otherwise = "(??)"
-    showKeepE keep | holds 1000 $ keep === const True = "const True"
-                   | holds 1000 $ keep === keepUpToLength 0 = "keepUpToLength 0"
-                   | holds 1000 $ keep === keepUpToLength 1 = "keepUpToLength 1"
-                   | holds 1000 $ keep === keepUpToLength 2 = "keepUpToLength 2"
-                   | holds 1000 $ keep === keepUpToLength 3 = "keepUpToLength 3"
-                   | holds 1000 $ keep === keepUpToLength 4 = "keepUpToLength 4"
-                   | holds 1000 $ keep === keepUpToLength 5 = "keepUpToLength 5"
-                   | holds 1000 $ keep === keepUpToLength 6 = "keepUpToLength 6"
-                   | holds 1000 $ keep === keepUpToLength 7 = "keepUpToLength 7"
-                   | holds 1000 $ keep === keepUpToLength 8 = "keepUpToLength 8"
-                   | holds 1000 $ keep === keepUpToLength 9 = "keepUpToLength 9"
-                   | otherwise = "\\e -> ??"
-
-expressionsT :: [Expr] -> [[Expr]]
-expressionsT ds = [ds] \/ productMaybeWith ($$) es es `addWeight` 1
-  where
-  es = expressionsT ds
--- TODO: maybe use expressionsT as the main function to generate Exprs.
--- By using it, I speculate a 20% increase in runtime.  But the code will
--- certainly be smaller and easier to maintain.
diff --git a/tests/Test/ListableExpr.hs b/tests/Test/ListableExpr.hs
deleted file mode 100644
--- a/tests/Test/ListableExpr.hs
+++ /dev/null
@@ -1,272 +0,0 @@
-module Test.ListableExpr
-  (
-  -- * The Expr type
-    Expr
-
-  -- * Expressions of a type
-  , IntE (..)
-  , BoolE (..)
-  , IntsE (..)
-  , CharE (..)
-
-  , IntE0 (..)
-  , IntEV (..)
-  , BoolE0 (..)
-  , BoolEV (..)
-  , IntsE0 (..)
-  , IntsEV (..)
-  , CharE0 (..)
-  , CharEV (..)
-
-  -- ** Functional values
-  , IntToIntE (..)
-  , IntToIntToIntE (..)
-  , BoolToBoolE (..)
-  , BoolToBoolToBoolE (..)
-
-  , SameTypeE (..)
-  , unSameTypeE
-  , SameTypedPairsE (..)
-
-  -- * Terminal expressions
-  , E0 (..)
-  , EV (..)
-
-  -- * Ill typed expressions
-  , Ill (..)
-  )
-where
-
--- TODO: StringE
-
-import Test.LeanCheck
-import Test.LeanCheck.Function.ShowFunction
-import Data.Express.Fixtures
-import Data.Function (on)
-
--- | Terminal constants.
-newtype E0  =  E0 { unE0 :: Expr }
-
--- | Variables.
-newtype EV  =  EV { unEV :: Expr }
-
--- | Expression of 'Int' type.
-newtype IntE  =  IntE { unIntE :: Expr }
-
--- | Constant terminal value of 'Int' type.
-newtype IntE0  =  IntE0 { unIntE0 :: Expr }
-
--- | Varialbe of 'Int' type.
-newtype IntEV  =  IntEV { unIntEV :: Expr }
-
--- | Functions from Int to Int
-newtype IntToIntE  =  IntToIntE { unIntToIntE :: Expr }
-newtype IntToIntToIntE  =  IntToIntToIntE { unIntToIntToIntE :: Expr }
-
--- | Expression of 'Bool' type.
-newtype BoolE  =  BoolE { unBoolE :: Expr }
-
--- | Constant terminal value of 'Bool' type.
-newtype BoolE0  =  BoolE0 { unBoolE0 :: Expr }
-
--- | Varialbe of 'Bool' type.
-newtype BoolEV  =  BoolEV { unBoolEV :: Expr }
-
--- | Functions from Bool to Bool
-newtype BoolToBoolE  =  BoolToBoolE { unBoolToBoolE :: Expr }
-newtype BoolToBoolToBoolE  =  BoolToBoolToBoolE { unBoolToBoolToBoolE :: Expr }
-
-newtype CharE  =  CharE { unCharE :: Expr }
-
-newtype CharE0  =  CharE0 { unCharE0 :: Expr }
-
-newtype CharEV  =  CharEV { unCharEV :: Expr }
-
-data SameTypeE  =  SameTypeE Expr Expr
-
-unSameTypeE :: SameTypeE -> (Expr,Expr)
-unSameTypeE (SameTypeE e1 e2)  =  (e1,e2)
-
-data SameTypedPairsE  =  SameTypedPairsE { unSameTypedPairsE :: [(Expr,Expr)] }
-
--- | Ill typed expressions.
-newtype Ill  =  Ill { unIll :: Expr }
-
-
-instance Show E0  where  show (E0 e) = show e
-instance Show EV  where  show (EV e) = show e
-
-instance Show IntE  where  show (IntE e) = show e
-
-instance Show IntE0  where  show (IntE0 e) = show e
-instance Show IntEV  where  show (IntEV e) = show e
-
-instance Show IntToIntE  where  show (IntToIntE e) = show e
-instance Show IntToIntToIntE  where  show (IntToIntToIntE e) = show e
-
-instance Show BoolE  where  show (BoolE e) = show e
-
-instance Show BoolE0  where  show (BoolE0 e) = show e
-instance Show BoolEV  where  show (BoolEV e) = show e
-
-instance Show BoolToBoolE  where  show (BoolToBoolE e) = show e
-instance Show BoolToBoolToBoolE  where  show (BoolToBoolToBoolE e) = show e
-
-instance Show IntsE  where  show (IntsE e) = show e
-
-instance Show IntsE0  where  show (IntsE0 e) = show e
-instance Show IntsEV  where  show (IntsEV e) = show e
-
-instance Show CharE  where  show (CharE e) = show e
-
-instance Show CharE0  where  show (CharE0 e) = show e
-instance Show CharEV  where  show (CharEV e) = show e
-
-instance Show SameTypeE  where  show (SameTypeE e1 e2) = show (e1,e2)
-
-instance Show SameTypedPairsE  where  show (SameTypedPairsE ees)  =  show ees
-
--- | Expression of 'Ints' type.
-newtype IntsE  =  IntsE { unIntsE :: Expr }
-
--- | Constant terminal value of 'Ints' type.
-newtype IntsE0  =  IntsE0 { unIntsE0 :: Expr }
-
--- | Varialbe of 'Ints' type.
-newtype IntsEV  =  IntsEV { unIntsEV :: Expr }
-
-instance Show Ill where  show (Ill e) = show e
-
-instance Listable IntE  where
-  tiers  =  mapT IntE
-         $  cons0 i_
-         \/ cons1 unIntEV
-         \/ cons1 unIntE0
-         \/ cons2 (\(IntToIntE f) (IntE xx) -> f :$ xx)
-         \/ cons1 (head' . unIntsE) `ofWeight` 2
-         \/ cons1 (ord' . unCharE) `ofWeight` 2
-
-instance Listable IntE0 where
-  tiers  =  (IntE0 . val) `mapT` (tiers :: [[Int]])
-
-instance Listable IntEV where
-  list  =  map IntEV $ listVars "x" (undefined :: Int)
-
-instance Listable IntToIntE where
-  tiers  =  mapT IntToIntE
-         $  cons0 idE
-         \/ cons0 negateE `addWeight` 1
-         \/ cons0 absE    `addWeight` 1
-         \/ cons2 (\(IntToIntToIntE ef) (IntE ex) -> ef :$ ex)
-         \/ toTiers (listVars "f" (undefined :: Int -> Int)) `addWeight` 2
-
-instance Listable IntToIntToIntE where
-  list  =  map IntToIntToIntE [plus, times]
-
-instance Listable IntsE  where
-  tiers  =  mapT IntsE
-         $  cons0 is_
-         \/ cons1 unIntsEV
-         \/ cons1 unIntsE0
-         \/ cons2 (\(IntE ex) (IntsE exs) -> ex -:- exs)
-         \/ cons1 (tail' . unIntsE) `ofWeight` 2
-         \/ cons2 (\(IntsE exs) (IntsE eys) -> exs -++- eys) `ofWeight` 2
-         \/ cons1 (\(IntsE exs) -> sort' exs) `ofWeight` 3
-         \/ cons2 (\(IntE ex) (IntsE exs) -> insert' ex exs) `ofWeight` 3
-
-instance Listable IntsE0 where
-  tiers  =  (IntsE0 . val) `mapT` (tiers :: [[ [Int] ]])
-
-instance Listable IntsEV where
-  list  =  map IntsEV $ listVars "xs" (undefined :: [Int])
-
-instance Listable BoolE  where
-  tiers  =  mapT BoolE
-         $  cons0 b_
-         \/ cons1 unBoolEV
-         \/ cons1 unBoolE0
-         \/ cons2 (\(BoolToBoolE ef) (BoolE ep) -> ef :$ ep)
-         \/ cons2 ((-==-) `on` unIntE)  `addWeight` 2
-         \/ cons2 ((-==-) `on` unBoolE) `addWeight` 2
-         \/ cons2 ((-<=-) `on` unIntE)  `addWeight` 3
-         \/ cons2 ((-<=-) `on` unBoolE) `addWeight` 3
-         \/ cons2 ((-<-)  `on` unIntE)  `addWeight` 4
-         \/ cons2 ((-<-)  `on` unBoolE) `addWeight` 4
-         \/ cons2 ((-/=-) `on` unIntE)  `addWeight` 5
-         \/ cons2 ((-/=-) `on` unBoolE) `addWeight` 5
-         \/ cons1 (odd'  . unIntE) `addWeight` 2
-         \/ cons1 (even' . unIntE) `addWeight` 2
-         \/ cons2 (\(IntE ex) (IntsE exs) -> elem' ex exs) `addWeight` 2
-
-instance Listable BoolE0 where
-  tiers  =  (BoolE0 . val) `mapT` (tiers :: [[Bool]])
-
-instance Listable BoolEV where
-  list  =  map BoolEV $ listVars "p" (undefined :: Bool)
-
-instance Listable BoolToBoolE where
-  tiers  =  mapT BoolToBoolE
-         $  cons0 notE
-         \/ cons2 (\(BoolToBoolToBoolE ef) (BoolE ex) -> ef :$ ex)
-
-instance Listable BoolToBoolToBoolE where
-  list  =  map BoolToBoolToBoolE [orE, andE, implies]
-
-instance Listable CharE where
-  tiers  =  mapT CharE $ cons0 c_
-                      \/ cons1 unCharEV
-                      \/ cons1 unCharE0
-
-instance Listable CharEV where
-  list  =  map CharEV $ listVars "c" (undefined :: Char)
-
-instance Listable CharE0 where
-  tiers  =  (CharE0 . val) `mapT` (tiers :: [[Char]])
-
-instance Listable SameTypeE where
-  tiers = cons1 (\(IntE  e1, IntE  e2) -> SameTypeE e1 e2) `ofWeight` 0
-       \/ cons1 (\(BoolE e1, BoolE e2) -> SameTypeE e1 e2) `ofWeight` 1
-       \/ cons1 (\(IntsE e1, IntsE e2) -> SameTypeE e1 e2) `ofWeight` 1
-       \/ cons1 (\(CharE e1, CharE e2) -> SameTypeE e1 e2) `ofWeight` 2
-       \/ cons1 (\(IntToIntE e1, IntToIntE e2)     -> SameTypeE e1 e2) `ofWeight` 2
-       \/ cons1 (\(BoolToBoolE e1, BoolToBoolE e2) -> SameTypeE e1 e2) `ofWeight` 2
-       \/ cons1 (\(BoolToBoolToBoolE e1, BoolToBoolToBoolE e2) -> SameTypeE e1 e2) `ofWeight` 2
-       \/ cons1 (\(IntToIntToIntE e1, IntToIntToIntE e2)       -> SameTypeE e1 e2) `ofWeight` 2
-
-instance Listable SameTypedPairsE where
-  tiers = cons1 (SameTypedPairsE . map unSameTypeE) `ofWeight` 0
-
-instance Listable E0 where
-  tiers  =  mapT E0
-         $  cons1 unIntE0  `ofWeight` 0
-         \/ cons1 unBoolE0 `ofWeight` 1
-         \/ cons1 unIntsE0 `ofWeight` 1
-
-instance Listable EV where
-  tiers  =  mapT EV
-         $  cons1 unIntEV  `ofWeight` 0
-         \/ cons1 unBoolEV `ofWeight` 1
-         \/ cons1 unIntsEV `ofWeight` 1
-
-
-instance Listable Expr where
-  tiers  =  reset (cons1 unIntE)
-         \/ cons1 unBoolE
-         \/ cons1 unCharE
-         \/ cons1 unIntsE
-         \/ cons1 unIntToIntE         `addWeight` 1
-         \/ cons1 unIntToIntToIntE    `addWeight` 1
-         \/ cons1 unBoolToBoolE       `addWeight` 2
-         \/ cons1 unBoolToBoolToBoolE `addWeight` 2
-
-
--- | This listable instance only produces Ill typed expressions
-instance Listable Ill where
-  tiers  =  mapT Ill
-         $  cons2 (\(IntE ef) (IntE ex) -> ef :$ ex) `ofWeight` 0
-         \/ cons2 (\(IntToIntE ef) (IntToIntE ex) -> ef :$ ex)
-         \/ cons2 (\(Ill ef) ex -> ef :$ ex)
-         \/ cons2 (\ef (Ill ex)-> ef :$ ex)
-
-
-instance ShowFunction Expr where bindtiers  =  bindtiersShow
diff --git a/tests/benchmark b/tests/benchmark
deleted file mode 100644
--- a/tests/benchmark
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/bin/bash
-top=`dirname $0`/..
-eg=$top/eg
-model=$top/tests/model
-
-case "$1" in
-	-*) sz="$1"
-	    shift
-		;;
-esac
-
-test-model() {
-	$1 $sz | diff -rud $model/$2$sz.out - || exit 1
-}
-
-update-test-model() {
-	$1 $sz > $model/$2$sz.out
-}
-
-tym() {
-	/usr/bin/time -f%e "$@"
-}
-
-spc() {
-	/usr/bin/time -f%M "$@"
-}
-
-mean() {
-	sum="`echo -n $* | sed -e "s/ / + /g"`"
-	mean="`echo "scale = 3; ($sum) / $#" | bc`"
-	printf "%3.3f\n" $mean
-}
-export -f mean
-
-div1024() {
-	printf "%3.0f\n" "`echo "$1 / 1024" | bc`"
-}
-export -f div1024
-
-benchmark() {
-	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
-	printf "%-18s  " "$2$sz"
-	for run in {1..3}
-	do
-		tym $1 $sz 2>&1 >/dev/null
-	done | xargs bash -c 'mean "$@"' mean
-}
-
-memory-benchmark() {
-	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
-	printf "%-18s  " "$2$sz"
-	for run in {1..3}
-	do
-		spc $1 $sz 2>&1 >/dev/null
-	done | xargs bash -c 'mean    "$@"' mean |
-	       xargs bash -c 'div1024 "$@"' div1024
-}
-
-benchmark-cmp() {
-	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
-	grep "^ *$2$sz " bench/runtime-$HOSTNAME | tr '\n' ' '
-	echo -n ' '
-	for run in {1..1}
-	do
-		tym $1 $sz 2>&1 >/dev/null
-	done | xargs bash -c 'mean "$@"' mean
-}
-
-find $* | sed -e "s/^bench/     /;s/^eg/  /" |
-sort -b | sed -e "s/^     /bench/;s/^  /eg/" |
-while read e
-do
-	`basename $0` $top/$e `basename $e`
-done
diff --git a/tests/benchmark-cmp b/tests/benchmark-cmp
deleted file mode 100644
--- a/tests/benchmark-cmp
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/bin/bash
-top=`dirname $0`/..
-eg=$top/eg
-model=$top/tests/model
-
-case "$1" in
-	-*) sz="$1"
-	    shift
-		;;
-esac
-
-test-model() {
-	$1 $sz | diff -rud $model/$2$sz.out - || exit 1
-}
-
-update-test-model() {
-	$1 $sz > $model/$2$sz.out
-}
-
-tym() {
-	/usr/bin/time -f%e "$@"
-}
-
-spc() {
-	/usr/bin/time -f%M "$@"
-}
-
-mean() {
-	sum="`echo -n $* | sed -e "s/ / + /g"`"
-	mean="`echo "scale = 3; ($sum) / $#" | bc`"
-	printf "%3.3f\n" $mean
-}
-export -f mean
-
-div1024() {
-	printf "%3.0f\n" "`echo "$1 / 1024" | bc`"
-}
-export -f div1024
-
-benchmark() {
-	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
-	printf "%-18s  " "$2$sz"
-	for run in {1..3}
-	do
-		tym $1 $sz 2>&1 >/dev/null
-	done | xargs bash -c 'mean "$@"' mean
-}
-
-memory-benchmark() {
-	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
-	printf "%-18s  " "$2$sz"
-	for run in {1..3}
-	do
-		spc $1 $sz 2>&1 >/dev/null
-	done | xargs bash -c 'mean    "$@"' mean |
-	       xargs bash -c 'div1024 "$@"' div1024
-}
-
-benchmark-cmp() {
-	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
-	grep "^ *$2$sz " bench/runtime-$HOSTNAME | tr '\n' ' '
-	echo -n ' '
-	for run in {1..1}
-	do
-		tym $1 $sz 2>&1 >/dev/null
-	done | xargs bash -c 'mean "$@"' mean
-}
-
-find $* | sed -e "s/^bench/     /;s/^eg/  /" |
-sort -b | sed -e "s/^     /bench/;s/^  /eg/" |
-while read e
-do
-	`basename $0` $top/$e `basename $e`
-done
diff --git a/tests/benchmark-save b/tests/benchmark-save
deleted file mode 100644
--- a/tests/benchmark-save
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-top=`dirname $0`
-get-ghc-v() {
-	ghc --version | sed -e "s/.* version/GHC/"
-}
-get-express-v() {
-	ghc-pkg list express 2>/dev/null |
-	grep " express-" |
-	sed -e "s/^ *//" |
-	tail -1
-}
-get-leancheck-v() {
-	ghc-pkg list leancheck 2>/dev/null |
-	grep " leancheck-" |
-	sed -e "s/^ *//" |
-	tail -1
-}
-(
-	get-ghc-v
-	get-express-v
-	get-leancheck-v
-	$top/benchmark "$@"
-) | tee bench/runtime-$HOSTNAME
diff --git a/tests/memory-benchmark b/tests/memory-benchmark
deleted file mode 100644
--- a/tests/memory-benchmark
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/bin/bash
-top=`dirname $0`/..
-eg=$top/eg
-model=$top/tests/model
-
-case "$1" in
-	-*) sz="$1"
-	    shift
-		;;
-esac
-
-test-model() {
-	$1 $sz | diff -rud $model/$2$sz.out - || exit 1
-}
-
-update-test-model() {
-	$1 $sz > $model/$2$sz.out
-}
-
-tym() {
-	/usr/bin/time -f%e "$@"
-}
-
-spc() {
-	/usr/bin/time -f%M "$@"
-}
-
-mean() {
-	sum="`echo -n $* | sed -e "s/ / + /g"`"
-	mean="`echo "scale = 3; ($sum) / $#" | bc`"
-	printf "%3.3f\n" $mean
-}
-export -f mean
-
-div1024() {
-	printf "%3.0f\n" "`echo "$1 / 1024" | bc`"
-}
-export -f div1024
-
-benchmark() {
-	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
-	printf "%-18s  " "$2$sz"
-	for run in {1..3}
-	do
-		tym $1 $sz 2>&1 >/dev/null
-	done | xargs bash -c 'mean "$@"' mean
-}
-
-memory-benchmark() {
-	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
-	printf "%-18s  " "$2$sz"
-	for run in {1..3}
-	do
-		spc $1 $sz 2>&1 >/dev/null
-	done | xargs bash -c 'mean    "$@"' mean |
-	       xargs bash -c 'div1024 "$@"' div1024
-}
-
-benchmark-cmp() {
-	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
-	grep "^ *$2$sz " bench/runtime-$HOSTNAME | tr '\n' ' '
-	echo -n ' '
-	for run in {1..1}
-	do
-		tym $1 $sz 2>&1 >/dev/null
-	done | xargs bash -c 'mean "$@"' mean
-}
-
-find $* | sed -e "s/^bench/     /;s/^eg/  /" |
-sort -b | sed -e "s/^     /bench/;s/^  /eg/" |
-while read e
-do
-	`basename $0` $top/$e `basename $e`
-done
diff --git a/tests/model/algebraic-graphs-s4.out b/tests/model/algebraic-graphs-s4.out
deleted file mode 100644
--- a/tests/model/algebraic-graphs-s4.out
+++ /dev/null
@@ -1,51 +0,0 @@
-max expr size  =    4
-max  #-tests   = 1080
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool  (holes: Bool)
-_ :: Int  (holes: Int)
-_ :: Nat3  (holes: Nat3)
-_ :: Graph Nat3  (holes: Graph Nat3)
-0 :: Nat3
-0 :: Int
-True :: Bool
-empty :: Graph Nat3
-vertex :: Nat3 -> Graph Nat3
-(+) :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
-(*) :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
-overlay :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
-connect :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
-edge :: Nat3 -> Nat3 -> Graph Nat3
-length :: Graph Nat3 -> Int
-size :: Graph Nat3 -> Int
-
-length (vertex i) == length (vertex j)
-  size (vertex i) == length (vertex 0)
-length (edge i j) == length (edge k i')
-length (edge i j) == size (edge k i')
-   length (x * y) == length (x + y)
-     size (x * y) == size (x + y)
-            x + x == x
-        x + empty == x
-        x * empty == x
-        empty * x == x
-            x + y == y + x
-      overlay x y == x + y
-      connect x y == x * y
-
-                0 <= length x
-                0 <= size x
-         length x <= size x
-       size empty <= size x
-         length x <= length (x + y)
-           size x <= size (x + y)
-         length x <= size (y + x)
-length (edge i i) <= size x
-            empty <= x
-                x <= x + y
-                x <= x * y
-                x <= y * x
-         vertex i <= edge i j
-         vertex i <= edge j i
-            x + y <= x * y
-
diff --git a/tests/model/algebraic-graphs-s7.out b/tests/model/algebraic-graphs-s7.out
deleted file mode 100644
--- a/tests/model/algebraic-graphs-s7.out
+++ /dev/null
@@ -1,64 +0,0 @@
-max expr size  =    7
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   = 1080
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool  (holes: Bool)
-_ :: Int  (holes: Int)
-_ :: Nat3  (holes: Nat3)
-_ :: Graph Nat3  (holes: Graph Nat3)
-0 :: Nat3
-0 :: Int
-True :: Bool
-empty :: Graph Nat3
-vertex :: Nat3 -> Graph Nat3
-(+) :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
-(*) :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
-overlay :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
-connect :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
-edge :: Nat3 -> Nat3 -> Graph Nat3
-length :: Graph Nat3 -> Int
-size :: Graph Nat3 -> Int
-
-    length (vertex i) == length (vertex j)
-      size (vertex i) == length (vertex 0)
-       length (x * y) == length (x + y)
-         size (x * y) == size (x + y)
-length (x + vertex i) == length (x + vertex j)
-  size (x + vertex i) == size (x + vertex j)
-   length (x * y + z) == length (x + (y + z))
-     size (x * y + z) == size (x + (y + z))
-                x + x == x
-            x + empty == x
-            x * empty == x
-            empty * x == x
-                x + y == y + x
-          overlay x y == x + y
-          connect x y == x * y
-            x + x * y == x * y
-            x + y * x == y * x
-             edge i j == vertex i * vertex j
-          (x + y) + z == x + (y + z)
-          (x * y) * z == x * (y * z)
-      x + y * (x * z) == y * (x * z)
-      x + y * (z * x) == y * (z * x)
-          x * (y + z) == x * y + x * z
-          (x + y) * z == x * z + y * z
-          x * (x * y) == x * x + x * y
-          x * (y * y) == x * y + y * y
-    x * (y * (x * z)) == x * (y * x) + x * (y * z)
-
-         0 <= length x
-         0 <= size x
-  length x <= size x
-size empty <= size x
-         x <= size (y + z)
-  length x <= length (edge i i)
-  length x <= length (x + y)
-     empty <= x
-         x <= x + y
-         x <= x * y
-         x <= y * x
-     x + y <= x * y
-
diff --git a/tests/model/algebraic-graphs.out b/tests/model/algebraic-graphs.out
deleted file mode 100644
--- a/tests/model/algebraic-graphs.out
+++ /dev/null
@@ -1,58 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   = 1080
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool  (holes: Bool)
-_ :: Int  (holes: Int)
-_ :: Nat3  (holes: Nat3)
-_ :: Graph Nat3  (holes: Graph Nat3)
-0 :: Nat3
-0 :: Int
-True :: Bool
-empty :: Graph Nat3
-vertex :: Nat3 -> Graph Nat3
-(+) :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
-(*) :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
-overlay :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
-connect :: Graph Nat3 -> Graph Nat3 -> Graph Nat3
-edge :: Nat3 -> Nat3 -> Graph Nat3
-length :: Graph Nat3 -> Int
-size :: Graph Nat3 -> Int
-
-    length (vertex i) == length (vertex j)
-      size (vertex i) == length (vertex 0)
-       length (x * y) == length (x + y)
-         size (x * y) == size (x + y)
-length (x + vertex i) == length (x + vertex j)
-  size (x + vertex i) == size (x + vertex j)
-                x + x == x
-            x + empty == x
-            x * empty == x
-            empty * x == x
-                x + y == y + x
-          overlay x y == x + y
-          connect x y == x * y
-            x + x * y == x * y
-            x + y * x == y * x
-             edge i j == vertex i * vertex j
-          (x + y) + z == x + (y + z)
-          (x * y) * z == x * (y * z)
-          x * (x * y) == x * (x + y)
-          (x + y) * x == y * (x * x)
-
-         0 <= length x
-         0 <= size x
-  length x <= size x
-size empty <= size x
-  length x <= length (x + y)
-    size x <= size (x + y)
-  length x <= size (y + x)
-size empty <= length (edge i i)
-     empty <= x
-         x <= x + y
-         x <= x * y
-         x <= y * x
-     x + y <= x * y
-
diff --git a/tests/model/arith-c-s4.out b/tests/model/arith-c-s4.out
deleted file mode 100644
--- a/tests/model/arith-c-s4.out
+++ /dev/null
@@ -1,183 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-0 :: Int
-1 :: Int
-(+) :: Int -> Int -> Int
-(*) :: Int -> Int -> Int
-
-_ :: Int
-0 :: Int
-1 :: Int
-_ + _ :: Int
-_ + 1 :: Int
-1 + 1 :: Int
-_ * _ :: Int
-_ + (_ + _) :: Int
-_ + (_ + 1) :: Int
-_ + (1 + 1) :: Int
-_ + _ * _ :: Int
-1 + (1 + 1) :: Int
-1 + _ * _ :: Int
-_ * (_ + _) :: Int
-_ * (_ + 1) :: Int
-_ * (_ * _) :: Int
-
-x :: Int
-0 :: Int
-1 :: Int
-x + x :: Int
-x + 1 :: Int
-1 + 1 :: Int
-x * x :: Int
-x + (x + x) :: Int
-x + (x + 1) :: Int
-x + (1 + 1) :: Int
-x + x * x :: Int
-1 + (1 + 1) :: Int
-1 + x * x :: Int
-x * (x + x) :: Int
-x * (x * x) :: Int
-
-x :: Int
-y :: Int
-0 :: Int
-1 :: Int
-x + x :: Int
-x + y :: Int
-y + y :: Int
-x + 1 :: Int
-y + 1 :: Int
-1 + 1 :: Int
-x * x :: Int
-x * y :: Int
-y * y :: Int
-x + (x + x) :: Int
-x + (x + y) :: Int
-x + (y + y) :: Int
-y + (y + y) :: Int
-x + (x + 1) :: Int
-x + (y + 1) :: Int
-y + (y + 1) :: Int
-x + (1 + 1) :: Int
-y + (1 + 1) :: Int
-x + x * x :: Int
-x + x * y :: Int
-x + y * y :: Int
-y + x * x :: Int
-y + x * y :: Int
-y + y * y :: Int
-1 + (1 + 1) :: Int
-1 + x * x :: Int
-1 + x * y :: Int
-1 + y * y :: Int
-x * (x + x) :: Int
-x * (x + y) :: Int
-x * (y + y) :: Int
-y * (x + y) :: Int
-y * (y + y) :: Int
-x * (x * x) :: Int
-x * (x * y) :: Int
-x * (y * y) :: Int
-y * (y * y) :: Int
-
-x :: Int
-y :: Int
-z :: Int
-0 :: Int
-1 :: Int
-x + x :: Int
-x + y :: Int
-x + z :: Int
-y + y :: Int
-y + z :: Int
-z + z :: Int
-x + 1 :: Int
-y + 1 :: Int
-z + 1 :: Int
-1 + 1 :: Int
-x * x :: Int
-x * y :: Int
-x * z :: Int
-y * y :: Int
-y * z :: Int
-z * z :: Int
-x + (x + x) :: Int
-x + (x + y) :: Int
-x + (x + z) :: Int
-x + (y + y) :: Int
-x + (y + z) :: Int
-x + (z + z) :: Int
-y + (y + y) :: Int
-y + (y + z) :: Int
-y + (z + z) :: Int
-z + (z + z) :: Int
-x + (x + 1) :: Int
-x + (y + 1) :: Int
-x + (z + 1) :: Int
-y + (y + 1) :: Int
-y + (z + 1) :: Int
-z + (z + 1) :: Int
-x + (1 + 1) :: Int
-y + (1 + 1) :: Int
-z + (1 + 1) :: Int
-x + x * x :: Int
-x + x * y :: Int
-x + x * z :: Int
-x + y * y :: Int
-x + y * z :: Int
-x + z * z :: Int
-y + x * x :: Int
-y + x * y :: Int
-y + x * z :: Int
-y + y * y :: Int
-y + y * z :: Int
-y + z * z :: Int
-z + x * x :: Int
-z + x * y :: Int
-z + x * z :: Int
-z + y * y :: Int
-z + y * z :: Int
-z + z * z :: Int
-1 + (1 + 1) :: Int
-1 + x * x :: Int
-1 + x * y :: Int
-1 + x * z :: Int
-1 + y * y :: Int
-1 + y * z :: Int
-1 + z * z :: Int
-x * (x + x) :: Int
-x * (x + y) :: Int
-x * (x + z) :: Int
-x * (y + y) :: Int
-x * (y + z) :: Int
-x * (z + z) :: Int
-y * (x + y) :: Int
-y * (x + z) :: Int
-y * (y + y) :: Int
-y * (y + z) :: Int
-y * (z + z) :: Int
-z * (x + y) :: Int
-z * (x + z) :: Int
-z * (y + z) :: Int
-z * (z + z) :: Int
-x * (x * x) :: Int
-x * (x * y) :: Int
-x * (x * z) :: Int
-x * (y * y) :: Int
-x * (y * z) :: Int
-x * (z * z) :: Int
-y * (y * y) :: Int
-y * (y * z) :: Int
-y * (z * z) :: Int
-z * (z * z) :: Int
-
-Number of Eq schema classes: 16
-Number of Eq 1-var classes: 15
-Number of Eq 2-var classes: 41
-Number of Eq 3-var classes: 90
diff --git a/tests/model/arith-c.out b/tests/model/arith-c.out
deleted file mode 100644
--- a/tests/model/arith-c.out
+++ /dev/null
@@ -1,183 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-0 :: Int
-1 :: Int
-(+) :: Int -> Int -> Int
-(*) :: Int -> Int -> Int
-
-_ :: Int
-0 :: Int
-1 :: Int
-_ + _ :: Int
-_ + 1 :: Int
-1 + 1 :: Int
-_ * _ :: Int
-_ + (_ + _) :: Int
-_ + (_ + 1) :: Int
-_ + (1 + 1) :: Int
-_ + _ * _ :: Int
-1 + (1 + 1) :: Int
-1 + _ * _ :: Int
-_ * (_ + _) :: Int
-_ * (_ + 1) :: Int
-_ * (_ * _) :: Int
-
-x :: Int
-0 :: Int
-1 :: Int
-x + x :: Int
-x + 1 :: Int
-1 + 1 :: Int
-x * x :: Int
-x + (x + x) :: Int
-x + (x + 1) :: Int
-x + (1 + 1) :: Int
-x + x * x :: Int
-1 + (1 + 1) :: Int
-1 + x * x :: Int
-x * (x + x) :: Int
-x * (x * x) :: Int
-
-x :: Int
-y :: Int
-0 :: Int
-1 :: Int
-x + x :: Int
-x + y :: Int
-y + y :: Int
-x + 1 :: Int
-y + 1 :: Int
-1 + 1 :: Int
-x * x :: Int
-x * y :: Int
-y * y :: Int
-x + (x + x) :: Int
-x + (x + y) :: Int
-x + (y + y) :: Int
-y + (y + y) :: Int
-x + (x + 1) :: Int
-x + (y + 1) :: Int
-y + (y + 1) :: Int
-x + (1 + 1) :: Int
-y + (1 + 1) :: Int
-x + x * x :: Int
-x + x * y :: Int
-x + y * y :: Int
-y + x * x :: Int
-y + x * y :: Int
-y + y * y :: Int
-1 + (1 + 1) :: Int
-1 + x * x :: Int
-1 + x * y :: Int
-1 + y * y :: Int
-x * (x + x) :: Int
-x * (x + y) :: Int
-x * (y + y) :: Int
-y * (x + y) :: Int
-y * (y + y) :: Int
-x * (x * x) :: Int
-x * (x * y) :: Int
-x * (y * y) :: Int
-y * (y * y) :: Int
-
-x :: Int
-y :: Int
-z :: Int
-0 :: Int
-1 :: Int
-x + x :: Int
-x + y :: Int
-x + z :: Int
-y + y :: Int
-y + z :: Int
-z + z :: Int
-x + 1 :: Int
-y + 1 :: Int
-z + 1 :: Int
-1 + 1 :: Int
-x * x :: Int
-x * y :: Int
-x * z :: Int
-y * y :: Int
-y * z :: Int
-z * z :: Int
-x + (x + x) :: Int
-x + (x + y) :: Int
-x + (x + z) :: Int
-x + (y + y) :: Int
-x + (y + z) :: Int
-x + (z + z) :: Int
-y + (y + y) :: Int
-y + (y + z) :: Int
-y + (z + z) :: Int
-z + (z + z) :: Int
-x + (x + 1) :: Int
-x + (y + 1) :: Int
-x + (z + 1) :: Int
-y + (y + 1) :: Int
-y + (z + 1) :: Int
-z + (z + 1) :: Int
-x + (1 + 1) :: Int
-y + (1 + 1) :: Int
-z + (1 + 1) :: Int
-x + x * x :: Int
-x + x * y :: Int
-x + x * z :: Int
-x + y * y :: Int
-x + y * z :: Int
-x + z * z :: Int
-y + x * x :: Int
-y + x * y :: Int
-y + x * z :: Int
-y + y * y :: Int
-y + y * z :: Int
-y + z * z :: Int
-z + x * x :: Int
-z + x * y :: Int
-z + x * z :: Int
-z + y * y :: Int
-z + y * z :: Int
-z + z * z :: Int
-1 + (1 + 1) :: Int
-1 + x * x :: Int
-1 + x * y :: Int
-1 + x * z :: Int
-1 + y * y :: Int
-1 + y * z :: Int
-1 + z * z :: Int
-x * (x + x) :: Int
-x * (x + y) :: Int
-x * (x + z) :: Int
-x * (y + y) :: Int
-x * (y + z) :: Int
-x * (z + z) :: Int
-y * (x + y) :: Int
-y * (x + z) :: Int
-y * (y + y) :: Int
-y * (y + z) :: Int
-y * (z + z) :: Int
-z * (x + y) :: Int
-z * (x + z) :: Int
-z * (y + z) :: Int
-z * (z + z) :: Int
-x * (x * x) :: Int
-x * (x * y) :: Int
-x * (x * z) :: Int
-x * (y * y) :: Int
-x * (y * z) :: Int
-x * (z * z) :: Int
-y * (y * y) :: Int
-y * (y * z) :: Int
-y * (z * z) :: Int
-z * (z * z) :: Int
-
-Number of Eq schema classes: 16
-Number of Eq 1-var classes: 15
-Number of Eq 2-var classes: 41
-Number of Eq 3-var classes: 90
diff --git a/tests/model/arith-negate-abs-s4.out b/tests/model/arith-negate-abs-s4.out
deleted file mode 100644
--- a/tests/model/arith-negate-abs-s4.out
+++ /dev/null
@@ -1,40 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-0 :: Int
-1 :: Int
-id :: Int -> Int
-abs :: Int -> Int
-negate :: Int -> Int
-(+) :: Int -> Int -> Int
-(*) :: Int -> Int -> Int
-
-             id x == x
-negate (negate x) == x
-            x + 0 == x
-            x * 1 == x
-            x * 0 == 0
-      abs (abs x) == abs x
-   abs (negate x) == abs x
-     x + negate x == 0
-            x + y == y + x
-            x * y == y * x
-      abs (x * x) == x * x
-     x * negate y == negate (x * y)
-
-             x <= abs x
-             0 <= abs x
-             x <= x * x
-             x <= x + 1
-             0 <= x * x
-      negate x <= abs x
-negate (abs x) <= x
-negate (abs x) <= 0
-         abs x <= x * x
-negate (abs x) <= negate x
-
diff --git a/tests/model/arith-negate-abs.out b/tests/model/arith-negate-abs.out
deleted file mode 100644
--- a/tests/model/arith-negate-abs.out
+++ /dev/null
@@ -1,68 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-0 :: Int
-1 :: Int
-id :: Int -> Int
-abs :: Int -> Int
-negate :: Int -> Int
-(+) :: Int -> Int -> Int
-(*) :: Int -> Int -> Int
-
-             id x == x
-negate (negate x) == x
-            x + 0 == x
-            x * 1 == x
-            x * 0 == 0
-      abs (abs x) == abs x
-   abs (negate x) == abs x
-     x + negate x == 0
-            x + y == y + x
-            x * y == y * x
-      abs (x * x) == x * x
-     x * negate y == negate (x * y)
-  abs (x * abs y) == abs (x * y)
-     negate x + y == negate (x + negate y)
-    abs x * abs y == abs (x * y)
-  abs (x + abs x) == x + abs x
-    abs x + abs x == abs (x + x)
-  abs (1 + abs x) == 1 + abs x
-      (x + y) + z == x + (y + z)
-      (x * y) * z == x * (y * z)
-      (x + x) * y == x * (y + y)
-      x * (y + 1) == x + x * y
-
-             x <= abs x
-             0 <= abs x
-             x <= x * x
-             x <= x + 1
-             0 <= x * x
-      negate x <= abs x
-negate (abs x) <= x
-negate (abs x) <= 0
-             x <= x + abs y
-             x <= abs (x + x)
-         abs x <= x * x
-negate (x * x) <= x
-negate (abs x) <= negate x
-             x <= 1 + abs x
-             0 <= x + abs x
-negate (x * x) <= 0
-  x + negate 1 <= x
-         abs x <= abs (x + x)
-negate (x * x) <= negate x
-negate (x + 1) <= negate x
-         x + y <= x + abs y
-     x * abs x <= x * x
-negate (x * x) <= negate (abs x)
-     x * abs y <= abs (x * y)
-  x + negate y <= x + abs y
-     x + abs x <= abs (x + x)
-negate (x * x) <= x * abs x
-   abs (x + 1) <= 1 + abs x
-
diff --git a/tests/model/arith-s4.out b/tests/model/arith-s4.out
deleted file mode 100644
--- a/tests/model/arith-s4.out
+++ /dev/null
@@ -1,23 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-0 :: Int
-1 :: Int
-(+) :: Int -> Int -> Int
-(*) :: Int -> Int -> Int
-
-x + 0 == x
-x * 1 == x
-x * 0 == 0
-x + y == y + x
-x * y == y * x
-
-x <= x * x
-x <= x + 1
-0 <= x * x
-
diff --git a/tests/model/arith.out b/tests/model/arith.out
deleted file mode 100644
--- a/tests/model/arith.out
+++ /dev/null
@@ -1,27 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-0 :: Int
-1 :: Int
-(+) :: Int -> Int -> Int
-(*) :: Int -> Int -> Int
-
-      x + 0 == x
-      x * 1 == x
-      x * 0 == 0
-      x + y == y + x
-      x * y == y * x
-(x + y) + z == x + (y + z)
-(x * y) * z == x * (y * z)
-(x + x) * y == x * (y + y)
-x * (y + 1) == x + x * y
-
-x <= x * x
-x <= x + 1
-0 <= x * x
-
diff --git a/tests/model/arithficial-s4.out b/tests/model/arithficial-s4.out
deleted file mode 100644
--- a/tests/model/arithficial-s4.out
+++ /dev/null
@@ -1,26 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-0 :: Int
-id :: Int -> Int
-(+) :: Int -> Int -> Int
-f :: Int -> Int -> Int
-g :: Int -> Int -> Int
-h :: Int -> Int -> Int
-
- id x == x
-x + 0 == x
-g x y == g z x'
-f x y == f x z
-h x y == h z y
-x + y == y + x
-
-x <= g y y
-x <= f 0 y
-x <= h y 0
-
diff --git a/tests/model/arithficial.out b/tests/model/arithficial.out
deleted file mode 100644
--- a/tests/model/arithficial.out
+++ /dev/null
@@ -1,27 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-0 :: Int
-id :: Int -> Int
-(+) :: Int -> Int -> Int
-f :: Int -> Int -> Int
-g :: Int -> Int -> Int
-h :: Int -> Int -> Int
-
-       id x == x
-      x + 0 == x
-      g x y == g z x'
-      f x y == f x z
-      h x y == h z y
-      x + y == y + x
-(x + y) + z == x + (y + z)
-
-x <= g y y
-x <= f 0 y
-x <= h y 0
-
diff --git a/tests/model/binarytree-s4.out b/tests/model/binarytree-s4.out
deleted file mode 100644
--- a/tests/model/binarytree-s4.out
+++ /dev/null
@@ -1,41 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Word2
-_ :: BT Word2
-_ :: [Word2]
-Null :: BT Word2
-insert :: Word2 -> BT Word2 -> BT Word2
-delete :: Word2 -> BT Word2 -> BT Word2
-isIn :: Word2 -> BT Word2 -> Bool
-(<=) :: Word2 -> Word2 -> Bool
-(/=) :: Word2 -> Word2 -> Bool
-ordered :: [Word2] -> Bool
-strictlyOrdered :: [Word2] -> Bool
-toList :: BT Word2 -> [Word2]
-fromList :: [Word2] -> BT Word2
-isSearch :: BT Word2 -> Bool
-[] :: [Word2]
-True :: Bool
-False :: Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: Word2 -> Word2 -> Bool
-(==) :: BT Word2 -> BT Word2 -> Bool
-(==) :: [Word2] -> [Word2] -> Bool
-
-  isIn x Null == False
-   (xs == []) == (Null == fromList xs)
-delete x Null == Null
-
-         Null <= t
-            t <= insert x t
-   delete x t <= t
-insert x Null <= insert x t
-
-isIn x t ==> insert x t == t
-
diff --git a/tests/model/binarytree.out b/tests/model/binarytree.out
deleted file mode 100644
--- a/tests/model/binarytree.out
+++ /dev/null
@@ -1,55 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Word2
-_ :: BT Word2
-_ :: [Word2]
-Null :: BT Word2
-insert :: Word2 -> BT Word2 -> BT Word2
-delete :: Word2 -> BT Word2 -> BT Word2
-isIn :: Word2 -> BT Word2 -> Bool
-(<=) :: Word2 -> Word2 -> Bool
-(/=) :: Word2 -> Word2 -> Bool
-ordered :: [Word2] -> Bool
-strictlyOrdered :: [Word2] -> Bool
-toList :: BT Word2 -> [Word2]
-fromList :: [Word2] -> BT Word2
-isSearch :: BT Word2 -> Bool
-[] :: [Word2]
-True :: Bool
-False :: Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: Word2 -> Word2 -> Bool
-(==) :: BT Word2 -> BT Word2 -> Bool
-(==) :: [Word2] -> [Word2] -> Bool
-
-           isIn x Null == False
-   isIn x (insert x t) == True
-   isIn x (delete x t) == False
-  (Null == insert x t) == False
-            (xs == []) == (Null == fromList xs)
-     (t == insert x t) == isIn x t
-              (x == y) == isIn x (insert y Null)
-     (t == delete x t) == (False == isIn x t)
-isIn x (insert y Null) == isIn y (insert x Null)
-   (False == (x /= y)) == isIn x (insert y Null)
-         delete x Null == Null
- insert x (insert x t) == insert x t
- delete x (delete x t) == delete x t
- insert x (delete x t) == insert x t
- delete x (insert x t) == delete x t
- insert x (insert y t) == insert y (insert x t)
- delete x (delete y t) == delete y (delete x t)
-
-         Null <= t
-            t <= insert x t
-   delete x t <= t
-insert x Null <= insert x t
-
-x /= y ==> delete y (insert x t) == insert x (delete y t)
-
diff --git a/tests/model/binarytree0-s4.out b/tests/model/binarytree0-s4.out
deleted file mode 100644
--- a/tests/model/binarytree0-s4.out
+++ /dev/null
@@ -1,31 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Word2
-_ :: BT Word2
-Null :: BT Word2
-insert :: Word2 -> BT Word2 -> BT Word2
-delete :: Word2 -> BT Word2 -> BT Word2
-isIn :: Word2 -> BT Word2 -> Bool
-(/=) :: Word2 -> Word2 -> Bool
-True :: Bool
-False :: Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: Word2 -> Word2 -> Bool
-(==) :: BT Word2 -> BT Word2 -> Bool
-
-  isIn x Null == False
-delete x Null == Null
-
-         Null <= t
-            t <= insert x t
-   delete x t <= t
-insert x Null <= insert x t
-
-isIn x t ==> insert x t == t
-
diff --git a/tests/model/binarytree0.out b/tests/model/binarytree0.out
deleted file mode 100644
--- a/tests/model/binarytree0.out
+++ /dev/null
@@ -1,45 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Word2
-_ :: BT Word2
-Null :: BT Word2
-insert :: Word2 -> BT Word2 -> BT Word2
-delete :: Word2 -> BT Word2 -> BT Word2
-isIn :: Word2 -> BT Word2 -> Bool
-(/=) :: Word2 -> Word2 -> Bool
-True :: Bool
-False :: Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: Word2 -> Word2 -> Bool
-(==) :: BT Word2 -> BT Word2 -> Bool
-
-           isIn x Null == False
-   isIn x (insert x t) == True
-   isIn x (delete x t) == False
-  (Null == insert x t) == False
-     (t == insert x t) == isIn x t
-              (x == y) == isIn x (insert y Null)
-     (t == delete x t) == (False == isIn x t)
-isIn x (insert y Null) == isIn y (insert x Null)
-   (False == (x /= y)) == isIn x (insert y Null)
-         delete x Null == Null
- insert x (insert x t) == insert x t
- delete x (delete x t) == delete x t
- insert x (delete x t) == insert x t
- delete x (insert x t) == delete x t
- insert x (insert y t) == insert y (insert x t)
- delete x (delete y t) == delete y (delete x t)
-
-         Null <= t
-            t <= insert x t
-   delete x t <= t
-insert x Null <= insert x t
-
-x /= y ==> delete y (insert x t) == insert x (delete y t)
-
diff --git a/tests/model/bool-c-s4.out b/tests/model/bool-c-s4.out
deleted file mode 100644
--- a/tests/model/bool-c-s4.out
+++ /dev/null
@@ -1,124 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-False :: Bool
-True :: Bool
-not :: Bool -> Bool
-(&&) :: Bool -> Bool -> Bool
-(||) :: Bool -> Bool -> Bool
-(==) :: Bool -> Bool -> Bool
-
-
-_ :: Bool
-False :: Bool
-True :: Bool
-not _ :: Bool
-_ && _ :: Bool
-_ || _ :: Bool
-_ == _ :: Bool
-not (_ && _) :: Bool
-not (_ || _) :: Bool
-not (_ == _) :: Bool
-_ && not _ :: Bool
-_ || not _ :: Bool
-_ && (_ && _) :: Bool
-_ && (_ || _) :: Bool
-_ && _ == _ :: Bool
-_ || _ && _ :: Bool
-_ || (_ || _) :: Bool
-_ || _ == _ :: Bool
-_ == (_ && _) :: Bool
-_ == (_ || _) :: Bool
-_ == (_ == _) :: Bool
-
-p :: Bool
-False :: Bool
-True :: Bool
-not p :: Bool
-
-p :: Bool
-q :: Bool
-False :: Bool
-True :: Bool
-not p :: Bool
-not q :: Bool
-p && q :: Bool
-p || q :: Bool
-p == q :: Bool
-not (p && q) :: Bool
-not (p || q) :: Bool
-not (p == q) :: Bool
-p && not q :: Bool
-q && not p :: Bool
-p || not q :: Bool
-q || not p :: Bool
-
-p :: Bool
-q :: Bool
-r :: Bool
-False :: Bool
-True :: Bool
-not p :: Bool
-not q :: Bool
-not r :: Bool
-p && q :: Bool
-p && r :: Bool
-q && r :: Bool
-p || q :: Bool
-p || r :: Bool
-q || r :: Bool
-p == q :: Bool
-p == r :: Bool
-q == r :: Bool
-not (p && q) :: Bool
-not (p && r) :: Bool
-not (q && r) :: Bool
-not (p || q) :: Bool
-not (p || r) :: Bool
-not (q || r) :: Bool
-not (p == q) :: Bool
-not (p == r) :: Bool
-not (q == r) :: Bool
-p && not q :: Bool
-p && not r :: Bool
-q && not p :: Bool
-q && not r :: Bool
-r && not p :: Bool
-r && not q :: Bool
-p || not q :: Bool
-p || not r :: Bool
-q || not p :: Bool
-q || not r :: Bool
-r || not p :: Bool
-r || not q :: Bool
-p && (q && r) :: Bool
-p && (q || r) :: Bool
-q && (p || r) :: Bool
-r && (p || q) :: Bool
-p && q == r :: Bool
-q && p == r :: Bool
-r && p == q :: Bool
-p || q && r :: Bool
-q || p && r :: Bool
-r || p && q :: Bool
-p || (q || r) :: Bool
-p || q == r :: Bool
-q || p == r :: Bool
-r || p == q :: Bool
-p == (q && r) :: Bool
-q == (p && r) :: Bool
-r == (p && q) :: Bool
-p == (q || r) :: Bool
-q == (p || r) :: Bool
-r == (p || q) :: Bool
-p == (q == r) :: Bool
-
-Number of Eq schema classes: 21
-Number of Eq 1-var classes: 4
-Number of Eq 2-var classes: 16
-Number of Eq 3-var classes: 59
diff --git a/tests/model/bool-c.out b/tests/model/bool-c.out
deleted file mode 100644
--- a/tests/model/bool-c.out
+++ /dev/null
@@ -1,124 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-False :: Bool
-True :: Bool
-not :: Bool -> Bool
-(&&) :: Bool -> Bool -> Bool
-(||) :: Bool -> Bool -> Bool
-(==) :: Bool -> Bool -> Bool
-
-
-_ :: Bool
-False :: Bool
-True :: Bool
-not _ :: Bool
-_ && _ :: Bool
-_ || _ :: Bool
-_ == _ :: Bool
-not (_ && _) :: Bool
-not (_ || _) :: Bool
-not (_ == _) :: Bool
-_ && not _ :: Bool
-_ || not _ :: Bool
-_ && (_ && _) :: Bool
-_ && (_ || _) :: Bool
-_ && _ == _ :: Bool
-_ || _ && _ :: Bool
-_ || (_ || _) :: Bool
-_ || _ == _ :: Bool
-_ == (_ && _) :: Bool
-_ == (_ || _) :: Bool
-_ == (_ == _) :: Bool
-
-p :: Bool
-False :: Bool
-True :: Bool
-not p :: Bool
-
-p :: Bool
-q :: Bool
-False :: Bool
-True :: Bool
-not p :: Bool
-not q :: Bool
-p && q :: Bool
-p || q :: Bool
-p == q :: Bool
-not (p && q) :: Bool
-not (p || q) :: Bool
-not (p == q) :: Bool
-p && not q :: Bool
-q && not p :: Bool
-p || not q :: Bool
-q || not p :: Bool
-
-p :: Bool
-q :: Bool
-r :: Bool
-False :: Bool
-True :: Bool
-not p :: Bool
-not q :: Bool
-not r :: Bool
-p && q :: Bool
-p && r :: Bool
-q && r :: Bool
-p || q :: Bool
-p || r :: Bool
-q || r :: Bool
-p == q :: Bool
-p == r :: Bool
-q == r :: Bool
-not (p && q) :: Bool
-not (p && r) :: Bool
-not (q && r) :: Bool
-not (p || q) :: Bool
-not (p || r) :: Bool
-not (q || r) :: Bool
-not (p == q) :: Bool
-not (p == r) :: Bool
-not (q == r) :: Bool
-p && not q :: Bool
-p && not r :: Bool
-q && not p :: Bool
-q && not r :: Bool
-r && not p :: Bool
-r && not q :: Bool
-p || not q :: Bool
-p || not r :: Bool
-q || not p :: Bool
-q || not r :: Bool
-r || not p :: Bool
-r || not q :: Bool
-p && (q && r) :: Bool
-p && (q || r) :: Bool
-q && (p || r) :: Bool
-r && (p || q) :: Bool
-p && q == r :: Bool
-q && p == r :: Bool
-r && p == q :: Bool
-p || q && r :: Bool
-q || p && r :: Bool
-r || p && q :: Bool
-p || (q || r) :: Bool
-p || q == r :: Bool
-q || p == r :: Bool
-r || p == q :: Bool
-p == (q && r) :: Bool
-q == (p && r) :: Bool
-r == (p && q) :: Bool
-p == (q || r) :: Bool
-q == (p || r) :: Bool
-r == (p || q) :: Bool
-p == (q == r) :: Bool
-
-Number of Eq schema classes: 21
-Number of Eq 1-var classes: 4
-Number of Eq 2-var classes: 16
-Number of Eq 3-var classes: 59
diff --git a/tests/model/bool-s4.out b/tests/model/bool-s4.out
deleted file mode 100644
--- a/tests/model/bool-s4.out
+++ /dev/null
@@ -1,38 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-False :: Bool
-True :: Bool
-not :: Bool -> Bool
-(&&) :: Bool -> Bool -> Bool
-(||) :: Bool -> Bool -> Bool
-(==) :: Bool -> Bool -> Bool
-
-    (p && p) == p
-    (p || p) == p
- not (not p) == p
- (p && True) == p
-(p || False) == p
-    (p == p) == True
- (p == True) == p
-(p && False) == False
- (p || True) == True
-(p && not p) == False
-(p || not p) == True
-(p == False) == not p
-    (p && q) == (q && p)
-    (p || q) == (q || p)
-(p == not q) == not (p == q)
-
-     p ==> True
- False ==> p
-     p ==> p || q
-p && q ==> p
-p && q ==> p == q
-
-
diff --git a/tests/model/bool.out b/tests/model/bool.out
deleted file mode 100644
--- a/tests/model/bool.out
+++ /dev/null
@@ -1,55 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-False :: Bool
-True :: Bool
-not :: Bool -> Bool
-(&&) :: Bool -> Bool -> Bool
-(||) :: Bool -> Bool -> Bool
-(==) :: Bool -> Bool -> Bool
-
-       (p && p) == p
-       (p || p) == p
-    not (not p) == p
-    (p && True) == p
-   (p || False) == p
-       (p == p) == True
-    (p == True) == p
-   (p && False) == False
-    (p || True) == True
-   (p && not p) == False
-   (p == False) == not p
-       (p && q) == (q && p)
-       (p || q) == (q || p)
-(p && (p || q)) == p
-  (p || p && q) == p
-  (p && p == q) == (p && q)
-   (p == not q) == not (p == q)
-   not (p || q) == (not p && not q)
-   (p || not q) == not (q && not p)
-((p && q) && r) == (p && (q && r))
-((p || q) || r) == (p || (q || r))
-(p == (p && q)) == not (p && not q)
-  (p || p == q) == not (q && not p)
-(p == (p || q)) == not (q && not p)
-
-           p ==> True
-       False ==> p
-           p ==> p || q
-      p && q ==> p
-      p && q ==> p == q
-       not p ==> not (p && q)
-not (p || q) ==> p == q
-not (p == q) ==> p || q
-  p && not q ==> q || p
-      p == q ==> p || not q
-  p && not q ==> not (q && p)
-not (p == q) ==> not (p && q)
-  p && not q ==> not (p == q)
-
-
diff --git a/tests/model/colour-s4.out b/tests/model/colour-s4.out
deleted file mode 100644
--- a/tests/model/colour-s4.out
+++ /dev/null
@@ -1,88 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    2
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Colour
-_ :: Maybe (Ratio Integer)
-_ :: Ratio Integer
-(+) :: Colour -> Colour -> Colour
-(-) :: Colour -> Colour -> Colour
-chroma :: Colour -> Ratio Integer
-hue :: Colour -> Maybe (Ratio Integer)
-saturation :: Colour -> Ratio Integer
-value :: Colour -> Ratio Integer
-lightness :: Colour -> Ratio Integer
-fromHSV :: Ratio Integer -> Ratio Integer -> Ratio Integer -> Colour
-fromHSL :: Ratio Integer -> Ratio Integer -> Ratio Integer -> Colour
-mix :: Colour -> Colour -> Colour
-black :: Colour
-white :: Colour
-red :: Colour
-grey :: Colour
-green :: Colour
-blue :: Colour
-Just :: Ratio Integer -> Maybe (Ratio Integer)
-Nothing :: Maybe (Ratio Integer)
-0 % 1 :: Ratio Integer
-1 % 1 :: Ratio Integer
-1 % 2 :: Ratio Integer
-
-Warning: (<=) :: Colour -> Colour -> Bool  is not an ordering (not antisymmetric)
-Warning: (==) and (<=) :: Colour -> Colour -> Bool are inconsistent: (x == y) /= (x <= y && y <= x)
-
-                  mix c c == c
-                c + black == c
-                    c - c == black
-                c - black == c
-                c + white == white
-                black - c == black
-                c - white == black
-      fromHSV q r (0 % 1) == black
-      fromHSL q r (0 % 1) == black
-      fromHSL q r (1 % 1) == white
-fromHSL q (0 % 1) (1 % 2) == grey
-                    c + d == d + c
-                  mix c d == mix d c
-      fromHSL q (0 % 1) r == fromHSL s (0 % 1) r
-      fromHSV q (0 % 1) r == fromHSL s (0 % 1) r
-      fromHSV (1 % 1) q r == fromHSV (0 % 1) q r
-      fromHSL (1 % 1) q r == fromHSL (0 % 1) q r
-fromHSL q (1 % 1) (1 % 2) == fromHSV q (1 % 1) (1 % 1)
-        hue (mix c black) == hue c
-        hue (mix c white) == hue c
-         hue (mix c grey) == hue c
-              hue (c + c) == hue (c + grey)
-          value (c + red) == 1 % 1
-        value (c + green) == 1 % 1
-         value (c + blue) == 1 % 1
-       chroma (white - c) == chroma c
- saturation (mix c black) == saturation c
-        chroma (grey - c) == chroma (c + grey)
-     chroma (mix c white) == chroma (mix c black)
-      chroma (mix c grey) == chroma (mix c black)
-     saturation (c + red) == chroma (c + red)
-   saturation (c + green) == chroma (c + green)
-    saturation (c + blue) == chroma (c + blue)
-          value (c - red) == chroma (c - red)
-        value (c - green) == chroma (c - green)
-         value (c - blue) == chroma (c - blue)
-          value (red - c) == chroma (red - c)
-        value (green - c) == chroma (green - c)
-         value (blue - c) == chroma (blue - c)
-
-       hue c <= Just (1 % 1)
-       0 % 1 <= chroma c
-       0 % 1 <= saturation c
-       0 % 1 <= value c
-       0 % 1 <= lightness c
-    chroma c <= 1 % 1
-saturation c <= 1 % 1
-     value c <= 1 % 1
- lightness c <= 1 % 1
-    chroma c <= saturation c
-    chroma c <= value c
- lightness c <= value c
-
diff --git a/tests/model/colour.out b/tests/model/colour.out
deleted file mode 100644
--- a/tests/model/colour.out
+++ /dev/null
@@ -1,88 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    2
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Colour
-_ :: Maybe (Ratio Integer)
-_ :: Ratio Integer
-(+) :: Colour -> Colour -> Colour
-(-) :: Colour -> Colour -> Colour
-chroma :: Colour -> Ratio Integer
-hue :: Colour -> Maybe (Ratio Integer)
-saturation :: Colour -> Ratio Integer
-value :: Colour -> Ratio Integer
-lightness :: Colour -> Ratio Integer
-fromHSV :: Ratio Integer -> Ratio Integer -> Ratio Integer -> Colour
-fromHSL :: Ratio Integer -> Ratio Integer -> Ratio Integer -> Colour
-mix :: Colour -> Colour -> Colour
-black :: Colour
-white :: Colour
-red :: Colour
-grey :: Colour
-green :: Colour
-blue :: Colour
-Just :: Ratio Integer -> Maybe (Ratio Integer)
-Nothing :: Maybe (Ratio Integer)
-0 % 1 :: Ratio Integer
-1 % 1 :: Ratio Integer
-1 % 2 :: Ratio Integer
-
-Warning: (<=) :: Colour -> Colour -> Bool  is not an ordering (not antisymmetric)
-Warning: (==) and (<=) :: Colour -> Colour -> Bool are inconsistent: (x == y) /= (x <= y && y <= x)
-
-                  mix c c == c
-                c + black == c
-                    c - c == black
-                c - black == c
-                c + white == white
-                black - c == black
-                c - white == black
-      fromHSV q r (0 % 1) == black
-      fromHSL q r (0 % 1) == black
-      fromHSL q r (1 % 1) == white
-fromHSL q (0 % 1) (1 % 2) == grey
-                    c + d == d + c
-                  mix c d == mix d c
-      fromHSL q (0 % 1) r == fromHSL s (0 % 1) r
-      fromHSV q (0 % 1) r == fromHSL s (0 % 1) r
-      fromHSV (1 % 1) q r == fromHSV (0 % 1) q r
-      fromHSL (1 % 1) q r == fromHSL (0 % 1) q r
-fromHSL q (1 % 1) (1 % 2) == fromHSV q (1 % 1) (1 % 1)
-        hue (mix c black) == hue c
-        hue (mix c white) == hue c
-         hue (mix c grey) == hue c
-              hue (c + c) == hue (c + grey)
-          value (c + red) == 1 % 1
-        value (c + green) == 1 % 1
-         value (c + blue) == 1 % 1
-       chroma (white - c) == chroma c
- saturation (mix c black) == saturation c
-        chroma (grey - c) == chroma (c + grey)
-     chroma (mix c white) == chroma (mix c black)
-      chroma (mix c grey) == chroma (mix c black)
-     saturation (c + red) == chroma (c + red)
-   saturation (c + green) == chroma (c + green)
-    saturation (c + blue) == chroma (c + blue)
-          value (c - red) == chroma (c - red)
-        value (c - green) == chroma (c - green)
-         value (c - blue) == chroma (c - blue)
-          value (red - c) == chroma (red - c)
-        value (green - c) == chroma (green - c)
-         value (blue - c) == chroma (blue - c)
-
-       hue c <= Just (1 % 1)
-       0 % 1 <= chroma c
-       0 % 1 <= saturation c
-       0 % 1 <= value c
-       0 % 1 <= lightness c
-    chroma c <= 1 % 1
-saturation c <= 1 % 1
-     value c <= 1 % 1
- lightness c <= 1 % 1
-    chroma c <= saturation c
-    chroma c <= value c
- lightness c <= value c
-
diff --git a/tests/model/digraphs-s4.out b/tests/model/digraphs-s4.out
deleted file mode 100644
--- a/tests/model/digraphs-s4.out
+++ /dev/null
@@ -1,41 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Nat
-_ :: Digraph Nat
-_ :: [Nat]
-[] :: [Nat]
-elem :: Nat -> [Nat] -> Bool
-empty :: Digraph Nat
-addNode :: Nat -> Digraph Nat -> Digraph Nat
-addEdge :: Nat -> Nat -> Digraph Nat -> Digraph Nat
-isNode :: Nat -> Digraph Nat -> Bool
-isEdge :: Nat -> Nat -> Digraph Nat -> Bool
-isPath :: Nat -> Nat -> Digraph Nat -> Bool
-subgraph :: [Nat] -> Digraph Nat -> Digraph Nat
-True :: Bool
-False :: Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: Nat -> Nat -> Bool
-(==) :: Digraph Nat -> Digraph Nat -> Bool
-(==) :: [Nat] -> [Nat] -> Bool
-
-   isNode x empty == False
- isEdge x y empty == False
- isPath x y empty == False
-     isPath x x a == isNode x a
-subgraph xs empty == empty
-    subgraph [] a == empty
-
-          empty <= a
-              a <= addNode x a
-  subgraph xs a <= a
-addNode x empty <= addNode x a
-
-isNode x a ==> addNode x a == a
-
diff --git a/tests/model/digraphs.out b/tests/model/digraphs.out
deleted file mode 100644
--- a/tests/model/digraphs.out
+++ /dev/null
@@ -1,59 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Nat
-_ :: Digraph Nat
-_ :: [Nat]
-[] :: [Nat]
-elem :: Nat -> [Nat] -> Bool
-empty :: Digraph Nat
-addNode :: Nat -> Digraph Nat -> Digraph Nat
-addEdge :: Nat -> Nat -> Digraph Nat -> Digraph Nat
-isNode :: Nat -> Digraph Nat -> Bool
-isEdge :: Nat -> Nat -> Digraph Nat -> Bool
-isPath :: Nat -> Nat -> Digraph Nat -> Bool
-subgraph :: [Nat] -> Digraph Nat -> Digraph Nat
-True :: Bool
-False :: Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: Nat -> Nat -> Bool
-(==) :: Digraph Nat -> Digraph Nat -> Bool
-(==) :: [Nat] -> [Nat] -> Bool
-
-             isNode x empty == False
-           isEdge x y empty == False
-           isPath x y empty == False
-     isNode x (addNode x a) == True
-     (empty == addNode x a) == False
-               isPath x x a == isNode x a
-         (a == addNode x a) == isNode x a
-                   (x == y) == isNode x (addNode y empty)
- isNode x (addNode y empty) == isNode y (addNode x empty)
-          subgraph xs empty == empty
-              subgraph [] a == empty
-    addNode x (addNode x a) == addNode x a
-subgraph xs (subgraph xs a) == subgraph xs a
-    addNode x (addNode y a) == addNode y (addNode x a)
-subgraph xs (subgraph ys a) == subgraph ys (subgraph xs a)
-
-     isEdge x y a ==> isNode x a
-     isEdge x y a ==> isNode y a
-     isPath x y a ==> isNode x a
-     isPath x y a ==> isNode y a
-     isEdge x y a ==> isPath x y a
-            empty <=  a
-                a <=  addNode x a
-    subgraph xs a <=  a
-                a <=  addEdge x y a
-  addNode x empty <=  addNode x a
-      addNode x a <=  addEdge x y a
-addEdge x y empty <=  addEdge x y a
-
-isEdge x y a ==>             addEdge x y a == a
-   elem x xs ==> subgraph xs (addNode x a) == addNode x (subgraph xs a)
-
diff --git a/tests/model/fun-s4.out b/tests/model/fun-s4.out
deleted file mode 100644
--- a/tests/model/fun-s4.out
+++ /dev/null
@@ -1,21 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   = 1000
-min  #-tests   =   50  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-_ :: [Int]
-_ :: Int -> Int
-map :: (Int -> Int) -> [Int] -> [Int]
-id :: Int -> Int
-(.) :: (Int -> Int) -> (Int -> Int) -> Int -> Int
-
-     id x == x
-  f (g x) == (f . g) x
-map id xs == xs
-   f . id == f
-   id . f == f
-
-
diff --git a/tests/model/fun.out b/tests/model/fun.out
deleted file mode 100644
--- a/tests/model/fun.out
+++ /dev/null
@@ -1,23 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   = 1000
-min  #-tests   =   50  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-_ :: [Int]
-_ :: Int -> Int
-map :: (Int -> Int) -> [Int] -> [Int]
-id :: Int -> Int
-(.) :: (Int -> Int) -> (Int -> Int) -> Int -> Int
-
-          id x == x
-       f (g x) == (f . g) x
-     map id xs == xs
-map (f . g) xs == map f (map g xs)
-        f . id == f
-        id . f == f
-   (f . g) . h == f . (g . h)
-
-
diff --git a/tests/model/insertsort-s4.out b/tests/model/insertsort-s4.out
deleted file mode 100644
--- a/tests/model/insertsort-s4.out
+++ /dev/null
@@ -1,41 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Int
-_ :: [Int]
-False :: Bool
-True :: Bool
-[] :: [Int]
-(:) :: Int -> [Int] -> [Int]
-(++) :: [Int] -> [Int] -> [Int]
-elem :: Int -> [Int] -> Bool
-ordered :: [Int] -> Bool
-all :: (Int -> Bool) -> [Int] -> Bool
-insert :: Int -> [Int] -> [Int]
-sort :: [Int] -> [Int]
-(==) :: Int -> Int -> Bool
-(<=) :: Int -> Int -> Bool
-(<) :: Int -> Int -> Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: [Int] -> [Int] -> Bool
-
-    ordered (sort xs) == True
-ordered (insert x xs) == ordered xs
-      (xs == sort xs) == ordered xs
-     elem x (sort xs) == elem x xs
-      (sort xs == []) == (xs == [])
-       sort (sort xs) == sort xs
-          insert x [] == [x]
-      sort (xs ++ ys) == sort (ys ++ xs)
-   sort (insert x xs) == insert x (sort xs)
-          sort (x:xs) == insert x (sort xs)
-
-    sort xs <= xs
-insert x xs <= x:xs
-
-
diff --git a/tests/model/insertsort.out b/tests/model/insertsort.out
deleted file mode 100644
--- a/tests/model/insertsort.out
+++ /dev/null
@@ -1,71 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Int
-_ :: [Int]
-False :: Bool
-True :: Bool
-[] :: [Int]
-(:) :: Int -> [Int] -> [Int]
-(++) :: [Int] -> [Int] -> [Int]
-elem :: Int -> [Int] -> Bool
-ordered :: [Int] -> Bool
-all :: (Int -> Bool) -> [Int] -> Bool
-insert :: Int -> [Int] -> [Int]
-sort :: [Int] -> [Int]
-(==) :: Int -> Int -> Bool
-(<=) :: Int -> Int -> Bool
-(<) :: Int -> Int -> Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: [Int] -> [Int] -> Bool
-
-      ordered (sort xs) == True
-  ordered (insert x xs) == ordered xs
-    (xs == insert x xs) == False
-    ([] == insert x xs) == False
-        (xs == sort xs) == ordered xs
-       elem x (sort xs) == elem x xs
-        (sort xs == []) == (xs == [])
-   all (x ==) (sort xs) == all (x ==) xs
-    all (x <) (sort xs) == all (x <) xs
-          all (x <=) xs == ordered (x:sort xs)
-ordered (xs ++ sort xs) == ordered (xs ++ xs)
-ordered (sort xs ++ xs) == ordered (xs ++ xs)
-   elem x (insert y xs) == elem x (y:xs)
-         sort (sort xs) == sort xs
-            insert x [] == [x]
-        sort (xs ++ ys) == sort (ys ++ xs)
-     sort (insert x xs) == insert x (sort xs)
-            sort (x:xs) == insert x (sort xs)
-   sort (xs ++ sort ys) == sort (xs ++ ys)
- insert x (insert y xs) == insert y (insert x xs)
-        insert x (x:xs) == x:x:xs
-           insert x [y] == insert y [x]
-
-  xs == sort ys ==> ordered xs
-        sort xs <=  xs
-    insert x xs <=  x:xs
-      x:sort xs <=  x:xs
-  xs ++ sort ys <=  xs ++ ys
-  sort xs ++ ys <=  xs ++ ys
-    sort (x:xs) <=  insert x xs
-sort (xs ++ ys) <=  xs ++ sort ys
-sort (xs ++ ys) <=  sort xs ++ ys
-  sort xs ++ xs <=  xs ++ sort xs
-
-     all (x <=) xs ==>         insert x xs == x:xs
-ordered (ys ++ xs) ==>       ys ++ sort xs == sort (xs ++ ys)
-ordered (ys ++ xs) ==>       sort ys ++ xs == sort (xs ++ ys)
-     all (x <=) xs ==>           x:sort xs == sort (x:xs)
-         elem x xs ==> insert x (xs ++ ys) == insert x xs ++ ys
-            x <= y ==>     insert x (y:xs) == x:y:xs
-             x < y ==>     insert y (x:xs) == x:insert y xs
-ordered (ys ++ xs) ==>  sort ys ++ sort xs == sort (xs ++ ys)
-     all (x <=) xs ==>     insert y (x:xs) == insert x (insert y xs)
-     all (x <=) ys ==> insert x (xs ++ ys) == insert x xs ++ ys
-
diff --git a/tests/model/insertsort0-s4.out b/tests/model/insertsort0-s4.out
deleted file mode 100644
--- a/tests/model/insertsort0-s4.out
+++ /dev/null
@@ -1,30 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Int
-_ :: [Int]
-[] :: [Int]
-(:) :: Int -> [Int] -> [Int]
-insert :: Int -> [Int] -> [Int]
-sort :: [Int] -> [Int]
-(<=) :: Int -> Int -> Bool
-(<) :: Int -> Int -> Bool
-True :: Bool
-False :: Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: Int -> Int -> Bool
-(==) :: [Int] -> [Int] -> Bool
-
-   (sort xs == []) == (xs == [])
-           sort [] == []
-    sort (sort xs) == sort xs
-       insert x [] == [x]
-sort (insert x xs) == insert x (sort xs)
-       sort (x:xs) == insert x (sort xs)
-
-
diff --git a/tests/model/insertsort0.out b/tests/model/insertsort0.out
deleted file mode 100644
--- a/tests/model/insertsort0.out
+++ /dev/null
@@ -1,37 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Int
-_ :: [Int]
-[] :: [Int]
-(:) :: Int -> [Int] -> [Int]
-insert :: Int -> [Int] -> [Int]
-sort :: [Int] -> [Int]
-(<=) :: Int -> Int -> Bool
-(<) :: Int -> Int -> Bool
-True :: Bool
-False :: Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: Int -> Int -> Bool
-(==) :: [Int] -> [Int] -> Bool
-
-   (xs == insert x xs) == False
-   ([] == insert x xs) == False
-       (sort xs == []) == (xs == [])
-               sort [] == []
-        sort (sort xs) == sort xs
-           insert x [] == [x]
-    sort (insert x xs) == insert x (sort xs)
-           sort (x:xs) == insert x (sort xs)
-insert x (insert y xs) == insert y (insert x xs)
-       insert x (x:xs) == x:x:xs
-          insert x [y] == insert y [x]
-
-x <= y ==> insert x (y:xs) == x:y:xs
- x < y ==> insert y (x:xs) == x:insert y xs
-
diff --git a/tests/model/length-s4.out b/tests/model/length-s4.out
deleted file mode 100644
--- a/tests/model/length-s4.out
+++ /dev/null
@@ -1,20 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-_ :: [Int]
-[] :: [Int]
-(:) :: Int -> [Int] -> [Int]
-(++) :: [Int] -> [Int] -> [Int]
-0 :: Int
-length :: [Int] -> Int
-
-    length (x:xs) == length (y:xs)
-length (xs ++ ys) == length (ys ++ xs)
-
-0 <= length xs
-
diff --git a/tests/model/length.out b/tests/model/length.out
deleted file mode 100644
--- a/tests/model/length.out
+++ /dev/null
@@ -1,23 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-_ :: [Int]
-[] :: [Int]
-(:) :: Int -> [Int] -> [Int]
-(++) :: [Int] -> [Int] -> [Int]
-0 :: Int
-length :: [Int] -> Int
-
-    length (x:xs) == length (y:xs)
-length (xs ++ ys) == length (ys ++ xs)
-
-         0 <= length xs
- length xs <= length (x:xs)
- length xs <= length (xs ++ ys)
-length [x] <= length (x:xs)
-
diff --git a/tests/model/list-c-s4.out b/tests/model/list-c-s4.out
deleted file mode 100644
--- a/tests/model/list-c-s4.out
+++ /dev/null
@@ -1,777 +0,0 @@
-max expr size  =    5
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    3  (for inequational and conditional laws)
-
-_ :: Int
-_ :: [Int]
-[] :: [Int]
-(:) :: Int -> [Int] -> [Int]
-(++) :: [Int] -> [Int] -> [Int]
-head :: [Int] -> Int
-tail :: [Int] -> [Int]
-
-_ :: Int
-_ :: [Int]
-[] :: [Int]
-head _ :: Int
-head [] :: Int
-tail _ :: [Int]
-tail [] :: [Int]
-head (tail _) :: Int
-head (tail []) :: Int
-tail (tail _) :: [Int]
-tail (tail []) :: [Int]
-_:_ :: [Int]
-[_] :: [Int]
-_ ++ _ :: [Int]
-head (tail (tail _)) :: Int
-head (tail (tail [])) :: Int
-head (_ ++ _) :: Int
-tail (tail (tail _)) :: [Int]
-tail (tail (tail [])) :: [Int]
-tail (_ ++ _) :: [Int]
-_:tail _ :: [Int]
-_:tail [] :: [Int]
-_ ++ tail _ :: [Int]
-_ ++ tail [] :: [Int]
-[] ++ tail _ :: [Int]
-[] ++ tail [] :: [Int]
-head _:_ :: [Int]
-[head _] :: [Int]
-head []:_ :: [Int]
-[head []] :: [Int]
-tail _ ++ _ :: [Int]
-tail _ ++ [] :: [Int]
-tail [] ++ _ :: [Int]
-tail [] ++ [] :: [Int]
-head (tail (tail (tail _))) :: Int
-head (tail (tail (tail []))) :: Int
-head (tail (_ ++ _)) :: Int
-head (_ ++ tail _) :: Int
-head (_ ++ tail []) :: Int
-head ([] ++ tail _) :: Int
-head ([] ++ tail []) :: Int
-head (head _:_) :: Int
-head [head _] :: Int
-head (head []:_) :: Int
-head [head []] :: Int
-head (tail _ ++ _) :: Int
-head (tail _ ++ []) :: Int
-head (tail [] ++ _) :: Int
-head (tail [] ++ []) :: Int
-tail (tail (tail (tail _))) :: [Int]
-tail (tail (tail (tail []))) :: [Int]
-tail (tail (_ ++ _)) :: [Int]
-tail (_:tail _) :: [Int]
-tail (_:tail []) :: [Int]
-tail (_ ++ tail _) :: [Int]
-tail (_ ++ tail []) :: [Int]
-tail ([] ++ tail _) :: [Int]
-tail ([] ++ tail []) :: [Int]
-tail (tail _ ++ _) :: [Int]
-tail (tail _ ++ []) :: [Int]
-tail (tail [] ++ _) :: [Int]
-tail (tail [] ++ []) :: [Int]
-_:tail (tail _) :: [Int]
-_:tail (tail []) :: [Int]
-_:_:_ :: [Int]
-[_,_] :: [Int]
-_:(_ ++ _) :: [Int]
-_ ++ tail (tail _) :: [Int]
-_ ++ tail (tail []) :: [Int]
-_ ++ (_:_) :: [Int]
-_ ++ [_] :: [Int]
-_ ++ (_ ++ _) :: [Int]
-[] ++ tail (tail _) :: [Int]
-[] ++ tail (tail []) :: [Int]
-head _:tail _ :: [Int]
-head _:tail [] :: [Int]
-head []:tail _ :: [Int]
-head []:tail [] :: [Int]
-tail _ ++ tail _ :: [Int]
-tail _ ++ tail [] :: [Int]
-tail [] ++ tail _ :: [Int]
-tail [] ++ tail [] :: [Int]
-head (tail _):_ :: [Int]
-[head (tail _)] :: [Int]
-head (tail []):_ :: [Int]
-[head (tail [])] :: [Int]
-tail (tail _) ++ _ :: [Int]
-tail (tail _) ++ [] :: [Int]
-tail (tail []) ++ _ :: [Int]
-tail (tail []) ++ [] :: [Int]
-
-x :: Int
-xs :: [Int]
-[] :: [Int]
-head xs :: Int
-head [] :: Int
-tail xs :: [Int]
-tail [] :: [Int]
-head (tail xs) :: Int
-head (tail []) :: Int
-tail (tail xs) :: [Int]
-tail (tail []) :: [Int]
-x:xs :: [Int]
-[x] :: [Int]
-xs ++ xs :: [Int]
-head (tail (tail xs)) :: Int
-head (tail (tail [])) :: Int
-head (xs ++ xs) :: Int
-tail (tail (tail xs)) :: [Int]
-tail (tail (tail [])) :: [Int]
-tail (xs ++ xs) :: [Int]
-x:tail xs :: [Int]
-x:tail [] :: [Int]
-xs ++ tail xs :: [Int]
-xs ++ tail [] :: [Int]
-head xs:xs :: [Int]
-[head xs] :: [Int]
-head []:xs :: [Int]
-[head []] :: [Int]
-tail xs ++ xs :: [Int]
-tail [] ++ xs :: [Int]
-head (tail (tail (tail xs))) :: Int
-head (tail (tail (tail []))) :: Int
-head (tail (xs ++ xs)) :: Int
-head (xs ++ tail xs) :: Int
-head (xs ++ tail []) :: Int
-head (tail xs ++ xs) :: Int
-head (tail [] ++ xs) :: Int
-tail (tail (tail (tail xs))) :: [Int]
-tail (tail (tail (tail []))) :: [Int]
-tail (tail (xs ++ xs)) :: [Int]
-tail (xs ++ tail xs) :: [Int]
-tail (xs ++ tail []) :: [Int]
-tail (tail xs ++ xs) :: [Int]
-tail (tail [] ++ xs) :: [Int]
-x:tail (tail xs) :: [Int]
-x:tail (tail []) :: [Int]
-x:x:xs :: [Int]
-[x,x] :: [Int]
-x:(xs ++ xs) :: [Int]
-xs ++ tail (tail xs) :: [Int]
-xs ++ tail (tail []) :: [Int]
-xs ++ (x:xs) :: [Int]
-xs ++ [x] :: [Int]
-xs ++ (xs ++ xs) :: [Int]
-head xs:tail xs :: [Int]
-head xs:tail [] :: [Int]
-head []:tail xs :: [Int]
-head []:tail [] :: [Int]
-tail xs ++ tail xs :: [Int]
-tail xs ++ tail [] :: [Int]
-tail [] ++ tail xs :: [Int]
-tail [] ++ tail [] :: [Int]
-head (tail xs):xs :: [Int]
-[head (tail xs)] :: [Int]
-head (tail []):xs :: [Int]
-[head (tail [])] :: [Int]
-tail (tail xs) ++ xs :: [Int]
-tail (tail []) ++ xs :: [Int]
-
-x :: Int
-y :: Int
-xs :: [Int]
-ys :: [Int]
-[] :: [Int]
-head xs :: Int
-head ys :: Int
-head [] :: Int
-tail xs :: [Int]
-tail ys :: [Int]
-tail [] :: [Int]
-head (tail xs) :: Int
-head (tail ys) :: Int
-head (tail []) :: Int
-tail (tail xs) :: [Int]
-tail (tail ys) :: [Int]
-tail (tail []) :: [Int]
-x:xs :: [Int]
-x:ys :: [Int]
-y:xs :: [Int]
-y:ys :: [Int]
-[x] :: [Int]
-[y] :: [Int]
-xs ++ xs :: [Int]
-xs ++ ys :: [Int]
-ys ++ xs :: [Int]
-ys ++ ys :: [Int]
-head (tail (tail xs)) :: Int
-head (tail (tail ys)) :: Int
-head (tail (tail [])) :: Int
-head (xs ++ xs) :: Int
-head (xs ++ ys) :: Int
-head (ys ++ xs) :: Int
-head (ys ++ ys) :: Int
-tail (tail (tail xs)) :: [Int]
-tail (tail (tail ys)) :: [Int]
-tail (tail (tail [])) :: [Int]
-tail (xs ++ xs) :: [Int]
-tail (xs ++ ys) :: [Int]
-tail (ys ++ xs) :: [Int]
-tail (ys ++ ys) :: [Int]
-x:tail xs :: [Int]
-x:tail ys :: [Int]
-y:tail xs :: [Int]
-y:tail ys :: [Int]
-x:tail [] :: [Int]
-y:tail [] :: [Int]
-xs ++ tail xs :: [Int]
-xs ++ tail ys :: [Int]
-ys ++ tail xs :: [Int]
-ys ++ tail ys :: [Int]
-xs ++ tail [] :: [Int]
-ys ++ tail [] :: [Int]
-head xs:xs :: [Int]
-head xs:ys :: [Int]
-head ys:xs :: [Int]
-head ys:ys :: [Int]
-[head xs] :: [Int]
-[head ys] :: [Int]
-head []:xs :: [Int]
-head []:ys :: [Int]
-[head []] :: [Int]
-tail xs ++ xs :: [Int]
-tail xs ++ ys :: [Int]
-tail ys ++ xs :: [Int]
-tail ys ++ ys :: [Int]
-tail [] ++ xs :: [Int]
-tail [] ++ ys :: [Int]
-head (tail (tail (tail xs))) :: Int
-head (tail (tail (tail ys))) :: Int
-head (tail (tail (tail []))) :: Int
-head (tail (xs ++ xs)) :: Int
-head (tail (xs ++ ys)) :: Int
-head (tail (ys ++ xs)) :: Int
-head (tail (ys ++ ys)) :: Int
-head (xs ++ tail xs) :: Int
-head (xs ++ tail ys) :: Int
-head (ys ++ tail xs) :: Int
-head (ys ++ tail ys) :: Int
-head (xs ++ tail []) :: Int
-head (ys ++ tail []) :: Int
-head (tail xs ++ xs) :: Int
-head (tail xs ++ ys) :: Int
-head (tail ys ++ xs) :: Int
-head (tail ys ++ ys) :: Int
-head (tail [] ++ xs) :: Int
-head (tail [] ++ ys) :: Int
-tail (tail (tail (tail xs))) :: [Int]
-tail (tail (tail (tail ys))) :: [Int]
-tail (tail (tail (tail []))) :: [Int]
-tail (tail (xs ++ xs)) :: [Int]
-tail (tail (xs ++ ys)) :: [Int]
-tail (tail (ys ++ xs)) :: [Int]
-tail (tail (ys ++ ys)) :: [Int]
-tail (xs ++ tail xs) :: [Int]
-tail (xs ++ tail ys) :: [Int]
-tail (ys ++ tail xs) :: [Int]
-tail (ys ++ tail ys) :: [Int]
-tail (xs ++ tail []) :: [Int]
-tail (ys ++ tail []) :: [Int]
-tail (tail xs ++ xs) :: [Int]
-tail (tail xs ++ ys) :: [Int]
-tail (tail ys ++ xs) :: [Int]
-tail (tail ys ++ ys) :: [Int]
-tail (tail [] ++ xs) :: [Int]
-tail (tail [] ++ ys) :: [Int]
-x:tail (tail xs) :: [Int]
-x:tail (tail ys) :: [Int]
-y:tail (tail xs) :: [Int]
-y:tail (tail ys) :: [Int]
-x:tail (tail []) :: [Int]
-y:tail (tail []) :: [Int]
-x:x:xs :: [Int]
-x:x:ys :: [Int]
-x:y:xs :: [Int]
-x:y:ys :: [Int]
-y:x:xs :: [Int]
-y:x:ys :: [Int]
-y:y:xs :: [Int]
-y:y:ys :: [Int]
-[x,x] :: [Int]
-[x,y] :: [Int]
-[y,x] :: [Int]
-[y,y] :: [Int]
-x:(xs ++ xs) :: [Int]
-x:(xs ++ ys) :: [Int]
-x:(ys ++ xs) :: [Int]
-x:(ys ++ ys) :: [Int]
-y:(xs ++ xs) :: [Int]
-y:(xs ++ ys) :: [Int]
-y:(ys ++ xs) :: [Int]
-y:(ys ++ ys) :: [Int]
-xs ++ tail (tail xs) :: [Int]
-xs ++ tail (tail ys) :: [Int]
-ys ++ tail (tail xs) :: [Int]
-ys ++ tail (tail ys) :: [Int]
-xs ++ tail (tail []) :: [Int]
-ys ++ tail (tail []) :: [Int]
-xs ++ (x:xs) :: [Int]
-xs ++ (y:xs) :: [Int]
-xs ++ (x:ys) :: [Int]
-xs ++ (y:ys) :: [Int]
-ys ++ (x:xs) :: [Int]
-ys ++ (y:xs) :: [Int]
-ys ++ (x:ys) :: [Int]
-ys ++ (y:ys) :: [Int]
-xs ++ [x] :: [Int]
-xs ++ [y] :: [Int]
-ys ++ [x] :: [Int]
-ys ++ [y] :: [Int]
-xs ++ (xs ++ xs) :: [Int]
-xs ++ (xs ++ ys) :: [Int]
-xs ++ (ys ++ xs) :: [Int]
-xs ++ (ys ++ ys) :: [Int]
-ys ++ (xs ++ xs) :: [Int]
-ys ++ (xs ++ ys) :: [Int]
-ys ++ (ys ++ xs) :: [Int]
-ys ++ (ys ++ ys) :: [Int]
-head xs:tail xs :: [Int]
-head xs:tail ys :: [Int]
-head ys:tail xs :: [Int]
-head ys:tail ys :: [Int]
-head xs:tail [] :: [Int]
-head ys:tail [] :: [Int]
-head []:tail xs :: [Int]
-head []:tail ys :: [Int]
-head []:tail [] :: [Int]
-tail xs ++ tail xs :: [Int]
-tail xs ++ tail ys :: [Int]
-tail ys ++ tail xs :: [Int]
-tail ys ++ tail ys :: [Int]
-tail xs ++ tail [] :: [Int]
-tail ys ++ tail [] :: [Int]
-tail [] ++ tail xs :: [Int]
-tail [] ++ tail ys :: [Int]
-tail [] ++ tail [] :: [Int]
-head (tail xs):xs :: [Int]
-head (tail xs):ys :: [Int]
-head (tail ys):xs :: [Int]
-head (tail ys):ys :: [Int]
-[head (tail xs)] :: [Int]
-[head (tail ys)] :: [Int]
-head (tail []):xs :: [Int]
-head (tail []):ys :: [Int]
-[head (tail [])] :: [Int]
-tail (tail xs) ++ xs :: [Int]
-tail (tail xs) ++ ys :: [Int]
-tail (tail ys) ++ xs :: [Int]
-tail (tail ys) ++ ys :: [Int]
-tail (tail []) ++ xs :: [Int]
-tail (tail []) ++ ys :: [Int]
-
-x :: Int
-y :: Int
-z :: Int
-xs :: [Int]
-ys :: [Int]
-zs :: [Int]
-[] :: [Int]
-head xs :: Int
-head ys :: Int
-head zs :: Int
-head [] :: Int
-tail xs :: [Int]
-tail ys :: [Int]
-tail zs :: [Int]
-tail [] :: [Int]
-head (tail xs) :: Int
-head (tail ys) :: Int
-head (tail zs) :: Int
-head (tail []) :: Int
-tail (tail xs) :: [Int]
-tail (tail ys) :: [Int]
-tail (tail zs) :: [Int]
-tail (tail []) :: [Int]
-x:xs :: [Int]
-x:ys :: [Int]
-x:zs :: [Int]
-y:xs :: [Int]
-y:ys :: [Int]
-y:zs :: [Int]
-z:xs :: [Int]
-z:ys :: [Int]
-z:zs :: [Int]
-[x] :: [Int]
-[y] :: [Int]
-[z] :: [Int]
-xs ++ xs :: [Int]
-xs ++ ys :: [Int]
-xs ++ zs :: [Int]
-ys ++ xs :: [Int]
-ys ++ ys :: [Int]
-ys ++ zs :: [Int]
-zs ++ xs :: [Int]
-zs ++ ys :: [Int]
-zs ++ zs :: [Int]
-head (tail (tail xs)) :: Int
-head (tail (tail ys)) :: Int
-head (tail (tail zs)) :: Int
-head (tail (tail [])) :: Int
-head (xs ++ xs) :: Int
-head (xs ++ ys) :: Int
-head (xs ++ zs) :: Int
-head (ys ++ xs) :: Int
-head (ys ++ ys) :: Int
-head (ys ++ zs) :: Int
-head (zs ++ xs) :: Int
-head (zs ++ ys) :: Int
-head (zs ++ zs) :: Int
-tail (tail (tail xs)) :: [Int]
-tail (tail (tail ys)) :: [Int]
-tail (tail (tail zs)) :: [Int]
-tail (tail (tail [])) :: [Int]
-tail (xs ++ xs) :: [Int]
-tail (xs ++ ys) :: [Int]
-tail (xs ++ zs) :: [Int]
-tail (ys ++ xs) :: [Int]
-tail (ys ++ ys) :: [Int]
-tail (ys ++ zs) :: [Int]
-tail (zs ++ xs) :: [Int]
-tail (zs ++ ys) :: [Int]
-tail (zs ++ zs) :: [Int]
-x:tail xs :: [Int]
-x:tail ys :: [Int]
-x:tail zs :: [Int]
-y:tail xs :: [Int]
-y:tail ys :: [Int]
-y:tail zs :: [Int]
-z:tail xs :: [Int]
-z:tail ys :: [Int]
-z:tail zs :: [Int]
-x:tail [] :: [Int]
-y:tail [] :: [Int]
-z:tail [] :: [Int]
-xs ++ tail xs :: [Int]
-xs ++ tail ys :: [Int]
-xs ++ tail zs :: [Int]
-ys ++ tail xs :: [Int]
-ys ++ tail ys :: [Int]
-ys ++ tail zs :: [Int]
-zs ++ tail xs :: [Int]
-zs ++ tail ys :: [Int]
-zs ++ tail zs :: [Int]
-xs ++ tail [] :: [Int]
-ys ++ tail [] :: [Int]
-zs ++ tail [] :: [Int]
-head xs:xs :: [Int]
-head xs:ys :: [Int]
-head xs:zs :: [Int]
-head ys:xs :: [Int]
-head ys:ys :: [Int]
-head ys:zs :: [Int]
-head zs:xs :: [Int]
-head zs:ys :: [Int]
-head zs:zs :: [Int]
-[head xs] :: [Int]
-[head ys] :: [Int]
-[head zs] :: [Int]
-head []:xs :: [Int]
-head []:ys :: [Int]
-head []:zs :: [Int]
-[head []] :: [Int]
-tail xs ++ xs :: [Int]
-tail xs ++ ys :: [Int]
-tail xs ++ zs :: [Int]
-tail ys ++ xs :: [Int]
-tail ys ++ ys :: [Int]
-tail ys ++ zs :: [Int]
-tail zs ++ xs :: [Int]
-tail zs ++ ys :: [Int]
-tail zs ++ zs :: [Int]
-tail [] ++ xs :: [Int]
-tail [] ++ ys :: [Int]
-tail [] ++ zs :: [Int]
-head (tail (tail (tail xs))) :: Int
-head (tail (tail (tail ys))) :: Int
-head (tail (tail (tail zs))) :: Int
-head (tail (tail (tail []))) :: Int
-head (tail (xs ++ xs)) :: Int
-head (tail (xs ++ ys)) :: Int
-head (tail (xs ++ zs)) :: Int
-head (tail (ys ++ xs)) :: Int
-head (tail (ys ++ ys)) :: Int
-head (tail (ys ++ zs)) :: Int
-head (tail (zs ++ xs)) :: Int
-head (tail (zs ++ ys)) :: Int
-head (tail (zs ++ zs)) :: Int
-head (xs ++ tail xs) :: Int
-head (xs ++ tail ys) :: Int
-head (xs ++ tail zs) :: Int
-head (ys ++ tail xs) :: Int
-head (ys ++ tail ys) :: Int
-head (ys ++ tail zs) :: Int
-head (zs ++ tail xs) :: Int
-head (zs ++ tail ys) :: Int
-head (zs ++ tail zs) :: Int
-head (xs ++ tail []) :: Int
-head (ys ++ tail []) :: Int
-head (zs ++ tail []) :: Int
-head (tail xs ++ xs) :: Int
-head (tail xs ++ ys) :: Int
-head (tail xs ++ zs) :: Int
-head (tail ys ++ xs) :: Int
-head (tail ys ++ ys) :: Int
-head (tail ys ++ zs) :: Int
-head (tail zs ++ xs) :: Int
-head (tail zs ++ ys) :: Int
-head (tail zs ++ zs) :: Int
-head (tail [] ++ xs) :: Int
-head (tail [] ++ ys) :: Int
-head (tail [] ++ zs) :: Int
-tail (tail (tail (tail xs))) :: [Int]
-tail (tail (tail (tail ys))) :: [Int]
-tail (tail (tail (tail zs))) :: [Int]
-tail (tail (tail (tail []))) :: [Int]
-tail (tail (xs ++ xs)) :: [Int]
-tail (tail (xs ++ ys)) :: [Int]
-tail (tail (xs ++ zs)) :: [Int]
-tail (tail (ys ++ xs)) :: [Int]
-tail (tail (ys ++ ys)) :: [Int]
-tail (tail (ys ++ zs)) :: [Int]
-tail (tail (zs ++ xs)) :: [Int]
-tail (tail (zs ++ ys)) :: [Int]
-tail (tail (zs ++ zs)) :: [Int]
-tail (xs ++ tail xs) :: [Int]
-tail (xs ++ tail ys) :: [Int]
-tail (xs ++ tail zs) :: [Int]
-tail (ys ++ tail xs) :: [Int]
-tail (ys ++ tail ys) :: [Int]
-tail (ys ++ tail zs) :: [Int]
-tail (zs ++ tail xs) :: [Int]
-tail (zs ++ tail ys) :: [Int]
-tail (zs ++ tail zs) :: [Int]
-tail (xs ++ tail []) :: [Int]
-tail (ys ++ tail []) :: [Int]
-tail (zs ++ tail []) :: [Int]
-tail (tail xs ++ xs) :: [Int]
-tail (tail xs ++ ys) :: [Int]
-tail (tail xs ++ zs) :: [Int]
-tail (tail ys ++ xs) :: [Int]
-tail (tail ys ++ ys) :: [Int]
-tail (tail ys ++ zs) :: [Int]
-tail (tail zs ++ xs) :: [Int]
-tail (tail zs ++ ys) :: [Int]
-tail (tail zs ++ zs) :: [Int]
-tail (tail [] ++ xs) :: [Int]
-tail (tail [] ++ ys) :: [Int]
-tail (tail [] ++ zs) :: [Int]
-x:tail (tail xs) :: [Int]
-x:tail (tail ys) :: [Int]
-x:tail (tail zs) :: [Int]
-y:tail (tail xs) :: [Int]
-y:tail (tail ys) :: [Int]
-y:tail (tail zs) :: [Int]
-z:tail (tail xs) :: [Int]
-z:tail (tail ys) :: [Int]
-z:tail (tail zs) :: [Int]
-x:tail (tail []) :: [Int]
-y:tail (tail []) :: [Int]
-z:tail (tail []) :: [Int]
-x:x:xs :: [Int]
-x:x:ys :: [Int]
-x:x:zs :: [Int]
-x:y:xs :: [Int]
-x:y:ys :: [Int]
-x:y:zs :: [Int]
-x:z:xs :: [Int]
-x:z:ys :: [Int]
-x:z:zs :: [Int]
-y:x:xs :: [Int]
-y:x:ys :: [Int]
-y:x:zs :: [Int]
-y:y:xs :: [Int]
-y:y:ys :: [Int]
-y:y:zs :: [Int]
-y:z:xs :: [Int]
-y:z:ys :: [Int]
-y:z:zs :: [Int]
-z:x:xs :: [Int]
-z:x:ys :: [Int]
-z:x:zs :: [Int]
-z:y:xs :: [Int]
-z:y:ys :: [Int]
-z:y:zs :: [Int]
-z:z:xs :: [Int]
-z:z:ys :: [Int]
-z:z:zs :: [Int]
-[x,x] :: [Int]
-[x,y] :: [Int]
-[x,z] :: [Int]
-[y,x] :: [Int]
-[y,y] :: [Int]
-[y,z] :: [Int]
-[z,x] :: [Int]
-[z,y] :: [Int]
-[z,z] :: [Int]
-x:(xs ++ xs) :: [Int]
-x:(xs ++ ys) :: [Int]
-x:(xs ++ zs) :: [Int]
-x:(ys ++ xs) :: [Int]
-x:(ys ++ ys) :: [Int]
-x:(ys ++ zs) :: [Int]
-x:(zs ++ xs) :: [Int]
-x:(zs ++ ys) :: [Int]
-x:(zs ++ zs) :: [Int]
-y:(xs ++ xs) :: [Int]
-y:(xs ++ ys) :: [Int]
-y:(xs ++ zs) :: [Int]
-y:(ys ++ xs) :: [Int]
-y:(ys ++ ys) :: [Int]
-y:(ys ++ zs) :: [Int]
-y:(zs ++ xs) :: [Int]
-y:(zs ++ ys) :: [Int]
-y:(zs ++ zs) :: [Int]
-z:(xs ++ xs) :: [Int]
-z:(xs ++ ys) :: [Int]
-z:(xs ++ zs) :: [Int]
-z:(ys ++ xs) :: [Int]
-z:(ys ++ ys) :: [Int]
-z:(ys ++ zs) :: [Int]
-z:(zs ++ xs) :: [Int]
-z:(zs ++ ys) :: [Int]
-z:(zs ++ zs) :: [Int]
-xs ++ tail (tail xs) :: [Int]
-xs ++ tail (tail ys) :: [Int]
-xs ++ tail (tail zs) :: [Int]
-ys ++ tail (tail xs) :: [Int]
-ys ++ tail (tail ys) :: [Int]
-ys ++ tail (tail zs) :: [Int]
-zs ++ tail (tail xs) :: [Int]
-zs ++ tail (tail ys) :: [Int]
-zs ++ tail (tail zs) :: [Int]
-xs ++ tail (tail []) :: [Int]
-ys ++ tail (tail []) :: [Int]
-zs ++ tail (tail []) :: [Int]
-xs ++ (x:xs) :: [Int]
-xs ++ (y:xs) :: [Int]
-xs ++ (z:xs) :: [Int]
-xs ++ (x:ys) :: [Int]
-xs ++ (y:ys) :: [Int]
-xs ++ (z:ys) :: [Int]
-xs ++ (x:zs) :: [Int]
-xs ++ (y:zs) :: [Int]
-xs ++ (z:zs) :: [Int]
-ys ++ (x:xs) :: [Int]
-ys ++ (y:xs) :: [Int]
-ys ++ (z:xs) :: [Int]
-ys ++ (x:ys) :: [Int]
-ys ++ (y:ys) :: [Int]
-ys ++ (z:ys) :: [Int]
-ys ++ (x:zs) :: [Int]
-ys ++ (y:zs) :: [Int]
-ys ++ (z:zs) :: [Int]
-zs ++ (x:xs) :: [Int]
-zs ++ (y:xs) :: [Int]
-zs ++ (z:xs) :: [Int]
-zs ++ (x:ys) :: [Int]
-zs ++ (y:ys) :: [Int]
-zs ++ (z:ys) :: [Int]
-zs ++ (x:zs) :: [Int]
-zs ++ (y:zs) :: [Int]
-zs ++ (z:zs) :: [Int]
-xs ++ [x] :: [Int]
-xs ++ [y] :: [Int]
-xs ++ [z] :: [Int]
-ys ++ [x] :: [Int]
-ys ++ [y] :: [Int]
-ys ++ [z] :: [Int]
-zs ++ [x] :: [Int]
-zs ++ [y] :: [Int]
-zs ++ [z] :: [Int]
-xs ++ (xs ++ xs) :: [Int]
-xs ++ (xs ++ ys) :: [Int]
-xs ++ (xs ++ zs) :: [Int]
-xs ++ (ys ++ xs) :: [Int]
-xs ++ (ys ++ ys) :: [Int]
-xs ++ (ys ++ zs) :: [Int]
-xs ++ (zs ++ xs) :: [Int]
-xs ++ (zs ++ ys) :: [Int]
-xs ++ (zs ++ zs) :: [Int]
-ys ++ (xs ++ xs) :: [Int]
-ys ++ (xs ++ ys) :: [Int]
-ys ++ (xs ++ zs) :: [Int]
-ys ++ (ys ++ xs) :: [Int]
-ys ++ (ys ++ ys) :: [Int]
-ys ++ (ys ++ zs) :: [Int]
-ys ++ (zs ++ xs) :: [Int]
-ys ++ (zs ++ ys) :: [Int]
-ys ++ (zs ++ zs) :: [Int]
-zs ++ (xs ++ xs) :: [Int]
-zs ++ (xs ++ ys) :: [Int]
-zs ++ (xs ++ zs) :: [Int]
-zs ++ (ys ++ xs) :: [Int]
-zs ++ (ys ++ ys) :: [Int]
-zs ++ (ys ++ zs) :: [Int]
-zs ++ (zs ++ xs) :: [Int]
-zs ++ (zs ++ ys) :: [Int]
-zs ++ (zs ++ zs) :: [Int]
-head xs:tail xs :: [Int]
-head xs:tail ys :: [Int]
-head xs:tail zs :: [Int]
-head ys:tail xs :: [Int]
-head ys:tail ys :: [Int]
-head ys:tail zs :: [Int]
-head zs:tail xs :: [Int]
-head zs:tail ys :: [Int]
-head zs:tail zs :: [Int]
-head xs:tail [] :: [Int]
-head ys:tail [] :: [Int]
-head zs:tail [] :: [Int]
-head []:tail xs :: [Int]
-head []:tail ys :: [Int]
-head []:tail zs :: [Int]
-head []:tail [] :: [Int]
-tail xs ++ tail xs :: [Int]
-tail xs ++ tail ys :: [Int]
-tail xs ++ tail zs :: [Int]
-tail ys ++ tail xs :: [Int]
-tail ys ++ tail ys :: [Int]
-tail ys ++ tail zs :: [Int]
-tail zs ++ tail xs :: [Int]
-tail zs ++ tail ys :: [Int]
-tail zs ++ tail zs :: [Int]
-tail xs ++ tail [] :: [Int]
-tail ys ++ tail [] :: [Int]
-tail zs ++ tail [] :: [Int]
-tail [] ++ tail xs :: [Int]
-tail [] ++ tail ys :: [Int]
-tail [] ++ tail zs :: [Int]
-tail [] ++ tail [] :: [Int]
-head (tail xs):xs :: [Int]
-head (tail xs):ys :: [Int]
-head (tail xs):zs :: [Int]
-head (tail ys):xs :: [Int]
-head (tail ys):ys :: [Int]
-head (tail ys):zs :: [Int]
-head (tail zs):xs :: [Int]
-head (tail zs):ys :: [Int]
-head (tail zs):zs :: [Int]
-[head (tail xs)] :: [Int]
-[head (tail ys)] :: [Int]
-[head (tail zs)] :: [Int]
-head (tail []):xs :: [Int]
-head (tail []):ys :: [Int]
-head (tail []):zs :: [Int]
-[head (tail [])] :: [Int]
-tail (tail xs) ++ xs :: [Int]
-tail (tail xs) ++ ys :: [Int]
-tail (tail xs) ++ zs :: [Int]
-tail (tail ys) ++ xs :: [Int]
-tail (tail ys) ++ ys :: [Int]
-tail (tail ys) ++ zs :: [Int]
-tail (tail zs) ++ xs :: [Int]
-tail (tail zs) ++ ys :: [Int]
-tail (tail zs) ++ zs :: [Int]
-tail (tail []) ++ xs :: [Int]
-tail (tail []) ++ ys :: [Int]
-tail (tail []) ++ zs :: [Int]
-
-Number of Eq schema classes: 90
-Number of Eq 1-var classes: 68
-Number of Eq 2-var classes: 191
-Number of Eq 3-var classes: 406
diff --git a/tests/model/list-c.out b/tests/model/list-c.out
deleted file mode 100644
--- a/tests/model/list-c.out
+++ /dev/null
@@ -1,777 +0,0 @@
-max expr size  =    5
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    3  (for inequational and conditional laws)
-
-_ :: Int
-_ :: [Int]
-[] :: [Int]
-(:) :: Int -> [Int] -> [Int]
-(++) :: [Int] -> [Int] -> [Int]
-head :: [Int] -> Int
-tail :: [Int] -> [Int]
-
-_ :: Int
-_ :: [Int]
-[] :: [Int]
-head _ :: Int
-head [] :: Int
-tail _ :: [Int]
-tail [] :: [Int]
-head (tail _) :: Int
-head (tail []) :: Int
-tail (tail _) :: [Int]
-tail (tail []) :: [Int]
-_:_ :: [Int]
-[_] :: [Int]
-_ ++ _ :: [Int]
-head (tail (tail _)) :: Int
-head (tail (tail [])) :: Int
-head (_ ++ _) :: Int
-tail (tail (tail _)) :: [Int]
-tail (tail (tail [])) :: [Int]
-tail (_ ++ _) :: [Int]
-_:tail _ :: [Int]
-_:tail [] :: [Int]
-_ ++ tail _ :: [Int]
-_ ++ tail [] :: [Int]
-[] ++ tail _ :: [Int]
-[] ++ tail [] :: [Int]
-head _:_ :: [Int]
-[head _] :: [Int]
-head []:_ :: [Int]
-[head []] :: [Int]
-tail _ ++ _ :: [Int]
-tail _ ++ [] :: [Int]
-tail [] ++ _ :: [Int]
-tail [] ++ [] :: [Int]
-head (tail (tail (tail _))) :: Int
-head (tail (tail (tail []))) :: Int
-head (tail (_ ++ _)) :: Int
-head (_ ++ tail _) :: Int
-head (_ ++ tail []) :: Int
-head ([] ++ tail _) :: Int
-head ([] ++ tail []) :: Int
-head (head _:_) :: Int
-head [head _] :: Int
-head (head []:_) :: Int
-head [head []] :: Int
-head (tail _ ++ _) :: Int
-head (tail _ ++ []) :: Int
-head (tail [] ++ _) :: Int
-head (tail [] ++ []) :: Int
-tail (tail (tail (tail _))) :: [Int]
-tail (tail (tail (tail []))) :: [Int]
-tail (tail (_ ++ _)) :: [Int]
-tail (_:tail _) :: [Int]
-tail (_:tail []) :: [Int]
-tail (_ ++ tail _) :: [Int]
-tail (_ ++ tail []) :: [Int]
-tail ([] ++ tail _) :: [Int]
-tail ([] ++ tail []) :: [Int]
-tail (tail _ ++ _) :: [Int]
-tail (tail _ ++ []) :: [Int]
-tail (tail [] ++ _) :: [Int]
-tail (tail [] ++ []) :: [Int]
-_:tail (tail _) :: [Int]
-_:tail (tail []) :: [Int]
-_:_:_ :: [Int]
-[_,_] :: [Int]
-_:(_ ++ _) :: [Int]
-_ ++ tail (tail _) :: [Int]
-_ ++ tail (tail []) :: [Int]
-_ ++ (_:_) :: [Int]
-_ ++ [_] :: [Int]
-_ ++ (_ ++ _) :: [Int]
-[] ++ tail (tail _) :: [Int]
-[] ++ tail (tail []) :: [Int]
-head _:tail _ :: [Int]
-head _:tail [] :: [Int]
-head []:tail _ :: [Int]
-head []:tail [] :: [Int]
-tail _ ++ tail _ :: [Int]
-tail _ ++ tail [] :: [Int]
-tail [] ++ tail _ :: [Int]
-tail [] ++ tail [] :: [Int]
-head (tail _):_ :: [Int]
-[head (tail _)] :: [Int]
-head (tail []):_ :: [Int]
-[head (tail [])] :: [Int]
-tail (tail _) ++ _ :: [Int]
-tail (tail _) ++ [] :: [Int]
-tail (tail []) ++ _ :: [Int]
-tail (tail []) ++ [] :: [Int]
-
-x :: Int
-xs :: [Int]
-[] :: [Int]
-head xs :: Int
-head [] :: Int
-tail xs :: [Int]
-tail [] :: [Int]
-head (tail xs) :: Int
-head (tail []) :: Int
-tail (tail xs) :: [Int]
-tail (tail []) :: [Int]
-x:xs :: [Int]
-[x] :: [Int]
-xs ++ xs :: [Int]
-head (tail (tail xs)) :: Int
-head (tail (tail [])) :: Int
-head (xs ++ xs) :: Int
-tail (tail (tail xs)) :: [Int]
-tail (tail (tail [])) :: [Int]
-tail (xs ++ xs) :: [Int]
-x:tail xs :: [Int]
-x:tail [] :: [Int]
-xs ++ tail xs :: [Int]
-xs ++ tail [] :: [Int]
-head xs:xs :: [Int]
-[head xs] :: [Int]
-head []:xs :: [Int]
-[head []] :: [Int]
-tail xs ++ xs :: [Int]
-tail [] ++ xs :: [Int]
-head (tail (tail (tail xs))) :: Int
-head (tail (tail (tail []))) :: Int
-head (tail (xs ++ xs)) :: Int
-head (xs ++ tail xs) :: Int
-head (xs ++ tail []) :: Int
-head (tail xs ++ xs) :: Int
-head (tail [] ++ xs) :: Int
-tail (tail (tail (tail xs))) :: [Int]
-tail (tail (tail (tail []))) :: [Int]
-tail (tail (xs ++ xs)) :: [Int]
-tail (xs ++ tail xs) :: [Int]
-tail (xs ++ tail []) :: [Int]
-tail (tail xs ++ xs) :: [Int]
-tail (tail [] ++ xs) :: [Int]
-x:tail (tail xs) :: [Int]
-x:tail (tail []) :: [Int]
-x:x:xs :: [Int]
-[x,x] :: [Int]
-x:(xs ++ xs) :: [Int]
-xs ++ tail (tail xs) :: [Int]
-xs ++ tail (tail []) :: [Int]
-xs ++ (x:xs) :: [Int]
-xs ++ [x] :: [Int]
-xs ++ (xs ++ xs) :: [Int]
-head xs:tail xs :: [Int]
-head xs:tail [] :: [Int]
-head []:tail xs :: [Int]
-head []:tail [] :: [Int]
-tail xs ++ tail xs :: [Int]
-tail xs ++ tail [] :: [Int]
-tail [] ++ tail xs :: [Int]
-tail [] ++ tail [] :: [Int]
-head (tail xs):xs :: [Int]
-[head (tail xs)] :: [Int]
-head (tail []):xs :: [Int]
-[head (tail [])] :: [Int]
-tail (tail xs) ++ xs :: [Int]
-tail (tail []) ++ xs :: [Int]
-
-x :: Int
-y :: Int
-xs :: [Int]
-ys :: [Int]
-[] :: [Int]
-head xs :: Int
-head ys :: Int
-head [] :: Int
-tail xs :: [Int]
-tail ys :: [Int]
-tail [] :: [Int]
-head (tail xs) :: Int
-head (tail ys) :: Int
-head (tail []) :: Int
-tail (tail xs) :: [Int]
-tail (tail ys) :: [Int]
-tail (tail []) :: [Int]
-x:xs :: [Int]
-x:ys :: [Int]
-y:xs :: [Int]
-y:ys :: [Int]
-[x] :: [Int]
-[y] :: [Int]
-xs ++ xs :: [Int]
-xs ++ ys :: [Int]
-ys ++ xs :: [Int]
-ys ++ ys :: [Int]
-head (tail (tail xs)) :: Int
-head (tail (tail ys)) :: Int
-head (tail (tail [])) :: Int
-head (xs ++ xs) :: Int
-head (xs ++ ys) :: Int
-head (ys ++ xs) :: Int
-head (ys ++ ys) :: Int
-tail (tail (tail xs)) :: [Int]
-tail (tail (tail ys)) :: [Int]
-tail (tail (tail [])) :: [Int]
-tail (xs ++ xs) :: [Int]
-tail (xs ++ ys) :: [Int]
-tail (ys ++ xs) :: [Int]
-tail (ys ++ ys) :: [Int]
-x:tail xs :: [Int]
-x:tail ys :: [Int]
-y:tail xs :: [Int]
-y:tail ys :: [Int]
-x:tail [] :: [Int]
-y:tail [] :: [Int]
-xs ++ tail xs :: [Int]
-xs ++ tail ys :: [Int]
-ys ++ tail xs :: [Int]
-ys ++ tail ys :: [Int]
-xs ++ tail [] :: [Int]
-ys ++ tail [] :: [Int]
-head xs:xs :: [Int]
-head xs:ys :: [Int]
-head ys:xs :: [Int]
-head ys:ys :: [Int]
-[head xs] :: [Int]
-[head ys] :: [Int]
-head []:xs :: [Int]
-head []:ys :: [Int]
-[head []] :: [Int]
-tail xs ++ xs :: [Int]
-tail xs ++ ys :: [Int]
-tail ys ++ xs :: [Int]
-tail ys ++ ys :: [Int]
-tail [] ++ xs :: [Int]
-tail [] ++ ys :: [Int]
-head (tail (tail (tail xs))) :: Int
-head (tail (tail (tail ys))) :: Int
-head (tail (tail (tail []))) :: Int
-head (tail (xs ++ xs)) :: Int
-head (tail (xs ++ ys)) :: Int
-head (tail (ys ++ xs)) :: Int
-head (tail (ys ++ ys)) :: Int
-head (xs ++ tail xs) :: Int
-head (xs ++ tail ys) :: Int
-head (ys ++ tail xs) :: Int
-head (ys ++ tail ys) :: Int
-head (xs ++ tail []) :: Int
-head (ys ++ tail []) :: Int
-head (tail xs ++ xs) :: Int
-head (tail xs ++ ys) :: Int
-head (tail ys ++ xs) :: Int
-head (tail ys ++ ys) :: Int
-head (tail [] ++ xs) :: Int
-head (tail [] ++ ys) :: Int
-tail (tail (tail (tail xs))) :: [Int]
-tail (tail (tail (tail ys))) :: [Int]
-tail (tail (tail (tail []))) :: [Int]
-tail (tail (xs ++ xs)) :: [Int]
-tail (tail (xs ++ ys)) :: [Int]
-tail (tail (ys ++ xs)) :: [Int]
-tail (tail (ys ++ ys)) :: [Int]
-tail (xs ++ tail xs) :: [Int]
-tail (xs ++ tail ys) :: [Int]
-tail (ys ++ tail xs) :: [Int]
-tail (ys ++ tail ys) :: [Int]
-tail (xs ++ tail []) :: [Int]
-tail (ys ++ tail []) :: [Int]
-tail (tail xs ++ xs) :: [Int]
-tail (tail xs ++ ys) :: [Int]
-tail (tail ys ++ xs) :: [Int]
-tail (tail ys ++ ys) :: [Int]
-tail (tail [] ++ xs) :: [Int]
-tail (tail [] ++ ys) :: [Int]
-x:tail (tail xs) :: [Int]
-x:tail (tail ys) :: [Int]
-y:tail (tail xs) :: [Int]
-y:tail (tail ys) :: [Int]
-x:tail (tail []) :: [Int]
-y:tail (tail []) :: [Int]
-x:x:xs :: [Int]
-x:x:ys :: [Int]
-x:y:xs :: [Int]
-x:y:ys :: [Int]
-y:x:xs :: [Int]
-y:x:ys :: [Int]
-y:y:xs :: [Int]
-y:y:ys :: [Int]
-[x,x] :: [Int]
-[x,y] :: [Int]
-[y,x] :: [Int]
-[y,y] :: [Int]
-x:(xs ++ xs) :: [Int]
-x:(xs ++ ys) :: [Int]
-x:(ys ++ xs) :: [Int]
-x:(ys ++ ys) :: [Int]
-y:(xs ++ xs) :: [Int]
-y:(xs ++ ys) :: [Int]
-y:(ys ++ xs) :: [Int]
-y:(ys ++ ys) :: [Int]
-xs ++ tail (tail xs) :: [Int]
-xs ++ tail (tail ys) :: [Int]
-ys ++ tail (tail xs) :: [Int]
-ys ++ tail (tail ys) :: [Int]
-xs ++ tail (tail []) :: [Int]
-ys ++ tail (tail []) :: [Int]
-xs ++ (x:xs) :: [Int]
-xs ++ (y:xs) :: [Int]
-xs ++ (x:ys) :: [Int]
-xs ++ (y:ys) :: [Int]
-ys ++ (x:xs) :: [Int]
-ys ++ (y:xs) :: [Int]
-ys ++ (x:ys) :: [Int]
-ys ++ (y:ys) :: [Int]
-xs ++ [x] :: [Int]
-xs ++ [y] :: [Int]
-ys ++ [x] :: [Int]
-ys ++ [y] :: [Int]
-xs ++ (xs ++ xs) :: [Int]
-xs ++ (xs ++ ys) :: [Int]
-xs ++ (ys ++ xs) :: [Int]
-xs ++ (ys ++ ys) :: [Int]
-ys ++ (xs ++ xs) :: [Int]
-ys ++ (xs ++ ys) :: [Int]
-ys ++ (ys ++ xs) :: [Int]
-ys ++ (ys ++ ys) :: [Int]
-head xs:tail xs :: [Int]
-head xs:tail ys :: [Int]
-head ys:tail xs :: [Int]
-head ys:tail ys :: [Int]
-head xs:tail [] :: [Int]
-head ys:tail [] :: [Int]
-head []:tail xs :: [Int]
-head []:tail ys :: [Int]
-head []:tail [] :: [Int]
-tail xs ++ tail xs :: [Int]
-tail xs ++ tail ys :: [Int]
-tail ys ++ tail xs :: [Int]
-tail ys ++ tail ys :: [Int]
-tail xs ++ tail [] :: [Int]
-tail ys ++ tail [] :: [Int]
-tail [] ++ tail xs :: [Int]
-tail [] ++ tail ys :: [Int]
-tail [] ++ tail [] :: [Int]
-head (tail xs):xs :: [Int]
-head (tail xs):ys :: [Int]
-head (tail ys):xs :: [Int]
-head (tail ys):ys :: [Int]
-[head (tail xs)] :: [Int]
-[head (tail ys)] :: [Int]
-head (tail []):xs :: [Int]
-head (tail []):ys :: [Int]
-[head (tail [])] :: [Int]
-tail (tail xs) ++ xs :: [Int]
-tail (tail xs) ++ ys :: [Int]
-tail (tail ys) ++ xs :: [Int]
-tail (tail ys) ++ ys :: [Int]
-tail (tail []) ++ xs :: [Int]
-tail (tail []) ++ ys :: [Int]
-
-x :: Int
-y :: Int
-z :: Int
-xs :: [Int]
-ys :: [Int]
-zs :: [Int]
-[] :: [Int]
-head xs :: Int
-head ys :: Int
-head zs :: Int
-head [] :: Int
-tail xs :: [Int]
-tail ys :: [Int]
-tail zs :: [Int]
-tail [] :: [Int]
-head (tail xs) :: Int
-head (tail ys) :: Int
-head (tail zs) :: Int
-head (tail []) :: Int
-tail (tail xs) :: [Int]
-tail (tail ys) :: [Int]
-tail (tail zs) :: [Int]
-tail (tail []) :: [Int]
-x:xs :: [Int]
-x:ys :: [Int]
-x:zs :: [Int]
-y:xs :: [Int]
-y:ys :: [Int]
-y:zs :: [Int]
-z:xs :: [Int]
-z:ys :: [Int]
-z:zs :: [Int]
-[x] :: [Int]
-[y] :: [Int]
-[z] :: [Int]
-xs ++ xs :: [Int]
-xs ++ ys :: [Int]
-xs ++ zs :: [Int]
-ys ++ xs :: [Int]
-ys ++ ys :: [Int]
-ys ++ zs :: [Int]
-zs ++ xs :: [Int]
-zs ++ ys :: [Int]
-zs ++ zs :: [Int]
-head (tail (tail xs)) :: Int
-head (tail (tail ys)) :: Int
-head (tail (tail zs)) :: Int
-head (tail (tail [])) :: Int
-head (xs ++ xs) :: Int
-head (xs ++ ys) :: Int
-head (xs ++ zs) :: Int
-head (ys ++ xs) :: Int
-head (ys ++ ys) :: Int
-head (ys ++ zs) :: Int
-head (zs ++ xs) :: Int
-head (zs ++ ys) :: Int
-head (zs ++ zs) :: Int
-tail (tail (tail xs)) :: [Int]
-tail (tail (tail ys)) :: [Int]
-tail (tail (tail zs)) :: [Int]
-tail (tail (tail [])) :: [Int]
-tail (xs ++ xs) :: [Int]
-tail (xs ++ ys) :: [Int]
-tail (xs ++ zs) :: [Int]
-tail (ys ++ xs) :: [Int]
-tail (ys ++ ys) :: [Int]
-tail (ys ++ zs) :: [Int]
-tail (zs ++ xs) :: [Int]
-tail (zs ++ ys) :: [Int]
-tail (zs ++ zs) :: [Int]
-x:tail xs :: [Int]
-x:tail ys :: [Int]
-x:tail zs :: [Int]
-y:tail xs :: [Int]
-y:tail ys :: [Int]
-y:tail zs :: [Int]
-z:tail xs :: [Int]
-z:tail ys :: [Int]
-z:tail zs :: [Int]
-x:tail [] :: [Int]
-y:tail [] :: [Int]
-z:tail [] :: [Int]
-xs ++ tail xs :: [Int]
-xs ++ tail ys :: [Int]
-xs ++ tail zs :: [Int]
-ys ++ tail xs :: [Int]
-ys ++ tail ys :: [Int]
-ys ++ tail zs :: [Int]
-zs ++ tail xs :: [Int]
-zs ++ tail ys :: [Int]
-zs ++ tail zs :: [Int]
-xs ++ tail [] :: [Int]
-ys ++ tail [] :: [Int]
-zs ++ tail [] :: [Int]
-head xs:xs :: [Int]
-head xs:ys :: [Int]
-head xs:zs :: [Int]
-head ys:xs :: [Int]
-head ys:ys :: [Int]
-head ys:zs :: [Int]
-head zs:xs :: [Int]
-head zs:ys :: [Int]
-head zs:zs :: [Int]
-[head xs] :: [Int]
-[head ys] :: [Int]
-[head zs] :: [Int]
-head []:xs :: [Int]
-head []:ys :: [Int]
-head []:zs :: [Int]
-[head []] :: [Int]
-tail xs ++ xs :: [Int]
-tail xs ++ ys :: [Int]
-tail xs ++ zs :: [Int]
-tail ys ++ xs :: [Int]
-tail ys ++ ys :: [Int]
-tail ys ++ zs :: [Int]
-tail zs ++ xs :: [Int]
-tail zs ++ ys :: [Int]
-tail zs ++ zs :: [Int]
-tail [] ++ xs :: [Int]
-tail [] ++ ys :: [Int]
-tail [] ++ zs :: [Int]
-head (tail (tail (tail xs))) :: Int
-head (tail (tail (tail ys))) :: Int
-head (tail (tail (tail zs))) :: Int
-head (tail (tail (tail []))) :: Int
-head (tail (xs ++ xs)) :: Int
-head (tail (xs ++ ys)) :: Int
-head (tail (xs ++ zs)) :: Int
-head (tail (ys ++ xs)) :: Int
-head (tail (ys ++ ys)) :: Int
-head (tail (ys ++ zs)) :: Int
-head (tail (zs ++ xs)) :: Int
-head (tail (zs ++ ys)) :: Int
-head (tail (zs ++ zs)) :: Int
-head (xs ++ tail xs) :: Int
-head (xs ++ tail ys) :: Int
-head (xs ++ tail zs) :: Int
-head (ys ++ tail xs) :: Int
-head (ys ++ tail ys) :: Int
-head (ys ++ tail zs) :: Int
-head (zs ++ tail xs) :: Int
-head (zs ++ tail ys) :: Int
-head (zs ++ tail zs) :: Int
-head (xs ++ tail []) :: Int
-head (ys ++ tail []) :: Int
-head (zs ++ tail []) :: Int
-head (tail xs ++ xs) :: Int
-head (tail xs ++ ys) :: Int
-head (tail xs ++ zs) :: Int
-head (tail ys ++ xs) :: Int
-head (tail ys ++ ys) :: Int
-head (tail ys ++ zs) :: Int
-head (tail zs ++ xs) :: Int
-head (tail zs ++ ys) :: Int
-head (tail zs ++ zs) :: Int
-head (tail [] ++ xs) :: Int
-head (tail [] ++ ys) :: Int
-head (tail [] ++ zs) :: Int
-tail (tail (tail (tail xs))) :: [Int]
-tail (tail (tail (tail ys))) :: [Int]
-tail (tail (tail (tail zs))) :: [Int]
-tail (tail (tail (tail []))) :: [Int]
-tail (tail (xs ++ xs)) :: [Int]
-tail (tail (xs ++ ys)) :: [Int]
-tail (tail (xs ++ zs)) :: [Int]
-tail (tail (ys ++ xs)) :: [Int]
-tail (tail (ys ++ ys)) :: [Int]
-tail (tail (ys ++ zs)) :: [Int]
-tail (tail (zs ++ xs)) :: [Int]
-tail (tail (zs ++ ys)) :: [Int]
-tail (tail (zs ++ zs)) :: [Int]
-tail (xs ++ tail xs) :: [Int]
-tail (xs ++ tail ys) :: [Int]
-tail (xs ++ tail zs) :: [Int]
-tail (ys ++ tail xs) :: [Int]
-tail (ys ++ tail ys) :: [Int]
-tail (ys ++ tail zs) :: [Int]
-tail (zs ++ tail xs) :: [Int]
-tail (zs ++ tail ys) :: [Int]
-tail (zs ++ tail zs) :: [Int]
-tail (xs ++ tail []) :: [Int]
-tail (ys ++ tail []) :: [Int]
-tail (zs ++ tail []) :: [Int]
-tail (tail xs ++ xs) :: [Int]
-tail (tail xs ++ ys) :: [Int]
-tail (tail xs ++ zs) :: [Int]
-tail (tail ys ++ xs) :: [Int]
-tail (tail ys ++ ys) :: [Int]
-tail (tail ys ++ zs) :: [Int]
-tail (tail zs ++ xs) :: [Int]
-tail (tail zs ++ ys) :: [Int]
-tail (tail zs ++ zs) :: [Int]
-tail (tail [] ++ xs) :: [Int]
-tail (tail [] ++ ys) :: [Int]
-tail (tail [] ++ zs) :: [Int]
-x:tail (tail xs) :: [Int]
-x:tail (tail ys) :: [Int]
-x:tail (tail zs) :: [Int]
-y:tail (tail xs) :: [Int]
-y:tail (tail ys) :: [Int]
-y:tail (tail zs) :: [Int]
-z:tail (tail xs) :: [Int]
-z:tail (tail ys) :: [Int]
-z:tail (tail zs) :: [Int]
-x:tail (tail []) :: [Int]
-y:tail (tail []) :: [Int]
-z:tail (tail []) :: [Int]
-x:x:xs :: [Int]
-x:x:ys :: [Int]
-x:x:zs :: [Int]
-x:y:xs :: [Int]
-x:y:ys :: [Int]
-x:y:zs :: [Int]
-x:z:xs :: [Int]
-x:z:ys :: [Int]
-x:z:zs :: [Int]
-y:x:xs :: [Int]
-y:x:ys :: [Int]
-y:x:zs :: [Int]
-y:y:xs :: [Int]
-y:y:ys :: [Int]
-y:y:zs :: [Int]
-y:z:xs :: [Int]
-y:z:ys :: [Int]
-y:z:zs :: [Int]
-z:x:xs :: [Int]
-z:x:ys :: [Int]
-z:x:zs :: [Int]
-z:y:xs :: [Int]
-z:y:ys :: [Int]
-z:y:zs :: [Int]
-z:z:xs :: [Int]
-z:z:ys :: [Int]
-z:z:zs :: [Int]
-[x,x] :: [Int]
-[x,y] :: [Int]
-[x,z] :: [Int]
-[y,x] :: [Int]
-[y,y] :: [Int]
-[y,z] :: [Int]
-[z,x] :: [Int]
-[z,y] :: [Int]
-[z,z] :: [Int]
-x:(xs ++ xs) :: [Int]
-x:(xs ++ ys) :: [Int]
-x:(xs ++ zs) :: [Int]
-x:(ys ++ xs) :: [Int]
-x:(ys ++ ys) :: [Int]
-x:(ys ++ zs) :: [Int]
-x:(zs ++ xs) :: [Int]
-x:(zs ++ ys) :: [Int]
-x:(zs ++ zs) :: [Int]
-y:(xs ++ xs) :: [Int]
-y:(xs ++ ys) :: [Int]
-y:(xs ++ zs) :: [Int]
-y:(ys ++ xs) :: [Int]
-y:(ys ++ ys) :: [Int]
-y:(ys ++ zs) :: [Int]
-y:(zs ++ xs) :: [Int]
-y:(zs ++ ys) :: [Int]
-y:(zs ++ zs) :: [Int]
-z:(xs ++ xs) :: [Int]
-z:(xs ++ ys) :: [Int]
-z:(xs ++ zs) :: [Int]
-z:(ys ++ xs) :: [Int]
-z:(ys ++ ys) :: [Int]
-z:(ys ++ zs) :: [Int]
-z:(zs ++ xs) :: [Int]
-z:(zs ++ ys) :: [Int]
-z:(zs ++ zs) :: [Int]
-xs ++ tail (tail xs) :: [Int]
-xs ++ tail (tail ys) :: [Int]
-xs ++ tail (tail zs) :: [Int]
-ys ++ tail (tail xs) :: [Int]
-ys ++ tail (tail ys) :: [Int]
-ys ++ tail (tail zs) :: [Int]
-zs ++ tail (tail xs) :: [Int]
-zs ++ tail (tail ys) :: [Int]
-zs ++ tail (tail zs) :: [Int]
-xs ++ tail (tail []) :: [Int]
-ys ++ tail (tail []) :: [Int]
-zs ++ tail (tail []) :: [Int]
-xs ++ (x:xs) :: [Int]
-xs ++ (y:xs) :: [Int]
-xs ++ (z:xs) :: [Int]
-xs ++ (x:ys) :: [Int]
-xs ++ (y:ys) :: [Int]
-xs ++ (z:ys) :: [Int]
-xs ++ (x:zs) :: [Int]
-xs ++ (y:zs) :: [Int]
-xs ++ (z:zs) :: [Int]
-ys ++ (x:xs) :: [Int]
-ys ++ (y:xs) :: [Int]
-ys ++ (z:xs) :: [Int]
-ys ++ (x:ys) :: [Int]
-ys ++ (y:ys) :: [Int]
-ys ++ (z:ys) :: [Int]
-ys ++ (x:zs) :: [Int]
-ys ++ (y:zs) :: [Int]
-ys ++ (z:zs) :: [Int]
-zs ++ (x:xs) :: [Int]
-zs ++ (y:xs) :: [Int]
-zs ++ (z:xs) :: [Int]
-zs ++ (x:ys) :: [Int]
-zs ++ (y:ys) :: [Int]
-zs ++ (z:ys) :: [Int]
-zs ++ (x:zs) :: [Int]
-zs ++ (y:zs) :: [Int]
-zs ++ (z:zs) :: [Int]
-xs ++ [x] :: [Int]
-xs ++ [y] :: [Int]
-xs ++ [z] :: [Int]
-ys ++ [x] :: [Int]
-ys ++ [y] :: [Int]
-ys ++ [z] :: [Int]
-zs ++ [x] :: [Int]
-zs ++ [y] :: [Int]
-zs ++ [z] :: [Int]
-xs ++ (xs ++ xs) :: [Int]
-xs ++ (xs ++ ys) :: [Int]
-xs ++ (xs ++ zs) :: [Int]
-xs ++ (ys ++ xs) :: [Int]
-xs ++ (ys ++ ys) :: [Int]
-xs ++ (ys ++ zs) :: [Int]
-xs ++ (zs ++ xs) :: [Int]
-xs ++ (zs ++ ys) :: [Int]
-xs ++ (zs ++ zs) :: [Int]
-ys ++ (xs ++ xs) :: [Int]
-ys ++ (xs ++ ys) :: [Int]
-ys ++ (xs ++ zs) :: [Int]
-ys ++ (ys ++ xs) :: [Int]
-ys ++ (ys ++ ys) :: [Int]
-ys ++ (ys ++ zs) :: [Int]
-ys ++ (zs ++ xs) :: [Int]
-ys ++ (zs ++ ys) :: [Int]
-ys ++ (zs ++ zs) :: [Int]
-zs ++ (xs ++ xs) :: [Int]
-zs ++ (xs ++ ys) :: [Int]
-zs ++ (xs ++ zs) :: [Int]
-zs ++ (ys ++ xs) :: [Int]
-zs ++ (ys ++ ys) :: [Int]
-zs ++ (ys ++ zs) :: [Int]
-zs ++ (zs ++ xs) :: [Int]
-zs ++ (zs ++ ys) :: [Int]
-zs ++ (zs ++ zs) :: [Int]
-head xs:tail xs :: [Int]
-head xs:tail ys :: [Int]
-head xs:tail zs :: [Int]
-head ys:tail xs :: [Int]
-head ys:tail ys :: [Int]
-head ys:tail zs :: [Int]
-head zs:tail xs :: [Int]
-head zs:tail ys :: [Int]
-head zs:tail zs :: [Int]
-head xs:tail [] :: [Int]
-head ys:tail [] :: [Int]
-head zs:tail [] :: [Int]
-head []:tail xs :: [Int]
-head []:tail ys :: [Int]
-head []:tail zs :: [Int]
-head []:tail [] :: [Int]
-tail xs ++ tail xs :: [Int]
-tail xs ++ tail ys :: [Int]
-tail xs ++ tail zs :: [Int]
-tail ys ++ tail xs :: [Int]
-tail ys ++ tail ys :: [Int]
-tail ys ++ tail zs :: [Int]
-tail zs ++ tail xs :: [Int]
-tail zs ++ tail ys :: [Int]
-tail zs ++ tail zs :: [Int]
-tail xs ++ tail [] :: [Int]
-tail ys ++ tail [] :: [Int]
-tail zs ++ tail [] :: [Int]
-tail [] ++ tail xs :: [Int]
-tail [] ++ tail ys :: [Int]
-tail [] ++ tail zs :: [Int]
-tail [] ++ tail [] :: [Int]
-head (tail xs):xs :: [Int]
-head (tail xs):ys :: [Int]
-head (tail xs):zs :: [Int]
-head (tail ys):xs :: [Int]
-head (tail ys):ys :: [Int]
-head (tail ys):zs :: [Int]
-head (tail zs):xs :: [Int]
-head (tail zs):ys :: [Int]
-head (tail zs):zs :: [Int]
-[head (tail xs)] :: [Int]
-[head (tail ys)] :: [Int]
-[head (tail zs)] :: [Int]
-head (tail []):xs :: [Int]
-head (tail []):ys :: [Int]
-head (tail []):zs :: [Int]
-[head (tail [])] :: [Int]
-tail (tail xs) ++ xs :: [Int]
-tail (tail xs) ++ ys :: [Int]
-tail (tail xs) ++ zs :: [Int]
-tail (tail ys) ++ xs :: [Int]
-tail (tail ys) ++ ys :: [Int]
-tail (tail ys) ++ zs :: [Int]
-tail (tail zs) ++ xs :: [Int]
-tail (tail zs) ++ ys :: [Int]
-tail (tail zs) ++ zs :: [Int]
-tail (tail []) ++ xs :: [Int]
-tail (tail []) ++ ys :: [Int]
-tail (tail []) ++ zs :: [Int]
-
-Number of Eq schema classes: 90
-Number of Eq 1-var classes: 68
-Number of Eq 2-var classes: 191
-Number of Eq 3-var classes: 406
diff --git a/tests/model/list-s4.out b/tests/model/list-s4.out
deleted file mode 100644
--- a/tests/model/list-s4.out
+++ /dev/null
@@ -1,26 +0,0 @@
-max expr size  =    4
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    3  (for inequational and conditional laws)
-
-_ :: Int
-_ :: [Int]
-[] :: [Int]
-(:) :: Int -> [Int] -> [Int]
-(++) :: [Int] -> [Int] -> [Int]
-head :: [Int] -> Int
-tail :: [Int] -> [Int]
-
-head (x:xs) == x
-   xs ++ [] == xs
-   [] ++ xs == xs
-tail (x:xs) == xs
-
- [] <= xs
- xs <= x:xs
- xs <= xs ++ ys
- xs <= ys ++ xs
- xs <= tail (xs ++ xs)
-[x] <= x:xs
-
diff --git a/tests/model/list.out b/tests/model/list.out
deleted file mode 100644
--- a/tests/model/list.out
+++ /dev/null
@@ -1,37 +0,0 @@
-max expr size  =    5
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    3  (for inequational and conditional laws)
-
-_ :: Int
-_ :: [Int]
-[] :: [Int]
-(:) :: Int -> [Int] -> [Int]
-(++) :: [Int] -> [Int] -> [Int]
-head :: [Int] -> Int
-tail :: [Int] -> [Int]
-
-     head (x:xs) == x
-        xs ++ [] == xs
-        [] ++ xs == xs
-     tail (x:xs) == xs
-(xs ++ ys) ++ zs == xs ++ (ys ++ zs)
-    (x:xs) ++ ys == x:(xs ++ ys)
-
-       [] <= xs
-       xs <= x:xs
-       xs <= xs ++ ys
-       xs <= ys ++ xs
-       xs <= tail (xs ++ xs)
-      [x] <= x:xs
-       xs <= head xs:tail xs
-     x:xs <= x:y:xs
- xs ++ ys <= xs ++ (ys ++ zs)
- xs ++ ys <= xs ++ (zs ++ ys)
-     x:xs <= x:(xs ++ ys)
-     x:xs <= x:(ys ++ xs)
- xs ++ ys <= xs ++ (x:ys)
-    [x,y] <= x:y:xs
-xs ++ [x] <= xs ++ (x:ys)
-
diff --git a/tests/model/minus-c-s4.out b/tests/model/minus-c-s4.out
deleted file mode 100644
--- a/tests/model/minus-c-s4.out
+++ /dev/null
@@ -1,232 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-0 :: Int
-1 :: Int
-id :: Int -> Int
-(+) :: Int -> Int -> Int
-negate :: Int -> Int
-(-) :: Int -> Int -> Int
-
-_ :: Int
-0 :: Int
-1 :: Int
-negate _ :: Int
-negate 1 :: Int
-_ + _ :: Int
-_ + 1 :: Int
-1 + 1 :: Int
-_ - _ :: Int
-_ - 1 :: Int
-1 - _ :: Int
-negate (_ + _) :: Int
-negate (_ + 1) :: Int
-negate (1 + 1) :: Int
-_ + (_ + _) :: Int
-_ + (_ + 1) :: Int
-_ + (1 + 1) :: Int
-_ + (_ - _) :: Int
-_ + (_ - 1) :: Int
-_ + (1 - _) :: Int
-1 + (1 + 1) :: Int
-1 + (1 - _) :: Int
-_ - (_ + _) :: Int
-_ - (_ + 1) :: Int
-_ - (1 + 1) :: Int
-1 - (_ + _) :: Int
-
-x :: Int
-0 :: Int
-1 :: Int
-negate x :: Int
-negate 1 :: Int
-x + x :: Int
-x + 1 :: Int
-1 + 1 :: Int
-x - 1 :: Int
-1 - x :: Int
-negate (x + x) :: Int
-negate (x + 1) :: Int
-negate (1 + 1) :: Int
-x + (x + x) :: Int
-x + (x + 1) :: Int
-x + (1 + 1) :: Int
-x + (x - 1) :: Int
-1 + (1 + 1) :: Int
-1 + (1 - x) :: Int
-x - (1 + 1) :: Int
-1 - (x + x) :: Int
-
-x :: Int
-y :: Int
-0 :: Int
-1 :: Int
-negate x :: Int
-negate y :: Int
-negate 1 :: Int
-x + x :: Int
-x + y :: Int
-y + y :: Int
-x + 1 :: Int
-y + 1 :: Int
-1 + 1 :: Int
-x - y :: Int
-y - x :: Int
-x - 1 :: Int
-y - 1 :: Int
-1 - x :: Int
-1 - y :: Int
-negate (x + x) :: Int
-negate (x + y) :: Int
-negate (y + y) :: Int
-negate (x + 1) :: Int
-negate (y + 1) :: Int
-negate (1 + 1) :: Int
-x + (x + x) :: Int
-x + (x + y) :: Int
-x + (y + y) :: Int
-y + (y + y) :: Int
-x + (x + 1) :: Int
-x + (y + 1) :: Int
-y + (y + 1) :: Int
-x + (1 + 1) :: Int
-y + (1 + 1) :: Int
-x + (x - y) :: Int
-y + (y - x) :: Int
-x + (x - 1) :: Int
-x + (y - 1) :: Int
-y + (y - 1) :: Int
-x + (1 - y) :: Int
-y + (1 - x) :: Int
-1 + (1 + 1) :: Int
-1 + (1 - x) :: Int
-1 + (1 - y) :: Int
-x - (y + y) :: Int
-y - (x + x) :: Int
-x - (y + 1) :: Int
-y - (x + 1) :: Int
-x - (1 + 1) :: Int
-y - (1 + 1) :: Int
-1 - (x + x) :: Int
-1 - (x + y) :: Int
-1 - (y + y) :: Int
-
-x :: Int
-y :: Int
-z :: Int
-0 :: Int
-1 :: Int
-negate x :: Int
-negate y :: Int
-negate z :: Int
-negate 1 :: Int
-x + x :: Int
-x + y :: Int
-x + z :: Int
-y + y :: Int
-y + z :: Int
-z + z :: Int
-x + 1 :: Int
-y + 1 :: Int
-z + 1 :: Int
-1 + 1 :: Int
-x - y :: Int
-x - z :: Int
-y - x :: Int
-y - z :: Int
-z - x :: Int
-z - y :: Int
-x - 1 :: Int
-y - 1 :: Int
-z - 1 :: Int
-1 - x :: Int
-1 - y :: Int
-1 - z :: Int
-negate (x + x) :: Int
-negate (x + y) :: Int
-negate (x + z) :: Int
-negate (y + y) :: Int
-negate (y + z) :: Int
-negate (z + z) :: Int
-negate (x + 1) :: Int
-negate (y + 1) :: Int
-negate (z + 1) :: Int
-negate (1 + 1) :: Int
-x + (x + x) :: Int
-x + (x + y) :: Int
-x + (x + z) :: Int
-x + (y + y) :: Int
-x + (y + z) :: Int
-x + (z + z) :: Int
-y + (y + y) :: Int
-y + (y + z) :: Int
-y + (z + z) :: Int
-z + (z + z) :: Int
-x + (x + 1) :: Int
-x + (y + 1) :: Int
-x + (z + 1) :: Int
-y + (y + 1) :: Int
-y + (z + 1) :: Int
-z + (z + 1) :: Int
-x + (1 + 1) :: Int
-y + (1 + 1) :: Int
-z + (1 + 1) :: Int
-x + (x - y) :: Int
-x + (x - z) :: Int
-x + (y - z) :: Int
-x + (z - y) :: Int
-y + (y - x) :: Int
-y + (y - z) :: Int
-y + (z - x) :: Int
-z + (z - x) :: Int
-z + (z - y) :: Int
-x + (x - 1) :: Int
-x + (y - 1) :: Int
-x + (z - 1) :: Int
-y + (y - 1) :: Int
-y + (z - 1) :: Int
-z + (z - 1) :: Int
-x + (1 - y) :: Int
-x + (1 - z) :: Int
-y + (1 - x) :: Int
-y + (1 - z) :: Int
-z + (1 - x) :: Int
-z + (1 - y) :: Int
-1 + (1 + 1) :: Int
-1 + (1 - x) :: Int
-1 + (1 - y) :: Int
-1 + (1 - z) :: Int
-x - (y + y) :: Int
-x - (y + z) :: Int
-x - (z + z) :: Int
-y - (x + x) :: Int
-y - (x + z) :: Int
-y - (z + z) :: Int
-z - (x + x) :: Int
-z - (x + y) :: Int
-z - (y + y) :: Int
-x - (y + 1) :: Int
-x - (z + 1) :: Int
-y - (x + 1) :: Int
-y - (z + 1) :: Int
-z - (x + 1) :: Int
-z - (y + 1) :: Int
-x - (1 + 1) :: Int
-y - (1 + 1) :: Int
-z - (1 + 1) :: Int
-1 - (x + x) :: Int
-1 - (x + y) :: Int
-1 - (x + z) :: Int
-1 - (y + y) :: Int
-1 - (y + z) :: Int
-1 - (z + z) :: Int
-
-Number of Eq schema classes: 26
-Number of Eq 1-var classes: 21
-Number of Eq 2-var classes: 53
-Number of Eq 3-var classes: 109
diff --git a/tests/model/minus-c.out b/tests/model/minus-c.out
deleted file mode 100644
--- a/tests/model/minus-c.out
+++ /dev/null
@@ -1,232 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-0 :: Int
-1 :: Int
-id :: Int -> Int
-(+) :: Int -> Int -> Int
-negate :: Int -> Int
-(-) :: Int -> Int -> Int
-
-_ :: Int
-0 :: Int
-1 :: Int
-negate _ :: Int
-negate 1 :: Int
-_ + _ :: Int
-_ + 1 :: Int
-1 + 1 :: Int
-_ - _ :: Int
-_ - 1 :: Int
-1 - _ :: Int
-negate (_ + _) :: Int
-negate (_ + 1) :: Int
-negate (1 + 1) :: Int
-_ + (_ + _) :: Int
-_ + (_ + 1) :: Int
-_ + (1 + 1) :: Int
-_ + (_ - _) :: Int
-_ + (_ - 1) :: Int
-_ + (1 - _) :: Int
-1 + (1 + 1) :: Int
-1 + (1 - _) :: Int
-_ - (_ + _) :: Int
-_ - (_ + 1) :: Int
-_ - (1 + 1) :: Int
-1 - (_ + _) :: Int
-
-x :: Int
-0 :: Int
-1 :: Int
-negate x :: Int
-negate 1 :: Int
-x + x :: Int
-x + 1 :: Int
-1 + 1 :: Int
-x - 1 :: Int
-1 - x :: Int
-negate (x + x) :: Int
-negate (x + 1) :: Int
-negate (1 + 1) :: Int
-x + (x + x) :: Int
-x + (x + 1) :: Int
-x + (1 + 1) :: Int
-x + (x - 1) :: Int
-1 + (1 + 1) :: Int
-1 + (1 - x) :: Int
-x - (1 + 1) :: Int
-1 - (x + x) :: Int
-
-x :: Int
-y :: Int
-0 :: Int
-1 :: Int
-negate x :: Int
-negate y :: Int
-negate 1 :: Int
-x + x :: Int
-x + y :: Int
-y + y :: Int
-x + 1 :: Int
-y + 1 :: Int
-1 + 1 :: Int
-x - y :: Int
-y - x :: Int
-x - 1 :: Int
-y - 1 :: Int
-1 - x :: Int
-1 - y :: Int
-negate (x + x) :: Int
-negate (x + y) :: Int
-negate (y + y) :: Int
-negate (x + 1) :: Int
-negate (y + 1) :: Int
-negate (1 + 1) :: Int
-x + (x + x) :: Int
-x + (x + y) :: Int
-x + (y + y) :: Int
-y + (y + y) :: Int
-x + (x + 1) :: Int
-x + (y + 1) :: Int
-y + (y + 1) :: Int
-x + (1 + 1) :: Int
-y + (1 + 1) :: Int
-x + (x - y) :: Int
-y + (y - x) :: Int
-x + (x - 1) :: Int
-x + (y - 1) :: Int
-y + (y - 1) :: Int
-x + (1 - y) :: Int
-y + (1 - x) :: Int
-1 + (1 + 1) :: Int
-1 + (1 - x) :: Int
-1 + (1 - y) :: Int
-x - (y + y) :: Int
-y - (x + x) :: Int
-x - (y + 1) :: Int
-y - (x + 1) :: Int
-x - (1 + 1) :: Int
-y - (1 + 1) :: Int
-1 - (x + x) :: Int
-1 - (x + y) :: Int
-1 - (y + y) :: Int
-
-x :: Int
-y :: Int
-z :: Int
-0 :: Int
-1 :: Int
-negate x :: Int
-negate y :: Int
-negate z :: Int
-negate 1 :: Int
-x + x :: Int
-x + y :: Int
-x + z :: Int
-y + y :: Int
-y + z :: Int
-z + z :: Int
-x + 1 :: Int
-y + 1 :: Int
-z + 1 :: Int
-1 + 1 :: Int
-x - y :: Int
-x - z :: Int
-y - x :: Int
-y - z :: Int
-z - x :: Int
-z - y :: Int
-x - 1 :: Int
-y - 1 :: Int
-z - 1 :: Int
-1 - x :: Int
-1 - y :: Int
-1 - z :: Int
-negate (x + x) :: Int
-negate (x + y) :: Int
-negate (x + z) :: Int
-negate (y + y) :: Int
-negate (y + z) :: Int
-negate (z + z) :: Int
-negate (x + 1) :: Int
-negate (y + 1) :: Int
-negate (z + 1) :: Int
-negate (1 + 1) :: Int
-x + (x + x) :: Int
-x + (x + y) :: Int
-x + (x + z) :: Int
-x + (y + y) :: Int
-x + (y + z) :: Int
-x + (z + z) :: Int
-y + (y + y) :: Int
-y + (y + z) :: Int
-y + (z + z) :: Int
-z + (z + z) :: Int
-x + (x + 1) :: Int
-x + (y + 1) :: Int
-x + (z + 1) :: Int
-y + (y + 1) :: Int
-y + (z + 1) :: Int
-z + (z + 1) :: Int
-x + (1 + 1) :: Int
-y + (1 + 1) :: Int
-z + (1 + 1) :: Int
-x + (x - y) :: Int
-x + (x - z) :: Int
-x + (y - z) :: Int
-x + (z - y) :: Int
-y + (y - x) :: Int
-y + (y - z) :: Int
-y + (z - x) :: Int
-z + (z - x) :: Int
-z + (z - y) :: Int
-x + (x - 1) :: Int
-x + (y - 1) :: Int
-x + (z - 1) :: Int
-y + (y - 1) :: Int
-y + (z - 1) :: Int
-z + (z - 1) :: Int
-x + (1 - y) :: Int
-x + (1 - z) :: Int
-y + (1 - x) :: Int
-y + (1 - z) :: Int
-z + (1 - x) :: Int
-z + (1 - y) :: Int
-1 + (1 + 1) :: Int
-1 + (1 - x) :: Int
-1 + (1 - y) :: Int
-1 + (1 - z) :: Int
-x - (y + y) :: Int
-x - (y + z) :: Int
-x - (z + z) :: Int
-y - (x + x) :: Int
-y - (x + z) :: Int
-y - (z + z) :: Int
-z - (x + x) :: Int
-z - (x + y) :: Int
-z - (y + y) :: Int
-x - (y + 1) :: Int
-x - (z + 1) :: Int
-y - (x + 1) :: Int
-y - (z + 1) :: Int
-z - (x + 1) :: Int
-z - (y + 1) :: Int
-x - (1 + 1) :: Int
-y - (1 + 1) :: Int
-z - (1 + 1) :: Int
-1 - (x + x) :: Int
-1 - (x + y) :: Int
-1 - (x + z) :: Int
-1 - (y + y) :: Int
-1 - (y + z) :: Int
-1 - (z + z) :: Int
-
-Number of Eq schema classes: 26
-Number of Eq 1-var classes: 21
-Number of Eq 2-var classes: 53
-Number of Eq 3-var classes: 109
diff --git a/tests/model/minus-s4.out b/tests/model/minus-s4.out
deleted file mode 100644
--- a/tests/model/minus-s4.out
+++ /dev/null
@@ -1,25 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-0 :: Int
-1 :: Int
-id :: Int -> Int
-(+) :: Int -> Int -> Int
-negate :: Int -> Int
-(-) :: Int -> Int -> Int
-
-             id x == x
-negate (negate x) == x
-            x + 0 == x
-     x + negate x == 0
-            x + y == y + x
-            x - y == x + negate y
-
-    x <= x + 1
-x - 1 <= x
-
diff --git a/tests/model/minus.out b/tests/model/minus.out
deleted file mode 100644
--- a/tests/model/minus.out
+++ /dev/null
@@ -1,27 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-0 :: Int
-1 :: Int
-id :: Int -> Int
-(+) :: Int -> Int -> Int
-negate :: Int -> Int
-(-) :: Int -> Int -> Int
-
-             id x == x
-negate (negate x) == x
-            x + 0 == x
-     x + negate x == 0
-            x + y == y + x
-            x - y == x + negate y
-   negate (x + y) == negate x + negate y
-      (x + y) + z == x + (y + z)
-
-    x <= x + 1
-x - 1 <= x
-
diff --git a/tests/model/monad-s4.out b/tests/model/monad-s4.out
deleted file mode 100644
--- a/tests/model/monad-s4.out
+++ /dev/null
@@ -1,21 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-_ :: [Int]
-_ :: Int -> [Int]
-return :: Int -> [Int]
-(>>=) :: [Int] -> (Int -> [Int]) -> [Int]
-(>=>) :: (Int -> [Int]) -> (Int -> [Int]) -> Int -> [Int]
-
-(xs >>= return) == xs
-            f x == (return x >>= f)
-    (f x >>= g) == (f >=> g) x
- (f >=> return) == f
- (return >=> f) == f
-
-
diff --git a/tests/model/monad.out b/tests/model/monad.out
deleted file mode 100644
--- a/tests/model/monad.out
+++ /dev/null
@@ -1,23 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Int
-_ :: [Int]
-_ :: Int -> [Int]
-return :: Int -> [Int]
-(>>=) :: [Int] -> (Int -> [Int]) -> [Int]
-(>=>) :: (Int -> [Int]) -> (Int -> [Int]) -> Int -> [Int]
-
-   (xs >>= return) == xs
-               f x == (return x >>= f)
-       (f x >>= g) == (f >=> g) x
-((xs >>= f) >>= g) == (xs >>= (f >=> g))
-    (f >=> return) == f
-    (return >=> f) == f
- ((f >=> g) >=> h) == (f >=> (g >=> h))
-
-
diff --git a/tests/model/nord-s4.out b/tests/model/nord-s4.out
deleted file mode 100644
--- a/tests/model/nord-s4.out
+++ /dev/null
@@ -1,15 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: EqButNotOrd
-C0 :: EqButNotOrd
-id :: EqButNotOrd -> EqButNotOrd
-
-Warning: no Ord instance for EqButNotOrd, inequations of this type will not be considered
-
-
-
diff --git a/tests/model/nord.out b/tests/model/nord.out
deleted file mode 100644
--- a/tests/model/nord.out
+++ /dev/null
@@ -1,15 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: EqButNotOrd
-C0 :: EqButNotOrd
-id :: EqButNotOrd -> EqButNotOrd
-
-Warning: no Ord instance for EqButNotOrd, inequations of this type will not be considered
-
-
-
diff --git a/tests/model/oddeven-s4.out b/tests/model/oddeven-s4.out
deleted file mode 100644
--- a/tests/model/oddeven-s4.out
+++ /dev/null
@@ -1,44 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Int
-0 :: Int
-1 :: Int
-2 :: Int
-False :: Bool
-True :: Bool
-odd :: Int -> Bool
-even :: Int -> Bool
-mod :: Int -> Int -> Int
-(==) :: Int -> Int -> Bool
-(==) :: Bool -> Bool -> Bool
-
-         (x == x) == True
-         (p == p) == True
-      (p == True) == p
-         (x == y) == (y == x)
-  odd (x `mod` 2) == odd x
- even (x `mod` 2) == even x
- (False == odd x) == even x
-(False == even x) == odd x
-        x `mod` 1 == 0
-
-        p ==> True
-    False ==> p
-   x == 0 ==> even x
-   x == 1 ==> odd x
-   x == 2 ==> even x
-x `mod` 2 <=  2
-        0 <=  x `mod` 2
-x `mod` 2 <=  1
-
- odd x ==> x `mod` x == 0
- odd x ==> 0 `mod` x == 0
- odd x ==> x `mod` 2 == 1
-even x ==> x `mod` 2 == 0
-
diff --git a/tests/model/oddeven.out b/tests/model/oddeven.out
deleted file mode 100644
--- a/tests/model/oddeven.out
+++ /dev/null
@@ -1,52 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Int
-0 :: Int
-1 :: Int
-2 :: Int
-False :: Bool
-True :: Bool
-odd :: Int -> Bool
-even :: Int -> Bool
-mod :: Int -> Int -> Int
-(==) :: Int -> Int -> Bool
-(==) :: Bool -> Bool -> Bool
-
-           (x == x) == True
-           (p == p) == True
-        (p == True) == p
-           (x == y) == (y == x)
-    odd (x `mod` 2) == odd x
-   even (x `mod` 2) == even x
-   (False == odd x) == even x
-  (False == even x) == odd x
-  (odd x == even x) == False
-   (2 == x `mod` 2) == False
-   (0 == x `mod` 2) == even x
-   (1 == x `mod` 2) == odd x
-  (even x == odd y) == (odd x == even y)
- (even x == even y) == (odd x == odd y)
-          x `mod` 1 == 0
-(x `mod` 2) `mod` 2 == x `mod` 2
-
-        p ==> True
-    False ==> p
-   x == 0 ==> even x
-   x == 1 ==> odd x
-   x == 2 ==> even x
-x `mod` 2 <=  2
-        0 <=  x `mod` 2
-x `mod` 2 <=  1
-
- odd x ==>           x `mod` x == 0
- odd x ==>           0 `mod` x == 0
- odd x ==>           x `mod` 2 == 1
-even x ==>           x `mod` 2 == 0
- odd y ==> (x `mod` y) `mod` y == x `mod` y
-
diff --git a/tests/model/plus-abs-s4.out b/tests/model/plus-abs-s4.out
deleted file mode 100644
--- a/tests/model/plus-abs-s4.out
+++ /dev/null
@@ -1,40 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Int
-(+) :: Int -> Int -> Int
-id :: Int -> Int
-abs :: Int -> Int
-0 :: Int
-1 :: Int
-(<=) :: Int -> Int -> Bool
-(<) :: Int -> Int -> Bool
-True :: Bool
-False :: Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: Int -> Int -> Bool
-
-(x <= abs x) == True
- (abs x < x) == False
-(0 <= abs x) == True
- (abs x < 0) == False
-(abs x <= x) == (0 <= x)
- (x < abs x) == (x < 0)
-(x == abs x) == (0 <= x)
-    (x == 0) == (abs x <= 0)
-        id x == x
-       x + 0 == x
- abs (abs x) == abs x
-       x + y == y + x
-
-x <= abs x
-0 <= abs x
-x <= x + 1
-
-x <= 0 ==> x + abs x == 0
-
diff --git a/tests/model/plus-abs.out b/tests/model/plus-abs.out
deleted file mode 100644
--- a/tests/model/plus-abs.out
+++ /dev/null
@@ -1,68 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Int
-(+) :: Int -> Int -> Int
-id :: Int -> Int
-abs :: Int -> Int
-0 :: Int
-1 :: Int
-(<=) :: Int -> Int -> Bool
-(<) :: Int -> Int -> Bool
-True :: Bool
-False :: Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: Int -> Int -> Bool
-
-       (x <= abs x) == True
-       (0 <= abs x) == True
-       (1 == x + x) == False
-       (abs x <= x) == (0 <= x)
-       (x == abs x) == (0 <= x)
-           (x == 0) == (abs x <= 0)
-           (0 <= x) == (y <= x + y)
-       (x + y <= x) == (y <= 0)
-            (x < y) == (x + 1 <= y)
-       (0 <= x + x) == (0 <= x)
-       (1 <= x + x) == (1 <= x)
-       (x + x <= 0) == (x <= 0)
-       (x + x <= 1) == (x <= 0)
-       (x == x + y) == (abs y <= 0)
-(False == (x <= y)) == (y + 1 <= x)
-               id x == x
-              x + 0 == x
-        abs (abs x) == abs x
-              x + y == y + x
-        abs (x + x) == abs x + abs x
-    abs (x + abs x) == x + abs x
-    abs (1 + abs x) == 1 + abs x
-        (x + y) + z == x + (y + z)
-
-     x <= y ==> x <= abs y
- abs x <= y ==> x <= y
-  abs x < y ==> x < y
-     x <= 0 ==> x <= abs y
- abs x <= y ==> 0 <= y
-  abs x < y ==> 1 <= y
-     x == 1 ==> 1 == abs x
-      x < 0 ==> 1 <= abs x
-          x <=  abs x
-          0 <=  abs x
-          x <=  x + 1
-          x <=  x + abs y
-          x <=  abs (x + x)
-          x <=  1 + abs x
-          0 <=  x + abs x
-      x + y <=  x + abs y
-abs (x + 1) <=  1 + abs x
-
-    x <= 0 ==>       x + abs x == 0
-abs x <= y ==>     abs (x + y) == x + y
-abs y <= x ==>     abs (x + y) == x + y
-    y <= x ==> abs (x + abs y) == x + abs y
-
diff --git a/tests/model/pretty-compact-s4.out b/tests/model/pretty-compact-s4.out
deleted file mode 100644
--- a/tests/model/pretty-compact-s4.out
+++ /dev/null
@@ -1,32 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  360
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Char  (holes: Char)
-_ :: Int  (holes: Int)
-_ :: ODoc Any  (holes: ODoc Any)
-_ :: [Char]  (holes: [Char])
-text :: [Char] -> ODoc Any
-char :: Char -> ODoc Any
-flush :: ODoc Any -> ODoc Any
-hang :: Int -> ODoc Any -> ODoc Any -> ODoc Any
-(<>) :: ODoc Any -> ODoc Any -> ODoc Any
-(<+>) :: ODoc Any -> ODoc Any -> ODoc Any
-($$) :: ODoc Any -> ODoc Any -> ODoc Any
-(</>) :: ODoc Any -> ODoc Any -> ODoc Any
-(<//>) :: ODoc Any -> ODoc Any -> ODoc Any
-(<$$>) :: ODoc Any -> ODoc Any -> ODoc Any
-
-        d1 $$ d2 == flush d1 <> d2
-      d1 <$$> d2 == flush d1 <> d2
- flush d1 </> d2 == flush (flush d1) <> d2
-flush d1 <//> d2 == flush (flush d1) <> d2
-
-      d1 <= flush d1
-      d1 <= d1 $$ d2
-      d1 <= d1 </> d2
-      d1 <= d1 <//> d2
-flush d1 <= d1 $$ d2
-
diff --git a/tests/model/pretty-compact.out b/tests/model/pretty-compact.out
deleted file mode 100644
--- a/tests/model/pretty-compact.out
+++ /dev/null
@@ -1,32 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  360
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Char  (holes: Char)
-_ :: Int  (holes: Int)
-_ :: ODoc Any  (holes: ODoc Any)
-_ :: [Char]  (holes: [Char])
-text :: [Char] -> ODoc Any
-char :: Char -> ODoc Any
-flush :: ODoc Any -> ODoc Any
-hang :: Int -> ODoc Any -> ODoc Any -> ODoc Any
-(<>) :: ODoc Any -> ODoc Any -> ODoc Any
-(<+>) :: ODoc Any -> ODoc Any -> ODoc Any
-($$) :: ODoc Any -> ODoc Any -> ODoc Any
-(</>) :: ODoc Any -> ODoc Any -> ODoc Any
-(<//>) :: ODoc Any -> ODoc Any -> ODoc Any
-(<$$>) :: ODoc Any -> ODoc Any -> ODoc Any
-
-        d1 $$ d2 == flush d1 <> d2
-      d1 <$$> d2 == flush d1 <> d2
- flush d1 </> d2 == flush (flush d1) <> d2
-flush d1 <//> d2 == flush (flush d1) <> d2
-
-      d1 <= flush d1
-      d1 <= d1 $$ d2
-      d1 <= d1 </> d2
-      d1 <= d1 <//> d2
-flush d1 <= d1 $$ d2
-
diff --git a/tests/model/pretty-s4.out b/tests/model/pretty-s4.out
deleted file mode 100644
--- a/tests/model/pretty-s4.out
+++ /dev/null
@@ -1,20 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    3  (for inequational and conditional laws)
-
-_ :: Doc
-_ :: Int
-_ :: [Char]
-($$) :: Doc -> Doc -> Doc
-(<>) :: Doc -> Doc -> Doc
-nest :: Int -> Doc -> Doc
-(++) :: [Char] -> [Char] -> [Char]
-length :: [Char] -> Int
-
-
-d1 <= d1 $$ d2
-d1 <= d1 <> d2
-
diff --git a/tests/model/pretty.out b/tests/model/pretty.out
deleted file mode 100644
--- a/tests/model/pretty.out
+++ /dev/null
@@ -1,33 +0,0 @@
-max expr size  =    7
-  |- on ineqs  =    6
-  |- on conds  =    6
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    3  (for inequational and conditional laws)
-
-_ :: Doc
-_ :: Int
-_ :: [Char]
-($$) :: Doc -> Doc -> Doc
-(<>) :: Doc -> Doc -> Doc
-nest :: Int -> Doc -> Doc
-(++) :: [Char] -> [Char] -> [Char]
-length :: [Char] -> Int
-
-            d1 <> nest x d2 == d1 <> d2
-           (d1 $$ d2) $$ d3 == d1 $$ (d2 $$ d3)
-           (d1 <> d2) <> d3 == d1 <> (d2 <> d3)
-         nest x (nest y d1) == nest y (nest x d1)
-           (d1 $$ d2) <> d3 == d1 $$ (d2 <> d3)
-          nest x (d1 <> d2) == nest x d1 <> d2
-    d1 <> (nest x d2 <> d3) == d1 <> (d2 <> d3)
-          nest x (d1 $$ d2) == nest x d1 $$ nest x d2
-nest (length (cs ++ ds)) d1 == nest (length cs) (nest (length ds) d1)
-
-      d1 <= d1 $$ d2
-      d1 <= d1 <> d2
-d1 $$ d2 <= d1 $$ (d2 $$ d3)
-d1 <> d2 <= d1 <> (d2 <> d3)
-d1 $$ d2 <= d1 $$ (d2 <> d3)
-d1 <> d2 <= d1 <> (d2 $$ d3)
-
diff --git a/tests/model/ratio-s4.out b/tests/model/ratio-s4.out
deleted file mode 100644
--- a/tests/model/ratio-s4.out
+++ /dev/null
@@ -1,59 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Integer
-_ :: Ratio Integer
-id :: Ratio Integer -> Ratio Integer
-abs :: Ratio Integer -> Ratio Integer
-negate :: Ratio Integer -> Ratio Integer
-(+) :: Ratio Integer -> Ratio Integer -> Ratio Integer
-(*) :: Ratio Integer -> Ratio Integer -> Ratio Integer
-(/) :: Ratio Integer -> Ratio Integer -> Ratio Integer
-(%) :: Integer -> Integer -> Ratio Integer
-recip :: Ratio Integer -> Ratio Integer
-numerator :: Ratio Integer -> Integer
-denominator :: Ratio Integer -> Integer
-0 % 1 :: Ratio Integer
-1 % 1 :: Ratio Integer
-0 :: Integer
-1 :: Integer
-
-    denominator (abs q) == denominator q
- denominator (negate q) == denominator q
-      numerator (x % 1) == x
-    denominator (x % 1) == 1
-denominator (q + 1 % 1) == denominator q
-                   id q == q
-      negate (negate q) == q
-              q + 0 % 1 == q
-            q * (1 % 1) == q
-            q / (1 % 1) == q
-            q * (0 % 1) == 0 % 1
-            abs (abs q) == abs q
-         abs (negate q) == abs q
-           q + negate q == 0 % 1
-      0 % denominator q == 0 % 1
-                  q + r == r + q
-                  q * r == r * q
-     q / negate (1 % 1) == negate q
-            abs (q * q) == q * q
-           q * negate r == negate (q * r)
-
-                   0 <= denominator q
-                   1 <= denominator q
-                   0 <= numerator (abs q)
-         numerator q <= numerator (abs q)
-numerator (negate q) <= numerator (abs q)
-                   q <= abs q
-               0 % 1 <= abs q
-                   q <= q + 1 % 1
-               0 % 1 <= q * q
-            negate q <= abs q
-      negate (abs q) <= q
-      negate (abs q) <= 0 % 1
-      negate (abs q) <= negate q
-
diff --git a/tests/model/ratio.out b/tests/model/ratio.out
deleted file mode 100644
--- a/tests/model/ratio.out
+++ /dev/null
@@ -1,114 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Integer
-_ :: Ratio Integer
-id :: Ratio Integer -> Ratio Integer
-abs :: Ratio Integer -> Ratio Integer
-negate :: Ratio Integer -> Ratio Integer
-(+) :: Ratio Integer -> Ratio Integer -> Ratio Integer
-(*) :: Ratio Integer -> Ratio Integer -> Ratio Integer
-(/) :: Ratio Integer -> Ratio Integer -> Ratio Integer
-(%) :: Integer -> Integer -> Ratio Integer
-recip :: Ratio Integer -> Ratio Integer
-numerator :: Ratio Integer -> Integer
-denominator :: Ratio Integer -> Integer
-0 % 1 :: Ratio Integer
-1 % 1 :: Ratio Integer
-0 :: Integer
-1 :: Integer
-
-            denominator (abs q) == denominator q
-         denominator (negate q) == denominator q
-              numerator (x % 1) == x
-            denominator (x % 1) == 1
-        denominator (q + 1 % 1) == denominator q
-  numerator (1 % denominator q) == 1
-denominator (1 % denominator q) == denominator q
-        denominator (q * abs r) == denominator (q * r)
-                           id q == q
-              negate (negate q) == q
-                      q + 0 % 1 == q
-                    q * (1 % 1) == q
-                    q / (1 % 1) == q
-                    q * (0 % 1) == 0 % 1
-                    abs (abs q) == abs q
-                 abs (negate q) == abs q
-                   q + negate q == 0 % 1
-              0 % denominator q == 0 % 1
-                          q + r == r + q
-                          q * r == r * q
-    numerator q % denominator q == q
-             q / negate (1 % 1) == negate q
-  denominator q % denominator q == 1 % 1
-                    abs (q * q) == q * q
-                   q * negate r == negate (q * r)
-                abs (q * abs r) == abs (q * r)
-                   negate q + r == negate (q + negate r)
-                  abs q * abs r == abs (q * r)
-                abs (q + abs q) == q + abs q
-                  abs q + abs q == abs (q + q)
-            abs (1 % 1 + abs q) == 1 % 1 + abs q
-        abs (1 % denominator q) == 1 % denominator q
-        abs (denominator q % 1) == denominator q % 1
-      recip (1 % denominator q) == denominator q % 1
-      recip (denominator q % 1) == 1 % denominator q
- x % numerator (negate (1 % 1)) == negate (x % 1)
-                    (q + r) + s == q + (r + s)
-                    (q * r) * s == q * (r * s)
-                    (q + q) * r == q * (r + r)
-                q * (r + 1 % 1) == q + q * r
-          numerator (abs q) % 1 == abs (numerator q % 1)
-       numerator (negate q) % 1 == negate (numerator q % 1)
-
-                         0 <= denominator q
-                         1 <= denominator q
-                         0 <= numerator (abs q)
-               numerator q <= numerator (abs q)
-                         0 <= numerator (q * q)
-numerator (negate (abs q)) <= 0
-               numerator q <= numerator (q * q)
-             denominator q <= denominator (q * q)
-       denominator (q + q) <= denominator q
-               numerator q <= numerator (q + 1 % 1)
-      numerator (negate q) <= numerator (abs q)
-numerator (negate (abs q)) <= numerator q
-         numerator (abs q) <= numerator (q * q)
-numerator (negate (abs q)) <= numerator (negate q)
-                         q <= abs q
-                     0 % 1 <= abs q
-                         q <= q + 1 % 1
-                     0 % 1 <= q * q
-                  negate q <= abs q
-            negate (abs q) <= q
-            negate (abs q) <= 0 % 1
-                         q <= q + abs r
-                         q <= abs (q + q)
-            negate (abs q) <= negate q
-                         q <= 1 % 1 + abs q
-                     0 % 1 <= q + abs q
-            negate (q * q) <= 0 % 1
-        q + negate (1 % 1) <= q
-                     0 % 1 <= 1 % denominator q
-                     0 % 1 <= denominator q % 1
-                     1 % 1 <= denominator q % 1
-         1 % denominator q <= 1 % 1
-                     abs q <= abs (q + q)
-        negate (q + 1 % 1) <= negate q
-                     q + r <= q + abs r
-                 q * abs q <= q * q
-        negate (q + 1 % 1) <= q * q
-            negate (q * q) <= q + 1 % 1
-        q + negate (1 % 1) <= q * q
-                 q * abs r <= abs (q * r)
-              q + negate r <= q + abs r
-         x % denominator q <= abs (x % 1)
-                 q + abs q <= abs (q + q)
-            negate (q * q) <= q * abs q
-            negate (q * q) <= 1 % 1 + negate q
-           abs (q + 1 % 1) <= 1 % 1 + abs q
-
diff --git a/tests/model/regexes-s4.out b/tests/model/regexes-s4.out
deleted file mode 100644
--- a/tests/model/regexes-s4.out
+++ /dev/null
@@ -1,45 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =   30
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: RE Symbol
-Empty :: RE Symbol
-None :: RE Symbol
-Star :: RE Symbol -> RE Symbol
-(:+) :: RE Symbol -> RE Symbol -> RE Symbol
-(:.) :: RE Symbol -> RE Symbol -> RE Symbol
-(<=) :: RE Symbol -> RE Symbol -> Bool
-(==) :: RE Symbol -> RE Symbol -> Bool
-False :: Bool
-True :: Bool
-
-     (r <= Empty) == True
-      (None <= r) == True
-    (r <= Star s) == True
- (Star r <= None) == False
-     (r == Empty) == (Empty <= r)
-      (r == None) == (r <= None)
-    (r == Star s) == (Star s <= r)
-           r :+ r == r
-        r :+ None == r
-       r :. Empty == r
-        r :. None == None
-    Star (Star r) == Star r
-           r :+ s == s :+ r
-           r :. s == s :. r
-      r :+ Star r == Star r
-Star (r :+ Empty) == Star r
-  Empty :+ Star r == Star r
-
- r <= None ==> r <= s
-      None <=  r
-         r <=  Star r
-     Empty <=  Star r
-         r <=  r :+ s
-    r :. r <=  Star r
-r :+ Empty <=  Star r
-    r :. s <=  r :+ s
-
diff --git a/tests/model/regexes.out b/tests/model/regexes.out
deleted file mode 100644
--- a/tests/model/regexes.out
+++ /dev/null
@@ -1,45 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =   30
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: RE Symbol
-Empty :: RE Symbol
-None :: RE Symbol
-Star :: RE Symbol -> RE Symbol
-(:+) :: RE Symbol -> RE Symbol -> RE Symbol
-(:.) :: RE Symbol -> RE Symbol -> RE Symbol
-(<=) :: RE Symbol -> RE Symbol -> Bool
-(==) :: RE Symbol -> RE Symbol -> Bool
-False :: Bool
-True :: Bool
-
-     (r <= Empty) == True
-      (None <= r) == True
-    (r <= Star s) == True
- (Star r <= None) == False
-     (r == Empty) == (Empty <= r)
-      (r == None) == (r <= None)
-    (r == Star s) == (Star s <= r)
-           r :+ r == r
-        r :+ None == r
-       r :. Empty == r
-        r :. None == None
-    Star (Star r) == Star r
-           r :+ s == s :+ r
-           r :. s == s :. r
-      r :+ Star r == Star r
-Star (r :+ Empty) == Star r
-  Empty :+ Star r == Star r
-
- r <= None ==> r <= s
-      None <=  r
-         r <=  Star r
-     Empty <=  Star r
-         r <=  r :+ s
-    r :. r <=  Star r
-r :+ Empty <=  Star r
-    r :. s <=  r :+ s
-
diff --git a/tests/model/sets-s4.out b/tests/model/sets-s4.out
deleted file mode 100644
--- a/tests/model/sets-s4.out
+++ /dev/null
@@ -1,50 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Int
-_ :: Set Int
-emptyS :: Set Int
-singleS :: Int -> Set Int
-insertS :: Int -> Set Int -> Set Int
-deleteS :: Int -> Set Int -> Set Int
-sizeS :: Set Int -> Int
-(<~) :: Int -> Set Int -> Bool
-(\/) :: Set Int -> Set Int -> Set Int
-(/\) :: Set Int -> Set Int -> Set Int
-False :: Bool
-True :: Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: Int -> Int -> Bool
-(==) :: Set Int -> Set Int -> Bool
-
-          x <~ emptyS == False
-       x <~ singleS x == True
-(emptyS == singleS x) == False
-             (x == y) == x <~ singleS y
-       x <~ singleS y == y <~ singleS x
-    sizeS (singleS x) == sizeS (singleS y)
-               s \/ s == s
-               s /\ s == s
-          s \/ emptyS == s
-     deleteS x emptyS == emptyS
-          s /\ emptyS == emptyS
-     insertS x emptyS == singleS x
-deleteS x (singleS x) == emptyS
-               s \/ t == t \/ s
-               s /\ t == t /\ s
-insertS x (singleS x) == singleS x
-       s \/ singleS x == insertS x s
-insertS x (singleS y) == insertS y (singleS x)
-
-          sizeS emptyS <= sizeS s
-                emptyS <= s
-singleS (sizeS emptyS) <= singleS (sizeS s)
-
-x <~ s ==>    insertS x s == s
-x <~ s ==> s /\ singleS x == singleS x
-
diff --git a/tests/model/sets.out b/tests/model/sets.out
deleted file mode 100644
--- a/tests/model/sets.out
+++ /dev/null
@@ -1,81 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Int
-_ :: Set Int
-emptyS :: Set Int
-singleS :: Int -> Set Int
-insertS :: Int -> Set Int -> Set Int
-deleteS :: Int -> Set Int -> Set Int
-sizeS :: Set Int -> Int
-(<~) :: Int -> Set Int -> Bool
-(\/) :: Set Int -> Set Int -> Set Int
-(/\) :: Set Int -> Set Int -> Set Int
-False :: Bool
-True :: Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: Int -> Int -> Bool
-(==) :: Set Int -> Set Int -> Bool
-
-                  x <~ emptyS == False
-               x <~ singleS x == True
-        (emptyS == singleS x) == False
-             x <~ insertS x s == True
-             x <~ deleteS x s == False
-      (emptyS == insertS x s) == False
-                     (x == y) == x <~ singleS y
-           (s == insertS x s) == x <~ s
-               x <~ singleS y == y <~ singleS x
-     (singleS x == singleS y) == x <~ singleS y
-                (s /\ t == s) == (t == s \/ t)
-           (s == deleteS x s) == (False == x <~ s)
-            sizeS (singleS x) == sizeS (singleS y)
-sizeS (deleteS x (singleS y)) == sizeS (deleteS y (singleS x))
-                       s \/ s == s
-                       s /\ s == s
-                  s \/ emptyS == s
-             deleteS x emptyS == emptyS
-                  s /\ emptyS == emptyS
-             insertS x emptyS == singleS x
-        deleteS x (singleS x) == emptyS
-                       s \/ t == t \/ s
-                       s /\ t == t /\ s
-             s \/ deleteS x s == s
-                s \/ (s /\ t) == s
-             s /\ insertS x s == s
-                s /\ (s \/ t) == s
-        insertS x (singleS x) == singleS x
-               s \/ singleS x == insertS x s
-      insertS x (insertS x s) == insertS x s
-      deleteS x (deleteS x s) == deleteS x s
-      insertS x (deleteS x s) == insertS x s
-      deleteS x (insertS x s) == deleteS x s
-        insertS x (singleS y) == insertS y (singleS x)
-      insertS x (insertS y s) == insertS y (insertS x s)
-      deleteS x (deleteS y s) == deleteS y (deleteS x s)
-                (s \/ t) \/ u == s \/ (t \/ u)
-                (s /\ t) /\ u == s /\ (t /\ u)
-             s \/ insertS x t == insertS x (s \/ t)
-             s /\ deleteS x t == deleteS x (s /\ t)
-
-          s == singleS x ==> x <~ s
-            sizeS emptyS <=  sizeS s
-                 sizeS s <=  sizeS (insertS x s)
-                 sizeS s <=  sizeS (s \/ t)
-     sizeS (deleteS x s) <=  sizeS s
-          sizeS (s /\ t) <=  sizeS s
-       sizeS (singleS x) <=  sizeS (insertS y s)
-     sizeS (deleteS x s) <=  sizeS (t \/ s)
-                  emptyS <=  s
-   deleteS x (singleS y) <=  singleS y
-          s /\ singleS x <=  singleS x
-  singleS (sizeS emptyS) <=  singleS (sizeS s)
-insertS (sizeS emptyS) s <=  singleS (sizeS s)
-insertS (sizeS emptyS) s <=  singleS (sizeS (singleS x))
-
-
diff --git a/tests/model/speculate-reason-s4.out b/tests/model/speculate-reason-s4.out
deleted file mode 100644
--- a/tests/model/speculate-reason-s4.out
+++ /dev/null
@@ -1,28 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   = 6000
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Equation
-_ :: Expr
-_ :: Thyght
-_ :: [Expr]
-okThy :: Thyght -> Bool
-insert :: Expr -> Thyght -> Thyght
-complete :: Thyght -> Thyght
-normalize :: Thyght -> Expr -> Expr
-equivalent :: Thyght -> Expr -> Expr -> Bool
-append :: Thyght -> [Expr] -> Thyght
-emptyThy :: Thyght
-True :: Bool
-False :: Bool
-Equation :: Expr -> Expr -> Equation
-
-              okThy t == True
-     equivalent t e e == True
-     equivalent t e f == equivalent t f e
- normalize emptyThy e == e
-complete (complete t) == complete t
-
diff --git a/tests/model/speculate-reason.out b/tests/model/speculate-reason.out
deleted file mode 100644
--- a/tests/model/speculate-reason.out
+++ /dev/null
@@ -1,28 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   = 6000
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Equation
-_ :: Expr
-_ :: Thyght
-_ :: [Expr]
-okThy :: Thyght -> Bool
-insert :: Expr -> Thyght -> Thyght
-complete :: Thyght -> Thyght
-normalize :: Thyght -> Expr -> Expr
-equivalent :: Thyght -> Expr -> Expr -> Bool
-append :: Thyght -> [Expr] -> Thyght
-emptyThy :: Thyght
-True :: Bool
-False :: Bool
-Equation :: Expr -> Expr -> Equation
-
-              okThy t == True
-     equivalent t e e == True
-     equivalent t e f == equivalent t f e
- normalize emptyThy e == e
-complete (complete t) == complete t
-
diff --git a/tests/model/string-s4.out b/tests/model/string-s4.out
deleted file mode 100644
--- a/tests/model/string-s4.out
+++ /dev/null
@@ -1,47 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: [Char]
-_ :: [[Char]]
-"" :: [Char]
-" " :: [Char]
-"\n" :: [Char]
-lines :: [Char] -> [[Char]]
-words :: [Char] -> [[Char]]
-unlines :: [[Char]] -> [Char]
-unwords :: [[Char]] -> [Char]
-(++) :: [Char] -> [Char] -> [Char]
-
-                     cs ++ "" == cs
-                     "" ++ cs == cs
-unlines (lines (unlines css)) == unlines css
-   lines (unlines (lines cs)) == lines cs
-   words (unlines (words cs)) == words cs
-   lines (unlines (words cs)) == words cs
-   words (unlines (lines cs)) == words cs
-          words (unwords css) == words (unlines css)
-            words (cs ++ " ") == words cs
-           words (cs ++ "\n") == words cs
-            words (" " ++ cs) == words cs
-           words ("\n" ++ cs) == words cs
-
-                 "" <= cs
-                 cs <= cs ++ ds
-                 cs <= unlines (lines cs)
-               "\n" <= cs ++ "\n"
-               "\n" <= cs ++ " "
-         "\n" ++ cs <= " "
- unwords (lines cs) <= cs ++ ds
-         "\n" ++ cs <= ds ++ " "
- unlines (lines cs) <= cs ++ cs
-         "\n" ++ cs <= cs ++ "\n"
-         cs ++ "\n" <= cs ++ " "
- unlines (lines cs) <= cs ++ " "
- unlines (lines cs) <= cs ++ "\n"
-           lines "" <= css
-lines (unlines css) <= css
-
diff --git a/tests/model/string.out b/tests/model/string.out
deleted file mode 100644
--- a/tests/model/string.out
+++ /dev/null
@@ -1,73 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: [Char]
-_ :: [[Char]]
-"" :: [Char]
-" " :: [Char]
-"\n" :: [Char]
-lines :: [Char] -> [[Char]]
-words :: [Char] -> [[Char]]
-unlines :: [[Char]] -> [Char]
-unwords :: [[Char]] -> [Char]
-(++) :: [Char] -> [Char] -> [Char]
-
-                            cs ++ "" == cs
-                            "" ++ cs == cs
-       unlines (lines (unlines css)) == unlines css
-unwords (lines (unwords (lines cs))) == unwords (lines cs)
-unwords (lines (unwords (words cs))) == unwords (words cs)
-        unlines (lines (cs ++ "\n")) == cs ++ "\n"
-                    (cs ++ ds) ++ es == cs ++ (ds ++ es)
-            cs ++ unlines (lines cs) == unlines (lines (cs ++ cs))
-           cs ++ unlines (lines " ") == unlines (lines (cs ++ " "))
-           " " ++ unwords (lines cs) == unwords (lines (" " ++ cs))
-          "\n" ++ unlines (lines cs) == unlines (lines ("\n" ++ cs))
-           unlines (lines " ") ++ cs == " " ++ ("\n" ++ cs)
-          lines (unlines (lines cs)) == lines cs
-          words (unlines (words cs)) == words cs
-          lines (unlines (words cs)) == words cs
-          words (unlines (lines cs)) == words cs
-                 words (unwords css) == words (unlines css)
-                   words (cs ++ " ") == words cs
-                  words (cs ++ "\n") == words cs
-                   words (" " ++ cs) == words cs
-                  words ("\n" ++ cs) == words cs
-           words (cs ++ unwords css) == words (cs ++ unlines css)
-
-                           "" <= cs
-                           cs <= cs ++ ds
-                           cs <= unlines (lines cs)
-                         "\n" <= cs ++ "\n"
-                         "\n" <= cs ++ " "
-                   "\n" ++ cs <= " "
-           unwords (lines cs) <= cs ++ ds
-                   "\n" ++ cs <= ds ++ " "
-           unlines (lines cs) <= cs ++ cs
-unwords (lines (unwords css)) <= unwords css
-                   "\n" ++ cs <= cs ++ "\n"
-                  unwords css <= unwords (lines (unlines css))
-                   cs ++ "\n" <= cs ++ " "
-                  unlines css <= unwords css ++ " "
-                  unlines css <= unwords css ++ "\n"
-           unlines (lines cs) <= cs ++ " "
-           unlines (lines cs) <= cs ++ "\n"
-unwords (lines (unlines css)) <= unwords css ++ cs
-           unlines css ++ " " <= unwords css ++ " "
-                     lines "" <= css
-          lines (unlines css) <= css
-                     lines cs <= lines (cs ++ ds)
-                     words cs <= words (cs ++ ds)
-                     words cs <= lines (unwords (words cs))
-                   lines "\n" <= lines (cs ++ "\n")
-                   lines "\n" <= lines (cs ++ " ")
-           lines ("\n" ++ cs) <= lines " "
-   lines (unwords (lines cs)) <= lines (cs ++ ds)
-           lines ("\n" ++ cs) <= lines (ds ++ " ")
-           lines ("\n" ++ cs) <= lines (cs ++ "\n")
-           lines (cs ++ "\n") <= lines (cs ++ " ")
-
diff --git a/tests/model/tauts-s4.out b/tests/model/tauts-s4.out
deleted file mode 100644
--- a/tests/model/tauts-s4.out
+++ /dev/null
@@ -1,33 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   = 4000
-min  #-tests   =  200  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Name
-_ :: Prop
-False :: Bool
-True :: Bool
-(==) :: Prop -> Prop -> Bool
-eval :: Prop -> Prop
-varOf :: Prop -> Name
-subst :: Name -> Bool -> Prop -> Prop
-taut :: Prop -> Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: Name -> Name -> Bool
-
-     (p == p) == True
-     (p == p) == True
-  (p == True) == p
-     (n == n) == True
-taut (eval p) == taut p
-     (p == q) == (q == p)
-eval (eval p) == eval p
-
-    p ==> True
-False ==> p
-
-p ==> subst n True q == subst n p q
-
diff --git a/tests/model/tauts.out b/tests/model/tauts.out
deleted file mode 100644
--- a/tests/model/tauts.out
+++ /dev/null
@@ -1,37 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   = 4000
-min  #-tests   =  200  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Name
-_ :: Prop
-False :: Bool
-True :: Bool
-(==) :: Prop -> Prop -> Bool
-eval :: Prop -> Prop
-varOf :: Prop -> Name
-subst :: Name -> Bool -> Prop -> Prop
-taut :: Prop -> Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: Name -> Name -> Bool
-
-     (p == p) == True
-     (p == p) == True
-  (p == True) == p
-     (n == n) == True
-taut (eval p) == taut p
-     (p == q) == (q == p)
-eval (eval p) == eval p
-
-              p ==> True
-          False ==> p
-    p == eval q ==> p == eval p
-    subst n p q <=  q
-    subst n p q <=  subst n True q
-subst n False p <=  subst n q p
-
-taut q ==> subst n (taut q) p == subst n True p
-
diff --git a/tests/model/tuples-s4.out b/tests/model/tuples-s4.out
deleted file mode 100644
--- a/tests/model/tuples-s4.out
+++ /dev/null
@@ -1,36 +0,0 @@
-max expr size  =    4
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    3  (for inequational and conditional laws)
-
-_ :: ()
-_ :: Int
-_ :: (Int,Int)
-_ :: (Int,Int,Int)
-() :: ()
-id :: () -> ()
-id :: Int -> Int
-id :: (Int,Int) -> (Int,Int)
-id :: (Int,Int,Int) -> (Int,Int,Int)
-(,) :: Int -> Int -> (Int,Int)
-(,,) :: Int -> Int -> Int -> (Int,Int,Int)
-fst :: (Int,Int) -> Int
-snd :: (Int,Int) -> Int
-swap :: (Int,Int) -> (Int,Int)
-right :: (Int,Int,Int) -> (Int,Int,Int)
-left :: (Int,Int,Int) -> (Int,Int,Int)
-
-                     id x == x
-                fst (x,y) == x
-                snd (x,y) == y
-            fst (swap xy) == snd xy
-            snd (swap xy) == fst xy
-                    id xy == xy
-           swap (swap xy) == xy
-               swap (x,y) == (y,x)
-                   id xyz == xyz
-right (right (right xyz)) == xyz
-                 left xyz == right (right xyz)
-
-
diff --git a/tests/model/tuples.out b/tests/model/tuples.out
deleted file mode 100644
--- a/tests/model/tuples.out
+++ /dev/null
@@ -1,35 +0,0 @@
-max expr size  =    5
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    3  (for inequational and conditional laws)
-
-_ :: ()
-_ :: Int
-_ :: (Int,Int)
-_ :: (Int,Int,Int)
-() :: ()
-id :: () -> ()
-id :: Int -> Int
-id :: (Int,Int) -> (Int,Int)
-id :: (Int,Int,Int) -> (Int,Int,Int)
-(,) :: Int -> Int -> (Int,Int)
-(,,) :: Int -> Int -> Int -> (Int,Int,Int)
-fst :: (Int,Int) -> Int
-snd :: (Int,Int) -> Int
-swap :: (Int,Int) -> (Int,Int)
-right :: (Int,Int,Int) -> (Int,Int,Int)
-left :: (Int,Int,Int) -> (Int,Int,Int)
-
-                     id x == x
-                fst (x,y) == x
-                snd (x,y) == y
-                    id xy == xy
-          (fst xy,snd xy) == xy
-                  swap xy == (snd xy,fst xy)
-                   id xyz == xyz
-right (right (right xyz)) == xyz
-                 left xyz == right (right xyz)
-            right (x,y,z) == (z,x,y)
-
-
diff --git a/tests/model/unit-s4.out b/tests/model/unit-s4.out
deleted file mode 100644
--- a/tests/model/unit-s4.out
+++ /dev/null
@@ -1,13 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    3
-  |- on conds  =    3
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: ()
-() :: ()
-id :: () -> ()
-
-
-
diff --git a/tests/model/unit.out b/tests/model/unit.out
deleted file mode 100644
--- a/tests/model/unit.out
+++ /dev/null
@@ -1,13 +0,0 @@
-max expr size  =    5
-  |- on ineqs  =    4
-  |- on conds  =    4
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    2  (for inequational and conditional laws)
-
-_ :: ()
-() :: ()
-id :: () -> ()
-
-
-
diff --git a/tests/model/zip-s4.out b/tests/model/zip-s4.out
deleted file mode 100644
--- a/tests/model/zip-s4.out
+++ /dev/null
@@ -1,23 +0,0 @@
-max expr size  =    4
-  |- on ineqs  =    5
-  |- on conds  =    5
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    3  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Int
-_ :: [Int]
-_ :: [(Int,Int)]
-(++) :: [Int] -> [Int] -> [Int]
-(==) :: Int -> Int -> Bool
-length :: [Int] -> Int
-zip :: [Int] -> [Int] -> [(Int,Int)]
-True :: Bool
-False :: Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: [Int] -> [Int] -> Bool
-(==) :: [(Int,Int)] -> [(Int,Int)] -> Bool
-
-
-
diff --git a/tests/model/zip.out b/tests/model/zip.out
deleted file mode 100644
--- a/tests/model/zip.out
+++ /dev/null
@@ -1,25 +0,0 @@
-max expr size  =    5
-max  #-tests   =  500
-min  #-tests   =   25  (to consider p ==> q true)
-max  #-vars    =    3  (for inequational and conditional laws)
-
-_ :: Bool
-_ :: Int
-_ :: [Int]
-_ :: [(Int,Int)]
-(++) :: [Int] -> [Int] -> [Int]
-(==) :: Int -> Int -> Bool
-length :: [Int] -> Int
-zip :: [Int] -> [Int] -> [(Int,Int)]
-True :: Bool
-False :: Bool
-(==) :: Bool -> Bool -> Bool
-(==) :: [Int] -> [Int] -> Bool
-(==) :: [(Int,Int)] -> [(Int,Int)] -> Bool
-
-zip xs (xs ++ ys) == zip xs xs
-zip (xs ++ ys) xs == zip xs xs
-
-length xs == length ys ==> zip xs (ys ++ zs) == zip xs ys
-length xs == length ys ==> zip (xs ++ zs) ys == zip xs ys
-
diff --git a/tests/test-creason.hs b/tests/test-creason.hs
deleted file mode 100644
--- a/tests/test-creason.hs
+++ /dev/null
@@ -1,61 +0,0 @@
--- Test library
-import Test
-
--- Functions under test
-import Test.Speculate.CondReason
-
--- Utils
-import Test.Speculate.Reason (canonicalEqn, canonicalizeEqn, emptyThy)
-import Test.Speculate.Expr (val)
-
-main :: IO ()
-main = mainTest tests 10000
-
-tests :: Int -> [Bool]
-tests n =
-  [ True
-
-  , creductions1 (zero -<=- yy) (yy -+- abs' yy) (zero -<=- xx, abs' xx, xx)
-    == [yy -+- yy]
-
-  , creductions1 (zero -<=- yy) (abs' yy -+- abs' yy) (zero -<=- xx, abs' xx, xx)
-    == [yy -+- abs' yy, abs' yy -+- yy]
-
-  , cnormalize
-      emptyChy{cequations = [(zero -<=- xx, abs' xx, xx)]}
-      (zero -<=- yy) (abs' yy -+- abs' yy)
-    == yy -+- yy
-
-  , not
-  $ cequivalent
-      emptyChy{cequations = []}
-      (zero -<=- yy) (abs' yy -+- yy) (yy -+- yy)
-
-  , cequivalent
-      emptyChy{cequations = [(zero -<=- xx, abs' xx, xx)]}
-      (zero -<=- yy) (abs' yy -+- yy) (yy -+- yy)
-
-  , holds n $ \e1 e2    -> canonicalCEqn compare (val False,e1,e2) == canonicalEqn emptyThy (e1,e2)
-  , holds n $ \e1 e2    -> sndTrd (canonicalizeCEqn compare (val False,e1,e2))
-                        == canonicalizeEqn emptyThy (e1,e2)
-  , holds n $ \e1 e2 ce -> sndTrd (canonicalizeCEqn compare (val False,e1,e2))
-                        == sndTrd (canonicalizeCEqn compare (ce,    e1,e2))
-
-  , const True -- TODO: make the following test pass!
-  $ let chy = cinsert ( elem' xx xxs
-                      , insert' xx (xxs -++- yys)
-                      , insert' xx xxs -++- yys
-                      )
-                      emptyChy
-    in cnormalize chy (elem' xx xxs) (insert' xx (xxs -++- yys)) == insert' xx xxs -++- yys
-
-  , const True -- TODO: make the following test pass!
-  $ creductions1 (elem' xx xxs) (insert' xx (xxs -++- yys))
-      ( elem' xx xxs, insert' xx (xxs -++- yys), insert' xx xxs -++- yys)
-    == [insert' xx xxs -++- yys]
-
-  , const True -- TODO: make the following test pass!
-  $ holds n $ \(BoolE ce) (SameTypeE e1 e2) -> creductions1 ce e1 (ce,e1,e2) == [e2]
-  ]
-  where
-  sndTrd (_,y,z) = (y,z)
diff --git a/tests/test-engine.hs b/tests/test-engine.hs
deleted file mode 100644
--- a/tests/test-engine.hs
+++ /dev/null
@@ -1,93 +0,0 @@
--- Test library
-import Test
-
--- Functions under test
-import Test.Speculate.Engine
-
--- Helper functions
-import Test.Speculate.Reason (emptyThy)
-import Test.Speculate.Utils
-
-main :: IO ()
-main = mainTest tests 10000
-
-tests :: Int -> [Bool]
-tests n =
-  [ True
-  
-  , holds n $ \e -> mostGeneral  e == head (fastCanonicalVariations e)
-  , holds n $ \e -> mostSpecific e == last (fastCanonicalVariations e)
-  , holds n $ \e -> allLater (\e1 e0 -> not (e0 `isInstanceOf` e1))
-                  $ fastCanonicalVariations e
-
-  , equivalencesBetween (===) (i_ -+- i_) (i_ -+- i_)
-    == [ ( xx -+- yy, yy -+- xx ) ]
-
-  , equivalencesBetween (===) (i_ -+- (i_ -+- i_)) ((i_ -+- i_) -+- i_)
-    == [ ( xx -+- (yy -+- zz), (xx -+- yy) -+- zz )
-       , ( xx -+- (yy -+- zz), (xx -+- zz) -+- yy )
-       , ( xx -+- (yy -+- zz), (yy -+- xx) -+- zz )
-       , ( xx -+- (yy -+- zz), (yy -+- zz) -+- xx )
-       , ( xx -+- (yy -+- zz), (zz -+- xx) -+- yy )
-       , ( xx -+- (yy -+- zz), (zz -+- yy) -+- xx ) ]
-
--- TODO: make the following pass (add ValueE and SameTypeValueE to Test)
---, holds n $ \(SameTypeE e1 e2) (SameTypeE e3 e4)
---         -> subConsequence emptyThy (e1 -==- e2) e3 e4
---         == subConsequence emptyThy (e2 -==- e1) e3 e4
---, holds n $ \(SameTypeE e1 e2) (SameTypeE e3 e4)
---         -> subConsequence emptyThy (e1 -==- e2) e3 e4
---         == subConsequence emptyThy (e1 -==- e2) e4 e3
---, holds n $ \...
---         -> not $ subConsequence emptyThy (e1 -<=- e2) e3 e4
-  ,       subConsequence emptyThy [] (xx -==- yy) (xx -+- yy) (xx -+- xx)
-  , not $ subConsequence emptyThy [] (xx -<=- yy) (xx -+- yy) (xx -+- xx)
-  ,       subConsequence emptyThy [(xx -<=- yy, [xx -==- yy])]
-                                     (xx -<=- yy) (xx -+- yy) (xx -+- xx)
-  ,       subConsequence emptyThy [] (abs' xx -==- abs' yy) (abs' xx) (abs' yy)
-  , not $ subConsequence emptyThy [] (abs' xx -<=- abs' yy) (abs' xx) (abs' yy)
-  , not $ subConsequence emptyThy [] (abs' xx -==- one) (xx -+- abs' xx) zero
-
-  , holds n $ \e -> length (expansions preludeInstances 1 e) == 1
-
-  , expansions preludeInstances 2 (i_ -+- i_)
-    == [ xx -+- xx
-       , xx -+- yy
-       , yy -+- xx
-       , yy -+- yy ]
-
-  , expansions preludeInstances 2 (i_ -+- i_ -+- ord' c_)
-    == [ xx -+- xx -+- ord' cc
-       , xx -+- xx -+- ord' dd
-       , xx -+- yy -+- ord' cc
-       , xx -+- yy -+- ord' dd
-       , yy -+- xx -+- ord' cc
-       , yy -+- xx -+- ord' dd
-       , yy -+- yy -+- ord' cc
-       , yy -+- yy -+- ord' dd ]
-
-  , expansionsOfType i_ ["x","y"] (i_ -+- i_ -+- ord' c_)
-    == [ xx -+- xx -+- ord' c_
-       , xx -+- yy -+- ord' c_
-       , yy -+- xx -+- ord' c_
-       , yy -+- yy -+- ord' c_ ]
-
-  , expansionsOfType i_ [] (i_ -+- i_ -+- ord' c_) == []
-
-  , expansionsWith [xx, yy]     (i_ -+- i_ -+- ord' c_)
-    == [ xx -+- xx -+- ord' c_
-       , xx -+- yy -+- ord' c_
-       , yy -+- xx -+- ord' c_
-       , yy -+- yy -+- ord' c_ ]
-
-  , expansionsWith [cc]         (i_ -+- i_ -+- ord' c_)
-    == [ i_ -+- i_ -+- ord' cc ]
-
-  , expansionsWith [xx, yy, cc] (i_ -+- i_ -+- ord' c_)
-    == [ xx -+- xx -+- ord' cc
-       , xx -+- yy -+- ord' cc
-       , yy -+- xx -+- ord' cc
-       , yy -+- yy -+- ord' cc ]
-  ]
-  where
-  x === y = equal preludeInstances 1000 x y
diff --git a/tests/test-eval.hs b/tests/test-eval.hs
deleted file mode 100644
--- a/tests/test-eval.hs
+++ /dev/null
@@ -1,61 +0,0 @@
--- Test library
-import Test
-
--- Functions under test
-import Test.Speculate.Expr.Ground
-import Test.Speculate.Expr
-
--- TODO: rename test-eval to test-ground
-
-main :: IO ()
-main = mainTest tests 10000
-
-tests :: Int -> [Bool]
-tests n =
-  [ True
-
-  ,                                    xx -+- yy === yy -+- xx
-  , holds n' $ \(IntE e1) (IntE e2) -> notUndefined e1 && notUndefined e2
-                                   ==> e1 -+- e2 === e2 -+- e1
-  ,                                    xx -+- yy =/= xx -+- xx
-  ,                                      abs' xx === abs' (abs' xx)
-  ,                      abs' (xx -+- abs' xx) === (xx -+- abs' xx) -- 2*x or 0
-  , holds n' $ \e1 e2 -> typ e1 /= typ e2 ==> e1 =/= e2
-
-  , holds n' $ \e1 e2 -> let e1e2 = mkEquation preludeInstances e1 e2
-                         in  notUndefined e1 && notUndefined e2 && isEquation e1e2
-                         ==> condEqual preludeInstances 500 e1e2 e1 e2
-  , holds n' $ \e1 e2 -> let e1e2 = mkEquation preludeInstances e1 e2
-                         in  notUndefined e1 && notUndefined e2 && isEquation e1e2
-                         ==> condEqualM preludeInstances 500 0 e1e2 e1 e2
-  , fails n' $ \e1 e2 -> let e1e2 = mkEquation preludeInstances e1 e2
-                         in  isEquation e1e2
-                         ==> condEqualM preludeInstances 500 500 e1e2 e1 e2
-
-  , holds n $ ordOK -:> int
-  , holds n $ ordOK -:> ()
-  , holds n $ ordOK -:> bool
-  , holds n $ ordOK -:> [int]
-  ]
-  where
-  notUndefined e = e === e
-  n' = n `div` 50
-  x === y = equal preludeInstances 500 x y
-  infix 4 ===
-  x =/= y = not (x === y)
-  infix 4 =/=
-
-(*==*), (*/=*), (*<=*), (*<*) :: (Show a, Typeable a) => a -> a -> Bool
-x *==* y = eval undefined $ val x -==- val y
-x */=* y = eval undefined $ val x -/=- val y
-x *<=* y = eval undefined $ val x -<=- val y
-x *<*  y = eval undefined $ val x -<-  val y
-
-eqOK :: (Eq a, Show a, Typeable a) => a -> a -> Bool
-eqOK x y =  (x *==* y) == (x == y)
-         && (x */=* y) == (x /= y)
-
-ordOK :: (Eq a, Ord a, Show a, Typeable a) => a -> a -> Bool
-ordOK x y =  eqOK x y
-          && (x *<=* y) == (x <= y)
-          && (x *<*  y) == (x <  y)
diff --git a/tests/test-expr.hs b/tests/test-expr.hs
deleted file mode 100644
--- a/tests/test-expr.hs
+++ /dev/null
@@ -1,83 +0,0 @@
--- Test library
-import Test
-
--- Functions under test
-import Test.Speculate.Expr
-
--- Helper functions
-import Data.Functor ((<$>)) -- for GHC < 7.10
-
-main :: IO ()
-main = mainTest tests 10000
-
-tests :: Int -> [Bool]
-tests n =
-  [ True
-
-  , ((xx -+- yy) -+- (yy -+- zz)) //- [(yy, yy -+- zz)]
-      == (xx -+- (yy -+- zz)) -+- ((yy -+- zz) -+- zz)
-
-  , (xx -+- yy) // [(yy, yy -+- zz), (xx, xx -+- yy)]
-      == (xx -+- yy) -+- (yy -+- zz)
-
-  , sub (xx -+- yy) zero ((xx -+- yy) -+- zz) == (zero -+- zz)
-  , sub (xx -+- yy) zero (xx -+- (yy -+- zz)) == (xx -+- (yy -+- zz))
-
-  , holds n $ \(SameTypeE e1 e2) -> sub e1 e2 e1 == e2
-  , holds n $ \(IntE e1) (IntE e2) -> sub e1 e2 (e1 -+- e1) == (e2 -+- e2)
-
-  , holds n $ \(SameTypeE e1 e2) -> unify e1 e2 =$ fmap canonicalize $= unify e2 e1
-
-  , unification xx yy == Just [(xx,yy)]
-  , (canonicalize <$> unify xx yy) == Just xx
-  , unification zero zero == Just []
-  , unification zero one  == Nothing
-  , unification xx one == Just [(xx,one)]
-  , unification (zero -+- xx) (zero -+- one) == Just [(xx,one)]
-  , unification (zero -+- xx) (yy -+- one) == Just [(xx,one),(yy,zero)]
-  , unify (zero -+- xx) (yy -+- one) == Just (zero -+- one)
-  , unification (foo xx) (foo (goo yy)) == Just [(xx,goo yy)]
-  , unification (foo xx -+- xx) (yy -+- zero) == Just [(xx,zero),(yy,foo zero)]
-  , unify (foo xx -+- xx) (yy -+- zero) == Just (foo zero -+- zero)
-  , unification (foo xx) (goo yy) == Nothing
-  , unification (foo xx) (foo yy) == unification xx yy
-  , (canonicalize <$> unify (negate' (negate' xx) -+- yy) (zz -+- zero))
-    == Just (negate' (negate' xx) -+- zero)
-  , unification (xx -+- one) (one -+- xx) == Just [(xx,one)]
-  , unification (xx -+- xx) (one -+- one) == Just [(xx,one)]
-  , unification (zz -+- zz) (xx -+- yy) == Just [(xx,yy),(zz,yy)]
-  , unification (xx     -*- (-+-) xx xx)
-                (foo zz -*- (-+-) xx yy) == Just [(yy,foo zz),(xx,foo zz)]
-
-  -- The following two tests are adapted from Baader and Snyder:
-  -- Example 2.8, Chapter 8, Handbook of Automated Reasoning (page 453).
-  , unification (hh5 yy zz (ff2 ii ii) (ff2 jj jj) kk) (hh5 (ff2 xx xx) (ff2 yy yy) jj kk zz)
-    == Just [ (ii,xx)
-            , (kk,ff2 (ff2 xx xx) (ff2 xx xx))
-            , (jj,ff2 xx xx)
-            , (zz,ff2 (ff2 xx xx) (ff2 xx xx))
-            , (yy,ff2 xx xx)
-            ]
-  , unification (hh7 yy zz xx' (ff2 ii ii) (ff2 jj jj) (ff2 kk kk) ii')
-                (hh7 (ff2 xx xx) (ff2 yy yy) (ff2 zz zz) jj kk ii' xx')
-    == Just [ (ii,xx)
-            , (ii',ff2 (ff2 (ff2 xx xx) (ff2 xx xx)) (ff2 (ff2 xx xx) (ff2 xx xx)))
-            , (kk,ff2 (ff2 xx xx) (ff2 xx xx))
-            , (jj,ff2 xx xx)
-            , (xx',ff2 (ff2 (ff2 xx xx) (ff2 xx xx)) (ff2 (ff2 xx xx) (ff2 xx xx)))
-            , (zz,ff2 (ff2 xx xx) (ff2 xx xx))
-            , (yy,ff2 xx xx)
-            ]
-  ]
-
-ff2 :: Expr -> Expr -> Expr
-ff2 e1 e2 = ffE :$ e1 :$ e2
-  where ffE = value "f" (undefined :: Int -> Int -> Int)
-
-hh5 :: Expr -> Expr -> Expr -> Expr -> Expr -> Expr
-hh5 e1 e2 e3 e4 e5 = hhE :$ e1 :$ e2 :$ e3 :$ e4 :$ e5
-  where hhE = value "h" (undefined :: Int -> Int -> Int -> Int -> Int -> Int)
-
-hh7 :: Expr -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr
-hh7 e1 e2 e3 e4 e5 e6 e7 = hhE :$ e1 :$ e2 :$ e3 :$ e4 :$ e5 :$ e6 :$ e7
-  where hhE = value "h" (undefined :: Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int)
diff --git a/tests/test-model b/tests/test-model
deleted file mode 100644
--- a/tests/test-model
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/bin/bash
-top=`dirname $0`/..
-eg=$top/eg
-model=$top/tests/model
-
-case "$1" in
-	-*) sz="$1"
-	    shift
-		;;
-esac
-
-test-model() {
-	$1 $sz | diff -rud $model/$2$sz.out - || exit 1
-}
-
-update-test-model() {
-	$1 $sz > $model/$2$sz.out
-}
-
-tym() {
-	/usr/bin/time -f%e "$@"
-}
-
-spc() {
-	/usr/bin/time -f%M "$@"
-}
-
-mean() {
-	sum="`echo -n $* | sed -e "s/ / + /g"`"
-	mean="`echo "scale = 3; ($sum) / $#" | bc`"
-	printf "%3.3f\n" $mean
-}
-export -f mean
-
-div1024() {
-	printf "%3.0f\n" "`echo "$1 / 1024" | bc`"
-}
-export -f div1024
-
-benchmark() {
-	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
-	printf "%-18s  " "$2$sz"
-	for run in {1..3}
-	do
-		tym $1 $sz 2>&1 >/dev/null
-	done | xargs bash -c 'mean "$@"' mean
-}
-
-memory-benchmark() {
-	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
-	printf "%-18s  " "$2$sz"
-	for run in {1..3}
-	do
-		spc $1 $sz 2>&1 >/dev/null
-	done | xargs bash -c 'mean    "$@"' mean |
-	       xargs bash -c 'div1024 "$@"' div1024
-}
-
-benchmark-cmp() {
-	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
-	grep "^ *$2$sz " bench/runtime-$HOSTNAME | tr '\n' ' '
-	echo -n ' '
-	for run in {1..1}
-	do
-		tym $1 $sz 2>&1 >/dev/null
-	done | xargs bash -c 'mean "$@"' mean
-}
-
-find $* | sed -e "s/^bench/     /;s/^eg/  /" |
-sort -b | sed -e "s/^     /bench/;s/^  /eg/" |
-while read e
-do
-	`basename $0` $top/$e `basename $e`
-done
diff --git a/tests/test-order.hs b/tests/test-order.hs
deleted file mode 100644
--- a/tests/test-order.hs
+++ /dev/null
@@ -1,140 +0,0 @@
-{-# Language DeriveDataTypeable, StandaloneDeriving #-} -- Travis
-import Test
-import Test.Speculate.Utils
-import qualified Test.LeanCheck.Utils as LC (comparison)
-
-import Test.Speculate.Expr
-import Test.Speculate.Reason (emptyThy)
-import Test.Speculate.Reason.Order
-
-import Data.Monoid ((<>))
-
--- for Travis:
-deriving instance Typeable Thyght
-deriving instance Typeable Equation
-
-main :: IO ()
-main = mainTest tests 10000
-
-tests :: Int -> [Bool]
-tests n =
-  [ True -- see test-expr.hs for general Expr orders
-
-  , holds n $ compare ==== (compareComplexity <> lexicompare)
-  , holds n $ LC.comparison lexicompare
-  , holds n $ LC.comparison compareComplexity
-
-  , holds n $ \(IntToIntE e1) (IntToIntE e2) (IntE e3) -> let cmp = lexicompare in
-                e1 `cmp` e2 == (e1 :$ e3) `cmp` (e2 :$ e3)
-  , holds n $ \(IntToIntE e1) (IntToIntE e2) (IntE e3) -> let cmp = lexicompareBy (flip compare) in
-                e1 `cmp` e2 == (e1 :$ e3) `cmp` (e2 :$ e3)
-  , holds n $ \(BoolToBoolE e1) (BoolToBoolE e2) (BoolE e3) -> let cmp = lexicompare in
-                e1 `cmp` e2 == (e1 :$ e3) `cmp` (e2 :$ e3)
-  , holds n $ \(BoolToBoolE e1) (BoolToBoolE e2) (BoolE e3) -> let cmp = lexicompareBy (flip compare) in
-                e1 `cmp` e2 == (e1 :$ e3) `cmp` (e2 :$ e3)
-
-  -- some tests of order
-  , value "xx" xx < zero
-  , value "xxeqxx" (Equation xx xx) < value "xx" xx
-  , value "xx" xx < value "emptyThyght" (Thyght emptyThy)
-
-  , holds n $ simplificationOrder (|>|)
-  , fails n $ simplificationOrder ( >|) -- TODO: make this pass (holds)
-  , fails n $ closedUnderSub ( >|) -- reason for the above, I believe this is an actual bug in >|
--- > > checkFor 5040 $ closedUnderSub ( >|)
--- > *** Failed! Falsifiable (after 3707 tests):
--- > (id _ :: Int) (id 0 :: Int) (0 :: Int)
--- > > closedUnderSub (>|) (id' xx) (id' zero) zero
--- > False
---
--- The above bug did exist before the introduction of Express and probably
--- since the creation of (>|).
-
--- TODO: fix the following two tests
--- > > checkFor 10080 $ simplificationOrder (dwoBy (<))
--- > *** Failed! Falsifiable (after 6901 tests):
--- > (f _ :: Int) (id _ :: Int) (_ :: Int)
--- > > checkFor 10080 $ simplificationOrder (|> )
--- > *** Failed! Falsifiable (after 6901 tests):
--- > (f _ :: Int) (id _ :: Int) (_ :: Int)
-
-  -- TODO: fix the following two tests with 10000 tests:
-  , holds 5040 $ simplificationOrder (|> )
-  , holds 5040 $ simplificationOrder (dwoBy (<))
-  , fails 10080 $ compatible (|>)
--- TODO: fix the following two tests
--- > > checkFor 10080 $ compatible    (|>)
--- > *** Failed! Falsifiable (after 6901 tests):
--- > (f _ :: Int) (id _ :: Int) (_ :: Int)
--- Like the one above
-
-
-  , fails n $ \e1 e2 -> (e1 |>| e2) == (e1 |>  e2)
-  , fails n $ \e1 e2 -> (e1 |>| e2) == (e1  >| e2)
-  , fails n $ \e1 e2 -> (e1 |>  e2) == (e1  >| e2)
-
-  , not $ zero |> xx
-  , not $ xx |> zero
-  , negate' xx |> zero
-  , negate' xx -+- xx |> zero
-  , zero > xx
-  , negateE > zero
-
-  , weight xx                            == 1
-  , weight zero                          == 1
-  , weight (xx -+- zero)                 == 2
-  , weight (one -+- yy)                  == 2
-  , weight (xx -*- (yy -+- zz))          == 3
-  , weight ((xx -*- yy) -+- (xx -*- zz)) == 4
-  , holds n $ \e1 e2 -> weight (e1 -+- e2)  == weight e1 + weight e2
-  , holds n $ \e     -> weight (e -+- zero) == 1 + weight e
-  , holds n $ \e     -> weight (abs' e)     == 1 + weight e
-  , holds n $ \e     -> weightExcept absE (abs' e)    <= weight e
-  , holds n $ \e     -> weightExcept absE (negate' e) <= weight e + 1
-  , holds n $ \e     -> weightExcept absE (abs' e)    == weightExcept absE e
-  , holds n $ \e     -> weightExcept absE (negate' e) == weightExcept absE e + 1
-
-  -- lexicompare is compatible (almost as if by coincidence)
-  , fails n $ simplificationOrder lgt
-  , holds n $ compatible          lgt
-  , fails n $ closedUnderSub      lgt
-  , fails n $ subtermProperty     lgt
-
-  -- compare has the subtermProperty (Expr)
-  , fails n $ simplificationOrder cgt
-  , fails n $ compatible          cgt
-  , fails n $ closedUnderSub      cgt
-  , holds n $ subtermProperty     cgt
-  ]
-  where
-  e1 `lgt` e2 = e1 `lexicompare` e2 == GT
-  e1 `cgt` e2 = e1 `compare` e2 == GT
-
-simplificationOrder :: (Expr -> Expr -> Bool) -> Expr -> Expr -> Expr -> Bool
-simplificationOrder (>) = \e1 e2 e3 -> reductionOrder  (>) e1 e2 e3
-                                    && subtermProperty (>) e1
-
-subtermProperty :: (Expr -> Expr -> Bool) -> Expr -> Bool
-subtermProperty (>) = \e -> all (e >)
-                          . filter (\e' -> e' /= e && typ e' == typ e)
-                          $ subexprs e -- isn't this subexprsV? I don't think so
-
-reductionOrder :: (Expr -> Expr -> Bool) -> Expr -> Expr -> Expr -> Bool
-reductionOrder (>) = \e1 e2 e3 -> strictPartialOrder (>) e1 e2 e3
-                               && compatible         (>) e1 e2 e3
-                               && closedUnderSub     (>) e1 e2 e3
-
-compatible :: (Expr -> Expr -> Bool) -> Expr -> Expr -> Expr -> Bool
-compatible (>) = \e e1 e2 -> e1 > e2 && typ e1 == typ e2
-                         ==> and [ (e //- [(v,e1)]) > (e //- [(v,e2)])
-                                 | v <- vars e
-                                 , typ v == typ e1
-                                 , typ v == typ e2 ]
-
--- The formal definition contains multiple assignments,
--- here, just a single variable is assigned.
-closedUnderSub :: (Expr -> Expr -> Bool) -> Expr -> Expr -> Expr -> Bool
-closedUnderSub (>) = \e1 e2 e -> e1 > e2
-                             ==> and [ (e1 //- [(v,e)]) > (e2 //- [(v,e)])
-                                     | v <- vars e1 `nubMerge` vars e2
-                                     , typ v == typ e ]
diff --git a/tests/test-reason.hs b/tests/test-reason.hs
deleted file mode 100644
--- a/tests/test-reason.hs
+++ /dev/null
@@ -1,258 +0,0 @@
-{-# LANGUAGE CPP #-}
--- Test library
-import Test
-import Test.Speculate.Utils
-
--- Functions under test
-import Test.Speculate.Expr
-import Test.Speculate.Reason
-import Test.Speculate.Reason.Order
-import Data.Tuple (swap)
-import Data.Function (on)
-import Data.List (permutations)
-
-theorize' :: [(Expr,Expr)] -> Thy
-theorize' eqs = finalize $ foldl (flip insert) emptyThy {closureLimit = 3, keepE = keepMaxOf eqs} eqs
-
-theorize'' :: [(Expr,Expr)] -> Thy
-theorize'' eqs = finalize $ foldr insert emptyThy {closureLimit = 3, keepE = keepMaxOf eqs} eqs
-
-main :: IO ()
-main = do
-  n <- getMaxTestsFromArgs 10000
-
-  reportTests (tests n)
-
-  putStrLn "\nlength (rules $ theorize eqs)"
-  reportCountsBy (\(SameTypedPairsE eqs) -> show . length . rules $ theorize eqs)
-                 (take n list)
-
-  putStrLn "length (equations $ theorize eqs)"
-  reportCountsBy (\(SameTypedPairsE eqs) -> show . length . equations $ theorize eqs)
-                 (take n list)
-
-  putStrLn "\\e1 e2 e3 -> e1 > e2 && typ e1 == typ e2,  length (vars e3)"
-  reportCountsBy (\(e1,e2,e3) -> if e1 > e2 && typ e1 == typ e2
-                                   then "OK, length " ++ show (length $ vars e3)
-                                   else "Not OK")
-                 (take n list)
-
-  putStrLn "\\e e1 e2 -> length $ reductions 1 e (e1,e2)"
-  reportCountsBy (\(e,e1,e2) -> if e1 > e2 && typ e1 == typ e2
-                                  then "OK, length " ++ show (length $ reductions1 e (e1,e2))
-                                  else "Not OK")
-                 (take n list)
-
-(~~) :: Expr -> Expr -> (Expr,Expr)
-(~~) = (,)
-infix 4 ~~
-
-mkThy :: [(Expr,Expr)] -> [(Expr,Expr)] -> Thy
-mkThy rs eqs = emptyThy
-             { rules     = rs
-             , equations = eqs }
-
-tests :: Int -> [Bool]
-tests n =
-  [ True
-
-  -- Listable Thy sound and complete:
-  , holds n $ okThy
-  , all (`elem` take n list) (take (n`div`10) listThyInefficient)
-
-  , holds n $ \(SameTypedPairsE eqs) -> theorize eqs == theorize (map swap eqs)
-  , holds n $ \(SameTypedPairsE eqs) -> theorize eqs == theorize (reverse eqs)
-
--- TODO: make the following two pass
--- > > let eqs = [(xx, id' xx), (zero, id' xx)]
--- > > theorize' eqs == theorize eqs
--- > False
--- > > theorize' eqs
--- > Thy { rules = [ id x == x
--- >               ]
--- >     , equations = [ 0 == x
--- >                   ]
--- >     , canReduceTo = (|>)
--- >     , closureLimit = 3
--- >     , keepE = keepUpToLength 3
--- >     }
--- > > theorize eqs
--- > Thy { rules = [ id x == x
--- >               , id x == 0
--- >               ]
--- >     , equations = [ 0 == x
--- >                   ]
--- >     , canReduceTo = (|>)
--- >     , closureLimit = 3
--- >     , keepE = keepUpToLength 3
--- >     }
---
--- This issue did exist before the introduction of Express,
--- it just wasn't found because Expr enumeration wasn't that good.
---, holds n $ \(SameTypedPairsE eqs) -> theorize'  eqs == theorize eqs
---, holds n $ \(SameTypedPairsE eqs) -> theorize'' eqs == theorize eqs
-
-  , holds n $ okThy . deduce
-  , holds n $ idempotent deduce
-  , holds n $ \thy -> ((>=) `on` length . equations) (deduce thy) thy
-  , holds n $ \thy -> ((==) `on` rules)              (deduce thy) thy
-
-  , holds n $ okThy . simplify
-  , holds n $ idempotent simplify
-  , holds n $ \thy -> ((<=) `on` length . equations) (simplify thy) thy
-  , holds n $ \thy -> ((==) `on` rules)              (simplify thy) thy
-
-  , holds n $ okThy . delete
-  , holds n $ idempotent delete
-  , holds n $ \thy -> ((<=) `on` length . equations) (delete thy) thy
-  , holds n $ \thy -> ((==) `on` rules)              (delete thy) thy
-
-  , holds n $ okThy . orient
-  , holds n $ idempotent orient
-  , holds n $ \thy -> ((<=) `on` length . equations) (orient thy) thy
-  , holds n $ \thy -> ((>=) `on` length . rules)     (orient thy) thy
-  , holds n $ \thy -> length (equations thy)      - length (equations $ orient thy)
-                   >= length (rules $ orient thy) - length (rules thy)
-
-  , holds n $ okThy . compose
-  , holds n $ idempotent compose
-  , holds n $ \thy -> ((<=) `on` length . rules)     (compose thy) thy
-  , holds n $ \thy -> ((==) `on` equations)          (compose thy) thy
-
-  , holds n $ okThy . collapse
-  , holds n $ idempotent collapse
-  , holds n $ \thy -> ((<=) `on` length . rules)     (collapse thy) thy
-  , holds n $ \thy -> ((>=) `on` length . equations) (collapse thy) thy
-
-  , holds n $ okThy . complete . unThyght
-
-  , holds n $ \(Thyght thy') (SameTypedPairsE eqs) ->
-                let thy = complete thy'
-                in  foldr insert thy eqs == complete (append thy eqs)
-
-  -- TODO: make the following pass with n `div` 10
-  -- Inference order should not matter:
-  , holds 100
-  $ \(Thyght thy) -> all (\steps -> iterateUntil (==) (chain steps) thy == complete thy)
-                   $ permutations [collapse, compose, orient, delete . simplify, deduce]
-  -- I now think the above property is not true in all cases, investigate.
-
-  -- NOTE: the following does not hold in general, only for most of the cases
-  , holds 4000
-  $ \(Thyght thy') (SameTypeE e1 e2) -> closureLimit thy' > 0 ==>
-       let thy = insert (e1,e2)
-               $ thy' { keepE = keepUpToLength (max (size e1) (size e2)) }
-       in  equivalent thy e1 e2
-
-  , holds n $ idempotent finalize
-
-  , criticalPairs emptyThy { rules = [ ((xx -+- yy) -+- zz,xx -+- (yy -+- zz))
-                                     , (negate' xx -+- xx, zero) ] }
-      == [ (negate' xx -+- (xx -+- yy),zero -+- yy)
-         , ((xx -+- (yy -+- zz)) -+- xx', (xx -+- yy) -+- (zz -+- xx')) ]
-
-  , criticalPairs emptyThy { rules = [ (negate' (negate' xx), id' xx) ] }
-      == [ (negate' (id' xx), id' (negate' xx)) ]
-
-  , criticalPairs emptyThy { canReduceTo = dwoBy (\e1 e2 -> e1 `lexicompare` e2 == GT)
-                           , rules = [ (foo (goo (foo xx)), xx)
-                                     , (foo (goo xx), goo (foo xx)) ] }
-      == (let sortuple (x,y) | x < y     = (y,x)
-                             | otherwise = (x,y)
-          in nubSort . map sortuple
-           $ [ (goo xx,                   foo (goo (goo (foo xx))))
-             , (goo (foo xx),             foo (goo xx))
-             , (goo (foo (foo xx)),       xx)
-             , (goo (foo (foo (goo xx))), goo xx) ])
-
-  , criticalPairs emptyThy { rules = [ (foo (goo (foo xx)), xx)
-                                     , (foo (goo xx), goo (foo xx)) ] }
-      == [ (goo (foo xx),             foo (goo xx))
-         , (goo (foo (foo xx)),       xx)
-         , (foo (goo (goo (foo xx))), goo xx)
-         , (goo (foo (foo (goo xx))), goo xx) ]
-
-  , theorize [ (xx -*- yy) -*- (yy -*- zz)  ~~  yy ]
-    |==|
-    [ (xx -*- yy) -*- (yy -*- zz)  ~~  yy
-    , xx -*- ((xx -*- yy) -*- zz)  ~~  xx -*- yy
-    , (xx -*- (yy -*- zz)) -*- zz  ~~  yy -*- zz
-    ] `mkThy` []
-
-  , theorize [ xx -*- (yy -+- zz)  ~~  (xx -*- yy) -+- (xx -*- zz)
-             , (xx -+- yy) -*- zz  ~~  (xx -*- zz) -+- (yy -*- zz) ]
-    |==|
-    [ (xx -*- yy) -+- (xx -*- zz)  ~~  xx -*- (yy -+- zz)
-    , (xx -*- yy) -+- (zz -*- yy)  ~~  (xx -+- zz) -*- yy
-    ] `mkThy` [ (xx -+- xx) -*- yy  ~~  xx -*- (yy -+- yy) ]
-
-  , theorizeBy (|>|) [ xx -+- zero      ~~  xx
-                     , xx -+- succ' yy  ~~  succ' (xx -+- yy) ]
-    |==|
-    [ xx -+- zero  ~~  xx
-    ] `mkThy` [ xx -+- succ' yy  ~~  succ' (xx -+- yy) ]
-
-  , theorizeBy (kboBy weight (<))
-    [ xx -+- zero      ~~  xx
-    , xx -+- succ' yy  ~~  succ' (xx -+- yy) ]
-    |==|
-    [                 xx -+- zero  ~~  xx
-    , succ' (xx -+- yy)            ~~  xx -+- succ' yy
-    , xx -+-         succ' zero    ~~         succ' xx
-    , xx -+- (succ' (succ' zero))  ~~  succ' (succ' xx)
-    ] `mkThy` []
-
-  , theorizeBy (|>) [ xx -+- zero      ~~  xx
-                    , xx -+- succ' yy  ~~  succ' (xx -+- yy) ]
-    |==|
-    [ xx -+- zero      ~~  xx
-    , xx -+- succ' yy  ~~  succ' (xx -+- yy)
-    ] `mkThy` []
-
-  -- TODO: fix order under GHC <= 7.8
-#if __GLASGOW_HASKELL >= 800
-  , theorizeBy (dwoBy $ \e1 e2 -> if typ e1 == typ e2
-                                      then e1 > e2
-                                      else typ e1 < typ e2)
-    [ ( xx -+- zero, xx )
-    , ( xx -+- succ' yy, succ' (xx -+- yy) ) ]
-    |==|
-    [ ( xx -+- zero, xx )
-    , ( succ' (xx -+- yy), xx -+- (succ' yy) )
-    ] `mkThy` [ xx -+- (succ' zero)  ~~  succ' xx]
-#endif
-
-  , theorizeBy (|>) [ ( zero -+- xx, xx )
-                    , ( negate' xx -+- xx, zero )
-                    , ( (xx -+- yy) -+- zz, xx -+- (yy -+- zz) ) ]
-    |==| [ ( zero -+- xx                , xx )
-         , ( negate' xx -+- xx          , zero )
-         , ( (xx -+- yy) -+- zz         , xx -+- (yy -+- zz) )
-         , ( negate' xx -+- (xx -+- yy) , yy )
-         , ( xx -+- zero                , xx )
-         , ( xx -+- (negate' xx -+- yy) , yy )
-         , ( negate' (negate' xx)         , xx )
-         , ( negate' zero                 , zero )
-         , ( xx -+- negate' xx            , zero )
-         ] `mkThy` []
-
-  , theorizeBy (kboBy (weightExcept negateE) (gtExcept (>) negateE))
-      [ ( zero -+- xx, xx )
-      , ( negate' xx -+- xx, zero )
-      , ( (xx -+- yy) -+- zz, xx -+- (yy -+- zz) ) ]
-    |==| [ ( zero -+- xx                , xx )
-         , ( negate' xx -+- xx          , zero )
-         , ( (xx -+- yy) -+- zz         , xx -+- (yy -+- zz) )
-         , ( negate' xx -+- (xx -+- yy) , yy )
-         , ( negate' zero -+- xx        , xx )
-         , ( xx -+- zero                , xx )
-         , ( xx -+- (negate' xx -+- yy) , yy )
-         , ( negate' (negate' xx)         , xx )
-         , ( xx -+- negate' xx            , zero )
-         ] `mkThy` [( negate' zero, zero )]
-
-  -- TODO: restore tests losts after removing test-kbc
-  ]
-
-succ' :: Expr -> Expr
-succ'  =  (value "succ" ((1+) :: Int -> Int) :$)
diff --git a/tests/test-sdist b/tests/test-sdist
deleted file mode 100644
--- a/tests/test-sdist
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/bash
-#
-# test-sdist: tests the package generated by "cabal sdist".
-#
-# Copyright (c) 2015-2018 Rudy Matela.
-# Distributed under the 3-Clause BSD licence.
-export LC_ALL=C  # consistent sort
-pkgver=` cat *.cabal | grep "^version:" | sed -e "s/version: *//"`
-pkgname=`cat *.cabal | grep "^name:"    | sed -e "s/name: *//"`
-pkg=$pkgname-$pkgver
-set -x
-cabal sdist &&
-cd dist &&
-tar -tf $pkg.tar.gz | sort --ignore-case          > ls-cabal-i  &&
-tar -tf $pkg.tar.gz | sort --ignore-case --unique > ls-cabal-iu &&
-diff -rud ls-cabal-i ls-cabal-iu &&
-rm -f ls-cabal ls-cabal-ignore-case &&
-if [ -d ../.git ]
-then
-	# on git repo, test if files are the same
-	git -C .. ls-files                                      | sort > ls-git   &&
-	tar -tf $pkg.tar.gz | grep -v "/$" | sed -e "s,$pkg/,," | sort > ls-cabal &&
-	diff -rud ls-git ls-cabal &&
-	rm -f ls-git ls-cabal
-else
-	# outside of git repo, test build
-	rm -rf $pkg/ &&
-	tar -xzf $pkg.tar.gz &&
-	cd $pkg/ &&
-	cabal configure --enable-tests --enable-benchmarks &&
-	cabal build &&
-	cabal test
-fi
diff --git a/tests/test-stats.hs b/tests/test-stats.hs
deleted file mode 100644
--- a/tests/test-stats.hs
+++ /dev/null
@@ -1,41 +0,0 @@
--- Test library
-import Test
-
--- Functions under test
-import Test.Speculate.Reason
-import Test.Speculate.Utils
-
-main :: IO ()
-main = do
-  n <- getMaxTestsFromArgs 10000
-
-  putStrLn "typ (e :: Expr)"
-  reportCountsBy typ            (take n list :: [Expr])
-
-  putStrLn "size (e :: Expr)"
-  reportCountsBy sizeInterval (take n list :: [Expr])
-
-  putStrLn "typ (e1 :: Expr) == typ (e2 :: Expr)"
-  reportCountsBy equalTypes (take n list)
-
-  putStrLn "typ (e1 :: Expr) == typ (e2 :: Expr)"
-  reportCountsBy equalTypes . map unSameTypeE . take n $ list
-
-  putStrLn "okThy thy"
-  reportCountsBy (show . okThy) (take n list)
-
-  putStrLn "length (equations thy)"
-  reportCountsBy (show . length . equations) (take n list)
-
-  putStrLn "length (rules thy)"
-  reportCountsBy (show . length . rules) (take n list)
-
-  putStrLn "length (equations thy + rules thy)"
-  reportCountsBy (show . length . (\thy -> rules thy ++ equations thy)) (take n list)
-
-sizeInterval :: Expr -> (Int,Int)
-sizeInterval e = (l, l+2) where l = (size e `div` 3) * 3
-
-equalTypes :: (Expr,Expr) -> String
-equalTypes (e1,e2) | typ e1 == typ e2 = show (typ e1)
-                   | otherwise        = "invalid"
diff --git a/tests/test-utils.hs b/tests/test-utils.hs
deleted file mode 100644
--- a/tests/test-utils.hs
+++ /dev/null
@@ -1,115 +0,0 @@
--- Test library
-import Test
-
--- Functions under test
-import Test.Speculate.Utils
-
--- Helper functions
-import Data.List
-import Data.Function
-
-import Test.LeanCheck.Utils (comparison)
-
-main :: IO ()
-main = mainTest tests 10000
-
-tests :: Int -> [Bool]
-tests n =
-  [ True
-  
-  , holds 100 $ \xs ys -> strictlyOrdered xs && strictlyOrdered ys
-                      ==> strictlyOrdered (nubMerge xs (ys::[Int]))
-  , and [ nubMerge xs xs == xs | n <- [0..10], let xs = [0..n] :: [Int] ]
-
-  , collectOn snd [(1,2),(2,2),(2,3),(3,3)::(Int,Int)] == [[(1,2),(2,2)],[(2,3),(3,3)]]
-  , collectOn fst [(1,2),(2,2),(2,3),(3,3)::(Int,Int)] == [[(1,2)],[(2,2),(2,3)],[(3,3)]]
-  , collectOn (uncurry (+)) [(1,2),(2,2),(2,3),(3,3)::(Int,Int)] == [[(1,2)],[(2,2)],[(2,3)],[(3,3)]]
-  , collectBy (compare `on` snd) [(1,2),(2,2),(2,3),(3,3)::(Int,Int)] == [[(1,2),(2,2)],[(2,3),(3,3)]]
-
-  , holds n $ \x           -> medianate (,) [x::Int]           == [(x,x)]
-  , holds n $ \x y         -> medianate (,) [x::Int,y]         == [(x,y)]
-  , holds n $ \x y z       -> medianate (,) [x::Int,y,z]       == [(x,z),(y,y)]
-  , holds n $ \x y z w     -> medianate (,) [x::Int,y,z,w]     == [(x,w),(y,z)]
-  , holds n $ \x y z w v   -> medianate (,) [x::Int,y,z,w,v]   == [(x,v),(y,w),(z,z)]
-  , holds n $ \x y z w v u -> medianate (,) [x::Int,y,z,w,v,u] == [(x,u),(y,v),(z,w)]
-
-  , all (\f -> discardOthers f [] == ([]::[Int])) [(<=),(>=),(<),(>),(==),(/=),\x y -> True]
-  , holds n $ \x -> all (\f -> discardOthers f [x] == [x::Int])
-                        [(<=),(>=),(<),(>),(==),(/=),\x y -> True]
-  , holds n $ \xs -> not (null xs) ==> discardOthers (<=) xs == [maximum xs::Int]
-  , holds n $ \xs -> not (null xs) ==> discardOthers (>=) xs == [minimum xs::Int]
-  , holds n $ \xs -> not (null xs) ==>
-      discardOthers (<) xs == replicate (count (maximum xs) xs) (maximum xs::Int)
-  , holds n $ \xs -> not (null xs) ==>
-      discardOthers (>) xs == replicate (count (minimum xs) xs) (minimum xs::Int)
-
-  , table "l  l  l" [ ["asdf", "qwer",     "zxvc\nzxvc"]
-                    , ["0",    "1",        "2"]
-                    , ["123",  "456\n789", "3"] ] ==
-      "asdf  qwer  zxvc\n\
-      \            zxvc\n\
-      \0     1     2\n\
-      \123   456   3\n\
-      \      789\n"
-
-  , table "r  l  l" [ ["asdf", "qwer",     "zxvc\nzxvc"]
-                    , ["0",    "1",        "2"]
-                    , ["123",  "456\n789", "3"] ] ==
-      "asdf  qwer  zxvc\n\
-      \            zxvc\n\
-      \   0  1     2\n\
-      \ 123  456   3\n\
-      \      789\n"
-
-  , table "r  r  l" [ ["asdf", "qwer",     "zxvc\nzxvc"]
-                    , ["0",    "1",        "2"]
-                    , ["123",  "456\n789", "3"] ] ==
-      "asdf  qwer  zxvc\n\
-      \            zxvc\n\
-      \   0     1  2\n\
-      \ 123   456  3\n\
-      \       789\n"
-
-  -- different versions of GHC/typeable impose different orders on TypeReps,
-  -- hence: map show . sort
-  , (sort . map show . typesIn $ typeOf (undefined :: (Int -> Int) -> Int -> Bool))
-      == ["Bool","Int"]
-  , (sort . map show . typesIn $ typeOf (undefined :: (Int -> Char) -> Integer -> Bool))
-      == ["Bool","Char","Int","Integer"]
-
-  , splitAtCommas "1,2,3" == ["1","2","3"]
-  , splitAtCommas "123,456,789," == ["123","456","789"]
-  , splitAtCommas "123 456,789"  == ["123","456","789"] -- weird behaviour, but fine for speculate
-
-  , compareIndex [3,2,1::Int] 3 1 == LT
-  , compareIndex [3,2,1::Int] 1 3 == GT
-  , compareIndex [3,2,1::Int] 4 1 == GT
-  , compareIndex [3,2,1::Int] 1 0 == LT
-  , holds n $ \xs -> comparison (compareIndex (xs::[Int]))
-
-  , partitionByMarkers '#' '*' "" == ("","")
-  , partitionByMarkers '#' '*' "abc*def" == ("abc","def")
-  , partitionByMarkers '#' '*'  "abcdef" == ("abcdef","")
-  , partitionByMarkers '#' '*' "#abcdef" == ("abcdef","")
-  , partitionByMarkers '#' '*' "abc#def" == ("abcdef","")
-  , partitionByMarkers '#' '*' "*ab#cd" == ("cd","ab")
-  , partitionByMarkers '#' '*' "abc#def*ghi*jkl#mno*pqr#stu" == ("abcdefmnostu","ghijklpqr")
-  , partitionByMarkers '#' '*' "#foreground*background#foreground" == ("foregroundforeground","background")
-
-  , holds n $ \xs ys -> strictlyOrdered xs && strictlyOrdered ys
-                    ==> strictlyOrdered (xs +++ ys :: [Int])
-  , holds n $ \xs ys -> xs +++ ys == ys +++ (xs :: [Int])
-  , holds n $ \xs ys -> strictlyOrdered xs && strictlyOrdered ys
-                    ==> xs +++ ys == nubSort (xs ++ ys :: [Int])
-
-  , holds n $ nubSort === nub . sort -:> [int]
-
-  , halve []             == ([],[]::[Int])
-  , halve [1::Int]       == ([],[1])
-  , halve [1,2::Int]     == ([1],[2])
-  , halve [1,2,3::Int]   == ([1],[2,3])
-  , halve [1,2,3,4::Int] == ([1,2],[3,4])
-
-  , holds n $ \n xss -> 0 <  n && n <  length xss ==> xss ! n == (xss !! n :: [Int])
-  , holds n $ \n xss -> 0 >= n && n >= length xss ==> xss ! n == ([] :: [Int])
-  ]
diff --git a/tests/update-test-model b/tests/update-test-model
deleted file mode 100644
--- a/tests/update-test-model
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/bin/bash
-top=`dirname $0`/..
-eg=$top/eg
-model=$top/tests/model
-
-case "$1" in
-	-*) sz="$1"
-	    shift
-		;;
-esac
-
-test-model() {
-	$1 $sz | diff -rud $model/$2$sz.out - || exit 1
-}
-
-update-test-model() {
-	$1 $sz > $model/$2$sz.out
-}
-
-tym() {
-	/usr/bin/time -f%e "$@"
-}
-
-spc() {
-	/usr/bin/time -f%M "$@"
-}
-
-mean() {
-	sum="`echo -n $* | sed -e "s/ / + /g"`"
-	mean="`echo "scale = 3; ($sum) / $#" | bc`"
-	printf "%3.3f\n" $mean
-}
-export -f mean
-
-div1024() {
-	printf "%3.0f\n" "`echo "$1 / 1024" | bc`"
-}
-export -f div1024
-
-benchmark() {
-	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
-	printf "%-18s  " "$2$sz"
-	for run in {1..3}
-	do
-		tym $1 $sz 2>&1 >/dev/null
-	done | xargs bash -c 'mean "$@"' mean
-}
-
-memory-benchmark() {
-	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
-	printf "%-18s  " "$2$sz"
-	for run in {1..3}
-	do
-		spc $1 $sz 2>&1 >/dev/null
-	done | xargs bash -c 'mean    "$@"' mean |
-	       xargs bash -c 'div1024 "$@"' div1024
-}
-
-benchmark-cmp() {
-	[ -x $1 ] || { echo "$0: not found $1"; return 1; }
-	grep "^ *$2$sz " bench/runtime-$HOSTNAME | tr '\n' ' '
-	echo -n ' '
-	for run in {1..1}
-	do
-		tym $1 $sz 2>&1 >/dev/null
-	done | xargs bash -c 'mean "$@"' mean
-}
-
-find $* | sed -e "s/^bench/     /;s/^eg/  /" |
-sort -b | sed -e "s/^     /bench/;s/^  /eg/" |
-while read e
-do
-	`basename $0` $top/$e `basename $e`
-done
