packages feed

speculate 0.3.5 → 0.4.0

raw patch · 149 files changed

+1911/−3656 lines, 149 filesdep +expressdep ~leancheck

Dependencies added: express

Dependency ranges changed: leancheck

Files

.gitignore view
@@ -6,7 +6,12 @@ **/log/ .stack-work -doc/+doc/**/*.html+doc/**/*.css+doc/**/*.js+doc/**/*.png+doc/**/*.gif+doc/**/*.json  **.prof **.swp@@ -38,8 +43,6 @@ tests/test-eval tests/test-haexpress tests/test-kbc-tests/test-match-tests/test-misc tests/test-order tests/test-creason tests/test-reason
.travis.yml view
@@ -31,14 +31,14 @@ - travis_retry curl -L https://www.stackage.org/stack/linux-x86_64 | tar xz --wildcards --strip-components=1 -C ~/.local/bin '*/stack' - stack config set system-ghc --global true - stack --version-- cabal install leancheck cmdargs+- cabal install leancheck express cmdargs  script: - make && make test-without-extra-deps - make haddock - make test-sdist-- travis_wait 40 cabal test expr -v-- travis_wait 40 stack $STACKR --no-terminal --skip-ghc-check test speculate:test:expr -v+- travis_wait 40 cabal test expr --ghc-option=-O0+- travis_wait 40 stack $STACKR --no-terminal --skip-ghc-check test speculate:test:expr --ghc-options=-O0  matrix:   allow_failures:@@ -47,9 +47,12 @@   - ghc: 'head'     env:                   GHCVER=head         CABALVER=head     addons: {apt: {packages: [ghc-head,   cabal-install-head], sources: hvr-ghc}}+  - ghc: '8.6'+    env:                   GHCVER=8.6.1        CABALVER=2.4+    addons: {apt: {packages: [ghc-8.6.1,  cabal-install-2.4],  sources: hvr-ghc}}   - ghc: '8.4'-    env:                   GHCVER=8.4.2        CABALVER=2.2-    addons: {apt: {packages: [ghc-8.4.2,  cabal-install-2.2],  sources: hvr-ghc}}+    env:                   GHCVER=8.4.4        CABALVER=2.2+    addons: {apt: {packages: [ghc-8.4.4,  cabal-install-2.2],  sources: hvr-ghc}}   - ghc: '8.2'     env:                   GHCVER=8.2.2        CABALVER=2.0     addons: {apt: {packages: [ghc-8.2.2,  cabal-install-2.0],  sources: hvr-ghc}}@@ -69,37 +72,7 @@     - cabal --version     - rm -f ~/.cabal/config && cabal update     - cabal install Cabal==1.18.*-    - cabal install leancheck cmdargs-    script:-    - make && make test-without-extra-deps-    - make haddock HADDOCKFLAGS=-    - make test-sdist-    - cabal test-  - ghc: '7.6'-    env:                   GHCVER=7.6.3        CABALVER=1.18-    addons: {apt: {packages: [ghc-7.6.3,  cabal-install-1.18], sources: hvr-ghc}}-    before_install:-    - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH-    - ghc --version-    - cabal --version-    - rm -f ~/.cabal/config && cabal update-    - cabal install Cabal==1.18.*-    - cabal install leancheck cmdargs-    script:-    - make && make test-without-extra-deps-    - make haddock HADDOCKFLAGS=-    - make test-sdist-    - cabal test-  - ghc: '7.4'-    env:                   GHCVER=7.4.2        CABALVER=1.18-    addons: {apt: {packages: [ghc-7.4.2,  cabal-install-1.18], sources: hvr-ghc}}-    before_install:-    - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH-    - ghc --version-    - cabal --version-    - rm -f ~/.cabal/config && cabal update-    - cabal install Cabal==1.18.*-    - cabal install leancheck cmdargs+    - cabal install leancheck express cmdargs     script:     - make && make test-without-extra-deps     - make haddock HADDOCKFLAGS=
Makefile view
@@ -1,15 +1,18 @@ # Makefile for Speculate #-# Copyright:   (c) 2015-2018 Rudy Matela+# 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-GHCFLAGS = -O2 $(shell grep -q "Arch Linux" /etc/lsb-release && echo -dynamic)+GHCFLAGS = -O2 \+  $(shell grep -q "Arch Linux" /etc/lsb-release && echo -dynamic)+# -Wall -Wno-name-shadowing -Wno-orphans -Wno-unused-matches # -prof -auto-all #-caf-all # When profiling is enabled, to get the cost centres with more than 6% time: #   $ ./eg/arith  +RTS -p -RTS #   $ cat arith.prof | grep -v ' [0-5].[0-9] ......$'-HADDOCKFLAGS = --no-print-missing-docs+HADDOCKFLAGS = --no-print-missing-docs \+  $(shell grep -q "Arch Linux" /etc/lsb-release && echo --optghc=-dynamic) MAXTESTS = 4000 MAXSIZE = -s4 TESTS = \@@ -17,8 +20,6 @@   tests/test-engine \   tests/test-eval \   tests/test-expr \-  tests/test-match \-  tests/test-misc \   tests/test-order \   tests/test-reason \   tests/test-utils \@@ -62,21 +63,24 @@   tests/test-engine \   tests/test-eval \   tests/test-expr \-  tests/test-match \   tests/test-order \   tests/test-reason QUICKEG = \   eg/arith \   eg/bool \   eg/list+LIST_ALL_HSS = find src tests 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)) -test: all $(patsubst %,%.test,$(TESTS)) \-          $(patsubst %,%.test-model,$(EG) $(wildcard bench/*-c))+test: all test-sdist \+  $(patsubst %,%.test,$(TESTS)) \+  $(patsubst %,%.test-model,$(EG) $(wildcard bench/*-c))  test-without-extra-deps: all $(patsubst %,%.test,$(TESTS)) \                              $(patsubst %,%.test-model,$(MOSTEG) $(wildcard bench/*-c))@@ -115,19 +119,19 @@  prepare-legacy-test-8.2: 	cabal-ghc-8.2 update-	cabal-ghc-8.2 --ignore-sandbox install regex-tdfa cmdargs leancheck+	cabal-ghc-8.2 --ignore-sandbox install cmdargs leancheck  prepare-legacy-test-8.0: 	cabal-ghc-8.0 update-	cabal-ghc-8.0 --ignore-sandbox install regex-tdfa cmdargs leancheck+	cabal-ghc-8.0 --ignore-sandbox install cmdargs leancheck  prepare-legacy-test-7.10: 	cabal-ghc-7.10 update-	cabal-ghc-7.10 --ignore-sandbox install regex-tdfa cmdargs leancheck+	cabal-ghc-7.10 --ignore-sandbox install cmdargs-0.10.17 leancheck  prepare-legacy-test-7.8: 	cabal-ghc-7.8 update-	cabal-ghc-7.8  --ignore-sandbox install regex-tdfa cmdargs leancheck+	cabal-ghc-7.8  --ignore-sandbox install cmdargs-0.10.17 leancheck  slow-test: MAXTESTS = slow-test: MAXSIZE =@@ -184,9 +188,12 @@ 	make -sC bench/qs1 save-bench 	make -sC bench/qs2 save-bench +update-listable-expr:+	cp -rav ../express/test/Test/ListableExpr.hs tests/Test/+ ghci: tests/Test.ghci -clean: clean-hi-o+clean: clean-hi-o clean-haddock 	rm -f $(TESTS) $(EG) eg/*.dot eg/*.pdf TAGS tags mk/toplibs 	make clean -C bench/qs1 	make clean -C bench/qs2
README.md view
@@ -6,6 +6,8 @@ [![Speculate on Stackage LTS][stackage-lts-badge]][speculate-on-stackage-lts] [![Speculate on Stackage Nightly][stackage-nightly-badge]][speculate-on-stackage-nightly] +![Speculate logo][speculate-logo]+ Speculate automatically discovers laws about [Haskell] functions. Give Speculate a bunch of Haskell functions and it will discover laws like: @@ -24,7 +26,7 @@ 	$ cabal update 	$ cabal install speculate -Pre-requisites are [cmdargs] and [leancheck].+Pre-requisites are [cmdargs], [express] and [leancheck]. They should be automatically resolved and installed by [Cabal].  @@ -117,6 +119,7 @@  [leancheck]: https://hackage.haskell.org/package/leancheck [LeanCheck]: https://hackage.haskell.org/package/leancheck+[express]:   https://hackage.haskell.org/package/express [QuickSpec]: https://github.com/nick8325/quickspec [QuickCheck]: https://hackage.haskell.org/package/QuickCheck [cmdargs]: https://hackage.haskell.org/package/cmdargs@@ -135,13 +138,15 @@ [`<=`]:        https://hackage.haskell.org/package/base/docs/Prelude.html#v:-60--61- [`<`]:         https://hackage.haskell.org/package/base/docs/Prelude.html#v:-60- +[speculate-logo]: https://github.com/rudymatela/speculate/raw/master/doc/speculate.svg?sanitize=true+ [build-status]: https://travis-ci.org/rudymatela/speculate.svg?branch=master [build-log]:    https://travis-ci.org/rudymatela/speculate [hackage-version]: https://img.shields.io/hackage/v/speculate.svg [latest Speculate version from Hackage]: https://hackage.haskell.org/package/speculate [speculate-on-hackage]:                  https://hackage.haskell.org/package/speculate-[stackage-lts-badge]:            http://stackage.org/package/speculate/badge/lts-[stackage-nightly-badge]:        http://stackage.org/package/speculate/badge/nightly-[speculate-on-stackage]:         http://stackage.org/package/speculate-[speculate-on-stackage-lts]:     http://stackage.org/lts/package/speculate-[speculate-on-stackage-nightly]: http://stackage.org/nightly/package/speculate+[stackage-lts-badge]:            https://stackage.org/package/speculate/badge/lts+[stackage-nightly-badge]:        https://stackage.org/package/speculate/badge/nightly+[speculate-on-stackage]:         https://stackage.org/package/speculate+[speculate-on-stackage-lts]:     https://stackage.org/lts/package/speculate+[speculate-on-stackage-nightly]: https://stackage.org/nightly/package/speculate
TODO.md view
@@ -1,154 +1,31 @@ TODO ==== -A non-exhaustive list of things TODO for Speculate--Warning: I tend to ramble...---current----------* improve out-of-the-box support for functions as data values (see `eg/fun.hs`)--* add fun0 example, where functions are not instances of Eq and Ord--* consistency: rename semi to inqualities everywhere.--* improve printing by separating variables, constants and background constants.--* derive `tiers` using speculate itself.  Use provided constructors.-  Maybe a new field in args?  Or even things begining with capital letters and-  ":".---stranger things (bugs?)--------------------------* after adding:--    constant "/=" $ (/=) -:> integer--  to `backgroundConstants`, these:--    (q == negate q) == False-       (q == q + r) == False--  along with a handful of other strange laws appear.-  Find out why and remove them.---* see commit `f7b323a`, why does the following equation disappears after-  requiring a minimum number of tests to pass?--    x /= y ==>        delete y (insert x Null) == insert x Null--  The precondition should hold most of the time, so, a minimum number of-  tests should not discard it.---redundancy to remove-----------------------* remove redundancy on taut example:--	taut q ==> subst n (taut q) p == subst n True p--  pruning principle:-  1. `genericMatch LHS RHS = [(taut q, True)]`-  2. `equivalent thy (taut q) (taut q == True)`--* remove the following redundant laws on insertsort:--	ordered (ys ++ xs) ==>       ys ++ sort xs == sort (xs ++ ys)-	ordered (ys ++ xs) ==>       sort ys ++ xs == sort (xs ++ ys)-	ordered (ys ++ xs) ==>  sort ys ++ sort xs == sort (xs ++ ys)--  implied by `ordered (sort xs) == True` *and* `sort (xs++ys) == sort (ys++xs)`--* on `./eg/insertsort`, we get:--    xs == sort ys ==> ordered xs-    (sort xs == []) == (xs == [])--  those are consequences of substitution--* On `./eg/digraphs -s6`, I get-  `False == isNode x a ==>  succs x a == preds x a`-  (and other related equations.) A more general version wouldn't be-  `False == isNode x a ==>  succs x a == []`?--  I checked on ghci, it does hold for 30000 tests, so the library isn't buggy.--  Maybe the issue is that `== []` is redundant and discarded?--  There are lots of other redundant equations there.  Maybe those are related-  to the planned genericMatch pruning principle?  (see a bit above)--* On `./eg/binarytree`, when toList and fromList are moved into the foreground,-  the following redundant laws appear:--  (xs == []) == (Null == fromList xs)-  xs == toList t ==> ordered xs-  xs == toList t ==> strictlyOrdered xs-  xs == toList t ==> t == fromList xs---Later Later--------------* check if equivalences (==) are congruences (s == s' ==> f s == f s')--* automatically detect and use orders.  algorithm sketch:-  1. list everything of the type a -> a -> Bool-  2. check and filter everything that is an order-  3. parameterize semiTheoryFromEtc so that it takes an order re-run for-     several different types+A list of things to do for Speculate. -* improve performance of inequality generation by using the following-  algorithm:+* release new Speculate after releasing Express+  (which will happen after I have a version of Extrapolate that uses Express) -	1. compute a theory and equivalence classes of schemas as usual;-	2. from classes of schemas, build class representatives of canonical-	   expressions (first occurrences in lexicographic order);-	3. rehole those representatives then compute <= relations-	4. expand <= expressions, filtering those that are true and discarding-	   redundancies "internally" (within possible variable namings)-	5. filter redundant <= expressions.  I believe this has to be adapted a-	   tiny bit.+* `-U` / `--auto-constants` is broken, fix it. -  I am not sure if it will work.  But it might be worth a try.+* 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`. -* print errors on stderr, not on stdout+* simpilfy "bench" handing.  Do like in LeanCheck and Extrapolate. -* add maximum commutative size limit?+* (code readability) review and document code -* improve error message for missing typeInfo.  Maybe add full suggestion.+* (code readability) rename semi to inqualities everywhere. -* (for performance and interface): actually compute what happens with-  undefined values.  e.g.: head [] == undefined.  This will/may make things-  faster as we can prune foo (head []) or head [] ++ head [], which are also-  undefined.+* (interface) print errors on stderr, not on stdout -* (for performance) note that variable assignments form a lattice.  So I only+* (performance) note that variable assignments form a lattice.  So I only   need to test stuff from upper if the lower is true.  Of course, testing is   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! -* (for interface) I actually do not need to provide 0-argument constants in the-  background algebra.  Since I am using an enumerative strategy, I can actually-  enumerate those from `Instances`.  This way, background will look nicer,-  with less functions and values.  Computing the size of values and expressions-  may be a problem.--* (for interface) make dwoList, where the order between expressions is given by-  the order in which they appear in a list.  Note this *cannot* be composed-  with a lexicographical order (as it could break transitivity, I think).-  Better raise an error in case a symbol is not in the list.  On second thought,-  I think it can be composed.  Just make everything in the list "smaller" than-  whatever is not in the list.- * (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:@@ -167,5 +44,7 @@   - finish groundJoinable from "Ordered Rewriting and Confluence" by     adding one last condition -* require _some_ cases of `e1 == e2` before considering `ce ==> e1 == e2`.-  10% by default?+* (performance and interface): actually compute what happens with+  undefined values.  e.g.: head [] == undefined.  This will/may make things+  faster as we can prune foo (head []) or head [] ++ head [], which are also+  undefined.
bench/arithficial.hs view
@@ -1,6 +1,4 @@ import Test.Speculate-import Test.Speculate.Utils (primeCycle)-import System.Environment (getArgs)  -- How well does this tool performs on artificial operators f :: Num a => a -> a -> a@@ -14,7 +12,7 @@  main :: IO () main = speculate args-  { instances = [ins "x" int]+  { instances = [reifyInstances int]   , constants =       [ hole int       , showConstant (0::Int)
bench/nord.hs view
@@ -1,6 +1,5 @@ {-# LANGUAGE CPP, DeriveDataTypeable, StandaloneDeriving #-} -- for GHC < 7.10 import Test.Speculate-import Test.Speculate.Expr (name, listable, eq, ord)  #if __GLASGOW_HASKELL__ < 710 import Data.Typeable (Typeable1)@@ -16,9 +15,8 @@ -- Speculate reports a warning reflecting that. main :: IO () main = speculate args-  { instances = [ name "x" C0-                , listable C0-                , eq C0+  { instances = [ reifyListable C0+                , reifyEq C0                 ]   , constants = [ showConstant C0                 , constant "id" (id :: EqButNotOrd -> EqButNotOrd)
bench/runtime-zero view
@@ -1,31 +1,35 @@-arith               0.456-arith-c             0.983-arithficial         3.313-arith-negate-abs    2.736-binarytree          4.053-binarytree0         1.150-bool                1.776-bool-c              1.633-colour              2.886-digraphs            3.246-insertsort          15.353-insertsort0         2.273-length              0.386-list                10.986-list-c              2.183-minus               1.170-minus-c             1.883-monad               0.786-nord                0.003-oddeven             12.233-plus-abs            6.070-pretty              11.180-ratio               15.060-regexes             8.476-sets                14.840-speculate-reason    6.416-string              4.633-tauts               7.186-tuples              2.186-unit                0.003-zip                 3.683+GHC 8.6.5+express-0.0.4+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+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+unit                0.010+zip                 1.993
+ doc/speculate.svg view
@@ -0,0 +1,131 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->++<svg+   xmlns:dc="http://purl.org/dc/elements/1.1/"+   xmlns:cc="http://creativecommons.org/ns#"+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+   xmlns:svg="http://www.w3.org/2000/svg"+   xmlns="http://www.w3.org/2000/svg"+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+   width="85mm"+   height="60mm"+   viewBox="0 0 84.999996 60.000001"+   version="1.1"+   id="svg857"+   inkscape:version="0.92.2 2405546, 2018-03-11"+   sodipodi:docname="speculate-v1.1.svg">+  <title+     id="title822">Speculate</title>+  <defs+     id="defs851">+    <clipPath+       id="clip1">+      <path+         inkscape:connector-curvature="0"+         d="M 0,340.15625 H 481.89062 V 0 H 0 Z m 0,0"+         id="path2" />+    </clipPath>+  </defs>+  <sodipodi:namedview+     id="base"+     pagecolor="#ffffff"+     bordercolor="#666666"+     borderopacity="1.0"+     inkscape:pageopacity="0"+     inkscape:pageshadow="2"+     inkscape:zoom="1.4142136"+     inkscape:cx="71.03241"+     inkscape:cy="158.37785"+     inkscape:document-units="mm"+     inkscape:current-layer="layer1"+     showgrid="false"+     fit-margin-top="0"+     fit-margin-left="0"+     fit-margin-right="0"+     fit-margin-bottom="0"+     inkscape:window-width="1918"+     inkscape:window-height="1063"+     inkscape:window-x="1366"+     inkscape:window-y="15"+     inkscape:window-maximized="0" />+  <metadata+     id="metadata854">+    <rdf:RDF>+      <cc:Work+         rdf:about="">+        <dc:format>image/svg+xml</dc:format>+        <dc:type+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+        <dc:title>Speculate</dc:title>+        <dc:date>2018-11-18</dc:date>+        <dc:creator>+          <cc:Agent>+            <dc:title>Rudy Matela</dc:title>+          </cc:Agent>+        </dc:creator>+        <dc:source>https://github.com/rudymatela/speculate</dc:source>+        <dc:subject>+          <rdf:Bag>+            <rdf:li>Speculate</rdf:li>+            <rdf:li>Haskell</rdf:li>+            <rdf:li>logo</rdf:li>+            <rdf:li>testing</rdf:li>+            <rdf:li>test</rdf:li>+            <rdf:li>property-based testing</rdf:li>+          </rdf:Bag>+        </dc:subject>+        <dc:description>Speculate's logo.  A check or tick is seen in teal/cyan intersected with a lambda sing.  An equal sign follows.</dc:description>+        <cc:license+           rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />+      </cc:Work>+      <cc:License+         rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">+        <cc:permits+           rdf:resource="http://creativecommons.org/ns#Reproduction" />+        <cc:permits+           rdf:resource="http://creativecommons.org/ns#Distribution" />+        <cc:requires+           rdf:resource="http://creativecommons.org/ns#Notice" />+        <cc:requires+           rdf:resource="http://creativecommons.org/ns#Attribution" />+        <cc:permits+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />+        <cc:requires+           rdf:resource="http://creativecommons.org/ns#ShareAlike" />+      </cc:License>+    </rdf:RDF>+  </metadata>+  <g+     inkscape:label="Layer 1"+     inkscape:groupmode="layer"+     id="layer1"+     transform="translate(297.11803,-172.26764)">+    <path+       style="clip-rule:nonzero;fill:#7fb3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.17638953"+       d="m -237.11837,172.26764 -32.49994,48.74992 -12.4998,-18.74983 h -14.99992 l 19.99989,29.99983 h 14.99992 l 39.99977,-59.99992 z"+       id="path9-3"+       inkscape:connector-curvature="0" />+    <path+       inkscape:connector-curvature="0"+       id="path9"+       d="m -277.11814,232.26764 20.00023,-30 -20.00023,-30 h 15 l 39.99977,60 h -15 l -12.49954,-18.74965 -12.50023,18.74965 z m 0,0"+       style="clip-rule:nonzero;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.17638952" />+    <path+       style="clip-rule:nonzero;fill:#4c8080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.17638952"+       d="m -249.61834,191.01782 -7.49983,11.24974 2.6e-4,2.6e-4 -19.99988,29.99982 h 14.99965 l 19.99989,-29.99982 z"+       id="path9-3-3"+       inkscape:connector-curvature="0" />+    <path+       inkscape:connector-curvature="0"+       style="clip-rule:nonzero;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.17638953"+       d="m -228.78465,214.76787 -6.66629,-9.99977 23.33303,-5e-4 v 10.00046 z m 0,0"+       id="path11" />+    <path+       inkscape:connector-curvature="0"+       style="clip-rule:nonzero;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.17638953"+       d="m -228.78465,189.76779 -6.66629,9.99977 23.33303,5e-4 V 189.7676 Z m 0,0"+       id="path11-7" />+  </g>+</svg>
eg/Digraph.hs view
@@ -11,7 +11,7 @@  import GHC.Exts (groupWith) import Data.List (partition,(\\),sort)-import Data.Maybe (isJust,fromJust)+import Data.Maybe (isJust) import Control.Monad (guard)  data Digraph a = D {nodeSuccs :: [(a,[a])]} deriving (Eq, Show)
eg/Set.hs view
@@ -126,6 +126,7 @@ (/\) :: Ord a => Set a -> Set a -> Set a S xs /\ S ys = S (meet xs ys) +meet :: Ord a => [a] -> [a] -> [a] meet [] _  = [] meet _  [] = [] meet xs@(x:xs') ys@(y:ys') =@@ -137,6 +138,7 @@ (\\) :: Ord a => Set a -> Set a -> Set a S xs \\ S ys = S (diff xs ys) +diff :: Ord a => [a] -> [a] -> [a] diff [] _  = [] diff xs [] = xs diff xs@(x:xs') ys@(y:ys') =
eg/Taut.hs view
@@ -28,6 +28,7 @@ varOf (Var v)   = v varOf (Not p)   = varOf p varOf (p :=> _) = varOf p+varOf _         = error "varOf: found Lit."  subst :: Name -> Bool -> Prop -> Prop subst _ _ (Lit b)   = Lit b
eg/algebraic-graphs.hs view
@@ -25,7 +25,7 @@   unless (listableGraphOK 180 a) $     error "incorrect Listable (Graph a), see source"   speculate args-    { instances = [ins "x" (gr a), ins "i" a]+    { instances = [reifyInstances (gr a), reifyInstances a]     , maxTests = 1080     , constants =         [ background
eg/binarytree.hs view
@@ -2,7 +2,6 @@ {-# Language DeriveDataTypeable, StandaloneDeriving #-} -- for GHC <= 7.8 -- Colin Runciman, December 2016 import Test.Speculate-import Test.LeanCheck import Data.Function (on)  @@ -93,12 +92,18 @@   tiers = truncateT         $ cons0 Null \/ cons3 Fork `suchThat` isSearch +instance Name (BT a) where name _ = "t"+instance Name Word2 where name _ = "x"++deriving instance Typeable Word2 -- for GHC <= 7.8+ type Item = Word2  main :: IO () main = speculate args   { instances =-      [ ins "t" (undefined :: BT Item)+      [ reifyInstances (undefined :: BT Item)+      , reifyInstances (undefined :: Item)       ]   , constants =       [ showConstant (Null :: BT Item)
eg/binarytree0.hs view
@@ -2,7 +2,6 @@ {-# Language DeriveDataTypeable, StandaloneDeriving #-} -- for GHC <= 7.8 -- Colin Runciman, December 2016 import Test.Speculate-import Test.LeanCheck import Data.Function (on)  @@ -53,8 +52,8 @@ toList Null           = [] toList (Fork t1 x t2) = toList t1 ++ [x] ++ toList t2 -fromList :: Ord a => [a] -> BT a-fromList = foldr insert Null+--fromList :: Ord a => [a] -> BT a+--fromList = foldr insert Null  {- fromList :: Ord a => [a] -> BT a@@ -73,10 +72,6 @@ isSearch :: Ord a => BT a -> Bool isSearch = strictlyOrdered . toList -ordered :: Ord a => [a] -> Bool-ordered [] = True-ordered xs = and (zipWith (<=) xs $ tail xs)- strictlyOrdered :: Ord a => [a] -> Bool strictlyOrdered [] = True strictlyOrdered xs = and (zipWith (<) xs $ tail xs)@@ -93,12 +88,18 @@   tiers = truncateT         $ cons0 Null \/ cons3 Fork `suchThat` isSearch +instance Name (BT a) where name _ = "t"+instance Name Word2 where name _ = "x"++deriving instance Typeable Word2 -- for GHC <= 7.8+ type Item = Word2  main :: IO () main = speculate args   { instances =-      [ ins "t" (undefined :: BT Item)+      [ reifyInstances (undefined :: BT Item)+      , reifyInstances (undefined :: Item)       ]   , constants =       [ showConstant (Null :: BT Item)
eg/bool.hs view
@@ -1,5 +1,4 @@ import Test.Speculate-import Test.LeanCheck ((==>))  main :: IO () main = speculate args
eg/colour.hs view
@@ -1,15 +1,8 @@-{-# LANGUAGE CPP #-} {-# LANGUAGE DeriveDataTypeable, StandaloneDeriving #-} -- for GHC < 7.10-#if __GLASGOW_HASKELL__ == 704-import Test.Speculate -- go figure...-#else-import Test.Speculate hiding (value)-#endif+import Test.Speculate import Test.Speculate.Utils.Colour-import Test.LeanCheck import Data.Ratio import Data.Function (on)-import Test.Speculate.Sanity  deriving instance Typeable Colour -- for GHC < 7.10 @@ -24,14 +17,16 @@ instance Listable Colour where   tiers = cons3 (\(ColourComponent r) (ColourComponent g) (ColourComponent b) -> RGB r g b) +instance Name Colour where name _ = "c"+ colour :: Colour colour = undefined  main :: IO () main = speculate args   { instances =-      [ ordWith ((<=) `on` lightness)-      , ins "c" colour+      [ mkOrdLessEqual ((<=) `on` lightness)+      , reifyInstances colour       ]   , maxSize = 4   , maxSemiSize = 2
eg/digraphs.hs view
@@ -1,8 +1,5 @@ {-# LANGUAGE CPP, DeriveDataTypeable, StandaloneDeriving #-} -- for GHC < 7.10 import Test.Speculate-import Test.LeanCheck hiding ((\/))-import Test.LeanCheck.Utils-import Data.Function (on)  import Digraph @@ -26,14 +23,17 @@     graphs ns = mapT (D . zip ns)               $ listsOfLength (length ns) (setsOf $ toTiers ns) +instance Name (Digraph a) where name _ = "a"+instance Name Nat         where name _ = "x"+ digraph :: a -> Digraph a digraph = undefined  main :: IO () main = speculate args   { instances =-      [ ins "x" nat-      , ins "a" (digraph nat)+      [ reifyInstances nat+      , reifyInstances (digraph nat)       ]   , maxTests = 500   , maxVars = 2
eg/fun.hs view
@@ -1,10 +1,10 @@ import Test.Speculate-import Test.Speculate.Function.A100+import Test.Speculate.Function.A100()  main :: IO () main = speculate args   { maxTests = 1000-  , instances = [ins "f" (undefined :: Int -> Int)]+  , instances = [reifyInstances (undefined :: Int -> Int)]   , constants =       [ hole (undefined :: Int -> Int)       , constant "map" (map :: (Int -> Int) -> [Int] -> [Int])
eg/length.hs view
@@ -20,5 +20,5 @@       , foreground       , constant "length" $ length  -:> [int]       ]-  , instances = [ ordWith (isSubsequenceOf :: [Int] -> [Int] -> Bool) ]+  , instances = [ mkOrdLessEqual (isSubsequenceOf :: [Int] -> [Int] -> Bool) ]   }
eg/list.hs view
@@ -11,9 +11,9 @@ main = speculate args   { maxSemiSize = 0   , maxVars     = 3---, instances = [ ordWith (isPrefixOf      :: [Int] -> [Int] -> Bool) ]---, instances = [ ordWith (isInfixOf       :: [Int] -> [Int] -> Bool) ]-  , instances = [ ordWith (isSubsequenceOf :: [Int] -> [Int] -> Bool) ]+--, instances = [ mkOrdLessEqual (isPrefixOf      :: [Int] -> [Int] -> Bool) ]+--, instances = [ mkOrdLessEqual (isInfixOf       :: [Int] -> [Int] -> Bool) ]+  , instances = [ mkOrdLessEqual (isSubsequenceOf :: [Int] -> [Int] -> Bool) ]   , constants =       [ showConstant ([] :: [Int])       , constant ":"    ((:)  ::  Int  -> [Int] -> [Int])
eg/monad.hs view
@@ -1,5 +1,5 @@ import Test.Speculate-import Test.Speculate.Function.A100+import Test.Speculate.Function.A100()  import Control.Monad ((>=>)) @@ -9,7 +9,7 @@  main :: IO () main = speculate args-  { instances = [ins "f" (int >- [int])]+  { instances = [reifyInstances (int >- [int])]   , constants =       [ hole (int >- [int])       , constant "return" (return :: A -> [A])
eg/pretty-compact.hs view
@@ -34,9 +34,11 @@ da :: Doc Any da = undefined +instance Name Doc where name _ = "d1"+ main :: IO () main = speculate args-  { instances = [ins "d1" da]+  { instances = [reifyInstances "d1" da]   , showConditions = False   , maxSize = 4   , maxTests = 360
eg/pretty.hs view
@@ -1,7 +1,6 @@ {-# LANGUAGE CPP #-} {-# Language DeriveDataTypeable, StandaloneDeriving #-} -- for GHC < 7.10 import Test.Speculate-import Test.LeanCheck import Data.Function (on) import Data.List (isPrefixOf) @@ -25,9 +24,11 @@        \/ cons2 (P.<>)        \/ cons2 nest +instance Name Doc where name _ = "d1"+ main :: IO () main = speculate args-  { instances = [ins "d1" (undefined :: Doc)]+  { instances = [reifyInstances (undefined :: Doc)]   , maxSize = 7   , maxVars = 3   , constants =
eg/regexes.hs view
@@ -4,7 +4,6 @@ import Test.Speculate.Utils.Memoize import Data.Function (on) import Regex-import Data.Maybe (fromJust)  instance Listable Symbol where   list = [Symbol 'a', Symbol 'b', Symbol 'c']@@ -17,6 +16,9 @@        \/ cons2 (:+)        \/ cons2 (:.) +instance Name Symbol where name _ = "c"+instance Name (RE a) where name _ = "r"+ deriving instance Typeable Symbol #if __GLASGOW_HASKELL__ < 708 deriving instance Typeable1 RE@@ -100,10 +102,10 @@   { maxTests = 30   , maxSize = 4   , instances =-      [ eqWith  (/==/)-      , ordWith (/<=/)-      , ins "c" (undefined :: Symbol)-      , ins "r" (undefined :: RE Symbol)+      [ mkEq (/==/)+      , mkOrdLessEqual (/<=/)+      , reifyInstances (undefined :: Symbol)+      , reifyInstances (undefined :: RE Symbol)       ]   , constants =       [ constant "Empty" (Empty :: RE Symbol)@@ -122,3 +124,5 @@   , showConditions    = False   , force = True   }+  where+  _ = (canonicalRE :: RE Symbol -> Bool) -- just to silence a warning
eg/sets.hs view
@@ -14,12 +14,14 @@ instance (Ord a, Listable a) => Listable (S.Set a) where   tiers = setCons S.set +instance Name (S.Set a) where name _ = "s"+ set :: a -> S.Set a set = undefined  main :: IO () main = speculate args-  { instances = [ins "s" (set int)]+  { instances = [reifyInstances (set int)]   , constants =       [ constant "emptyS"      $ emptyS      -:  set int       , constant "singleS"     $ singleS     -:> int    
eg/speculate-reason.hs view
@@ -2,7 +2,6 @@ import Test.Speculate import Test.Speculate.Expr import Test.Speculate.Reason-import Test.Speculate.Utils.Timeout (timeoutToError) import Test  import Data.Function (on)@@ -23,6 +22,10 @@ instance Ord Thyght where   compare = compare `on` unThyght +instance Name Thyght   where name _ = "t"+instance Name Equation where name _ = "eq"+instance Name Expr     where name _ = "e"+ -- NOTE: we get wrong laws for size 5, but no wrong laws for size 4. -- increasing the number of tests can get rid of those laws @@ -33,9 +36,9 @@   , showConditions = False   , showSemiequations = False   , instances =-      [ ins "t"  (undefined :: Thyght)-      , ins "eq" (undefined :: Equation)-      , ins "e"  (undefined :: Expr)+      [ reifyInstances (undefined :: Thyght)+      , reifyInstances (undefined :: Equation)+      , reifyInstances (undefined :: Expr)       ]   , constants =       [ constant "okThy"      $ \(Thyght t)       -> okThy t
eg/string.hs view
@@ -1,9 +1,9 @@ import Test.Speculate-import Data.List (sort,insert)  main :: IO () main = speculate args-  { constants = +  { instances = [ reifyInstances [string] ]+  , constants =       [ showConstant ""       , showConstant " "       , showConstant "\n"
eg/tauts.hs view
@@ -1,8 +1,8 @@ {-# LANGUAGE TemplateHaskell #-} {-# Language DeriveDataTypeable, StandaloneDeriving #-} -- for GHC < 7.10-import Test.Speculate+import Test.Speculate hiding (Name(..))+import qualified Test.Speculate as S import Taut hiding (main)-import Test.LeanCheck  deriveListable ''Prop deriveListable ''Name@@ -16,11 +16,14 @@ name :: Name name = undefined +instance S.Name Prop where name _ = "p"+instance S.Name Name where name _ = "n"+ main :: IO () main = speculate args   { instances =-      [ ins "p" prop-      , ins "n" name+      [ reifyInstances prop+      , reifyInstances name       ]   , showConditions = True   , maxVars = 2
eg/tuples.hs view
@@ -11,6 +11,7 @@ main = speculate args   { maxSemiSize = 0   , maxVars     = 3+  , instances = [ reifyInstances (int,int,int) ]   , constants =       [ showConstant (() :: ())       , constant "id"    (id :: () -> ())
eg/zip.hs view
@@ -2,7 +2,8 @@  main :: IO () main = speculate args-  { constants =+  { instances = [reifyInstances (int,int)]+  , constants =       [ background       , constant "++"     $ (++)    -:> [int]       , constant "==" $ (==) -:> int
mk/depend.mk view
@@ -24,12 +24,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -60,12 +58,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -96,12 +92,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -132,12 +126,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -171,12 +163,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -204,12 +194,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -240,12 +228,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -276,12 +262,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -312,12 +296,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -348,12 +330,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -386,15 +366,11 @@   src/Test/Speculate/Reason/Order.hs \   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \-  src/Test/Speculate/Function.hs \-  src/Test/Speculate/Function/A100.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -425,13 +401,13 @@   src/Test/Speculate/Reason/Order.hs \   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \+  src/Test/Speculate/Function.hs \+  src/Test/Speculate/Function/A100.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -462,12 +438,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -498,12 +472,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -534,12 +506,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -570,12 +540,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -605,15 +573,11 @@   src/Test/Speculate/Reason/Order.hs \   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \-  src/Test/Speculate/Function.hs \-  src/Test/Speculate/Function/A100.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -643,13 +607,13 @@   src/Test/Speculate/Reason/Order.hs \   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \+  src/Test/Speculate/Function.hs \+  src/Test/Speculate/Function/A100.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -680,12 +644,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -716,16 +678,48 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \   eg/plus-abs.hs+eg/pretty-compact: \+  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 \+  src/Test/Speculate/Utils/String.hs \+  src/Test/Speculate/Utils/PrettyPrint.hs \+  src/Test/Speculate/Utils.hs \+  src/Test/Speculate/Utils/Ord.hs \+  src/Test/Speculate/Utils/Misc.hs \+  src/Test/Speculate/Utils/Memoize.hs \+  src/Test/Speculate/Utils/List.hs \+  src/Test/Speculate/Utils/Digraph.hs \+  src/Test/Speculate/Utils/Colour.hs \+  src/Test/Speculate/Utils/Class.hs \+  src/Test/Speculate/SemiReason.hs \+  src/Test/Speculate/Sanity.hs \+  src/Test/Speculate/Report.hs \+  src/Test/Speculate/Reason.hs \+  src/Test/Speculate/Reason/Order.hs \+  src/Test/Speculate/Pretty.hs \+  src/Test/Speculate.hs \+  src/Test/Speculate/Expr.hs \+  src/Test/Speculate/Expr/Instance.hs \+  src/Test/Speculate/Expr/Ground.hs \+  src/Test/Speculate/Expr/Equate.hs \+  src/Test/Speculate/Expr/Core.hs \+  src/Test/Speculate/Engine.hs \+  src/Test/Speculate/CondReason.hs \+  src/Test/Speculate/Args.hs \+  eg/pretty-compact.hs eg/pretty: \   eg/pretty.hs \   mk/toplibs@@ -752,12 +746,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -788,12 +780,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -825,12 +815,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -867,12 +855,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -880,6 +866,7 @@   eg/Set.hs eg/speculate-reason.o: \   tests/Test.hs \+  tests/Test/ListableExpr.hs \   src/Test/Speculate/Utils/Typeable.hs \   src/Test/Speculate/Utils/Tuple.hs \   src/Test/Speculate/Utils/Timeout.hs \@@ -902,18 +889,17 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \   eg/speculate-reason.hs eg/speculate-reason: \   tests/Test.hs \+  tests/Test/ListableExpr.hs \   eg/speculate-reason.hs \   mk/toplibs eg/string: \@@ -942,12 +928,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -984,12 +968,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -1021,12 +1003,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -1057,12 +1037,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs \@@ -1080,12 +1058,10 @@   src/Test/Speculate/Utils/Memoize.hs \   src/Test/Speculate/Utils/List.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Args.hs src/Test/Speculate/CondReason.o: \   src/Test/Speculate/Utils/Typeable.hs \@@ -1103,12 +1079,10 @@   src/Test/Speculate/Reason.hs \   src/Test/Speculate/Reason/Order.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/CondReason.hs src/Test/Speculate/Engine: \   mk/toplibs@@ -1130,41 +1104,16 @@   src/Test/Speculate/Reason.hs \   src/Test/Speculate/Reason/Order.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs-src/Test/Speculate/Expr/Canon.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 \-  src/Test/Speculate/Utils/String.hs \-  src/Test/Speculate/Utils/PrettyPrint.hs \-  src/Test/Speculate/Utils.hs \-  src/Test/Speculate/Utils/Ord.hs \-  src/Test/Speculate/Utils/Misc.hs \-  src/Test/Speculate/Utils/Memoize.hs \-  src/Test/Speculate/Utils/List.hs \-  src/Test/Speculate/Expr/Match.hs \-  src/Test/Speculate/Expr/Instance.hs \-  src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs+src/Test/Speculate/Expr/Core: \+  mk/toplibs src/Test/Speculate/Expr/Core.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 \-  src/Test/Speculate/Utils/String.hs \-  src/Test/Speculate/Utils/PrettyPrint.hs \-  src/Test/Speculate/Utils.hs \-  src/Test/Speculate/Utils/Ord.hs \-  src/Test/Speculate/Utils/Misc.hs \-  src/Test/Speculate/Utils/Memoize.hs \   src/Test/Speculate/Utils/List.hs \   src/Test/Speculate/Expr/Core.hs src/Test/Speculate/Expr/Equate.o: \@@ -1179,7 +1128,6 @@   src/Test/Speculate/Utils/Misc.hs \   src/Test/Speculate/Utils/Memoize.hs \   src/Test/Speculate/Utils/List.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs@@ -1195,7 +1143,6 @@   src/Test/Speculate/Utils/Misc.hs \   src/Test/Speculate/Utils/Memoize.hs \   src/Test/Speculate/Utils/List.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \@@ -1212,25 +1159,8 @@   src/Test/Speculate/Utils/Misc.hs \   src/Test/Speculate/Utils/Memoize.hs \   src/Test/Speculate/Utils/List.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Core.hs-src/Test/Speculate/Expr/Match: \-  mk/toplibs-src/Test/Speculate/Expr/Match.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 \-  src/Test/Speculate/Utils/String.hs \-  src/Test/Speculate/Utils/PrettyPrint.hs \-  src/Test/Speculate/Utils.hs \-  src/Test/Speculate/Utils/Ord.hs \-  src/Test/Speculate/Utils/Misc.hs \-  src/Test/Speculate/Utils/Memoize.hs \-  src/Test/Speculate/Utils/List.hs \-  src/Test/Speculate/Expr/Match.hs \-  src/Test/Speculate/Expr/Core.hs src/Test/Speculate/Expr.o: \   src/Test/Speculate/Utils/Typeable.hs \   src/Test/Speculate/Utils/Tuple.hs \@@ -1244,12 +1174,10 @@   src/Test/Speculate/Utils/Memoize.hs \   src/Test/Speculate/Utils/List.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \-  src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.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 \@@ -1275,12 +1203,10 @@   src/Test/Speculate/Function.hs \   src/Test/Speculate/Function/A1000.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs@@ -1309,12 +1235,10 @@   src/Test/Speculate/Function.hs \   src/Test/Speculate/Function/A100.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs@@ -1342,48 +1266,13 @@   src/Test/Speculate.hs \   src/Test/Speculate/Function.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs-src/Test/Speculate/Misc.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 \-  src/Test/Speculate/Utils/String.hs \-  src/Test/Speculate/Utils/PrettyPrint.hs \-  src/Test/Speculate/Utils.hs \-  src/Test/Speculate/Utils/Ord.hs \-  src/Test/Speculate/Utils/Misc.hs \-  src/Test/Speculate/Utils/Memoize.hs \-  src/Test/Speculate/Utils/List.hs \-  src/Test/Speculate/Utils/Digraph.hs \-  src/Test/Speculate/Utils/Colour.hs \-  src/Test/Speculate/Utils/Class.hs \-  src/Test/Speculate/SemiReason.hs \-  src/Test/Speculate/Sanity.hs \-  src/Test/Speculate/Report.hs \-  src/Test/Speculate/Reason.hs \-  src/Test/Speculate/Reason/Order.hs \-  src/Test/Speculate/Pretty.hs \-  src/Test/Speculate.hs \-  src/Test/Speculate/Misc.hs \-  src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \-  src/Test/Speculate/Expr/Instance.hs \-  src/Test/Speculate/Expr/Ground.hs \-  src/Test/Speculate/Expr/Equate.hs \-  src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \-  src/Test/Speculate/Engine.hs \-  src/Test/Speculate/CondReason.hs \-  src/Test/Speculate/Args.hs src/Test/Speculate: \   mk/toplibs src/Test/Speculate.o: \@@ -1409,12 +1298,10 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs@@ -1436,12 +1323,10 @@   src/Test/Speculate/Reason/Order.hs \   src/Test/Speculate/Pretty.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/CondReason.hs src/Test/Speculate/Reason/Order.o: \   src/Test/Speculate/Utils/Typeable.hs \@@ -1457,12 +1342,10 @@   src/Test/Speculate/Utils/List.hs \   src/Test/Speculate/Reason/Order.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \-  src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs+  src/Test/Speculate/Expr/Core.hs src/Test/Speculate/Reason.o: \   src/Test/Speculate/Utils/Typeable.hs \   src/Test/Speculate/Utils/Tuple.hs \@@ -1478,12 +1361,10 @@   src/Test/Speculate/Reason.hs \   src/Test/Speculate/Reason/Order.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \-  src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs+  src/Test/Speculate/Expr/Core.hs src/Test/Speculate/Report.o: \   src/Test/Speculate/Utils/Typeable.hs \   src/Test/Speculate/Utils/Tuple.hs \@@ -1506,12 +1387,10 @@   src/Test/Speculate/Reason/Order.hs \   src/Test/Speculate/Pretty.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   src/Test/Speculate/Engine.hs \   src/Test/Speculate/CondReason.hs \   src/Test/Speculate/Args.hs@@ -1529,12 +1408,10 @@   src/Test/Speculate/Utils/List.hs \   src/Test/Speculate/Sanity.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \-  src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs+  src/Test/Speculate/Expr/Core.hs src/Test/Speculate/SemiReason.o: \   src/Test/Speculate/Utils/Typeable.hs \   src/Test/Speculate/Utils/Tuple.hs \@@ -1551,14 +1428,11 @@   src/Test/Speculate/Reason.hs \   src/Test/Speculate/Reason/Order.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \-  src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs+  src/Test/Speculate/Expr/Core.hs src/Test/Speculate/Utils/Class.o: \-  src/Test/Speculate/Utils/List.hs \   src/Test/Speculate/Utils/Class.hs src/Test/Speculate/Utils/Colour.o: \   src/Test/Speculate/Utils/Colour.hs@@ -1613,6 +1487,7 @@   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 \   src/Test/Speculate/Utils/Tuple.hs \@@ -1636,21 +1511,21 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   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 \   mk/toplibs tests/test-engine.o: \   tests/Test.hs \+  tests/Test/ListableExpr.hs \   tests/test-engine.hs \   src/Test/Speculate/Utils/Typeable.hs \   src/Test/Speculate/Utils/Tuple.hs \@@ -1674,21 +1549,21 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   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 \   mk/toplibs tests/test-eval.o: \   tests/Test.hs \+  tests/Test/ListableExpr.hs \   tests/test-eval.hs \   src/Test/Speculate/Utils/Typeable.hs \   src/Test/Speculate/Utils/Tuple.hs \@@ -1712,21 +1587,21 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   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 \   mk/toplibs tests/test-expr.o: \   tests/Test.hs \+  tests/Test/ListableExpr.hs \   tests/test-expr.hs \   src/Test/Speculate/Utils/Typeable.hs \   src/Test/Speculate/Utils/Tuple.hs \@@ -1750,99 +1625,24 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   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 \   mk/toplibs-tests/test-match.o: \-  tests/Test.hs \-  tests/test-match.hs \-  src/Test/Speculate/Utils/Typeable.hs \-  src/Test/Speculate/Utils/Tuple.hs \-  src/Test/Speculate/Utils/Timeout.hs \-  src/Test/Speculate/Utils/Tiers.hs \-  src/Test/Speculate/Utils/String.hs \-  src/Test/Speculate/Utils/PrettyPrint.hs \-  src/Test/Speculate/Utils.hs \-  src/Test/Speculate/Utils/Ord.hs \-  src/Test/Speculate/Utils/Misc.hs \-  src/Test/Speculate/Utils/Memoize.hs \-  src/Test/Speculate/Utils/List.hs \-  src/Test/Speculate/Utils/Digraph.hs \-  src/Test/Speculate/Utils/Colour.hs \-  src/Test/Speculate/Utils/Class.hs \-  src/Test/Speculate/SemiReason.hs \-  src/Test/Speculate/Sanity.hs \-  src/Test/Speculate/Report.hs \-  src/Test/Speculate/Reason.hs \-  src/Test/Speculate/Reason/Order.hs \-  src/Test/Speculate/Pretty.hs \-  src/Test/Speculate.hs \-  src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \-  src/Test/Speculate/Expr/Instance.hs \-  src/Test/Speculate/Expr/Ground.hs \-  src/Test/Speculate/Expr/Equate.hs \-  src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \-  src/Test/Speculate/Engine.hs \-  src/Test/Speculate/CondReason.hs \-  src/Test/Speculate/Args.hs-tests/test-match: \-  tests/Test.hs \-  tests/test-match.hs \-  mk/toplibs-tests/test-misc.o: \-  tests/Test.hs \-  tests/test-misc.hs \-  src/Test/Speculate/Utils/Typeable.hs \-  src/Test/Speculate/Utils/Tuple.hs \-  src/Test/Speculate/Utils/Timeout.hs \-  src/Test/Speculate/Utils/Tiers.hs \-  src/Test/Speculate/Utils/String.hs \-  src/Test/Speculate/Utils/PrettyPrint.hs \-  src/Test/Speculate/Utils.hs \-  src/Test/Speculate/Utils/Ord.hs \-  src/Test/Speculate/Utils/Misc.hs \-  src/Test/Speculate/Utils/Memoize.hs \-  src/Test/Speculate/Utils/List.hs \-  src/Test/Speculate/Utils/Digraph.hs \-  src/Test/Speculate/Utils/Colour.hs \-  src/Test/Speculate/Utils/Class.hs \-  src/Test/Speculate/SemiReason.hs \-  src/Test/Speculate/Sanity.hs \-  src/Test/Speculate/Report.hs \-  src/Test/Speculate/Reason.hs \-  src/Test/Speculate/Reason/Order.hs \-  src/Test/Speculate/Pretty.hs \-  src/Test/Speculate.hs \-  src/Test/Speculate/Misc.hs \-  src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \-  src/Test/Speculate/Expr/Instance.hs \-  src/Test/Speculate/Expr/Ground.hs \-  src/Test/Speculate/Expr/Equate.hs \-  src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \-  src/Test/Speculate/Engine.hs \-  src/Test/Speculate/CondReason.hs \-  src/Test/Speculate/Args.hs-tests/test-misc: \-  tests/Test.hs \-  tests/test-misc.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 \   src/Test/Speculate/Utils/Tuple.hs \   src/Test/Speculate/Utils/Timeout.hs \@@ -1865,21 +1665,21 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   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 \   mk/toplibs tests/Test.o: \   tests/Test.hs \+  tests/Test/ListableExpr.hs \   src/Test/Speculate/Utils/Typeable.hs \   src/Test/Speculate/Utils/Tuple.hs \   src/Test/Speculate/Utils/Timeout.hs \@@ -1902,18 +1702,17 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   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 \   src/Test/Speculate/Utils/Tuple.hs \   src/Test/Speculate/Utils/Timeout.hs \@@ -1936,22 +1735,22 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   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 \   mk/toplibs tests/test-stats.o: \   tests/test-stats.hs \   tests/Test.hs \+  tests/Test/ListableExpr.hs \   src/Test/Speculate/Utils/Typeable.hs \   src/Test/Speculate/Utils/Tuple.hs \   src/Test/Speculate/Utils/Timeout.hs \@@ -1974,25 +1773,26 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   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 \   mk/toplibs tests/test-utils.o: \   tests/test-utils.hs \   tests/Test.hs \+  tests/Test/ListableExpr.hs \   src/Test/Speculate/Utils/Typeable.hs \   src/Test/Speculate/Utils/Tuple.hs \   src/Test/Speculate/Utils/Timeout.hs \@@ -2015,16 +1815,15 @@   src/Test/Speculate/Pretty.hs \   src/Test/Speculate.hs \   src/Test/Speculate/Expr.hs \-  src/Test/Speculate/Expr/Match.hs \   src/Test/Speculate/Expr/Instance.hs \   src/Test/Speculate/Expr/Ground.hs \   src/Test/Speculate/Expr/Equate.hs \   src/Test/Speculate/Expr/Core.hs \-  src/Test/Speculate/Expr/Canon.hs \   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 \   mk/toplibs
mk/ghcdeps view
@@ -2,7 +2,7 @@ # # ghcdeps: generate Haskell make dependencies for compiling with GHC. #-# Copyright (c) 2015-2017 Rudy Matela.+# Copyright (c) 2015-2019 Rudy Matela. # Distributed under the 3-Clause BSD licence. # # From a list of files provided on standard input,
mk/haddock-i view
@@ -2,7 +2,7 @@ # # haddock-i: list haddock's -i parameters. #-# Copyright (c) 2015-2017 Rudy Matela.+# Copyright (c) 2015-2019 Rudy Matela. # Distributed under the 3-Clause BSD licence. # # $ haddock-i <package1> <package2> ... <packageN>@@ -11,14 +11,26 @@ # documentation installed on your system, so you can: # # $ haddock-i base template-haskell | xargs haddock <files>-errxit() {+err() { 	echo "$@" > /dev/stderr+}++errxit() {+	err "$@" 	exit 1 } -for pkg in "$@"; do-	ghc-pkg field $pkg haddock-html,haddock-interfaces ||-	errxit "error: haddock-i: cannot find package $pkg (ghc-pkg)"-done |-sed "s/.*: //" |-sed "N;s/\n/,/;s/^/-i/"+iface-for() {+	ghc-pkg field $1 haddock-interfaces | sort -rV | head -1 | sed "s/.*: //"+}++html-for() {+	ghc-pkg field $1 haddock-html       | sort -rV | head -1 | sed "s/.*: //"+}++for pkg in "$@"+do+	iface=$(iface-for $pkg)+	html=$(html-for $pkg)+	[ -d "$html" -a -f "$iface" ] && echo "-i$html,$iface" || err "haddock-i: warning: could not find interface file for $pkg"+done
mk/haskell.mk view
@@ -1,6 +1,6 @@ # Implicit rules for compiling Haskell code. #-# Copyright (c) 2015-2018 Rudy Matela.+# Copyright (c) 2015-2019 Rudy Matela. # Distributed under the 3-Clause BSD licence. # # You can optionally configure the "Configuration variables" below in your main@@ -20,6 +20,7 @@ GHCFLAGS ?= GHC ?= ghc GHCCMD = $(GHC) -i$(GHCIMPORTDIRS) $(GHCFLAGS)+HADDOCK ?= haddock  # Hugs Parameters HUGSIMPORTDIRS ?= "/usr/lib/hugs/packages/*"@@ -43,7 +44,19 @@ LIB_HSS ?= $(shell $(LIST_LIB_HSS)) ALL_HSS ?= $(shell $(LIST_ALL_HSS)) +LIB_DEPS ?= base+ALL_DEPS ?= $(LIB_DEPS)+ PKGNAME = $(shell cat *.cabal | grep "^name:"    | sed -e "s/name: *//")+HADDOCK_VERSION = $(shell $(HADDOCK) --version | grep version | sed -e 's/.*version //;s/,.*//')+HADDOCK_MAJOR = $(shell echo $(HADDOCK_VERSION) | sed -e 's/\..*//')+HADDOCK_MINOR = $(shell echo $(HADDOCK_VERSION) | sed -e 's/[0-9]*\.\([0-9]*\).[0-9]*/\1/')+HADDOCK_PKG_NAME = $(shell [ $(HADDOCK_MAJOR) -gt 2 ] \+                        || [ $(HADDOCK_MAJOR) -eq 2 -a $(HADDOCK_MINOR) -ge 20 ] \+                        && echo "--package-name=$(PKGNAME)")+HADDOCK_HLNK_SRC = $(shell [ $(HADDOCK_MAJOR) -gt 2 ] \+                        || [ $(HADDOCK_MAJOR) -eq 2 -a $(HADDOCK_MINOR) -ge 17 ] \+                        && echo "--hyperlinked-source")   # Implicit rules@@ -84,7 +97,7 @@ haddock: doc/index.html  clean-haddock:-	rm -f doc/*.{html,css,js,png,gif,json} README.html+	rm -f doc/*.{html,css,js,png,gif,json} doc/src/*.{html,css,js} README.html  upload-haddock: 	@echo "use \`cabal upload -d' instead"@@ -93,9 +106,14 @@ 	@echo "(on Arch Linux, use: cabal haddock --for-hackage --haddock-options=--optghc=-dynamic)"  doc/index.html: $(LIB_HSS)-	./mk/haddock-i base template-haskell | xargs \-	haddock --html -odoc $(LIB_HSS) $(HADDOCKFLAGS) --title=$(PKGNAME)+	./mk/haddock-i $(LIB_DEPS) | xargs \+	$(HADDOCK) --html -odoc $(LIB_HSS) \+	  --title=$(PKGNAME) \+	  $(HADDOCK_PKG_NAME) \+	  $(HADDOCK_HLNK_SRC) \+	  $(HADDOCKFLAGS) + # lists all Haskell source files list-all-hss: 	@find $(ALL_HSS)@@ -103,6 +121,12 @@ # lists library Haskell source files list-lib-hss: 	@find $(LIB_HSS)++bootstrap-haskell-mk:+	@[ -d "$(DEST)" ] || (echo -e "error: no destination found\nusage: \`make bootstrap-haskell-mk DEST=path/to/prj'"; exit 1)+	mkdir -p mk+	cp mk/{haskell.mk,ghcdeps,haddock-i} $(DEST)/mk+	touch $(DEST)/mk/depend.mk  show-pkgname: 	@echo $(PKGNAME)
speculate.cabal view
@@ -1,5 +1,5 @@ name:                speculate-version:             0.3.5+version:             0.4.0 synopsis:            discovery of properties about Haskell functions description:   Speculate automatically discovers laws about Haskell functions.@@ -22,6 +22,7 @@  extra-doc-files: README.md                , TODO.md+               , doc/speculate.svg extra-source-files: .gitignore                   , .travis.yml                   , Makefile@@ -66,7 +67,12 @@                   , tests/test-sdist                   , tests/update-test-model -tested-with: GHC==8.2, GHC==8.0, GHC==7.10, GHC==7.8, GHC==7.6, GHC==7.4+tested-with: GHC==8.6+           , GHC==8.4+           , GHC==8.2+           , GHC==8.0+           , GHC==7.10+           , GHC==7.8  source-repository head   type:            git@@ -75,7 +81,7 @@ source-repository this   type:            git   location:        https://github.com/rudymatela/speculate-  tag:             v0.3.5+  tag:             v0.4.0   library@@ -87,19 +93,16 @@                  , Test.Speculate.Report                  , Test.Speculate.Engine                  , Test.Speculate.Expr-                 , Test.Speculate.Expr.Canon                  , Test.Speculate.Expr.Core                  , Test.Speculate.Expr.Equate                  , Test.Speculate.Expr.Ground                  , Test.Speculate.Expr.Instance-                 , Test.Speculate.Expr.Match                  , Test.Speculate.Pretty                  , Test.Speculate.Reason                  , Test.Speculate.Reason.Order                  , Test.Speculate.SemiReason                  , Test.Speculate.CondReason                  , Test.Speculate.Sanity-                 , Test.Speculate.Misc                  , Test.Speculate.Utils   other-modules:   Test.Speculate.Utils.Class                  , Test.Speculate.Utils.Colour@@ -114,79 +117,67 @@                  , Test.Speculate.Utils.Timeout                  , Test.Speculate.Utils.Tuple                  , Test.Speculate.Utils.Typeable-  build-depends: base >= 4 && < 5, leancheck >= 0.7.2, cmdargs, containers+  build-depends: base >= 4 && < 5+               , leancheck >= 0.9.1+               , express >= 0.1.0+               , cmdargs+               , containers   hs-source-dirs:    src   default-language:  Haskell2010  test-suite creason   main-is:           test-creason.hs-  other-modules:     Test+  other-modules:     Test, Test.ListableExpr   hs-source-dirs:    tests-  build-depends:     base >= 4 && < 5, leancheck, speculate+  build-depends:     base >= 4 && < 5, leancheck, express, speculate   default-language:  Haskell2010   type:              exitcode-stdio-1.0  test-suite engine   main-is:           test-engine.hs-  other-modules:     Test+  other-modules:     Test, Test.ListableExpr   hs-source-dirs:    tests-  build-depends:     base >= 4 && < 5, leancheck, speculate+  build-depends:     base >= 4 && < 5, leancheck, express, speculate   default-language:  Haskell2010   type:              exitcode-stdio-1.0  test-suite eval   main-is:           test-eval.hs-  other-modules:     Test+  other-modules:     Test, Test.ListableExpr   hs-source-dirs:    tests-  build-depends:     base >= 4 && < 5, leancheck, speculate+  build-depends:     base >= 4 && < 5, leancheck, express, speculate   default-language:  Haskell2010   type:              exitcode-stdio-1.0  test-suite expr   main-is:           test-expr.hs-  other-modules:     Test-  hs-source-dirs:    tests-  build-depends:     base >= 4 && < 5, leancheck, speculate-  default-language:  Haskell2010-  type:              exitcode-stdio-1.0--test-suite match-  main-is:           test-match.hs-  other-modules:     Test-  hs-source-dirs:    tests-  build-depends:     base >= 4 && < 5, leancheck, speculate-  default-language:  Haskell2010-  type:              exitcode-stdio-1.0--test-suite misc-  main-is:           test-misc.hs-  other-modules:     Test+  other-modules:     Test, Test.ListableExpr   hs-source-dirs:    tests-  build-depends:     base >= 4 && < 5, leancheck, speculate+  build-depends:     base >= 4 && < 5, leancheck, express, speculate   default-language:  Haskell2010   type:              exitcode-stdio-1.0  test-suite order   main-is:           test-order.hs-  other-modules:     Test+  other-modules:     Test, Test.ListableExpr   hs-source-dirs:    tests-  build-depends:     base >= 4 && < 5, leancheck, speculate+  build-depends:     base >= 4 && < 5, leancheck, express, speculate   default-language:  Haskell2010   type:              exitcode-stdio-1.0  test-suite reason   main-is:           test-reason.hs-  other-modules:     Test+  other-modules:     Test, Test.ListableExpr   hs-source-dirs:    tests-  build-depends:     base >= 4 && < 5, leancheck, speculate+  build-depends:     base >= 4 && < 5, leancheck, express, speculate   default-language:  Haskell2010   type:              exitcode-stdio-1.0  test-suite utils   main-is:           test-utils.hs-  other-modules:     Test+  other-modules:     Test, Test.ListableExpr   hs-source-dirs:    tests-  build-depends:     base >= 4 && < 5, leancheck, speculate+  build-depends:     base >= 4 && < 5, leancheck, express, speculate   default-language:  Haskell2010   type:              exitcode-stdio-1.0 @@ -199,8 +190,8 @@  benchmark test-stats   main-is:           test-stats.hs-  other-modules:     Test+  other-modules:     Test, Test.ListableExpr   hs-source-dirs:    tests-  build-depends:     base >= 4 && < 5, leancheck, speculate+  build-depends:     base >= 4 && < 5, leancheck, express, speculate   default-language:  Haskell2010   type:              exitcode-stdio-1.0
src/Test/Speculate.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -47,7 +47,17 @@   -- | The following combinators are used to build   --   the 'instances' list from 'Args'.   , Instances-  , ins, eq, ord, eqWith, ordWith, names+  , reifyInstances+  , reifyEq+  , reifyOrd+  , reifyEqOrd+  , reifyListable+  , mkEq+  , mkOrd+  , mkOrdLessEqual+  , mkListable+  , mkNameWith+  , Name (..)    -- * Misc.   , report@@ -66,26 +76,30 @@  import Data.Typeable import Test.LeanCheck-import Test.LeanCheck.Utils hiding (comparison)+import Test.LeanCheck.Utils  import Test.Speculate.Expr   ( Expr-  , constant-  , var   , hole-  , showConstant   , Instances-  , ins-  , eq-  , eqWith-  , ord-  , ordWith-  , names+  , reifyInstances+  , reifyEq+  , reifyOrd+  , reifyEqOrd+  , reifyListable+  , mkEq+  , mkOrd+  , mkOrdLessEqual+  , mkListable+  , mkNameWith+  , Name (..)   ) import Test.Speculate.Args   ( Args (..)   , args   , getArgs+  , constant+  , showConstant   , foreground   , background   , processArgs
src/Test/Speculate/Args.hs view
@@ -1,7 +1,7 @@ {-# Language DeriveDataTypeable #-} -- for GHC <= 7.8 -- | -- Module      : Test.Speculate.CondReason--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -12,6 +12,8 @@   ( Args (..)   , args +  , constant+  , showConstant   , foreground   , background @@ -28,6 +30,13 @@   , shouldShowConditionalEquation   , reallyShowConditions +  , foregroundConstants+  , backgroundConstants++  , about++  , allAbout+   -- TODO: remove the following exports eventually:   , prepareArgs   , module System.Console.CmdArgs.Explicit@@ -44,6 +53,7 @@ import Data.Maybe (catMaybes) import Data.Monoid ((<>)) +import Data.Maybe  -- | Arguments to Speculate data Args = Args@@ -166,21 +176,21 @@   fore = foregroundConstants args  keepExpr :: Args -> Expr -> Bool-keepExpr Args{maxConstants = Just n} e | length (consts e) > n = False-keepExpr Args{maxDepth     = Just n} e |         depthE e  > n = False-keepExpr _                           _                         = True+keepExpr Args{maxConstants = Just n} e | length (nubConsts e) > n = False+keepExpr Args{maxDepth     = Just n} e |             depth e  > n = False+keepExpr _                           _                            = True  reallyShowConditions :: Args -> Bool reallyShowConditions args = showConditions args                          && boolTy `elem` map (finalResultTy . typ) (allConstants args)  atoms :: Args -> [[Expr]]-atoms args = [ nubSort (map holeOfTy ts)+atoms args = [ nubSort (mapMaybe (maybeHoleOfTy is) ts)        `union` allConstants args-       `union` [showConstant True  | showConds || showDot args]-       `union` [showConstant False | showConds || showDot args]-       `union` (nubSort . catMaybes) [eqE is t | showConds, t <- ts] ]-         \-/ foldr (\/) [] [tiersE is t | autoConstants args, t <- ts]+       `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]   where   ts = types args   is = computeInstances args@@ -190,6 +200,7 @@   []  \-/ yss  =  yss   (xs:xss) \-/ (ys:yss)  =  xs `union` ys  :  xss \-/ yss +-- misnomer: these are not all types, but just the star kinded ones... types :: Args -> [TypeRep] types = nubMergeMap (typesIn . typ) . allConstants @@ -209,29 +220,32 @@ -- > x + y == z `allAbout` [(+)] == False -- > x + y == z `allAbout` [(+),(==)] == True allAbout :: Expr -> [Expr] -> Bool-e `allAbout` es = atomicConstants e `areAll` (`elem` es)+e `allAbout` es = nubConsts e `areAll` (`elem` es)  about :: Expr -> [Expr] -> Bool-e `about` es = atomicConstants e `areAny` (`elem` es)--notAbout :: Expr -> [Expr] -> Bool-notAbout = not .: about+e `about` es = nubConsts e `areAny` (`elem` es)  timeout :: Args -> Bool -> Bool timeout Args{evalTimeout = Nothing} = id timeout Args{evalTimeout = Just t}  = timeoutToFalse t --- needs lexicompareBy compareExpr :: Args -> Expr -> Expr -> Ordering-compareExpr args = compareComplexityThen (lexicompareBy cmp)+compareExpr args = compareComplexity <> lexicompareBy cmp   where   e1 `cmp` e2 | arity e1 == 0 && arity e2 /= 0 = LT   e1 `cmp` e2 | arity e1 /= 0 && arity e2 == 0 = GT-  e1 `cmp` e2 = compareIndex (concat $ atoms args) e1 e2 <> e1 `compare` e2+  e1 `cmp` e2 = compareIndex (exprPair:concat (atoms args)) e1 e2 <> e1 `compare` e2+  exprPair = head . unfoldApp $ foldPair (val (), val ()) -- NOTE: "concat $ atoms args" may be an infinite list.  This function assumes -- that the symbols will appear on the list eventually for termination.  If I -- am correct this ivariant is assured by the rest of the code. +constant :: Typeable a => String -> a -> Expr+constant = value++showConstant :: (Typeable a, Show a) => a -> Expr+showConstant = val+ -- | A special 'Expr' value. --   When provided on the 'constants' list,  --   makes all the following constants 'foreground' constants.@@ -292,11 +306,12 @@   ]   where   (short:long) --= fun = flagReq  (filter (/= " ") [[short],long]) ((Right .) . fun) "X" ""+  _            --= _   = error "(--=): first argument can't be \"\""   (short:long) --. fun = flagNone (filter (/= " ") [[short],long]) fun                   ""+  _            --. _   = error "(--.): first argument can't be \"\""   parseMinTests :: String -> Int -> Int   parseMinTests s | last s == '%' = \x -> read (init s) * x `div` 100                   | otherwise     = const (read s)  getArgs :: Args -> IO Args getArgs = processArgs . prepareArgs-
src/Test/Speculate/CondReason.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.CondReason--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -13,7 +13,7 @@ import Test.Speculate.Reason import qualified Test.Speculate.Utils.Digraph as D import Test.Speculate.Utils.Digraph (Digraph)-import Data.Maybe (mapMaybe,maybeToList,fromMaybe)+import Data.Maybe (maybeToList,fromMaybe) import Data.List (lookup, sortBy) import Data.Function (on) import Data.Functor ((<$>)) -- for GHC < 7.10@@ -28,6 +28,7 @@   , unThy :: Thy   } +emptyChy :: Chy emptyChy = Chy   { cequations = []   , cimplications = D.empty@@ -48,10 +49,10 @@ listEquivalent Chy{cclasses = ccss} ce = fromMaybe [] $ lookup ce ccss  reduceRootWith :: Binds -> Expr -> (Expr,Expr) -> Maybe Expr-reduceRootWith bs e (e1,e2) = (e2 `assigning`) <$> matchWith bs e e1+reduceRootWith bs e (e1,e2) = (e2 //-) <$> matchWith bs e e1  reductions1With :: Binds -> Expr -> (Expr,Expr) -> [Expr]-reductions1With bs e (l,_) | lengthE l > lengthE e = [] -- optional optimization+reductions1With bs e (l,_) | size l > size e = [] -- optional optimization reductions1With bs e@(e1 :$ e2) r = maybeToList (reduceRootWith bs e r)                                  ++ map (:$ e2) (reductions1With bs e1 r)                                  ++ map (e1 :$) (reductions1With bs e2 r)@@ -84,9 +85,9 @@  cIsInstanceOf :: Chy -> (Expr,Expr,Expr) -> (Expr,Expr,Expr) -> Bool cIsInstanceOf chy (ce2,le2,re2) (ce1,le1,re1) =-  case match2 (le2,re2) (le1,re1) of+  case foldPair (le2,re2) `match` foldPair (le1,re1) of     Nothing -> False-    Just bs -> equivalent (unThy chy) (ce1 `assigning` bs) ce2+    Just bs -> equivalent (unThy chy) (ce1 //- bs) ce2  -- TODO: make cinsert result independent of insertion order cinsert :: (Expr,Expr,Expr) -> Chy -> Chy@@ -113,8 +114,8 @@   expandSmallerConditions ceq@(ce,e1,e2) =     (ce,e1,e2) : [ (ce',cnormalize chy' ce' e1,cnormalize chy' ce' e2)                  | ce' <- listImplies chy ce-                 , lengthE ce' < lengthE ce-                 , ce' /= falseE+                 , size ce' < size ce+                 , ce' /= val False                  , let chy' = chy{cequations = L.delete ceq ceqs}                  , not $ cequivalent chy' ce' e1 e2                  ]@@ -125,7 +126,7 @@ canonicalizeCEqnWith :: (Expr -> Expr -> Ordering) -> Instances -> (Expr,Expr,Expr) -> (Expr,Expr,Expr) canonicalizeCEqnWith cmp ti = c . o   where-  c (ce,e1,e2) = case canonicalizeWith ti (e2 :$ (e1 :$ ce)) of+  c (ce,e1,e2) = case canonicalizeWith (lookupNames ti) (e2 :$ (e1 :$ ce)) of                    (e2' :$ (e1' :$ ce')) -> (ce',e1',e2')                    _ -> error $ "canonicalizeCEqnWith: the impossible happened,"                              ++ "this is definitely a bug, see source!"
src/Test/Speculate/Engine.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Engine--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -8,8 +8,7 @@ -- -- Main engine to process data. module Test.Speculate.Engine-  ( vassignments-  , expansions+  ( expansions   , expansionsOfType   , expansionsWith   , mostGeneral@@ -41,7 +40,6 @@ import Data.Maybe import Data.List hiding (insert) import Data.Function (on)-import Data.Monoid ((<>))  import Test.LeanCheck ((\/)) import Test.Speculate.Utils@@ -56,50 +54,34 @@ ------------------------------ -- * Manipulating expressions --- | List all relevant variable assignments in an expresssion.---   In pseudo-Haskell:------ > vassignments (0 + x) == [0 + x]--- > vassignments (0 + 0) == [0 + 0]--- > vassignments (0 + _) == [0 + x]--- > vassignments (_ + _) == [x + x, x + y]--- > vassignments (_ + (_ + ord _)) == [x + (x + ord c), x + (y + ord c)]------ You should not use this on expression with already assinged variables--- (undefined, but currently defined behavior):------ > vassignments (ii -+- i_) == [ii -+- ii]-vassignments :: Expr -> [Expr]-vassignments e =-  [ foldl fill e [ [ Var (defNames !! i) t | i <- is ]-                 | (t,is) <- fs ]-  | fs <- productsList [[(t,is) | is <- iss 0 c] | (t,c) <- counts (holes e)] ]-  -- > fss _ + _ = [ [(Int,[0,0])], [(Int,[0,1])] ]-  -- > fss _ + (_ + ord _) = [ [(Int,[0,0]),(Char,[1])]-  -- >                       , [(Int,[0,1]),(Char,[1])] ]--- TODO: rename vassignments, silly name.  what about canonicalExpansions?--vassignmentsEqn :: (Expr,Expr) -> [(Expr,Expr)]-vassignmentsEqn = filter (uncurry (/=)) . map unEquation . vassignments . uncurry phonyEquation+canonicalVariationsEqn :: (Expr,Expr) -> [(Expr,Expr)]+canonicalVariationsEqn = filter (uncurry (/=))+                       . map unfoldPair+                       . fastCanonicalVariations+                       . foldPair  -- | List all variable assignments for a given type and list of variables.-expansionsOfType :: TypeRep -> [String] -> Expr -> [Expr]-expansionsOfType t vs e = [ fill e [Var v t | v <- vs']-                          | vs' <- placements (countHoles t e) vs ]+expansionsOfType :: Expr -> [String] -> Expr -> [Expr]+expansionsOfType ht vs e = [ fill e [v `varAsTypeOf` ht | v <- vs']+                           | vs' <- placements (countHoles ht e) vs ]   where   placements :: Int -> [a] -> [[a]]   placements 0 xs = [[]]   placements n xs = [y:ys | y <- xs, ys <- placements (n-1) xs]+  countHoles :: Expr -> Expr -> Int+  countHoles ht e = length [() | h <- holes e, typ h == typ ht]+-- change first argument of expansionsOfType to just [Expr] with the list of+-- possible variables?  expansionsWith :: [Expr] -> Expr -> [Expr]-expansionsWith es = ew (collectWith typ nam (,) es)+expansionsWith es = ew (collectOn typ es)   where-  nam (Var s _) = s-  typ (Var _ t) = t-  ew :: [(TypeRep,[String])] -> Expr -> [Expr]-  ew []            e = [e]-  ew ((t,ns):tnss) e = ew tnss-           `concatMap` expansionsOfType t ns e+  nam (Value ('_':s) _) = s+  nam _ = "expansionsWith: argument list must only contain vars."+  ew :: [[Expr]] -> Expr -> [Expr]+  ew []        e = [e]+  ew (es:tnss) e = ew tnss+           `concatMap` expansionsOfType (head es) (map nam es) e  -- | List all variable assignments for a given number of variables. --   It only assign variables to holes (variables with "" as its name).@@ -114,24 +96,24 @@ -- > , (y + y) + ord c :: Int -- > , (y + y) + ord d :: Int ] expansions :: Instances -> Int -> Expr -> [Expr]-expansions ti n e =+expansions is n e =   case counts (holes e) of     []      -> [e]-    (t,c):_ -> expansions ti n `concatMap`-               expansionsOfType t (take n (names ti t)) e+    (h,c):_ -> expansions is n `concatMap`+               expansionsOfType h (take n (lookupNames is h)) e  -- | List the most general assignment of holes in an expression mostGeneral :: Expr -> Expr-mostGeneral = head . vassignments -- TODO: make this efficient+mostGeneral = head . fastCanonicalVariations -- TODO: make this efficient  -- | List the most specific assignment of holes in an expression mostSpecific :: Expr -> Expr-mostSpecific = last . vassignments -- TODO: make this efficient+mostSpecific = last . fastCanonicalVariations -- TODO: make this efficient  rehole :: Expr -> Expr-rehole (e1 :$ e2) = rehole e1 :$ rehole e2-rehole (Var _ t) = Var "" t-rehole e = e+rehole (e1 :$ e2)    = rehole e1 :$ rehole e2+rehole e | isVar e   = "" `varAsTypeOf` e+         | otherwise = e  ---------------------------- -- * Enumerating expressions@@ -244,9 +226,13 @@ -- > equivalencesBetween basicInstances 500 (_ + _) (_ + _) = -- >   [i + j == j + i] equivalencesBetween :: (Expr -> Expr -> Bool) -> Expr -> Expr -> [(Expr,Expr)]-equivalencesBetween (===) e1 e2 = discardLater (isInstanceOf `on` uncurry phonyEquation)-                                . filter (uncurry (===))-                                $ vassignmentsEqn (e1,e2)+equivalencesBetween (===) e1 e2 = filterRelevant $ canonicalVariationsEqn (e1,e2)+  where+  isInstanceOf'  =  isInstanceOf `on` foldPair+  filterRelevant []      =  []+  filterRelevant (e:es)+    | uncurry (===) e    =  e : filterRelevant (discard (`isInstanceOf'` e) es)+    | otherwise          =  filterRelevant es  semiTheoryFromThyAndReps :: Instances -> Int -> Int                          -> Thy -> [Expr] -> Shy@@ -256,7 +242,7 @@                       && typ e1 == typ e2                       && lessOrEqual ti nt e1 e2)   . distinctFromSchemas ti nt nv thy-  . filter (isOrdE ti)+  . filter (isOrd ti)  conditionalTheoryFromThyAndReps :: Instances                                 -> (Expr -> Expr -> Ordering)@@ -270,9 +256,9 @@     (lessOrEqual ti nt)     csz thy clpres cles   where-  (cles,clpres) = (id *** filter (\(e,_) -> lengthE e <= csz))+  (cles,clpres) = (id *** filter (\(e,_) -> size e <= csz))                 . partition (\(e,_) -> typ e /= boolTy)-                . filter (isEqE ti . fst)+                . filter (isEq ti . fst)                 $ classesFromSchemas ti nt nv thy es'  conditionalEquivalences :: (Expr -> Expr -> Ordering)@@ -283,14 +269,13 @@ conditionalEquivalences cmp canon cequal (==>) csz thy clpres cles =     cdiscard (\(ce,e1,e2) -> subConsequence thy clpres ce e1 e2)   . foldl (flip cinsert) (Chy [] cdg clpres thy)-  . sortBy (\(c1,e11,e12) (c2,e21,e22) -> c1 `cmp` c2-                                       <> ((e11 `phonyEquation` e12) `cmp` (e21 `phonyEquation` e22)))-  . discard (\(pre,e1,e2) -> pre == falseE-                          || length (vars pre \\ (vars e1 +++ vars e2)) > 0+  . sortBy (cmp `on` foldTrio)+  . discard (\(pre,e1,e2) -> pre == val False+                          || length (nubVars pre \\ (nubVars e1 +++ nubVars e2)) > 0                           || subConsequence thy [] pre e1 e2)   . filter canon   $ [ (ce, e1, e2)-    | e1 <- es, e2 <- es, e1 /= e2, canon (falseE,e1,e2)+    | e1 <- es, e2 <- es, e1 /= e2, canon (val False,e1,e2)     , typ e1 == typ e2, typ e1 /= boolTy     , ce <- explain e1 e2     ]@@ -307,12 +292,12 @@ -- > subConsequence (abs x == abs y) (abs x) (abs y) == True -- > subConsequence (abs x == 1) (x + abs x) (20) == False (artificial) subConsequence :: Thy -> [Class Expr] -> Expr -> Expr -> Expr -> Bool-subConsequence thy clpres ((Constant "==" _ :$ ea) :$ eb) e1 e2+subConsequence thy clpres ((Value "==" _ :$ ea) :$ eb) e1 e2   -- NOTE: the first 4 are uneeded, but make it a bit faster...-  | ea `isSub` e1 && equivalent thy{closureLimit=1} (sub ea eb e1) e2 = True-  | eb `isSub` e1 && equivalent thy{closureLimit=1} (sub eb ea e1) e2 = True-  | ea `isSub` e2 && equivalent thy{closureLimit=1} (sub ea eb e2) e1 = True-  | eb `isSub` e2 && equivalent thy{closureLimit=1} (sub eb ea e2) e1 = True+  | 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   | equivalent ((ea,eb) `insert` thy){closureLimit=1} e1 e2 = True subConsequence thy clpres ce e1 e2 = or   [ subConsequence thy clpres ce' e1 e2
src/Test/Speculate/Expr.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Expr--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -10,16 +10,14 @@ module Test.Speculate.Expr   ( module Test.Speculate.Expr.Core   , module Test.Speculate.Expr.Ground-  , module Test.Speculate.Expr.Match   , module Test.Speculate.Expr.Instance   , module Test.Speculate.Expr.Equate-  , module Test.Speculate.Expr.Canon+  , module Test.Speculate.Utils.Typeable   ) where  import Test.Speculate.Expr.Core import Test.Speculate.Expr.Ground-import Test.Speculate.Expr.Match import Test.Speculate.Expr.Instance import Test.Speculate.Expr.Equate-import Test.Speculate.Expr.Canon+import Test.Speculate.Utils.Typeable
− src/Test/Speculate/Expr/Canon.hs
@@ -1,44 +0,0 @@--- |--- Module      : Test.Speculate.Expr.Canon--- Copyright   : (c) 2016-2017 Rudy Matela--- License     : 3-Clause BSD  (see the file LICENSE)--- Maintainer  : Rudy Matela <rudy@matela.com.br>------ This module is part of Speculate.------ Canonicalize and check canonicity of expressions.-module Test.Speculate.Expr.Canon-  ( canonicalize-  , canonicalizeWith-  , canonicalWith-  )-where--import Test.Speculate.Expr.Core-import Test.Speculate.Expr.Match-import Test.Speculate.Expr.Instance-import Data.List ((\\))---- | Canonicalize variable names in an expression.------ > canonicalize (x + y) = (x + y)--- > canonicalize (y + x) = (x + y)--- > canonicalize (y + (z + x)) = (x + (y + z))--- > canonicalize ((w + z) + (z + x)) = ((x + y) + (y + z))--- > canonicalize (y + abs y) = (x + abs x)--- > canonicalize ((y + x) == (x + y)) = ((x + y) == (y + x))-canonicalizeWith :: Instances -> Expr -> Expr-canonicalizeWith ti e = e `assigning` ((\(t,n,n') -> (n,Var n' t)) `map` cr [] e)-  where-  cr :: [(TypeRep,String,String)] -> Expr -> [(TypeRep,String,String)]-  cr bs (e1 :$ e2) = cr (cr bs e1) e2-  cr bs (Var n t)-    | any (\(t',n',_) -> t == t' && n == n') bs = bs-    | otherwise = (t,n,head $ names ti t \\ map (\(_,_,n) -> n) bs):bs-  cr bs _ = bs--canonicalize :: Expr -> Expr-canonicalize = canonicalizeWith preludeInstances--canonicalWith :: Instances -> Expr -> Bool-canonicalWith ti e = canonicalizeWith ti e == e
src/Test/Speculate/Expr/Core.hs view
@@ -1,468 +1,149 @@ -- | -- Module      : Test.Speculate.Expr.Core--- Copyright   : (c) 2016-2017 Rudy Matela+-- 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. ----- Defines the 'Expr' type and basic operations on it.-{-# LANGUAGE DeriveDataTypeable #-} -- for GHC < 7.10+-- This module reexports 'Data.Express' along with some extra utilities. module Test.Speculate.Expr.Core-  ( Expr (..)-  -- * Smart constructors-  , constant-  , showConstant-  , var-  , hole-  , holeOfTy-  , ($$)+  ( module Data.Express -  -- * Smart destructors-  , evaluate-  , eval-  , typ-  , etyp +  -- * Order+  , lexicompare+  , lexicompareBy -  -- * Queries-  , typeCorrect-  , arity-  , holes-  , vars-  , consts-  , atomicConstants-  , subexprs-  , subexprsV-  , isSub-  , hasVar-  , unfoldApp-  , isTuple-  , unfoldTuple+  -- * Properties   , isConstantNamed--  -- * Properties of expressions-  , lengthE-  , depthE-  , countHoles-  , countVar-  , countVars   , unrepeatedVars   , isAssignment-  , lexicompare-  , lexicompareBy-  , compareComplexity-  , compareComplexityThen -  -- * Useful expressions-  , falseE+  -- * Assigning+  , Binds+  , fill+  , sub -  -- * Showing-  , showExpr-  , showPrecExpr-  , showsPrecExpr-  , showOpExpr-  , showsOpExpr-  , eqExprCommuting+  -- * Matching+  , unify+  , unification+  , isCanonInstanceOf+  , hasCanonInstanceOf   ) where -import Data.List (intercalate, find)-import Data.Maybe (fromMaybe, isJust, catMaybes)-import Data.Function (on)+import Data.Express+import Test.Speculate.Utils.Typeable+import Test.Speculate.Utils.List import Data.Monoid ((<>))--import Data.Dynamic-import Test.LeanCheck-import Test.Speculate.Utils----- | An encoded Haskell functional-application expression for use by Speculate.-data Expr = Constant String Dynamic-          | Var String TypeRep-          | Expr :$ Expr-  deriving Typeable -- for GHC < 7.10---- | Encode a constant Haskell expression for use by Speculate.---   It takes a string representation of a value and a value, returning an---   'Expr'.  Examples:------ > constant "0" 0--- > constant "'a'" 'a'--- > constant "True" True--- > constant "id" (id :: Int -> Int)--- > constant "(+)" ((+) :: Int -> Int -> Int)--- > constant "sort" (sort :: [Bool] -> [Bool])-constant :: Typeable a => String -> a -> Expr-constant s x = Constant s (toDyn x)---- | A shorthand for 'constant' to be used on values that are 'Show' instances.---   Examples:------ > showConstant 0     =  constant "0" 0--- > showConstant 'a'   =  constant "'a'" 'a' --- > showConstant True  =  constant "True" True-showConstant :: (Typeable a, Show a) => a -> Expr-showConstant x = constant (show x) x---- | @var "x" (undefined :: Ty)@ returns a variable of type 'Ty' named "x"-var :: (Listable a, Typeable a) => String -> a -> Expr-var s a = Var s (typeOf a)---- | __(intended for advanced users)__------ @hole (undefined :: Ty)@ returns a hole of type 'Ty'------ By convention, a Hole is a variable named with the empty string.-hole :: (Listable a, Typeable a) => a -> Expr-hole = holeOfTy . typeOf--holeOfTy :: TypeRep -> Expr-holeOfTy = Var ""---- | 'Just' an 'Expr' application if the types match,---   'Nothing' otherwise.-($$) :: Expr -> Expr -> Maybe Expr-e1 $$ e2 =-  case typ e1 `funResultTy` typ e2 of-    Nothing -> Nothing-    Just _  -> Just $ e1 :$ e2----- Deprecated smart constructors:------ quick and dirty show instance-instance Show Expr where-  showsPrec d e = showParen (d > 10)-                $ showsPrecExpr 0 e-                . showString " :: "-                . shows (typ e)-                . showString (showHoles e)-    where-    showHoles e = case holes e of-                    [] -> ""-                    hs -> "  (holes: " ++ intercalate ", " (map show hs) ++ ")"--showsPrecExpr :: Int -> Expr -> String -> String-showsPrecExpr d (Constant s _) | isInfixedPrefix s = showString $ toPrefix s-showsPrecExpr d (Constant s _) | isNegativeLiteral s = showParen (d > 0) $ showString s-showsPrecExpr d (Constant s _) = showParen sp $ showString s-  where sp = if atomic s then isInfix s else maybe True (d >) $ outernmostPrec s-showsPrecExpr d (Var "" _)     = showString "_" -- a hole-showsPrecExpr d (Var s _)      = showParen (isInfix s) $ showString s-showsPrecExpr d ((Constant ":" _ :$ e1@(Constant _ _)) :$ e2)-  | typ e1 == typeOf (undefined :: Char) =-  case showsTailExpr e2 "" of-    '\"':cs  -> showString ("\"" ++ (init . tail) (showsPrecExpr 0 e1 "") ++ cs)-    cs -> showParen (d > prec ":")-        $ showsOpExpr ":" e1 . showString ":" . showString cs-showsPrecExpr d ((Constant ":" _ :$ e1) :$ e2) =-  case showsTailExpr e2 "" of-    "[]" -> showString "[" . showsPrecExpr 0 e1 . showString "]"-    '[':cs -> showString "[" . showsPrecExpr 0 e1 . showString "," . showString cs-    cs -> showParen (d > prec ":")-        $ showsOpExpr ":" e1 . showString ":" . showString cs-showsPrecExpr d ee | isTuple ee = id-    showString "("-  . foldr1 (\s1 s2 -> s1 . showString "," . s2)-           (showsPrecExpr 0 `map` unfoldTuple ee)-  . showString ")"-showsPrecExpr d ((Constant f _ :$ e1) :$ e2)-  | isInfix f = showParen (d > prec f)-              $ showsOpExpr f e1-              . showString " " . showString f . showString " "-              . showsOpExpr f e2-  | otherwise = showParen (d > prec " ")-              $ showString f-              . showString " " . showsOpExpr " " e1-              . showString " " . showsOpExpr " " e2-showsPrecExpr d (Constant f _ :$ e1)-  | isInfix f = showParen True-              $ showsOpExpr f e1 . showString " " . showString f-showsPrecExpr d (e1 :$ e2) = showParen (d > prec " ")-                           $ showsPrecExpr (prec " ") e1-                           . showString " "-                           . showsPrecExpr (prec " " + 1) e2--- TODO: the above show instance is getting big.  Move it into a separate file?--isTuple :: Expr -> Bool-isTuple = not . null . unfoldTuple--unfoldTuple :: Expr -> [Expr]-unfoldTuple = u . unfoldApp-  where-  u (Constant cs _:es) | not (null es) && cs == replicate (length es - 1) ','-                       = es-  u _   = []---- bad smell here, repeated code!-showsTailExpr :: Expr -> String -> String-showsTailExpr ((Constant ":" _ :$ e1@(Constant _ _)) :$ e2)-  | typ e1 == typeOf (undefined :: Char) =-  case showsPrecExpr 0 e2 "" of-    '\"':cs  -> showString ("\"" ++ (init . tail) (showsPrecExpr 0 e1 "") ++ cs)-    cs -> showsOpExpr ":" e1 . showString ":" . showsTailExpr e2-showsTailExpr ((Constant ":" _ :$ e1) :$ e2) =-  case showsPrecExpr 0 e2 "" of-    "[]" -> showString "[" . showsPrecExpr 0 e1 . showString "]"-    '[':cs -> showString "[" . showsPrecExpr 0 e1 . showString "," . showString cs-    cs -> showsOpExpr ":" e1 . showString ":" . showsTailExpr e2-showsTailExpr e = showsOpExpr ":" e--showsOpExpr :: String -> Expr -> String -> String-showsOpExpr op = showsPrecExpr (prec op + 1)--showOpExpr :: String -> Expr -> String-showOpExpr op = showPrecExpr (prec op + 1)--showPrecExpr :: Int -> Expr -> String-showPrecExpr n e = showsPrecExpr n e ""--showExpr :: Expr -> String-showExpr = showPrecExpr 0---- Does not evaluate values when comparing, but rather their representation as--- strings and their types.-instance Eq Expr where (==) = eqExprCommuting []--eqExprCommuting :: [Expr] -> Expr -> Expr -> Bool-eqExprCommuting ces = e-  where-  e (Var s1 t1) (Var s2 t2) = t1 == t2 && s1 == s2-  e (Constant s1 d1) (Constant s2 d2) = dynTypeRep d1 == dynTypeRep d2 && s1 == s2-  e ((ef1 :$ ex1) :$ ey1) ((ef2 :$ ex2) :$ ey2)-    | ef1 == ef2 && ef1 `elem` ces = eqExprCommuting ces ex1 ex2 && eqExprCommuting ces ey1 ey2-                                  || eqExprCommuting ces ex1 ey2 && eqExprCommuting ces ey1 ex2-  e (ef1 :$ ex1)  (ef2 :$ ex2)  = ef1 == ef2 && ex1 == ex2-  e _ _ = False--instance Ord Expr where-  compare = compareComplexity+import Data.Functor ((<$>)) -- for GHC <= 7.8 +lexicompare :: Expr -> Expr -> Ordering+lexicompare = lexicompareBy compare  lexicompareBy :: (Expr -> Expr -> Ordering) -> Expr -> Expr -> Ordering-lexicompareBy compareConstants = cmp+lexicompareBy compareConstants  =  cmp   where-  c1@(Constant _ _) `cmp` c2@(Constant _ _) = c1 `compareConstants` c2-  e1 `cmp` e2 | typ e1 /= typ e2    = typ e1 `compareTy` typ e2-  Var      s1 _ `cmp` Var      s2 _ = s1 `compare` s2-  (f :$ x)      `cmp` (g :$ y)      = f  `cmp` g   `thn`  x `cmp` y-  (_ :$ _)      `cmp` _             = GT-  _             `cmp` (_ :$ _)      = LT-  _             `cmp` Var _ _       = GT-  Var _ _       `cmp` _             = LT+  (f :$ x) `cmp` (g :$ y)  =  f  `cmp` g <> x `cmp` y+  (_ :$ _) `cmp` _         =  GT+  _        `cmp` (_ :$ _)  =  LT+  e1 `cmp` e2  =  case (isVar e1, isVar e2) of+    (True,  True)  -> let Value n1 _ = e1+                          Value n2 _ = e2+                      in typ e1 `compareTy` typ e2 <> n1 `compare` n2+    (False, True)  -> GT+    (True,  False) -> LT+    (False, False) -> e1 `compareConstants` e2   -- Var < Constants < Apps -lexicompareConstants :: Expr -> Expr -> Ordering-lexicompareConstants = cmp-  where-  e1 `cmp` e2 | typ e1 /= typ e2 = typ e1 `compareTy` typ e2-  Constant s1 _ `cmp` Constant s2 _ = s1 `compare` s2-  _ `cmp` _ = error "lexicompareConstants can only compare constants"---- | Compare two expressiosn lexicographically------ 1st their type arity;--- 2nd their type;--- 3rd var < constants < apps--- 4th lexicographic order on names-lexicompare :: Expr -> Expr -> Ordering-lexicompare = lexicompareBy lexicompareConstants---- | Compares two expressions first by their complexity:---   1st length;---   2nd number of variables (more variables is less complex);---   3nd sum of number of variable occurrences;---   4th their depth;---   5th normal `compare`.-compareComplexityThen :: (Expr -> Expr -> Ordering) -> Expr -> Expr -> Ordering-compareComplexityThen cmp = (compare `on` lengthE)-                         <> (flip compare `on` length . vars)-                         <> (flip compare `on` length . repVars)-                         <> (compare `on` length . consts)-                         <> cmp---- | Compares two expressions first by their complexity:---   1st length;---   2nd number of variables (more variables is less complex);---   3nd sum of number of variable occurrences;---   4th their depth;---   5th lexicompare.-compareComplexity :: Expr -> Expr -> Ordering-compareComplexity = compareComplexityThen lexicompare--falseE :: Expr-falseE = showConstant False---- | 'Just' the value of an expression when possible (correct type, no holes),---   'Nothing' otherwise.-evaluate :: Typeable a => Expr -> Maybe a-evaluate e = v e >>= fromDynamic-  where-  v :: Expr -> Maybe Dynamic-  v (Var      _ _) = Nothing-  v (Constant _ x) = Just x-  v (e1 :$ e2)     = do v1 <- v e1-                        v2 <- v e2-                        dynApply v1 v2---- | Evaluates an expression when possible (correct type, no holes).---   Returns a default value otherwise.-eval :: Typeable a => a -> Expr -> a-eval x e = fromMaybe x (evaluate e)---- | The type of an expression.  This raises errors, but those should not---   happen if expressions are smart-constructed.-typ :: Expr -> TypeRep-typ (Constant _ d) = dynTypeRep d-typ (Var      _ t) = t-typ (e1 :$ e2) = resultTy (typ e1) -- this silently ignores type mismatches, was:-{--  case typ e1 `funResultTy` typ e2 of-    Nothing -> error $ "type mismatch, cannot apply "-                    ++ show (typ e1) ++ " to " ++ show (typ e2)-    Just t  -> t--}---- | etyp returns either:---     the Right type---     a Left expression with holes with the structure of the I'll typed expression-etyp :: Expr -> Either Expr TypeRep-etyp (e1 :$ e2) =-  case (et1,et2) of-    (Right t1, Right t2) ->-      case t1 `funResultTy` t2 of-        Just t  -> Right t-        Nothing -> Left  e-    _ -> Left e-  where-  et1 = etyp e1-  et2 = etyp e2-  ettoe et = case et of Right t -> Var "" t-                        Left  e -> e-  e = ettoe et1 :$ ettoe et2-etyp e = Right (typ e)--- on error, what's left is an ill typed expression made up entirely of holes--- this could be a good workaround, but let's think more: cause it is really workaroundish--typeCorrect :: Expr -> Bool-typeCorrect (e1 :$ e2) = typeCorrect e1-                      && typeCorrect e2-                      && isJust (typ e1 `funResultTy` typ e2)-typeCorrect _ = True---- | Type arity of an 'Expr'-arity :: Expr -> Int-arity = tyArity . typ---- | List types holes (unamed variables) in an expression-holes :: Expr -> [TypeRep]-holes (e1 :$ e2)  = holes e1 ++ holes e2-holes (Var "" t) = [t]-holes _ = []---- | List all variables in an expression.-vars :: Expr -> [(TypeRep,String)]-vars (e1 :$ e2) = vars e1 +++ vars e2-vars (Var s t) = [(t,s)]-vars _ = []--atomicConstants :: Expr -> [Expr]-atomicConstants (e1 :$ e2) = atomicConstants e1 +++ atomicConstants e2-atomicConstants e@(Constant _ _) = [e]-atomicConstants _ = []--hasVar :: Expr -> Bool-hasVar (e1 :$ e2) = hasVar e1 || hasVar e2-hasVar (Var s t) = True-hasVar _ = False---- | List all variables in an expression, in order, with repetitions-repVars :: Expr -> [(TypeRep,String)]-repVars (e1 :$ e2) = repVars e1 ++ repVars e2-repVars (Var s t) = [(t,s)]-repVars _ = []---- | List terminal constants in an expression.  This does not repeat values.-consts :: Expr -> [Expr]-consts (e1 :$ e2)       = consts e1 +++ consts e2-consts e@(Constant _ _) = [e]-consts _                = []----- | Returns the length of an expression.  In term rewriting terms: |s|-lengthE :: Expr -> Int-lengthE (e1 :$ e2)  = lengthE e1 + lengthE e2-lengthE _           = 1---- | Returns the maximum depth of an expression.-depthE :: Expr -> Int-depthE e@(_:$_) = 1 + maximum (map depthE $ unfoldApp e)-depthE _        = 1---- | Number of occurrences of holes with a given type.-countHoles :: TypeRep -> Expr -> Int-countHoles t = count t . holes---- | Number of occurrences of a given variable name.--- In term rewriting terms: |s|_x-countVar :: TypeRep -> String -> Expr -> Int-countVar t n (e1 :$ e2) = countVar t n e1 + countVar t n e2-countVar t n (Var n' t') | t == t' && n == n' = 1-countVar _ _ _ = 0--countVars :: Expr -> [(TypeRep,String,Int)]-countVars e = map (\(t,n) -> (t,n,countVar t n e)) $ vars e+countVars :: Expr -> [(Expr,Int)]+countVars e = map (\e' -> (e',length . filter (== e') $ vars e)) $ nubVars e  unrepeatedVars :: Expr -> Bool-unrepeatedVars = all (\(_,_,n) -> n == 1) . countVars+unrepeatedVars = all (\(_,n) -> n == 1) . countVars  -- Is this espression an assignment of a variable to a value? isAssignment :: Expr -> Bool-isAssignment ((Constant "==" _ :$ Var _ _) :$ e2) = True-isAssignment ((Constant "==" _ :$ e1) :$ Var _ _) = True+isAssignment ((Value "==" _ :$ e1) :$ e2) = isVar e1 || isVar e2 isAssignment _ = False --- | Non-variable sub-expressions of an expression+isConstantNamed :: Expr -> String -> Bool+e@(Value n' _) `isConstantNamed` n = isConst e && n' == n+_ `isConstantNamed` _ = False++type Binds = [(Expr,Expr)]++-- | Fill holes in an expression.+--   Silently skips holes that are not of the right type.+--   Silently discard remaining expressions.+fill :: Expr -> [Expr] -> Expr+fill e = fst . fill' e+  where+  fill' :: Expr -> [Expr] -> (Expr,[Expr])+  fill' (e1 :$ e2) es = let (e1',es')  = fill' e1 es+                            (e2',es'') = fill' e2 es'+                        in (e1' :$ e2', es'')+  fill' eh (e:es) | isHole eh && typ eh == typ e = (e,es)+  fill' e es = (e,es)++-- | Substitute matching subexpressios. ----- This includes the expression itself-subexprs :: Expr -> [Expr]-subexprs e@(e1 :$ e2)     = [e] +++ subexprs e1 +++ subexprs e2-subexprs e@(Constant _ _) = [e]-subexprs _                = []+-- 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)]) --- | Sub-expressions of an expression---   including variables and the expression itself.-subexprsV :: Expr -> [Expr]-subexprsV e@(e1 :$ e2)  = [e] +++ subexprsV e1 +++ subexprsV e2-subexprsV e = [e]+unify :: Expr -> Expr -> Maybe Expr+unify e1 e2 = (e1 //-) <$> unification e1 e2 -isConstant :: Expr -> Bool-isConstant (Constant _ _) = True-isConstant _              = False+unification :: Expr -> Expr -> Maybe [(Expr,Expr)]+unification = naiveUnification --- | Is a subexpression of.-isSub :: Expr -> Expr -> Bool-isSub e e0 | e == e0 = True-isSub e (e1 :$ e2) = isSub e e1 || isSub e e2-isSub e e0 = e == e0+findBind :: Expr -> Expr -> Either Bool (Expr,Expr)+findBind e1         e2          |  typ e1 /= typ e2  =  Left False+                                |  e1 == e2          =  Left True+                                |  isVar e1          =  Right (e1,e2)+                                |  isVar e2          =  Right (e2,e1)+findBind (f1 :$ x1) (f2 :$ x2)  =  case findBind f1 f2 of+                                   Left True -> findBind x1 x2+                                   r         -> r+findBind e1         e2          =  Left (e1 == e2) --- | Make substitutions on subexpressions, variables have to match exactly!-sub :: Expr -> Expr -> Expr -> Expr-sub ef et = s+-- NOTE: there are faster methods for unification.+naiveUnification :: Expr -> Expr -> Maybe [(Expr,Expr)]+naiveUnification e1' e2' = uu e1' e2' []   where-  s e | e == ef = et-  s (e1 :$ e2)  = s e1 :$ s e2-  s e           = e+  uu :: Expr -> Expr -> Binds -> Maybe Binds+  uu e1' e2' bs' =+    case u e1' e2' bs' of+      Nothing -> Nothing+      Just (e1,e2,bs) ->+        if e1' == e1 && e2' == e2+        then Just bs+        else uu e1 e2 bs+  u :: Expr -> Expr -> Binds -> Maybe (Expr,Expr,Binds)+  u e1 e2 bs =+    case findBind e1 e2 of+    Left False -> Nothing+    Left True  -> Just (e1,e2,bs)+    Right (ex,e) ->+      if ex `isSubexprOf` e+      then Nothing+      else Just ( e1 //- [(ex,e)]+                , e2 //- [(ex,e)]+                , (ex,e):[(ex',e' //- [(ex,e)]) | (ex',e') <- bs]+                ) -isConstantNamed :: Expr -> String -> Bool-Constant n' _ `isConstantNamed` n = n' == n-_             `isConstantNamed` _ = False+isCanonInstanceOf :: Expr -> Expr -> Bool+e1 `isCanonInstanceOf` e2 =+  case e1 `match` e2 of+    Nothing -> False+    Just xs -> strictlyOrderedOn snd (sortOn fst xs) --- | Unfold function application:------ > (((f :$ e1) :$ e2) :$ e3) = [f,e1,e2,e3]-unfoldApp :: Expr -> [Expr]-unfoldApp (ef :$ ex) = unfoldApp ef ++ [ex]-unfoldApp  ef        = [ef]+hasCanonInstanceOf :: Expr -> Expr -> Bool+e1           `hasCanonInstanceOf` e2 | e1   `isCanonInstanceOf` e2 = True+(e1f :$ e1x) `hasCanonInstanceOf` e2 | e1f `hasCanonInstanceOf` e2 ||+                                       e1x `hasCanonInstanceOf` e2 = True+_            `hasCanonInstanceOf` _                                = False
src/Test/Speculate/Expr/Equate.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Expr.Equate--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -14,120 +14,37 @@ --   inequations --   and conditional equations. module Test.Speculate.Expr.Equate-  ( equation, unEquation, isEquation, uselessEquation, usefulEquation-  , phonyEquation--  , inequality-  , comparisonLT, comparisonLE, unComparison--  , implication, unImplication, usefulImplication--  , conditionalEquation, unConditionalEquation, usefulConditionalEquation-  , conditionalComparisonLT, conditionalComparisonLE, unConditionalComparison+  ( unEquation+  , isEquation+  , unComparison+  , mkConditionalEquation+  , unConditionalEquation   ) where -import Test.LeanCheck ((==>))-import Data.List ((\\))-import Test.Speculate.Utils import Test.Speculate.Expr.Core import Test.Speculate.Expr.Instance--equation :: Instances -> Expr -> Expr -> Maybe Expr-equation ti e1 e2 = do-  e <- eqE ti (typ e1)-  e :$ e1 $$ e2--phonyEquation :: Expr -> Expr -> Expr-phonyEquation e1 e2 | typ e1 /= typ e2 = error $ "phonyEquation: type mismatch "-                                              ++ show (typ e1) ++ ", "-                                              ++ show (typ e2)-phonyEquation e1 e2 = Var "==" (mkEqnTy $ typ e1) :$ e1 :$ e2+import Data.Express.Fixtures ((-==>-))  unEquation :: Expr -> (Expr,Expr)-unEquation ((Constant "==" _ :$ e1) :$ e2) = (e1,e2)-unEquation ((Var      "==" _ :$ e1) :$ e2) = (e1,e2)+unEquation ((Value "==" _ :$ e1) :$ e2) = (e1,e2) unEquation _ = error "unEquation: not an equation!"  isEquation :: Expr -> Bool-isEquation ((Constant "==" _ :$ e1) :$ e2) = True-isEquation ((Var      "==" _ :$ e1) :$ e2) = True+isEquation ((Value "==" _ :$ e1) :$ e2) = True isEquation _ = False --- | Given an equation encoded as an 'Expr'.---   Checks if both sides of an equation are the same.---   If the 'Expr' is not an equation, this raises an error.-uselessEquation :: Expr -> Bool-uselessEquation = uncurry (==) . unEquation--usefulEquation :: Expr -> Bool-usefulEquation = uncurry (/=) . unEquation--inequality :: Instances -> Expr -> Expr -> Maybe Expr-inequality ti e1 e2 = do-  e <- iqE ti (typ e1)-  e :$ e1 $$ e2--comparisonLT :: Instances -> Expr -> Expr -> Maybe Expr-comparisonLT ti e1 e2 = do-  e <- ltE ti (typ e1)-  e :$ e1 $$ e2--comparisonLE :: Instances -> Expr -> Expr -> Maybe Expr-comparisonLE ti e1 e2 = do-  e <- leE ti (typ e1)-  e :$ e1 $$ e2- unComparison :: Expr -> (Expr,Expr)-unComparison ((Constant "compare"  _ :$ e1) :$ e2) = (e1,e2)-unComparison ((Constant "<"        _ :$ e1) :$ e2) = (e1,e2)-unComparison ((Constant "<="       _ :$ e1) :$ e2) = (e1,e2)-unComparison ((Constant ">"        _ :$ e1) :$ e2) = (e1,e2)-unComparison ((Constant ">="       _ :$ e1) :$ e2) = (e1,e2)+unComparison ((Value "compare"  _ :$ e1) :$ e2) = (e1,e2)+unComparison ((Value "<"        _ :$ e1) :$ e2) = (e1,e2)+unComparison ((Value "<="       _ :$ e1) :$ e2) = (e1,e2)+unComparison ((Value ">"        _ :$ e1) :$ e2) = (e1,e2)+unComparison ((Value ">="       _ :$ e1) :$ e2) = (e1,e2) unComparison _ = error "unComparisonL: not a compare/(<)/(<=)/(>)/(>=) application" -implication :: Expr -> Expr -> Maybe Expr-implication e1 e2-  | typ e1 == boolTy = implicationE :$ e1 $$ e2-  | otherwise        = Nothing-  where-  implicationE = constant "==>" (==>)--unImplication :: Expr -> (Expr,Expr)-unImplication ((Constant "==>" _ :$ e1) :$ e2) = (e1,e2)-unImplication _ = error "unImplication: not an implication"--usefulImplication :: Expr -> Bool-usefulImplication e = vp \\ ve /= vp-  where-  (pre,e') = unImplication e-  vp = vars pre-  ve = vars e'--conditionalEquation :: Instances -> Expr -> Expr -> Expr -> Maybe Expr-conditionalEquation ti pre e1 e2 = (pre `implication`) =<< equation ti e1 e2+mkConditionalEquation :: Instances -> Expr -> Expr -> Expr -> Expr+mkConditionalEquation ti pre e1 e2 = pre -==>- mkEquation ti e1 e2  unConditionalEquation :: Expr -> (Expr,Expr,Expr)-unConditionalEquation ((Constant "==>" _ :$ pre) :$ ((Constant "==" _ :$ e1) :$ e2)) = (pre,e1,e2)+unConditionalEquation ((Value "==>" _ :$ pre) :$ ((Value "==" _ :$ e1) :$ e2)) = (pre,e1,e2) unConditionalEquation _ = error "unConditionalEquation: not an equation with side condition"---- an equation with a side condition is useful when sides of the equation are different--- and at least one variable is shared between the side condition and the equation-usefulConditionalEquation :: Expr -> Bool-usefulConditionalEquation e = e1 /= e2 && vp \\ ve /= vp-  where-  (pre,e1,e2) = unConditionalEquation e-  vp = vars pre-  ve = vars e1 +++ vars e2--conditionalComparisonLE :: Instances -> Expr -> Expr -> Expr -> Maybe Expr-conditionalComparisonLE ti pre e1 e2 = (pre `implication`) =<< comparisonLE ti e1 e2--conditionalComparisonLT :: Instances -> Expr -> Expr -> Expr -> Maybe Expr-conditionalComparisonLT ti pre e1 e2 = (pre `implication`) =<< comparisonLT ti e1 e2--unConditionalComparison :: Expr -> (Expr,Expr,Expr)-unConditionalComparison e = (econd,e1,e2)-  where-  (e1,e2) = unComparison ecmp-  (econd,ecmp) = unImplication e
src/Test/Speculate/Expr/Ground.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Expr.Ground--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -10,71 +10,57 @@ module Test.Speculate.Expr.Ground   ( grounds   , groundBinds-  , groundAndBinds   , equal   , lessOrEqual   , less   , inequal-  , true-  , false+  , isTrue+  , isFalse   , condEqual   , condEqualM-  , trueBinds   , trueRatio   ) where  import Test.Speculate.Expr.Core-import Test.Speculate.Expr.Match import Test.Speculate.Expr.Instance import Test.Speculate.Expr.Equate import Test.LeanCheck+import Test.LeanCheck.Error (errorToFalse) import Data.Ratio import Data.Functor ((<$>)) -- for GHC < 7.10-import Data.Maybe (fromMaybe) --- TODO: move vassignments / etc here- -- | List all possible valuations of an expression (potentially infinite). --   In pseudo-Haskell: ----- > take 3 $ grounds preludeInstances ((x + x) + y)+-- > take 3 $ grounds (lookupTiers preludeInstances) ((x + x) + y) -- >   == [(0 + 0) + 0, (0 + 0) + 1, (1 + 1) + 0]-grounds :: Instances -> Expr -> [Expr]-grounds ti e = (e `assigning`) <$> groundBinds ti e+--+-- Note this function will return an empty list when a 'Listable' instance is+-- not found in the 'Instances' list.+grounds :: (Expr -> [[Expr]]) -> Expr -> [Expr]+grounds tiersFor e = (e //-) <$> groundBinds tiersFor e  -- | List all possible variable bindings to an expression ----- > take 3 $ groundBinds preludeInstances ((x + x) + y)+-- > take 3 $ groundBinds (lookupTiers preludeInstances) ((x + x) + y) -- >   == [ [("x",0),("y",0)] -- >      , [("x",0),("y",1)] -- >      , [("x",1),("y",0)] ]-groundBinds :: Instances -> Expr -> [Binds]-groundBinds ti e =-  concat $ products [mapT ((,) n) (tiersE ti t) | (t,n) <- vars e]---- | List all possible variable bindings and valuations to an expression------ > groundAndBinds ti e == zipWith (,) (grounds ti e) (groundBinds ti e)-groundAndBinds :: Instances -> Expr -> [(Binds,Expr)]-groundAndBinds ti e = (\bs -> (bs, e `assigning` bs)) <$> groundBinds ti e+groundBinds :: (Expr -> [[Expr]]) -> Expr -> [Binds]+groundBinds tiersFor e =+  concat $ products [mapT ((,) v) (tiersFor v) | v <- nubVars e]  -- | Are two expressions equal for a given number of tests? equal :: Instances -> Int -> Expr -> Expr -> Bool -- equal ti _ e1 e2 | e1 == e2 = isComparable ti e1 -- optional optimization-equal ti n e1 e2 = maybe False (true ti n) (equation ti e1 e2)--- TODO: discover why the optimization above changes the output--- 1. $ make eg/list && ./eg/list -ES -r0 -s4 > without--- 2. uncomment above--- 3. $ make eg/list && ./eg/list -ES -r0 -s4 > with--- 4. diff -rud without with--- 5. see that there are less equivalence classes now!+equal ti n = isTrueComparison (take n . grounds (lookupTiers ti)) (mkEquation ti)  -- | Are two expressions equal --   under a given condition --   for a given number of tests? condEqual :: Instances -> Int -> Expr -> Expr -> Expr -> Bool-condEqual ti n pre e1 e2 = maybe False (true ti n) (conditionalEquation ti pre e1 e2)+condEqual ti n pre e1 e2 = isTrue (take n . grounds (lookupTiers ti)) (mkConditionalEquation ti pre e1 e2)  -- | Are two expressions equal --   under a given condition@@ -83,38 +69,42 @@ condEqualM :: Instances -> Int -> Int -> Expr -> Expr -> Expr -> Bool condEqualM ti n n0 pre e1 e2 = condEqual ti n pre e1 e2 && length cs >= n0   where-  cs =  fromMaybe []-     $  filter (eval False) . map condition . take n . grounds ti-    <$> conditionalEquation ti pre e1 e2+  cs = filter evalBool . map condition . take n . grounds (lookupTiers ti)+     $ mkConditionalEquation ti pre e1 e2   condition ceq = let (ce,_,_) = unConditionalEquation ceq in ce  -- | Are two expressions less-than-or-equal for a given number of tests? lessOrEqual :: Instances -> Int -> Expr -> Expr -> Bool-lessOrEqual ti n e1 e2 = maybe False (true ti n) (comparisonLE ti e1 e2)+lessOrEqual ti n = isTrueComparison (take n . grounds (lookupTiers ti)) (mkComparisonLE ti)  -- | Are two expressions less-than for a given number of tests?-less        :: Instances -> Int -> Expr -> Expr -> Bool-less        ti n e1 e2 = maybe False (true ti n) (comparisonLT ti e1 e2)+less :: Instances -> Int -> Expr -> Expr -> Bool+less ti n = isTrueComparison (take n . grounds (lookupTiers ti)) (mkComparisonLT ti)  -- | Are two expressions inequal for *all* variable assignments? --   Note this is different than @not . equal@. inequal :: Instances -> Int -> Expr -> Expr -> Bool-inequal ti n e1 e2 = maybe False (false ti n) (equation ti e1 e2)---- | Is a boolean expression true for all variable assignments?-true :: Instances -> Int -> Expr -> Bool-true ti n e = all (eval False) . take n $ grounds ti e---- | List variable bindings for which an expression holds true.-trueBinds :: Instances -> Int -> Expr -> [Binds]-trueBinds ti n e = [bs | (bs,e) <- take n $ groundAndBinds ti e, eval False e]+inequal ti n e1 e2 = isFalse (take n . grounds (lookupTiers ti)) (mkEquation ti e1 e2)  -- | Under a maximum number of tests, --   returns the ratio for which an expression holds true. trueRatio :: Instances -> Int -> Expr -> Ratio Int-trueRatio ti n e = length (trueBinds ti n e) % length (take n $ groundAndBinds ti e)+trueRatio is n e = length trueBinds % length gs+  where+  gs = take n $ grounds (lookupTiers is) e+  trueBinds = [e | e <- gs , eval False e] +isTrueComparison :: (Expr -> [Expr]) -> (Expr -> Expr -> Expr) -> Expr -> Expr -> Bool+isTrueComparison grounds mkComparison e1 e2  =  isTrue grounds (mkComparison e1 e2)++-- | Is a boolean expression true for all variable assignments?+isTrue :: (Expr -> [Expr]) -> Expr -> Bool+isTrue grounds  =  all evalBool . grounds+ -- | Is an expression ALWAYS false?--- This is *NOT* the same as not true-false :: Instances -> Int -> Expr -> Bool-false ti n e = all (not . eval False) . take n $ grounds ti e+-- This is *NOT* the same as not true.+isFalse :: (Expr -> [Expr]) -> Expr -> Bool+isFalse grounds  =  all (not . evalBool) . grounds++evalBool :: Expr -> Bool+evalBool  =  errorToFalse . eval False
src/Test/Speculate/Expr/Instance.hs view
@@ -1,7 +1,7 @@ {-# Language DeriveDataTypeable, StandaloneDeriving #-} -- for GHC <= 7.8 -- | -- Module      : Test.Speculate.Expr.Instance--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -10,259 +10,146 @@ -- Typeclass instance information. module Test.Speculate.Expr.Instance   ( Instances-  , Instance (..)-  , TypeRep -  -- * Smart constructors-  , ins-  , eq,       eqWith-  , ord,      ordWith-  , eqOrd-  , listable, listableWith-  , name+  -- * reifying instances+  , reifyInstances+  , reifyInstances1+  , reifyListable, mkListable -  -- * Queries on Instances-  , instanceType-  , findInfo-  , names-  , eqE, iqE, isEq,       isEqE-  , leE, ltE, isOrd,      isOrdE-  ,           isEqOrd,    isEqOrdE-  , tiersE,   isListable+  -- * checking instances+  , isListable, isListableT -  -- * Type info for standard Haskell types-  , preludeInstances+  -- * finding functions+  , lookupTiers+  , lookupTiersT+  , holeOfTy, maybeHoleOfTy -  -- * Does not belong here?-  , defNames+  -- * the preludeInstances definition+  , preludeInstances -  , boolTy-  , mkEqnTy+  -- * module re-export+  , module Data.Express.Instances   ) where +import Data.Express.Instances import Test.Speculate.Expr.Core-import Test.Speculate.Expr.Match-import Test.Speculate.Utils hiding (ord)+import Test.Speculate.Utils import Test.LeanCheck-import Test.LeanCheck.Utils hiding (comparison)-import Test.LeanCheck.Error (errorToFalse)-import Data.Dynamic--import Data.Maybe (isJust,fromMaybe,listToMaybe,catMaybes,mapMaybe)-import Data.List (find,(\\))-import Data.Monoid ((<>))----- | Type information needed to Speculate expressions (single type / single class).-data Instance = Instance String TypeRep [Expr]-  deriving Show--instance Eq Instance where-  Instance s1 t1 _ == Instance s2 t2 _  =  s1 == s2 && t1 == t2--instance Ord Instance where-  Instance s1 t1 _ `compare` Instance s2 t2 _  =  s1 `compare` s2 <> t1 `compare` t2----- | Type information needed to Speculate expressions.-type Instances = [Instance]--instanceType :: Instance -> TypeRep-instanceType (Instance _ t _)  =  t---- | Usage: @ins1 "x" (undefined :: Type)@-ins1 :: (Typeable a, Listable a, Show a, Eq a, Ord a)-          => String -> a -> Instances-ins1 n x = eq x ++ ord x ++ listable x ++ name n x--ins :: (Typeable a, Listable a, Show a, Eq a, Ord a)-    => String -> a -> Instances-ins n x = concat-  [    x      / n--  ,   [x]     / n ++ "s"-  ,  [[x]]    / n ++ "ss"---, [[[x]]]   / n ++ "ss"--  , (x,x)     / n ++ m-  , (x,x,x)   / n ++ m ++ o---, (x,x,x,x) / n ++ m ++ o ++ p+import Test.LeanCheck.Utils+import Data.Maybe -  , [(x,x)]   / n ++ m ++ "s"---, [(x,x,x)] / n ++ m ++ o ++ "ss"+type Instances = [Expr] -- TODO: remove? ---, (x,[x])   / n ++ m ++ "s"---, ([x],x)   / n ++ "s" ++ m---, ([x],[x]) / n ++ "s" ++ m ++ "s"---, (x,(x,x)) / n ++ m ++ o---, ((x,x),x) / n ++ m ++ o+reifyInstances1 :: (Typeable a, Listable a, Show a, Eq a, Ord a, Name a) => a -> Instances+reifyInstances1 a  =  concat [reifyListable a, reifyEqOrd a, reifyName a] -  , mayb x    / "m" ++ n ++ "1"---, eith x x  / "e" ++ n ++ o ++ "1"+reifyInstances :: (Typeable a, Listable a, Show a, Eq a, Ord a, Name a) => a -> Instances+reifyInstances a  =  concat+  [ r1 a+  , r1 [a]+--, r1 [[a]]+  , r1 (a,a)+--, r1 (a,a,a)+--, r1 [(a,a)]+  , r1 (mayb a)+--, r1 (eith a a)   ]   where-  (/) :: (Typeable a, Listable a, Show a, Eq a, Ord a)-      => a -> String -> Instances -- monomorphism restriction strikes again-  (/) = flip ins1-  infixr 0 /-  m = namesFromTemplate n !! 1-  o = namesFromTemplate m !! 1-  p = namesFromTemplate o !! 1--- NOTE: the function typeInfoN is not perfect: it won't help produce types--- combining different sub-types, like for example: (Bool,Int).  But it is--- way better than the original version in which I had to explictly define--- everything.  A definitive solution is still to be thought of.--- NOTE: see related TODO on the definition of basicInstances--eq :: (Typeable a, Eq a) => a -> Instances-eq x = eqWith $ (==) -:> x--ord :: (Typeable a, Ord a) => a -> Instances-ord x = ordWith $ (<=) -:> x--eqOrd :: (Typeable a, Eq a, Ord a) => a -> Instances-eqOrd x = eq x ++ ord x--listable :: (Typeable a, Show a, Listable a) => a -> Instances-listable x = listableWith $ tiers `asTypeOf` [[x]]--name :: Typeable a => String -> a -> Instances-name n x = [ Instance "Names" (typeOf x)-               [constant "names" $ namesFromTemplate n] ]--eqWith :: (Typeable a, Eq a) => (a -> a -> Bool) -> Instances-eqWith (==) = [ Instance "Eq" (typeOf $ arg (==))-                  [ constant "==" $ errorToFalse .: (==)-                  , constant "/=" $ (errorToFalse . not) .: (==)] ]-  where-  arg :: (a -> b) -> a-  arg _ = undefined--ordWith :: (Typeable a, Ord a) => (a -> a -> Bool) -> Instances-ordWith (<=) = [ Instance "Ord" (typeOf $ arg (<=))-                   [ constant "<=" $ errorToFalse .: (<=)-                   , constant "<"  $ (errorToFalse . not) .: flip (<=) ] ]-  where-  arg :: (a -> b) -> a-  arg _ = undefined--listableWith :: (Typeable a, Show a) => [[a]] -> Instances-listableWith xss = [ Instance "Listable" (typeOf $ head $ head xss)-                       [constant "tiers" $ mapT showConstant xss] ]--isEq :: Instances -> TypeRep -> Bool-isEq ti = isJust . eqE ti--isOrd :: Instances -> TypeRep -> Bool-isOrd ti = isJust . ltE ti--isEqOrd :: Instances -> TypeRep -> Bool-isEqOrd ti t = isOrd ti t && isEq ti t--isEqE :: Instances -> Expr -> Bool-isEqE ti = isEq ti . typ--isOrdE :: Instances -> Expr -> Bool-isOrdE ti = isOrd ti . typ--isEqOrdE :: Instances -> Expr -> Bool-isEqOrdE ti = isEqOrd ti . typ--isListable :: Instances -> TypeRep -> Bool-isListable ti t = isJust $ findInfo m ti-  where-  m (Instance "Listable" t' ts) | t' == t = Just ts-  m _                                     = Nothing---- TODO: implement above using something similar to the following--- isComparable ti = isJust . (`findInfo` ti) . typ--findInfo :: (Instance -> Maybe a) -> Instances -> Maybe a-findInfo may = listToMaybe . mapMaybe may+  r1 :: (Typeable a, Listable a, Show a, Eq a, Ord a, Name a)+     => a -> Instances+  r1 = reifyInstances1 -findInfoOr :: a -> (Instance -> Maybe a) -> Instances -> a-findInfoOr def may = fromMaybe def . findInfo may+reifyListable :: (Typeable a, Show a, Listable a) => a -> Instances+reifyListable a  =  mkListable (tiers -: [[a]]) -names :: Instances -> TypeRep -> [String]-names ti t = findInfoOr defNames m ti+mkListable :: (Typeable a, Show a) => [[a]] -> [Expr]+mkListable xss+  | null (concat xss)  =  err+  | otherwise          =  [value "tiers" $ mapT val xss]   where-  m (Instance "Names" t' [ns]) | t == t' = Just $ eval defNames ns-  m _                                    = Nothing+  err  =  error+       $  "Speculate does not allow an empty tiers enumeration"+       ++ ", offending type: " ++ show (typeOf . head $ head xss)+-- TODO: reify an "undefined" value of a type to be able to holeOfTy and lift+--       the above restriction of no empty tiers? -tiersE :: Instances -> TypeRep -> [[Expr]]-tiersE ti t = findInfoOr (error $ "could not find Listable " ++ show t) m ti-  where-  m (Instance "Listable" t' [ts]) | t == t' = Just $ eval (error $ "invalid Listable " ++ show t) ts-  m _                                       = Nothing+isListable :: Instances -> Expr -> Bool+isListable is  =  isListableT is . typ -eqE :: Instances -> TypeRep -> Maybe Expr-eqE ti t = findInfo m ti-  where-  m (Instance "Eq" t' [eq,_]) | t == t' = Just eq-  m _                                   = Nothing+isListableT :: Instances -> TypeRep -> Bool+isListableT is  =  not . null . lookupTiersT is -iqE :: Instances -> TypeRep -> Maybe Expr-iqE ti t = findInfo m ti-  where-  m (Instance "Eq" t' [_,iq]) | t == t' = Just iq-  m _                                   = Nothing+lookupTiers :: Instances -> Expr -> [[Expr]]+lookupTiers is  =  lookupTiersT is . typ -ltE :: Instances -> TypeRep -> Maybe Expr-ltE ti t = findInfo m ti+lookupTiersT :: Instances -> TypeRep -> [[Expr]]+lookupTiersT is t  =  fromMaybe [] $ maybeTiersE is t   where-  m (Instance "Ord" t' [_,lt]) | t == t' = Just lt-  m _                                    = Nothing+  maybeTiersE :: Instances -> TypeRep -> Maybe [[Expr]]+  maybeTiersE is t  =  case i of+    [] -> Nothing+    (tiers:_) -> Just tiers+    where+    i = [tiers | e@(Value "tiers" _) <- is+               , let tiers = eval (undefined :: [[Expr]]) e+               , typ (head . concat $ tiers) == t]+  -- TODO: make the above work on empty tiers -leE :: Instances -> TypeRep -> Maybe Expr-leE ti t = findInfo m ti+holeOfTy :: Instances -> TypeRep -> Expr+holeOfTy is t = fromMaybe err $ maybeHoleOfTy is t   where-  m (Instance "Ord" t' [le,_]) | t == t' = Just le-  m _                                    = Nothing+  err  =  error $ "holeOfTy: could not find tiers with type `[[" ++ show t ++ "]]'." -deriving instance Typeable Word2 -- for GHC <= 7.8+maybeHoleOfTy :: Instances -> TypeRep -> Maybe Expr+maybeHoleOfTy is t = case concat $ lookupTiersT is t of+                     (e:_) -> Just $ "" `varAsTypeOf` e+                     _     -> Nothing --- TODO: include *ALL* prelude types on basicInstances+-- despite the name, this _does not_ include most types from the prelude. preludeInstances :: Instances-preludeInstances = concat-  [ ins1 "x"  (undefined :: ())-  , ins1 "xs" (undefined :: [()])+preludeInstances  =  concat+  [ r1 (u :: ())+  , r1 (u :: [()]) -  , ins "p" (undefined :: Bool)+  , r (u :: Bool) -  , ins "x" (undefined :: Int)---, ins "x" (undefined :: Word)-  , ins "x" (undefined :: Integer)+  , r (u :: Int)+--, r (u :: Word)+  , r (u :: Integer) -  , ins "o" (undefined :: Ordering)-  , ins "c" (undefined :: Char)+  , r (u :: Ordering)+  , r (u :: Char) -  , ins "q" (undefined :: Rational)-  , ins "f" (undefined :: Float)-  , ins "f" (undefined :: Double)+  , r (u :: Rational)+  , r (u :: Float)+  , r (u :: Double)  -- TODO: uncomment the following and investigate why compilation takes so long---, ins "x" (undefined :: Int1)---, ins "x" (undefined :: Int2)---, ins "x" (undefined :: Int3)---, ins "x" (undefined :: Int4)---, ins "x" (undefined :: Word1)-  , ins "x" (undefined :: Word2)---, ins "x" (undefined :: Word3)---, ins "x" (undefined :: Word4)---, ins "x" (undefined :: Nat1)---, ins "x" (undefined :: Nat2)---, ins "x" (undefined :: Nat3)---, ins "x" (undefined :: Nat4)---, ins "x" (undefined :: Nat5)---, ins "x" (undefined :: Nat6)---, ins "x" (undefined :: Nat7)+--, r (u :: Int1)+--, r (u :: Int2)+--, r (u :: Int3)+--, r (u :: Int4)+--, r (u :: Word1)+--, r (u :: Word2)+--, r (u :: Word3)+--, r (u :: Word4)+--, r (u :: Nat1)+--, r (u :: Nat2)+--, r (u :: Nat3)+--, r (u :: Nat4)+--, r (u :: Nat5)+--, r (u :: Nat6)+--, r (u :: Nat7)   ]+  where+  u :: a+  u  =  undefined+  r, r1 :: (Typeable a, Listable a, Show a, Eq a, Ord a, Name a)+        => a -> Instances+  r = reifyInstances+  r1 = reifyInstances1 -- WHOA!  Have I discovered a "bug" in GHC?  adding to many type compositions -- on ins and types on preludeInstances makes compilation of this module -- *really* slow: it takes a whopping 2 minutes! -- (the above report is using -O2, I have not tested without optimizations).---defNames :: [String]-defNames = namesFromTemplate "x"
− src/Test/Speculate/Expr/Match.hs
@@ -1,221 +0,0 @@--- |--- Module      : Test.Speculate.Expr.Match--- Copyright   : (c) 2016-2017 Rudy Matela--- License     : 3-Clause BSD  (see the file LICENSE)--- Maintainer  : Rudy Matela <rudy@matela.com.br>------ This module is part of Speculate.------ Matching expressions.-module Test.Speculate.Expr.Match-  ( Binds-  -- * Assigning-  , fill-  , assign-  , assigning-  , sub-  , renameBy--  -- * Matching-  , match-  , match2-  , matchWith-  , unify-  , unification-  , isInstanceOf-  , hasInstanceOf-  , isCanonInstanceOf-  , hasCanonInstanceOf-  )-where--import Test.Speculate.Expr.Core--import Data.Typeable-import Data.List (find)-import Data.Maybe (isJust,fromMaybe)-import Data.Functor ((<$>))-import Test.Speculate.Utils-import Control.Monad ((>=>))--type Binds = [(String,Expr)]--findB :: String -> TypeRep -> Binds -> Maybe Expr-findB n t bs = snd <$> find (\(n',e) -> n' == n && typ e == t) bs--updateAssignments :: String -> Expr -> Binds -> Maybe Binds-updateAssignments s e = \bs ->-  case findB s (typ e) bs of-    Nothing -> Just ((s,e):bs)-    Just e' -> if e' == e-                 then Just bs-                 else Nothing---- | Fill holes in an expression.---   Silently skips holes that are not of the right type.---   Silently discard remaining expressions.-fill :: Expr -> [Expr] -> Expr-fill e = fst . fill' e-  where-  fill' :: Expr -> [Expr] -> (Expr,[Expr])-  fill' (e1 :$ e2) es = let (e1',es')  = fill' e1 es-                            (e2',es'') = fill' e2 es'-                        in (e1' :$ e2', es'')-  fill' (Var "" t) (e:es) | t == typ e = (e,es)-  fill' e es = (e,es)---- | Assign all occurences of a variable in an expression.------ Examples in pseudo-Haskell:------ > assign "x" (10) (x + y) = (10 + y)--- > assign "y" (y + z) ((x + y) + (y + z)) = (x + (y + z)) + ((y + z) + z)------ This respects the type (won't change occurrences of a similarly named--- variable of a different type).-assign :: String -> Expr -> Expr -> Expr-assign n e (e1 :$ e2) = assign n e e1 :$ assign n e e2-assign n e (Var n' t) | t == typ e && n == n' = e-assign n e e1 = e1---- | Assign all occurrences of several variables in an expression.------ For single variables, this works as assign:------ > x + y `assigning` [("x",10)] = (10 + y)--- > ((x + y) + (y + z)) `assigning` [("y",y+z)] = (x + (y + z)) + ((y + z) + z)------ Note this is /not/ equivalent to @foldr (uncurry assign)@.  Variables inside--- expressions being assigned will not be assigned.-assigning :: Expr -> Binds -> Expr-(e1 :$ e2) `assigning` as = (e1 `assigning` as) :$ (e2 `assigning` as)-(Var n t) `assigning` as = fromMaybe (Var n t) $ findB n t as-e `assigning` _ = e---- | Substitute matching subexpressios.------ sub (x + y) 0 ((x + y) + z) == (0 + z)--- sub (x + y) 0 (x + (y + z)) == (x + (y + z))-sub :: Expr -> Expr -> Expr -> Expr-sub ef et = s-  where-  s e | e == ef = et-  s (e1 :$ e2)  = s e1 :$ s e2-  s e           = e---- | Primeify variable names in an expression.------ > renameBy (++ "'") (x + y) = (x' + y')--- > renameBy (++ "'") (y + (z + x)) = (y' + (z' + x'))--- > renameBy (++ "1") abs x = abs x1--- > renameBy (++ "2") abs (x + y) = abs (x2 + y2)------ Note this will affect holes!-renameBy :: (String -> String) -> Expr -> Expr-renameBy f (e1 :$ e2) = renameBy f e1 :$ renameBy f e2-renameBy f (Var n t) = Var (f n) t-renameBy f e = e---- | List matches if possible------ > 0 + 1       `match` x + y       = Just [x=0, y=1]--- > 0 + (1 + 2) `match` x + y       = Just [x=0, y=1 + 2]--- > 0 + (1 + 2) `match` x + (y + y) = Nothing--- > (x + x) + (1 + 2) `match` x + (y + y) = Nothing-match :: Expr -> Expr -> Maybe Binds-match = matchWith []---- | List matches of pairs of expressions if possible------ > (0,1)   `match2` (x,y)   = Just [x=0, y=1]--- > (0,1+2) `match2` (x,y+y) = Nothing-match2 :: (Expr,Expr) -> (Expr,Expr) -> Maybe Binds-match2 (e1,e2) (e3,e4) =-  case matchWith [] e1 e3 of-    Nothing -> Nothing-    Just bs -> matchWith bs e2 e4---- | List matches with preexisting bindings:------ > 0 + 1 `matchWith [(x,0)]` x + y = Just [x=0, y=1]--- > 0 + 1 `matchWith [(x,1)]` x + y = Nothing-matchWith :: Binds -> Expr -> Expr -> Maybe Binds-matchWith bs e1' e2' = m e1' e2' bs-  where-  m :: Expr -> Expr -> Binds -> Maybe Binds-  m e1 e2 | typ e1 /= typ e2 = const Nothing-  m e1 (Var s t) = updateAssignments s e1-  m (f1 :$ x1) (f2 :$ x2) = m f1 f2 >=> m x1 x2-  m e1 e2 | e1 == e2  = Just-          | otherwise = const Nothing--unify :: Expr -> Expr -> Maybe Expr-unify e1 e2 = (e1 `assigning`) <$> unification e1 e2--unification :: Expr -> Expr -> Maybe Binds-unification = naiveUnification--findBind :: Expr -> Expr -> Either Bool (String,Expr)-findBind e1         e2          |  typ e1 /= typ e2  =  Left False-                                |  e1 == e2          =  Left True-findBind (Var s t)  e2          =  Right (s,e2)-findBind e1         (Var s t)   =  Right (s,e1)-findBind (f1 :$ x1) (f2 :$ x2)  =  case findBind f1 f2 of-                                   Left True -> findBind x1 x2-                                   r         -> r-findBind e1         e2          =  Left (e1 == e2)---- NOTE: there are faster methods for unification.-naiveUnification :: Expr -> Expr -> Maybe Binds-naiveUnification e1' e2' = uu e1' e2' []-  where-  uu :: Expr -> Expr -> Binds -> Maybe Binds-  uu e1' e2' bs' =-    case u e1' e2' bs' of-      Nothing -> Nothing-      Just (e1,e2,bs) ->-        if e1' == e1 && e2' == e2-        then Just bs-        else uu e1 e2 bs-  u :: Expr -> Expr -> Binds -> Maybe (Expr,Expr,Binds)-  u e1 e2 bs =-    case findBind e1 e2 of-    Left False -> Nothing-    Left True  -> Just (e1,e2,bs)-    Right (s,e) ->-      if (Var s (typ e)) `isSub` e-      then Nothing-      else Just ( e1 `assigning` [(s,e)]-                , e2 `assigning` [(s,e)]-                , (s,e):[(s',e' `assigning` [(s,e)]) | (s',e') <- bs]-                )---- 0 `isInstanceOf` x = True--- y `isInstanceOf` x = True--- x `isInstanceOf` 0 = False--- 1 `isInstanceOf` 0 = False--- x + (y + x) `isInstanceOf` x + y = True--- y + (y + x) `isInstanceOf` x + y = True--- 0 + (y + x) `isInstanceOf` x + y = True--- x `isInstanceOf` x = True--- _ `isInstanceOf` x = True-isInstanceOf :: Expr -> Expr -> Bool-e1 `isInstanceOf` e2 = isJust $ e1 `match` e2--hasInstanceOf :: Expr -> Expr -> Bool-e1           `hasInstanceOf` e2 | e1   `isInstanceOf` e2 = True-(e1f :$ e1x) `hasInstanceOf` e2 | e1f `hasInstanceOf` e2 ||-                                  e1x `hasInstanceOf` e2 = True-_            `hasInstanceOf` _                           = False--isCanonInstanceOf :: Expr -> Expr -> Bool-e1 `isCanonInstanceOf` e2 =-  case e1 `match` e2 of-    Nothing -> False-    Just xs -> strictlyOrderedOn snd (sortOn fst xs)--hasCanonInstanceOf :: Expr -> Expr -> Bool-e1           `hasCanonInstanceOf` e2 | e1   `isCanonInstanceOf` e2 = True-(e1f :$ e1x) `hasCanonInstanceOf` e2 | e1f `hasCanonInstanceOf` e2 ||-                                       e1x `hasCanonInstanceOf` e2 = True-_            `hasCanonInstanceOf` _                                = False
src/Test/Speculate/Function.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Function--- Copyright   : (c) 2016-2018 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -20,7 +20,7 @@ where  import Test.Speculate-import Test.LeanCheck.Function+import Test.LeanCheck.Function() import Test.LeanCheck.Error (errorToNothing) import Data.Function (on) 
src/Test/Speculate/Function/A100.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Function.A100--- Copyright   : (c) 2018 Rudy Matela+-- Copyright   : (c) 2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --
src/Test/Speculate/Function/A1000.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Function.A1000--- Copyright   : (c) 2018 Rudy Matela+-- Copyright   : (c) 2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --
− src/Test/Speculate/Misc.hs
@@ -1,128 +0,0 @@--- |--- Module      : Test.Speculate.Misc--- Copyright   : (c) 2016-2017 Rudy Matela--- License     : 3-Clause BSD  (see the file LICENSE)--- Maintainer  : Rudy Matela <rudy@matela.com.br>------ This module is part o Speculate.------ Miscellaneous functions I still did not find a reasonable place to put--- them in.-module Test.Speculate.Misc-  ( functions1-  , functions2-  , functions3-  , functions4-  , fillings--  , expressionsOf-  , valuedExpressionsOf-  )-where--import Test.Speculate-import Test.Speculate.Expr-import Test.Speculate.Utils-import Data.Dynamic-import Test.LeanCheck--functions1 :: (Typeable a, Typeable b) => Expr -> [(Expr,a->b)]-functions1 e =-  case l undefined of-    [] -> []-    _  -> fist l-  where-  l = \x -> [(e',v) | e' <- fillings e [constant "x" x], let Just v = evaluate e']--functions2 :: (Typeable a, Typeable b, Typeable c) => Expr -> [(Expr,a->b->c)]-functions2 e =-  case l undefined undefined of-    [] -> []-    _  -> fist2 l-  where-  l = \x y -> [(e',v) | e' <- fillings e [constant "x" x, constant "y" y]-                      , let Just v = evaluate e']--functions3 :: (Typeable a, Typeable b, Typeable c, Typeable d)-           => Expr -> [(Expr,a->b->c->d)]-functions3 e =-  case l undefined undefined undefined of-    [] -> []-    _  -> fist3 l-  where-  l = \x y z -> [(e',v) | e' <- fillings e [constant "x" x, constant "y" y, constant "z" z]-                        , let Just v = evaluate e']--functions4 :: (Typeable a, Typeable b, Typeable c, Typeable d, Typeable e)-           => Expr -> [(Expr,a->b->c->d->e)]-functions4 e =-  case l undefined undefined undefined undefined of-    [] -> []-    _  -> fist4 l-  where-  l = \x y z w -> [(e',v) | e' <- fillings e [constant "x" x, constant "y" y, constant "z" z, constant "w" w]-                          , let Just v = evaluate e']----- This function is dangerous:------ @f@ should always return the same number of values--- and should not evaluateuate it's argument when producing the list spine------ fist (function-list), in lack of a better name-fist :: (a->[(z,b)]) -> [(z,a->b)]-fist f = [ (fst $ f' undefined, snd . f')-         | i <- [0..(length (f undefined)-1)]-         , let f' = (!! i) . f ]--fist2 :: (a->b->[(z,c)]) -> [(z,a->b->c)]-fist2 f = map (id *** curry) $ fist (uncurry f)--fist3 :: (a->b->c->[(z,d)]) -> [(z,a->b->c->d)]-fist3 f = map (id *** curry3) $ fist (uncurry3 f)--fist4 :: (a->b->c->d->[(z,e)]) -> [(z,a->b->c->d->e)]-fist4 f = map (id *** curry4) $ fist (uncurry4 f)---- All possible fillings of holes in an expression:--- --- * For an expression without holes, this returns a singleton list with that---   expression.------ * If there is no type match between the given filler-expressions,---   return an empty list.-fillings :: Expr -> [Expr] -> [Expr]-fillings e vs = [fill e f | f <- fs]-  where-  fs = productsList [[v | v <- vs, typ v == h] | h <- holes e]---- | Given a list of atomic expressions, enumerate experssions by application------ NOTE: for now, very inneficient------ This function exists solely for documentation and will never actually be--- useful, as:------ > mapT fst $ classes------ Will return as expressions that are semantially different (and is more--- efficient)------ Eventually this function will be removed from Speculate-expressionsOf :: [Expr] -> [[Expr]]-expressionsOf ds = [ds] \/ productMaybeWith ($$) es es `addWeight` 1-  where-  es = expressionsOf ds---- | Given a list of atomic expressinos, enumerated expressions of a given type---   by application.------   Never will be actually useful, see 'expressionsOf'.------ Eventually this functino will be removed from Speculate-valuedExpressionsOf :: Typeable a => [Expr] -> [[(Expr,a)]]-valuedExpressionsOf = mapTMaybe exprValue . expressionsOf-  where-  exprValue :: Typeable a => Expr -> Maybe (Expr,a)-  exprValue e = (,) e `fmap` evaluate e-
src/Test/Speculate/Pretty.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Pretty--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --
src/Test/Speculate/Reason.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Reason--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -58,13 +58,13 @@ import Test.Speculate.Reason.Order import Test.Speculate.Utils import Data.Either-import Data.Tuple (swap)-import Data.List (partition, (\\), sortBy, sort) import Data.Function (on)-import Data.Monoid ((<>)) import Data.Functor ((<$>)) -- for GHC < 7.10+import Data.List (partition, (\\), sortBy, sort)+import Data.Maybe+import Data.Monoid ((<>))+import Data.Tuple (swap) import qualified Data.List as L (insert)-import Data.Maybe (fromJust,isJust,listToMaybe,maybeToList,mapMaybe) import Control.Monad  type Rule = (Expr,Expr)@@ -144,10 +144,10 @@   keepR (e1,e2) = keep e1 && keep e2  keepUpToLength :: Int -> Expr -> Bool-keepUpToLength limit e = lengthE e <= limit+keepUpToLength limit e = size e <= limit  keepMaxOf :: [Equation] -> Expr -> Bool-keepMaxOf = keepUpToLength . (+1) . maximum . (0:) . map lengthE . catPairs+keepMaxOf = keepUpToLength . (+1) . maximum . (0:) . map size . catPairs  normalize :: Thy -> Expr -> Expr normalize Thy {rules = rs} = n@@ -169,11 +169,11 @@ isNormal thy e = normalizeE thy e == e  reduceRoot :: Expr -> Rule -> Maybe Expr-reduceRoot e (e1,e2) = (e2 `assigning`) <$> (e `match` e1)+reduceRoot e (e1,e2) = (e2 //-) <$> (e `match` e1)  -- Lists all reductions by one rule, note that reductions may be repeated. reductions1 :: Expr -> Rule -> [Expr]-reductions1 e (l,_) | lengthE l > lengthE e = [] -- optional optimization+reductions1 e (l,_) | size l > size e = [] -- optional optimization reductions1 e@(e1 :$ e2) r = maybeToList (e `reduceRoot` r)                           ++ map (:$ e2) (reductions1 e1 r)                           ++ map (e1 :$) (reductions1 e2 r)@@ -231,11 +231,12 @@ -- canonicalization here is needed for the nub overlaps :: Expr -> Expr -> [Expr] overlaps e1 e2 = id -- nubSort-               . map (canonicalize . (e2' `assigning`))-               $ (e1' `unification`) `mapMaybe` subexprs e2'+               . map (canonicalize . (e2' //-))+               $ (e1' `unification`) `mapMaybe` nonVarSubexprs e2'   where-  e1' = renameBy (++ "1") e1-  e2' = renameBy (++ "2") e2+  nonVarSubexprs = discard isVar . nubSubexprs+  e1' = renameVarsBy (++ "1") e1+  e2' = renameVarsBy (++ "2") e2  equivalent :: Thy -> Expr -> Expr -> Bool equivalent thy e1 e2 = e1' == e2'@@ -272,7 +273,8 @@ append :: Thy -> [Equation] -> Thy append thy eqs = updateEquationsBy (nubSort . (++ eqs')) thy   where-  eqs' = map (canonicalizeEqn thy) $ filter (uncurry ((/=) `on` normalize thy)) eqs+  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}@@ -390,7 +392,7 @@  canonicalizeRuleWith :: Instances -> Rule -> Rule canonicalizeRuleWith ti (e1,e2) =-  case canonicalizeWith ti (e1 :$ e2) of+  case canonicalizeWith (lookupNames ti) (e1 :$ e2) of     e1' :$ e2' -> (e1',e2')     _ -> error $ "canonicalizeRuleWith: the impossible happened,"               ++ "this is definitely a bug, see source!"@@ -415,7 +417,7 @@ finalEquations :: (Equation -> Bool) -> Instances -> Thy -> [Equation] finalEquations shouldShow ti thy =     sortBy (compareTy `on` (typ . fst))-  . sortBy (compareE thy `on` uncurry phonyEquation)+  . sortBy (compareE thy `on` foldPair)   . filter shouldShow   $ rules thy' ++ map swap (equations thy')   where@@ -456,7 +458,7 @@   discardRedundant = d []                    . discardLater eqnInstanceOf                    . reverse-                   . sortOn (uncurry (+) . (lengthE *** lengthE))+                   . sortOn (uncurry (+) . (size *** size))   (e1l,e1r) `eqnInstanceOf` (e0l,e0r) = e1l `hasCanonInstanceOf` e0l                                      && e1r `hasCanonInstanceOf` e0r                                      || e1l `hasCanonInstanceOf` e0r
src/Test/Speculate/Reason/Order.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Reason.Order--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -24,8 +24,10 @@  -- | Greater than or equal number of occurences of each variable (>=\/) :: Expr -> Expr -> Bool-e1 >=\/ e2 = all (\(t,n) -> countVar t n e1 >= countVar t n e2)-                 (vars e1 `nubMerge` vars e2)+e1 >=\/ e2 = all (\e -> countVar e e1 >= countVar e e2)+                 (nubVars e1 `nubMerge` nubVars e2)+  where+  countVar e = length . filter (== e) . vars   -- | Strict order between expressions as defined in TRAAT p103.@@ -34,7 +36,7 @@ -- -- This is perhaps the simplest order that can be used with KBC. (|>|) :: Expr -> Expr -> Bool-e1 |>| e2 = lengthE e1 > lengthE e2+e1 |>| e2 = size e1 > size e2          && e1 >=\/ e2 infix 4 |>| @@ -45,6 +47,7 @@ (>|) :: Expr -> Expr -> Bool (>|) = kboBy weight (>) infix 4 >|+-- TODO: FIXME: this KBO is not closed under substitution!  kboBy :: (Expr -> Int) -> (Expr -> Expr -> Bool) -> Expr -> Expr -> Bool kboBy w (->-) e1 e2 = e1 >=\/ e2@@ -55,14 +58,14 @@                                         )                       )   where-  ef :$ (eg :$ ex)               `fn` ey@(Var _ _) | ef == eg = fn (eg :$ ex) ey-  ef@(Constant _ _) :$ ex@(Var _ _) `fn` ey@(Var _ _) | ex == ey = True+  ef :$ (eg :$ ex) `fn` ey | isVar ey && ef == eg = fn (eg :$ ex) ey+  ef@(Value _ _) :$ ex `fn` ey | isVar ex && isVar ey && ex == ey = True   _ `fn` _ = False   e1 `fg` e2 =     case (unfoldApp e1, unfoldApp e2) of       -- do I really need the _:_ instead of just _?       -- do I really need to restrict to functional values?-      (ef@(Constant _ _):(_:_),eg@(Constant _ _):(_:_)) -> ef ->- eg+      (ef:(_:_),eg:(_:_)) | isConst ef && isConst eg -> ef ->- eg       _ -> False   e1 `ff` e2 =     case (unfoldApp e1, unfoldApp e2) of@@ -88,11 +91,11 @@ weight = w   where   w (e1 :$ e2) = weight e1 + weight e2-  w (Var _ _)  = 1-  w e = case arity e of-          0 -> 1-          1 -> 1-          _ -> 0+  w e | isVar e   = 1+      | otherwise = case arity e of+                    0 -> 1+                    1 -> 1+                    _ -> 0  -- | Weight function for kboBy: --@@ -104,11 +107,11 @@ weightExcept f0 = w   where   w (e1 :$ e2) = w e1 + w e2-  w (Var _ _)  = 1-  w e = case arity e of-          0 -> 1-          1 -> if e == f0 then 0 else 1-          _ -> 0+  w e | isVar e   = 1+      | otherwise = case arity e of+                  0 -> 1+                  1 -> if e == f0 then 0 else 1+                  _ -> 0  -- | To be used alongside weightExcept gtExcept :: (Expr -> Expr -> Bool) -> Expr -> Expr -> Expr -> Bool@@ -130,7 +133,7 @@ dwoBy :: (Expr -> Expr -> Bool) -> Expr -> Expr -> Bool dwoBy (>) = (|>)   where-  e1 |> e2@(Var n t) | (t,n) `elem` vars e1 && e1 /= e2 = True+  e1 |> e2 | isVar e2 && e2 `elem` nubVars e1 && e1 /= e2 = True   e1 |> e2 = any (|>= e2) xs           || (notVar f && notVar g && f >  g && all (e1 |>) ys)           || (notVar f && notVar g && f == g && all (e1 |>) ys@@ -140,8 +143,7 @@     where     (f:xs) = unfoldApp e1     (g:ys) = unfoldApp e2-    notVar (Var _ _) = False-    notVar _         = True+    notVar = not . isVar     e1 |>= e2 = e1 == e2              || e1 |> e2 
src/Test/Speculate/Report.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Report--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -26,13 +26,11 @@ import Data.Ratio ((%)) import Control.Monad (when,unless) import Test.LeanCheck.Utils ((&&&&))-import Data.List (intercalate)  report :: Args -> IO () report args@Args {maxSize = sz, maxTests = n} = do   let ti = computeInstances args   let ats = types args-  let ts = filter (isListable ti) ats   let dss = atoms args   let (thy,ess) = theoryAndRepresentativesFromAtoms sz (compareExpr args) (keepExpr args) (timeout args .: equal ti n) dss   let es = uptoT sz ess@@ -51,7 +49,7 @@       fail "exiting"   when (showTheory args)       . putStrLn $ showThy thy   let shy = semiTheoryFromThyAndReps ti n (maxVars args) thy-          $ filter (\e -> lengthE e <= computeMaxSemiSize args) es+          $ filter (\e -> size e <= computeMaxSemiSize args) es   let chy = conditionalTheoryFromThyAndReps ti (compareExpr args) n (maxVars args) (computeMaxCondSize args) thy es   let equations     = finalEquations     (shouldShowEquation args) ti                          thy   let semiEquations = finalSemiEquations (shouldShowEquation args) ti (equivalentInstance thy) shy@@ -96,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 (isListable is t)]+     | t <- ts, not (isListableT is t)]   ++ ["Warning: no Eq instance for " ++ show t ++       ", equations of this type will not be considered"-     | t <- ts, not (isEq is t)]+     | t <- ts, not (isEqT is t)]   ++ ["Warning: no Ord instance for " ++ show t ++       ", inequations of this type will not be considered"-     | t <- ts, not (isOrd is t)]+     | t <- ts, not (isOrdT is t)]  reportClassesFor :: Instances -> Int -> [Int] -> Thy -> [Expr] -> IO () reportClassesFor ti nTests nVarss thy res = do@@ -111,7 +109,7 @@   where   pn 0 = putStrLn $ "Number of Eq schema classes: " ++ show (length $ r 0)   pn n = putStrLn $ "Number of Eq " ++ show n ++ "-var classes: " ++ show (length $ r n)-  r 0 = filter (isEqE ti) res+  r 0 = filter (isEq ti) res   r n = distinctFromSchemas ti nTests n thy (r 0)  reportDot :: Instances -> [String] -> Bool -> Int -> Int -> Thy -> [Expr] -> IO ()@@ -120,7 +118,7 @@           $ (if null onlyTypes                then id                else filter ((`elem` map (map toLower) onlyTypes) . map toLower . show . typ))-          $ filter (isEqOrdE ti) es+          $ filter (isEqOrd ti) es   let res = [(trueRatio ti n e, e) | e <- ces, typ e == boolTy]   putStrLn "digraph G {"   putStrLn "  rankdir = BT"@@ -131,7 +129,7 @@   unless quiet . putStrLn . unlines            . map (\(r,e) -> showExprNode e                          ++ " [style=filled, fillcolor = \""-                         ++ showNodeColour (length (vars e) % (nVars*2)) r+                         ++ showNodeColour (length (nubVars e) % (nVars*2)) r                          ++ "\"]")            . filter (\(r,e) -> typ e == boolTy)            $ res@@ -145,9 +143,9 @@ --putStrLn . unlines $ map showRank $ collectSndByFst res   putStrLn "}"   where-  showRank (r,es) = "  { rank = same; " ++ "\"" ++ show r ++ "\""-                 ++ intercalate "; " (map showExprNode es)-                 ++ " }"+--showRank (r,es) = "  { rank = same; " ++ "\"" ++ show r ++ "\""+--               ++ intercalate "; " (map showExprNode es)+--               ++ " }"   showExprEdge (e1,e2) = "  " ++ showExprNode e1 ++ " -> " ++ showExprNode e2   showExprNode e     | typ e == boolTy && not quiet = let tre = trueRatio ti n e
src/Test/Speculate/Sanity.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Sanity--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -17,16 +17,14 @@  import Test.Speculate.Expr import Test.LeanCheck ((==>))-import Data.Maybe (fromMaybe) import Data.List (intercalate)-import Test.Speculate.Utils  (-==>-) :: Expr -> Expr -> Expr-e1 -==>- e2 = impliesE :$ e1 :$ e2 where impliesE = constant "==>" (==>)+e1 -==>- e2 = impliesE :$ e1 :$ e2 where impliesE = value "==>" (==>) infixr 1 -==>-  (-&&-) :: Expr -> Expr -> Expr-e1 -&&- e2 = andE :$ e1 :$ e2 where andE = constant "&&" (&&)+e1 -&&- e2 = andE :$ e1 :$ e2 where andE = value "&&" (&&) infixr 3 -&&-  -- returns a list of errors on the Eq instances (if any)@@ -37,11 +35,12 @@   ++ ["not symmetric"  | f  ((x -==- y) -==- (y -==- x))]   ++ ["not transitive" | f (((x -==- y) -&&- (y -==- z)) -==>- (x -==- z))]   where-  f = not . true is n-  e1 -==- e2 = fromMaybe falseE $ equation is e1 e2-  x = Var "x" t-  y = Var "y" t-  z = Var "z" t+  f = not . isTrue (take n . grounds (lookupTiers is))+  e1 -==- e2 = mkEquation is e1 e2+  e = holeOfTy is t+  x = "x" `varAsTypeOf` e+  y = "y" `varAsTypeOf` e+  z = "z" `varAsTypeOf` e  -- returns a list of errors on the Ord instance (if any) ordErrors :: Instances -> Int -> TypeRep -> [String]@@ -50,28 +49,29 @@   ++ ["not antisymmetric" | f (((x -<=- y) -&&- (y -<=- x)) -==>- (x -==- y))]   ++ ["not transitive"    | f (((x -<=- y) -&&- (y -<=- z)) -==>- (x -<=- z))]   where-  f = not . true is n-  e1 -==- e2 = fromMaybe falseE $ equation     is e1 e2-  e1 -<=- e2 = fromMaybe falseE $ comparisonLE is e1 e2-  x = Var "x" t-  y = Var "y" t-  z = Var "z" t+  f = not . isTrue (take n . grounds (lookupTiers is))+  e1 -==- e2 = mkEquation     is e1 e2+  e1 -<=- e2 = mkComparisonLE is e1 e2+  e = holeOfTy is t+  x = "x" `varAsTypeOf` e+  y = "y" `varAsTypeOf` e+  z = "z" `varAsTypeOf` e  eqOrdErrors :: Instances -> Int -> TypeRep -> [String] eqOrdErrors is n t =      [ "(==) :: " ++ ty ++ "  is not an equiavalence (" ++ intercalate ", " es ++ ")"-     | let es = eqErrors is n t, isEq is t, not (null es) ]+     | let es = eqErrors is n t, isEqT is t, not (null es) ]   ++ [ "(<=) :: " ++ ty ++ "  is not an ordering ("     ++ intercalate ", " es ++ ")"-     | let es = ordErrors is n t, isOrd is t, not (null es) ]+     | let es = ordErrors is n t, isOrdT is t, not (null es) ]   ++ [ "(==) and (<=) :: " ++ ty ++ " are inconsistent: (x == y) /= (x <= y && y <= x)"-     | f $ (x -==- y) -==- (x -<=- y -&&- y -<=- x), isEq is t, isOrd is t ]+     | f $ (x -==- y) -==- (x -<=- y -&&- y -<=- x), isEqT is t, isOrdT is t ]   where-  f = not . true is n-  x = Var "x" t-  y = Var "y" t-  z = Var "z" t-  e1 -==- e2 = fromMaybe falseE $ equation     is e1 e2-  e1 -<=- e2 = fromMaybe falseE $ comparisonLE is e1 e2+  f = not . isTrue (take n . grounds (lookupTiers is))+  e = holeOfTy is t+  x = "x" `varAsTypeOf` e+  y = "y" `varAsTypeOf` e+  e1 -==- e2 = mkEquation is e1 e2+  e1 -<=- e2 = mkComparisonLE is e1 e2   ty = show t ++ " -> " ++ show t ++ " -> Bool"  instanceErrors :: Instances -> Int -> [TypeRep] -> [String]
src/Test/Speculate/SemiReason.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Misc--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -24,6 +24,7 @@   , sthy :: Thy   } +emptyShy :: Shy emptyShy = Shy   { sequations = []   , sthy = emptyThy@@ -58,7 +59,7 @@ simplerThan :: Equation -> Shy -> Shy simplerThan seq = updateSEquationsBy upd   where-  isSEInstanceOf = isInstanceOf `on` uncurry phonyEquation+  isSEInstanceOf = isInstanceOf `on` foldPair   upd eqs = r ++ [seq' | seq' <- r'                        , any (seq' `isSEInstanceOf`) r ]     where@@ -80,7 +81,7 @@  stheorize :: Thy -> [Equation] -> Shy stheorize thy seqs =-  Shy{ sequations = sortBy (compareE thy `on` uncurry phonyEquation) seqs+  Shy{ sequations = sortBy (compareE thy `on` foldPair) seqs      , sthy = thy      } @@ -94,9 +95,9 @@ finalSemiEquations shouldShow insts equivalentInstanceOf shy =     sortBy (compareTy `on` (typ . fst))   . filter shouldShow-  . discardLater (equivalentInstanceOf `on` uncurry phonyEquation)+  . discardLater (equivalentInstanceOf `on` foldPair)   . discard (transConsequence shy)-  . discardLater (isInstanceOf `on` uncurry phonyEquation)+  . discardLater (isInstanceOf `on` foldPair)   . sequations   $ canonicalizeShyWith insts shy @@ -105,7 +106,7 @@  canonicalizeSemiEquationWith :: Instances -> Equation -> Equation canonicalizeSemiEquationWith is (e1,e2) =-  case canonicalizeWith is (e1 :$ e2) of+  case canonicalizeWith (lookupNames is) (e1 :$ e2) of   e1' :$ e2' -> (e1',e2')   _ -> error $ "canonicalizeShyWith: the impossible happened,"             ++ "this is definitely a bug, see source!"
src/Test/Speculate/Utils.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Utils--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --
src/Test/Speculate/Utils/Class.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Utils.Class--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -18,7 +18,6 @@   ) where -import Test.Speculate.Utils.List (collectOn) import Data.Function (on) import Data.List (partition) import Prelude hiding (map)
src/Test/Speculate/Utils/Colour.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Utils.Tuple--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -196,6 +196,7 @@      | m == r = Just $ (g - b) / c      | m == g = Just $ (b - r) / c + 2      | m == b = Just $ (r - g) / c + 4+     | otherwise = error "hue: the impossible happened! (report bug)"  intensity :: Colour -> Rational intensity (RGB r g b) = (r + g + b) / 3@@ -262,6 +263,7 @@     | 3%6 <= h && h <= 4%6 = (0,x,c)     | 4%6 <= h && h <= 5%6 = (x,0,c)     | 5%6 <= h && h <= 6%6 = (c,0,x)+    | otherwise = error "fromHCM: the impossible happened! (report bug)"  mix :: Colour -> Colour -> Colour mix (RGB r1 g1 b1) (RGB r2 g2 b2) = RGB ((r1 + r2) / 2) ((g1 + g2) / 2) ((b1 + b2) / 2)
src/Test/Speculate/Utils/List.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE CPP #-} -- | -- Module      : Test.Speculate.Utils.List--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -161,7 +161,9 @@             -> [a] -> [d] collectWith f g h = map collapse                   . groupOn f-  where collapse (x:xs) = f x `h` map g (x:xs)+  where+  collapse (x:xs) = f x `h` map g (x:xs)+  collapse _      = error "collectWith: the impossible happened! (see source)"  collectSndByFst :: Ord a => [(a,b)] -> [(a,[b])] collectSndByFst = collectWith fst snd (,)
src/Test/Speculate/Utils/Memoize.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Utils.Memoize--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --
src/Test/Speculate/Utils/Misc.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Utils.Misc--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -9,16 +9,10 @@ -- Miscellaneous utilities. module Test.Speculate.Utils.Misc where -import Test.LeanCheck import Data.Maybe-import Data.List-import Data.Char-import Data.Function import Data.Ratio-import Data.Tuple import Test.Speculate.Utils.String import Test.Speculate.Utils.List-import Test.LeanCheck.Stats  -- easy debug: undefined1 :: a@@ -27,18 +21,6 @@ undefined2 :: a undefined2 = error "undefined2" --- TODO: Find a better name for iss:------ > iss 0 0 = [ [] ]--- > iss 0 1 = [ [0] ]--- > iss 0 2 = [ [0,1], [0,0] ]--- > iss 0 3 = [ [0,1,2], [0,1,0], [0,1,1], [0,0,1], [0,0,0] ]-iss :: Int -> Int -> [[Int]]-iss _ 0 = [[]]-iss i n = concat [map (j:) (iss (i + j-=-i) (n-1)) | j <- i:[0..(i-1)]]-  where x -=- y | x == y    = 1-                | otherwise = 0- thn :: Ordering -> Ordering -> Ordering thn EQ o = o thn o  _ = o@@ -53,20 +35,6 @@   showCount (x,n) = unquote (show x) ++ ": "                  ++ show n ++ "/" ++ show len ++ " "                  ++ show (100 * n `div` len) ++ "%"---- O(1) bell number implementation (I'm lazy)--- TODO: actually implement bell-bell :: Int -> Int-bell 0 = 1-bell 1 = 1-bell 2 = 2-bell 3 = 5-bell 4 = 15-bell 5 = 52-bell 6 = 203-bell 7 = 877-bell 8 = 4140-bell _ = error "bell: argument > 8, implement me!"  maybesToMaybe :: [Maybe a] -> Maybe a maybesToMaybe = listToMaybe . catMaybes
src/Test/Speculate/Utils/Ord.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Utils.Ord--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --
src/Test/Speculate/Utils/PrettyPrint.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Utils.PrettyPrint--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -16,8 +16,8 @@ where -- TODO: Fix somewhat inefficient implementations, i.e.: heavy use of '(++)'. -import Data.List (intercalate,transpose,isSuffixOf)-import Data.Char (toUpper,isSpace)+import Data.List (transpose)+import Data.Char (isSpace) import Test.Speculate.Utils.List import Test.LeanCheck ((+|)) @@ -99,6 +99,7 @@ normalizeTo :: Char -> a -> [[a]] -> [[a]] normalizeTo 'l' = normalize normalizeTo 'r' = normalizeR+normalizeTo _   = error "normalizeTo: unhandled case"  -- | Given a list of lists returns the maximum length maxLength :: [[a]] -> Int
src/Test/Speculate/Utils/String.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Utils.String--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -17,8 +17,7 @@   , isInfix, isPrefix, isInfixedPrefix   , toPrefix   , prec-  , prime, primeCycle-  , namesFromTemplate+  , prime   , indent, alignRight, alignLeft   , splitAtCommas   )@@ -61,6 +60,7 @@ -- > isInfix "+"     == True isInfix :: String -> Bool isInfix (c:_) = c `notElem` "()'\"[" && not (isAlphaNum c)+isInfix "" = error "isInfix: empty string"  -- | Returns the precedence of default Haskell operators prec :: String -> Int@@ -126,21 +126,6 @@ prime ('(':cs) = '(':init cs ++ "-)" -- (+) to (+-) prime cs | isInfix cs = cs ++ "-"    -- + to +-          | otherwise  = cs ++ "'"    -- foo to foo'--primeCycle :: [String] -> [String]-primeCycle [] = []-primeCycle ss = ss ++ map (++ "'") (primeCycle ss)--namesFromTemplate :: String -> [String]-namesFromTemplate = primeCycle . f-  where-  f ""                         = f "x"-  f cs    | isDigit (last cs)  = map (\n -> init cs ++ show n) [digitToInt (last cs)..]-  f [c]                        = map ((:[]) . chr) [x,x+1,x+2] where x = ord c-  f cs    | last cs == 's'     = (++ "s") <$> f (init cs)-  f "xy"                       = ["xy","zw"]-  f [c,d] | ord d - ord c == 1 = [[c,d], [chr $ ord c + 2, chr $ ord d + 2]]-  f cs                         = [cs]  alignRight :: Int -> String -> String alignRight n cs = replicate (n - length cs) ' ' ++ cs
src/Test/Speculate/Utils/Tiers.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Utils.Tiers--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -17,7 +17,6 @@ where  import Test.LeanCheck-import Test.LeanCheck.Tiers import Data.Maybe (mapMaybe)  productsList :: [[a]] -> [[a]]@@ -25,9 +24,6 @@  mapTMaybe :: (a -> Maybe b) -> [[a]] -> [[b]] mapTMaybe f = map (mapMaybe f)--partitionT :: (a -> Bool) -> [[a]] -> ([[a]],[[a]])-partitionT p xss = (filterT p xss, discardT p xss)  uptoT :: Int -> [[a]] -> [a] uptoT sz = concat . take sz
src/Test/Speculate/Utils/Timeout.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Utils.Timeout--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --
src/Test/Speculate/Utils/Tuple.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Utils.Tuple--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> module Test.Speculate.Utils.Tuple
src/Test/Speculate/Utils/Typeable.hs view
@@ -1,6 +1,6 @@ -- | -- Module      : Test.Speculate.Utils.Typeable--- Copyright   : (c) 2016-2017 Rudy Matela+-- Copyright   : (c) 2016-2019 Rudy Matela -- License     : 3-Clause BSD  (see the file LICENSE) -- Maintainer  : Rudy Matela <rudy@matela.com.br> --@@ -8,46 +8,14 @@ -- -- Utilities to manipulate 'TypeRep's (of 'Typeable' values). module Test.Speculate.Utils.Typeable-  ( tyArity+  ( module Data.Express.Utils.Typeable   , typesIn-  , unFunTy-  , isFunTy-  , argumentTy-  , resultTy-  , finalResultTy-  , boolTy-  , mkEqnTy-  , funTyCon-  , compareTy-  , module Data.Typeable   ) where -import Data.Typeable-import Data.Monoid ((<>))+import Data.Express.Utils.Typeable import Test.Speculate.Utils.List ((+++)) --- Different versions of Typeable/GHC provide different orderings for TypeReps.--- The following is a version independent ordering, with the following--- properties:------ * functional types with more arguments are larger;--- * type constructors with more arguments are larger.-compareTy :: TypeRep -> TypeRep -> Ordering-compareTy t1 t2 | t1 == t2 = EQ -- optional optimization-compareTy t1 t2 = tyArity t1 `compare` tyArity t2-               <> length ts1 `compare` length ts2-               <> show c1 `compare` show c2-               <> foldr (<>) EQ (zipWith compareTy ts1 ts2)-  where-  (c1,ts1) = splitTyConApp t1-  (c2,ts2) = splitTyConApp t2--tyArity :: TypeRep -> Int-tyArity t-  | isFunTy t = 1 + tyArity (resultTy t)-  | otherwise = 0- -- | For a given type, return all *-kinded types. --   (all non-function types) --@@ -58,34 +26,3 @@   | isFunTy t = typesIn (argumentTy t)             +++ typesIn (resultTy   t)   | otherwise = [t]--finalResultTy :: TypeRep -> TypeRep-finalResultTy t-  | isFunTy t = finalResultTy (resultTy t)-  | otherwise = t--unFunTy :: TypeRep -> (TypeRep,TypeRep)-unFunTy t-  | isFunTy t = let (f,[a,b]) = splitTyConApp t in (a,b)-  | otherwise = error $ "error (unFunTy): `" ++ show t ++ "` is not a function type"--argumentTy :: TypeRep -> TypeRep-argumentTy = fst . unFunTy--resultTy :: TypeRep -> TypeRep-resultTy = snd . unFunTy--boolTy :: TypeRep-boolTy = typeOf (undefined :: Bool)--funTyCon :: TyCon-funTyCon = typeRepTyCon $ typeOf (undefined :: () -> ())--isFunTy :: TypeRep -> Bool-isFunTy t =-  case splitTyConApp t of-    (con,[_,_]) | con == funTyCon -> True-    _ -> False--mkEqnTy :: TypeRep -> TypeRep-mkEqnTy a = a `mkFunTy` (a `mkFunTy` boolTy)
stack.yaml view
@@ -1,15 +1,11 @@-# stack.yaml docs:-# https://docs.haskellstack.org/en/stable/yaml_configuration/--# resolver: nightly-2015-09-21-# resolver: ghc-7.10.2-resolver: lts-12.7+resolver: lts-13.30  packages: - .  extra-deps:-- leancheck-0.7.2+- leancheck-0.9.1+- express-0.1.0  flags: {} 
tests/Test.hs view
@@ -12,6 +12,8 @@     module Test.LeanCheck   , module Test.LeanCheck.Utils   , module Test.Speculate+  , module Data.Express.Fixtures+  , module Test.ListableExpr    -- * Test reporting   , reportTests@@ -19,139 +21,46 @@   , mainTest   , printLines -  -- * Properties-  , tiersExprTypeCorrect-+  -- * Test types   , listThyInefficient -  , IntE  (..)-  , BoolE (..)-  , CharE (..)-  , ListE (..)-  , FunE (..)-  , SameTypeE (..)-  , unSameTypeE-  , SameTypedPairsE (..)   , Thyght (..)   , Equation (..) -  -- * Functions and values encoded as 'Expr' or functions of Exprs-  -- | Terminal values are named;-  --   Variables are duplicated;-  --   Functions are primed;-  --   Operators are surrounded by dashes.--  -- ** Integers-  , zero, one, two, three, minusOne, minusTwo-  , xx, yy, zz, xx'-  , id', abs'-  , (-+-), (-*-), (.-.)-  , ii, jj, kk, ii'-  , negate'-  , ff, gg-  , ff2, hh2, hh3, hh4, hh5, hh6, hh7-  , succ'-  , (-$-)--  , (-|-), pair, duple -- synonyms-  , triple-  , quadruple-  , quintuple-  , sixtuple--  , idE-  , absE-  , succE-  , negateE-  , plusE-  , timesE-  , minusE-  , commaE-  , ffE-  , ggE--  -- ** Booleans-  , true, false-  , pp, qq, rr-  , not', (-&&-), (-||-), (-==>-)-  , (-==-), (-/=-), (-<=-), (-<-)-  , odd', even'--  -- ** Characters-  , aa, bb-  , space, lineBreak-  , cc, dd-  , ord'-  , ordE-  , emptyString-  , ccs--  -- ** Lists (of Inteters)-  , ll-  , xxs, yys-  , (-:-), (-++-)-  , head', tail'-  , insert', elem', sort'--  , consE, appendE--  -- ** Typereps-  , intTy-  , charTy--  -- ** checks for types-  , intE-  , charE-  , boolE--  -- ** Unamed holes-  , i_-  , c_-  , b_--  -- ** Dummy-  , expr+  -- * Test fixtures+  , foo, goo -  -- ** Enumerate expressions+  -- * Enumerate expressions   , expressionsT   ) where  import Test.LeanCheck-import Test.LeanCheck.Tiers 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.Expr hiding (true, false, ord)-import qualified Test.Speculate.Expr as E import Test.Speculate.Reason import Test.Speculate.Reason.Order-import Test.Speculate.Engine hiding (true, false) -import Data.Char (ord)-import Data.Dynamic-import Data.Function (on)-import Data.List as L (sort,insert)-import Data.Maybe (fromMaybe)+import Data.List (sort)  import Test.Speculate.Utils -isTrue :: Instances -> Int -> Expr -> Bool-isTrue = E.true+import Test.ListableExpr -isFalse :: Instances -> Int -> Expr -> Bool-isFalse = E.false +-- test reporting --+ reportTests :: [Bool] -> IO ()-reportTests tests =-  case elemIndices False tests of-    [] -> putStrLn "+++ Tests passed!"-    is -> do putStrLn ("*** Failed tests:" ++ show is)-             exitFailure+reportTests tests  =  case elemIndices False tests of+  [] -> putStrLn "+++ Tests passed!"+  is -> putStrLn ("*** Failed tests:" ++ show is) >> exitFailure  getMaxTestsFromArgs :: Int -> IO Int getMaxTestsFromArgs n = do@@ -168,473 +77,27 @@ printLines :: Show a => [a] -> IO () printLines = putStrLn . unlines . map show --- | This will not enumerate all possible 'Expr's, as that is impossible.---   But eventually, a rather a nice subset of it, with Integers, Booleans,---   Chars and lists of Integers.-instance Listable Expr where-  tiers = cons1 unIntE-       \/ cons1 unBoolE-       \/ cons1 unCharE-       \/ cons1 unListE `addWeight` 1-       \/ cons1 unFunE  `addWeight` 1 -tiersExprTypeCorrect :: Int -> Bool-tiersExprTypeCorrect n = all typeCorrect $ take n (list :: [Expr])---- Not a particularly efficient implementation.  If performance ever becomes an--- issue, declare something like:------ > tiersIntE = ...--- >          \/ mapT ord tiersCharE--- >          \/ ...--- >   where--- >   cons1 c = mapT c tiersIntE--- >   cons2 c = mapT ...--newtype IntE  = IntE  { unIntE  :: Expr } deriving Show-newtype BoolE = BoolE { unBoolE :: Expr } deriving Show-newtype CharE = CharE { unCharE :: Expr } deriving Show-newtype ListE = ListE { unListE :: Expr } deriving Show-newtype FunE  = FunE  { unFunE  :: Expr } deriving Show--consI :: (Expr -> a) -> [[a]]; consI f = cons1 (f . unIntE)-consB :: (Expr -> a) -> [[a]]; consB f = cons1 (f . unBoolE)-consC :: (Expr -> a) -> [[a]]; consC f = cons1 (f . unCharE)-consL :: (Expr -> a) -> [[a]]; consL f = cons1 (f . unListE)-consF :: (Expr -> a) -> [[a]]; consF f = cons1 (f . unFunE)-consII :: (Expr -> Expr -> a) -> [[a]]; consII o = cons2 (o `on` unIntE)-consBB :: (Expr -> Expr -> a) -> [[a]]; consBB o = cons2 (o `on` unBoolE)-consLL :: (Expr -> Expr -> a) -> [[a]]; consLL o = cons2 (o `on` unListE)-consIL :: (Expr -> Expr -> a) -> [[a]]; consIL o = cons2 (\(IntE x) (ListE xs) -> x `o` xs)--instance Listable IntE where-  tiers = mapT IntE $ cons0 zero   `addWeight` 1-                   \/ cons0 one    `addWeight` 2-                   \/ cons0 i_-                   \/ cons0 xx-                   \/ cons0 yy     `addWeight` 1-                   \/ cons0 zz     `addWeight` 2-                   \/ consI id'-                   \/ consI abs'   `addWeight` 1-                   \/ consII (-+-)-                   \/ consII (-*-) `addWeight` 1-                   \/ consC ord'   `addWeight` 2--instance Listable BoolE where-  tiers = mapT BoolE $ cons0 true   `addWeight` 1-                    \/ cons0 false  `addWeight` 1-                    \/ cons0 b_-                    \/ cons0 pp-                    \/ cons0 qq     `addWeight` 1-                    \/ cons0 rr     `addWeight` 2-                    \/ consB not'-                    \/ consBB (-&&-)  `addWeight` 1-                    \/ consBB (-||-)  `addWeight` 2-                    \/ consBB (-==>-) `addWeight` 3-                    \/ maybeCons1 (uncurry (equation     preludeInstances) . unSameTypeE) `addWeight` 3-                    \/ maybeCons1 (uncurry (comparisonLT preludeInstances) . unSameTypeE) `addWeight` 4-                    \/ maybeCons1 (uncurry (comparisonLE preludeInstances) . unSameTypeE) `addWeight` 4-                    \/ consI odd'   `addWeight` 1-                    \/ consI even'  `addWeight` 1-                    \/ consIL elem' `addWeight` 4--instance Listable CharE where-  tiers = mapT CharE $ cons0 aa   `addWeight` 1-                    \/ cons0 c_-                    \/ cons0 cc-                    \/ cons0 dd   `addWeight` 1--instance Listable ListE where-  tiers = mapT ListE $ cons0 ll-                    \/ cons0 xxs-                    \/ cons0 yys      `addWeight` 1-                    \/ consIL (-:-)-                    \/ consLL (-++-)  `addWeight` 1-                    \/ consIL insert' `addWeight` 2-                    \/ consL  sort'   `addWeight` 2--instance Listable FunE where-  list = map FunE-       [ idE-       , plusE-       , appendE-       , ordE-       , consE-       , absE-       , timesE-       , negateE-       , succE-       ]--data SameTypeE = SameTypeE Expr Expr deriving Show--unSameTypeE :: SameTypeE -> (Expr,Expr)-unSameTypeE (SameTypeE e1 e2) = (e1,e2)--instance Listable SameTypeE where-  tiers = cons1 (\(IntE  e1, IntE  e2) -> SameTypeE e1 e2) `ofWeight` 0-       \/ cons1 (\(BoolE e1, BoolE e2) -> SameTypeE e1 e2) `ofWeight` 0-       \/ cons1 (\(CharE e1, CharE e2) -> SameTypeE e1 e2) `ofWeight` 0-       \/ cons1 (\(ListE e1, ListE e2) -> SameTypeE e1 e2) `ofWeight` 0-       \/ cons1 (\(FunE  e1, FunE  e2) -> SameTypeE e1 e2) `ofWeight` 0-          `suchThat` (\(SameTypeE e1 e2) -> typ e1 == typ e2) -- for func, manual--newtype SameTypedPairsE = SameTypedPairsE [(Expr,Expr)] deriving Show--instance Listable SameTypedPairsE where-  tiers = cons1 (SameTypedPairsE . map unSameTypeE) `ofWeight` 0---zero :: Expr-zero = showConstant (0 :: Int)--one :: Expr-one = showConstant (1 :: Int)--two :: Expr-two = showConstant (2 :: Int)--three :: Expr-three = showConstant (3 :: Int)--minusOne :: Expr-minusOne = showConstant (-1 :: Int)--minusTwo :: Expr-minusTwo = showConstant (-2 :: Int)--xx :: Expr -- ex-xx = var "x" int--yy :: Expr -- wye-yy = var "y" int--zz :: Expr -- zed-zz = var "z" int--xx' :: Expr -- ex prime-xx' = var "x'" int--id' :: Expr -> Expr-id' = (idE :$)--idE :: Expr-idE = constant "id" (id :: Int -> Int)--abs' :: Expr -> Expr-abs' = (absE :$)--absE :: Expr-absE = constant "abs" (abs :: Int -> Int)--negate' :: Expr -> Expr-negate' = (negateE :$)--negateE :: Expr-negateE = constant "negate" (negate :: Int -> Int)--succ' :: Expr -> Expr-succ' = (succE :$)--succE :: Expr-succE = constant "succ" ((1+) :: Int -> Int)--(-+-) :: Expr -> Expr -> Expr-e1 -+- e2 = plusE :$ e1 :$ e2-infixl 6 -+---plusE :: Expr-plusE = constant "+" ((+) :: Int -> Int -> Int)--(-*-) :: Expr -> Expr -> Expr-e1 -*- e2 = timesE :$ e1 :$ e2--timesE :: Expr-timesE = constant "*" ((*) :: Int -> Int -> Int)--(.-.) :: Expr -> Expr -> Expr-e1 .-. e2 = minusE :$ e1 :$ e2--minusE :: Expr-minusE = constant "-" ((-) :: Int -> Int -> Int)--(-|-) :: Expr -> Expr -> Expr-e1 -|- e2 = commaE :$ e1 :$ e2--commaE :: Expr-commaE = constant "," ((,) :: Int -> Int -> (Int,Int))--pair :: Expr -> Expr -> Expr-pair = (-|-)--duple :: Expr -> Expr -> Expr-duple = (-|-)--triple :: Expr -> Expr -> Expr -> Expr-triple e1 e2 e3 = ccE :$ e1 :$ e2 :$ e3-  where-  ccE = constant ",," ((,,) :: Int -> Int -> Int -> (Int,Int,Int))--quadruple :: Expr -> Expr -> Expr -> Expr -> Expr-quadruple e1 e2 e3 e4 = cccE :$ e1 :$ e2 :$ e3 :$ e4-  where-  cccE = constant ",,," ((,,,) :: Int -> Int -> Int -> Int -> (Int,Int,Int,Int))--quintuple :: Expr -> Expr -> Expr -> Expr -> Expr -> Expr-quintuple e1 e2 e3 e4 e5 = ccccE :$ e1 :$ e2 :$ e3 :$ e4 :$ e5-  where-  ccccE = constant ",,,," ((,,,,) :: Int -> Int -> Int -> Int -> Int -> (Int,Int,Int,Int,Int))--sixtuple :: Expr -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr-sixtuple e1 e2 e3 e4 e5 e6 = cccccE :$ e1 :$ e2 :$ e3 :$ e4 :$ e5 :$ e6-  where-  cccccE = constant ",,,,," ((,,,,,) :: Int -> Int -> Int -> Int -> Int -> Int -> (Int,Int,Int,Int,Int,Int))--(-$-) :: Expr -> Expr -> Expr-e1 -$- e2 = applyE :$ e1 :$ e2-infixl 6 -$---applyE :: Expr-applyE = constant "$" (($) :: (Int -> Int) -> Int -> Int)--ii :: Expr-ii = var "i" int--jj :: Expr-jj = var "j" int--kk :: Expr-kk = var "k" int--ii' :: Expr-ii' = var "i'" int--ff :: Expr -> Expr-ff = (ffE :$)--ffE :: Expr-ffE = constant "f" (undefined :: Int -> Int)--gg :: Expr -> Expr-gg = (ggE :$)--ggE :: Expr-ggE = constant "g" (undefined :: Int -> Int)--ff2 :: Expr -> Expr -> Expr-ff2 e1 e2 = ffE :$ e1 :$ e2-  where ffE = constant "f" (undefined :: Int -> Int -> Int)--hh2 :: Expr -> Expr -> Expr-hh2 e1 e2 = hhE :$ e1 :$ e2-  where hhE = constant "h" (undefined :: Int -> Int -> Int)--hh3 :: Expr -> Expr -> Expr -> Expr-hh3 e1 e2 e3 = hhE :$ e1 :$ e2 :$ e3-  where hhE = constant "h" (undefined :: Int -> Int -> Int -> Int)--hh4 :: Expr -> Expr -> Expr -> Expr -> Expr-hh4 e1 e2 e3 e4 = hhE :$ e1 :$ e2 :$ e3 :$ e4-  where hhE = constant "h" (undefined :: Int -> Int -> Int -> Int -> Int)--hh5 :: Expr -> Expr -> Expr -> Expr -> Expr -> Expr-hh5 e1 e2 e3 e4 e5 = hhE :$ e1 :$ e2 :$ e3 :$ e4 :$ e5-  where hhE = constant "h" (undefined :: Int -> Int -> Int -> Int -> Int -> Int)--hh6 :: Expr -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr-hh6 e1 e2 e3 e4 e5 e6 = hhE :$ e1 :$ e2 :$ e3 :$ e4 :$ e5 :$ e6-  where hhE = constant "h" (undefined :: Int -> 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 = constant "h" (undefined :: Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int)---- unification (hh5 yy zz (ff2 ii ii) (ff2 jj jj) kk) (hh5 (ff2 xx xx) (ff2 yy yy) jj kk zz)---- 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')--true :: Expr-true = showConstant (True :: Bool)--false :: Expr-false = showConstant (False :: Bool)--pp :: Expr -- pee-pp = var "p" bool--qq :: Expr -- cue-qq = var "q" bool--rr :: Expr -- ar, I'm a pirate-rr = var "r" bool--not' :: Expr -> Expr-not' = (notE :$) where notE = constant "not" not--(-&&-) :: Expr -> Expr -> Expr-e1 -&&- e2 = andE :$ e1 :$ e2 where andE = constant "&&" (&&)-infixr 3 -&&---(-||-) :: Expr -> Expr -> Expr-e1 -||- e2 = orE :$ e1 :$ e2 where orE = constant "||" (||)-infixr 2 -||---(-==>-) :: Expr -> Expr -> Expr-e1 -==>- e2 = impliesE :$ e1 :$ e2 where impliesE = constant "==>" (==>)-infixr 0 -==>---(-==-) :: Expr -> Expr -> Expr-e1 -==- e2 =-  fromMaybe (error $ "(-==-): cannot equate " ++ show e1 ++ " and " ++ show e2)-            (equation preludeInstances e1 e2)-infix 4 -==---(-/=-) :: Expr -> Expr -> Expr-e1 -/=- e2 =-  fromMaybe (error $ "(-/=-): cannot inequate " ++ show e1 ++ " and " ++ show e2)-            (inequality preludeInstances e1 e2)-infix 4 -/=---(-<=-) :: Expr -> Expr -> Expr-e1 -<=- e2 =-  fromMaybe (error $ "(-<=-): cannot lessEq " ++ show e1 ++ " and " ++ show e2)-            (comparisonLE preludeInstances e1 e2)-infix 4 -<=---(-<-) :: Expr -> Expr -> Expr-e1 -<- e2 =-  fromMaybe (error $ "(-<-): cannot less " ++ show e1 ++ " and " ++ show e2)-            (comparisonLT preludeInstances e1 e2)-infix 4 -<---odd' :: Expr -> Expr-odd' = (oddE :$) where oddE = constant "odd" (odd :: Int -> Bool)--even' :: Expr -> Expr-even' = (evenE :$) where evenE = constant "even" (even :: Int -> Bool)---aa :: Expr -- a, the character, not a variable-aa = showConstant 'a'--bb :: Expr -- bee, the character, not a variable-bb = showConstant 'b'--space :: Expr -- space, the character-space = showConstant ' '--lineBreak :: Expr -- lineBreak, the character-lineBreak = showConstant '\n'--cc :: Expr -- cee, a variable character-cc = var "c" char--dd :: Expr -- dee, a variable character-dd = var "d" char--ord' :: Expr -> Expr-ord' = (ordE :$)--ordE :: Expr-ordE = constant "ord" Data.Char.ord--emptyString :: Expr-emptyString = showConstant ""--ccs :: Expr -- cees-ccs = var "cs" [char]---ll :: Expr-ll = showConstant ([] :: [Int])--xxs :: Expr -- exes-xxs = var "xs" [int]--yys :: Expr -- wyes-yys = var "ys" [int]--(-:-) :: Expr -> Expr -> Expr-e1 -:- e2-  | typ e1 == typeOf (undefined :: Int)  = consE :$ e1 :$ e2-  | typ e1 == typeOf (undefined :: Char) = stringConsE :$ e1 :$ e2-  where-  stringConsE = constant ":" ((:) :: Char -> String -> String)-infixr 5 -:---consE :: Expr-consE = constant ":" ((:) :: Int -> [Int] -> [Int])--(-++-) :: Expr -> Expr -> Expr-e1 -++- e2 = appendE :$ e1 :$ e2-infixr 5 -++---appendE :: Expr-appendE = constant "++" ((++) :: [Int] -> [Int] -> [Int])--head' :: Expr -> Expr-head' exs = headE :$ exs where headE = constant "head" (head :: [Int] -> Int)--tail' :: Expr -> Expr-tail' exs = tailE :$ exs where tailE = constant "tail" (tail :: [Int] -> [Int])--insert' :: Expr -> Expr -> Expr-insert' ex exs = insertE :$ ex :$ exs where insertE = constant "insert" (L.insert :: Int -> [Int] -> [Int])+-- test fixtures -- -elem' :: Expr -> Expr -> Expr-elem' ex exs = elemE :$ ex :$ exs where elemE = constant "elem" (elem :: Int -> [Int] -> Bool)+foo :: Expr -> Expr+foo = (value "f" (undefined :: Int -> Int) :$) -sort' :: Expr -> Expr-sort' exs = sortE :$ exs where sortE = constant "sort" (sort :: [Int] -> [Int])+goo :: Expr -> Expr+goo = (value "g" (undefined :: Int -> Int) :$)  --- boolTy already exported by Speculate.Instance--intTy :: TypeRep-intTy = typeOf int--charTy :: TypeRep-charTy = typeOf char--listTy :: TypeRep-listTy = typeOf [int]--intE :: Expr -> Bool-intE e = typ e == intTy--boolE :: Expr -> Bool-boolE e = typ e == boolTy--charE :: Expr -> Bool-charE e = typ e == charTy--listE :: Expr -> Bool-listE e = typ e == listTy--i_ :: Expr-i_ = hole int--c_ :: Expr-c_ = hole char--b_ :: Expr-b_ = hole bool--xs_ :: Expr-xs_ = hole [int]---- | Dummy expr value, for use in type binding-expr :: Expr-expr = undefined-+-- 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 -unEquation :: Equation -> (Expr,Expr)-unEquation (Equation e1 e2) = (e1,e2) +-- 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.@@ -659,11 +122,8 @@         . mapT unSameTypeE         $ tiers     where-    orientEqn (e1,e2) | e1 `compareComplexity` e2 == LT = (e2,e1)-                      | otherwise                       = (e1,e2)--newtype RuleSet = RuleSet [(Expr,Expr)] deriving Show-newtype EquationSet = EquationSet [(Expr,Expr)] deriving Show+    orientEqn (e1,e2) | e1 `compare` e2 == LT = (e2,e1)+                      | otherwise             = (e1,e2)  instance Listable RuleSet where   tiers = setCons (RuleSet . map unRule) `ofWeight` 0@@ -683,8 +143,6 @@                    -> emptyThy { rules     = sort rs                                , equations = sort eqs }) -newtype Thyght = Thyght { unThyght :: Thy } deriving Show- instance Listable Thyght where   tiers = mapT Thyght         $ concatMapT expandCanReduceTo@@ -702,7 +160,7 @@                \/ cons0 thy {keepE = keepUpToLength (maxLen + 3)} `ofWeight` 6                \/ cons0 thy {keepE = keepUpToLength (maxLen + 4)} `ofWeight` 8   where-  maxLen = maximum . map lengthE . catPairs $ equations thy ++ rules thy+  maxLen = maximum . (0:) . map size . catPairs $ equations thy ++ rules thy  expandClosureLimit :: Thy -> [[Thy]] expandClosureLimit thy = cons0 thy {closureLimit = 3}@@ -718,9 +176,10 @@                      \/ if all (uncurry (|>|)) (rules thy)                           then cons0 thy {canReduceTo = (|>|)} `ofWeight` 1                           else []-                     \/ if all (uncurry ( >|)) (rules thy)-                          then cons0 thy {canReduceTo = ( >|)} `ofWeight` 2-                          else []+-- FIXME: KBO is broken ATM:+--                   \/ if all (uncurry ( >|)) (rules thy)+--                        then cons0 thy {canReduceTo = ( >|)} `ofWeight` 2+--                        else []  listThyInefficient :: [Thy] listThyInefficient = concat@@ -776,5 +235,3 @@ -- 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.--instance Listable Instance where list = preludeInstances
+ tests/Test/ListableExpr.hs view
@@ -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
tests/benchmark-save view
@@ -1,3 +1,23 @@ #!/bin/bash top=`dirname $0`-$top/benchmark "$@" | tee bench/runtime-$HOSTNAME+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
tests/model/arith-c-s4.out view
@@ -5,28 +5,28 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)+_ :: Int 0 :: Int 1 :: Int (+) :: Int -> Int -> Int (*) :: Int -> Int -> Int -_ :: Int  (holes: Int)+_ :: Int 0 :: Int 1 :: Int-_ + _ :: Int  (holes: Int, Int)-_ + 1 :: Int  (holes: Int)+_ + _ :: Int+_ + 1 :: Int 1 + 1 :: Int-_ * _ :: Int  (holes: Int, Int)-_ + (_ + _) :: Int  (holes: Int, Int, Int)-_ + (_ + 1) :: Int  (holes: Int, Int)-_ + (1 + 1) :: Int  (holes: Int)-_ + _ * _ :: Int  (holes: Int, Int, Int)+_ * _ :: Int+_ + (_ + _) :: Int+_ + (_ + 1) :: Int+_ + (1 + 1) :: Int+_ + _ * _ :: Int 1 + (1 + 1) :: Int-1 + _ * _ :: Int  (holes: Int, Int)-_ * (_ + _) :: Int  (holes: Int, Int, Int)-_ * (_ + 1) :: Int  (holes: Int, Int)-_ * (_ * _) :: Int  (holes: Int, Int, Int)+1 + _ * _ :: Int+_ * (_ + _) :: Int+_ * (_ + 1) :: Int+_ * (_ * _) :: Int  x :: Int 0 :: Int
tests/model/arith-c.out view
@@ -5,28 +5,28 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)+_ :: Int 0 :: Int 1 :: Int (+) :: Int -> Int -> Int (*) :: Int -> Int -> Int -_ :: Int  (holes: Int)+_ :: Int 0 :: Int 1 :: Int-_ + _ :: Int  (holes: Int, Int)-_ + 1 :: Int  (holes: Int)+_ + _ :: Int+_ + 1 :: Int 1 + 1 :: Int-_ * _ :: Int  (holes: Int, Int)-_ + (_ + _) :: Int  (holes: Int, Int, Int)-_ + (_ + 1) :: Int  (holes: Int, Int)-_ + (1 + 1) :: Int  (holes: Int)-_ + _ * _ :: Int  (holes: Int, Int, Int)+_ * _ :: Int+_ + (_ + _) :: Int+_ + (_ + 1) :: Int+_ + (1 + 1) :: Int+_ + _ * _ :: Int 1 + (1 + 1) :: Int-1 + _ * _ :: Int  (holes: Int, Int)-_ * (_ + _) :: Int  (holes: Int, Int, Int)-_ * (_ + 1) :: Int  (holes: Int, Int)-_ * (_ * _) :: Int  (holes: Int, Int, Int)+1 + _ * _ :: Int+_ * (_ + _) :: Int+_ * (_ + 1) :: Int+_ * (_ * _) :: Int  x :: Int 0 :: Int
tests/model/arith-negate-abs-s4.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)+_ :: Int 0 :: Int 1 :: Int id :: Int -> Int
tests/model/arith-negate-abs.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)+_ :: Int 0 :: Int 1 :: Int id :: Int -> Int
tests/model/arith-s4.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)+_ :: Int 0 :: Int 1 :: Int (+) :: Int -> Int -> Int
tests/model/arith.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)+_ :: Int 0 :: Int 1 :: Int (+) :: Int -> Int -> Int
tests/model/arithficial-s4.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)+_ :: Int 0 :: Int id :: Int -> Int (+) :: Int -> Int -> Int
tests/model/arithficial.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)+_ :: Int 0 :: Int id :: Int -> Int (+) :: Int -> Int -> Int
tests/model/binarytree-s4.out view
@@ -5,10 +5,10 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Word2  (holes: Word2)-_ :: BT Word2  (holes: BT Word2)-_ :: [Word2]  (holes: [Word2])+_ :: Bool+_ :: Word2+_ :: BT Word2+_ :: [Word2] Null :: BT Word2 insert :: Word2 -> BT Word2 -> BT Word2 delete :: Word2 -> BT Word2 -> BT Word2
tests/model/binarytree.out view
@@ -5,10 +5,10 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Word2  (holes: Word2)-_ :: BT Word2  (holes: BT Word2)-_ :: [Word2]  (holes: [Word2])+_ :: Bool+_ :: Word2+_ :: BT Word2+_ :: [Word2] Null :: BT Word2 insert :: Word2 -> BT Word2 -> BT Word2 delete :: Word2 -> BT Word2 -> BT Word2
tests/model/binarytree0-s4.out view
@@ -5,9 +5,9 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Word2  (holes: Word2)-_ :: BT Word2  (holes: BT Word2)+_ :: Bool+_ :: Word2+_ :: BT Word2 Null :: BT Word2 insert :: Word2 -> BT Word2 -> BT Word2 delete :: Word2 -> BT Word2 -> BT Word2
tests/model/binarytree0.out view
@@ -5,9 +5,9 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Word2  (holes: Word2)-_ :: BT Word2  (holes: BT Word2)+_ :: Bool+_ :: Word2+_ :: BT Word2 Null :: BT Word2 insert :: Word2 -> BT Word2 -> BT Word2 delete :: Word2 -> BT Word2 -> BT Word2
tests/model/bool-c-s4.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)+_ :: Bool False :: Bool True :: Bool not :: Bool -> Bool@@ -14,27 +14,27 @@ (==) :: Bool -> Bool -> Bool  -_ :: Bool  (holes: Bool)+_ :: Bool False :: Bool True :: Bool-not _ :: Bool  (holes: Bool)-_ && _ :: Bool  (holes: Bool, Bool)-_ || _ :: Bool  (holes: Bool, Bool)-_ == _ :: Bool  (holes: Bool, Bool)-not (_ && _) :: Bool  (holes: Bool, Bool)-not (_ || _) :: Bool  (holes: Bool, Bool)-not (_ == _) :: Bool  (holes: Bool, Bool)-_ && not _ :: Bool  (holes: Bool, Bool)-_ || not _ :: Bool  (holes: Bool, Bool)-_ && (_ && _) :: Bool  (holes: Bool, Bool, Bool)-_ && (_ || _) :: Bool  (holes: Bool, Bool, Bool)-_ && _ == _ :: Bool  (holes: Bool, Bool, Bool)-_ || _ && _ :: Bool  (holes: Bool, Bool, Bool)-_ || (_ || _) :: Bool  (holes: Bool, Bool, Bool)-_ || _ == _ :: Bool  (holes: Bool, Bool, Bool)-_ == (_ && _) :: Bool  (holes: Bool, Bool, Bool)-_ == (_ || _) :: Bool  (holes: Bool, Bool, Bool)-_ == (_ == _) :: Bool  (holes: Bool, Bool, 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
tests/model/bool-c.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)+_ :: Bool False :: Bool True :: Bool not :: Bool -> Bool@@ -14,27 +14,27 @@ (==) :: Bool -> Bool -> Bool  -_ :: Bool  (holes: Bool)+_ :: Bool False :: Bool True :: Bool-not _ :: Bool  (holes: Bool)-_ && _ :: Bool  (holes: Bool, Bool)-_ || _ :: Bool  (holes: Bool, Bool)-_ == _ :: Bool  (holes: Bool, Bool)-not (_ && _) :: Bool  (holes: Bool, Bool)-not (_ || _) :: Bool  (holes: Bool, Bool)-not (_ == _) :: Bool  (holes: Bool, Bool)-_ && not _ :: Bool  (holes: Bool, Bool)-_ || not _ :: Bool  (holes: Bool, Bool)-_ && (_ && _) :: Bool  (holes: Bool, Bool, Bool)-_ && (_ || _) :: Bool  (holes: Bool, Bool, Bool)-_ && _ == _ :: Bool  (holes: Bool, Bool, Bool)-_ || _ && _ :: Bool  (holes: Bool, Bool, Bool)-_ || (_ || _) :: Bool  (holes: Bool, Bool, Bool)-_ || _ == _ :: Bool  (holes: Bool, Bool, Bool)-_ == (_ && _) :: Bool  (holes: Bool, Bool, Bool)-_ == (_ || _) :: Bool  (holes: Bool, Bool, Bool)-_ == (_ == _) :: Bool  (holes: Bool, Bool, 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
tests/model/bool-s4.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)+_ :: Bool False :: Bool True :: Bool not :: Bool -> Bool
tests/model/bool.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)+_ :: Bool False :: Bool True :: Bool not :: Bool -> Bool
tests/model/colour-s4.out view
@@ -5,9 +5,9 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Colour  (holes: Colour)-_ :: Maybe (Ratio Integer)  (holes: Maybe (Ratio Integer))-_ :: Ratio Integer  (holes: Ratio Integer)+_ :: Colour+_ :: Maybe (Ratio Integer)+_ :: Ratio Integer (+) :: Colour -> Colour -> Colour (-) :: Colour -> Colour -> Colour chroma :: Colour -> Ratio Integer
tests/model/colour.out view
@@ -5,9 +5,9 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Colour  (holes: Colour)-_ :: Maybe (Ratio Integer)  (holes: Maybe (Ratio Integer))-_ :: Ratio Integer  (holes: Ratio Integer)+_ :: Colour+_ :: Maybe (Ratio Integer)+_ :: Ratio Integer (+) :: Colour -> Colour -> Colour (-) :: Colour -> Colour -> Colour chroma :: Colour -> Ratio Integer
tests/model/digraphs-s4.out view
@@ -5,10 +5,10 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Nat  (holes: Nat)-_ :: Digraph Nat  (holes: Digraph Nat)-_ :: [Nat]  (holes: [Nat])+_ :: Bool+_ :: Nat+_ :: Digraph Nat+_ :: [Nat] [] :: [Nat] elem :: Nat -> [Nat] -> Bool empty :: Digraph Nat
tests/model/digraphs.out view
@@ -5,10 +5,10 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Nat  (holes: Nat)-_ :: Digraph Nat  (holes: Digraph Nat)-_ :: [Nat]  (holes: [Nat])+_ :: Bool+_ :: Nat+_ :: Digraph Nat+_ :: [Nat] [] :: [Nat] elem :: Nat -> [Nat] -> Bool empty :: Digraph Nat@@ -54,6 +54,6 @@       addNode x a <=  addEdge x y a addEdge x y empty <=  addEdge x y a -   elem x xs ==> subgraph xs (addNode x a) == addNode x (subgraph xs a) isEdge x y a ==>             addEdge x y a == a+   elem x xs ==> subgraph xs (addNode x a) == addNode x (subgraph xs a) 
tests/model/fun-s4.out view
@@ -5,9 +5,9 @@ min  #-tests   =   50  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])-_ :: Int -> Int  (holes: Int -> Int)+_ :: Int+_ :: [Int]+_ :: Int -> Int map :: (Int -> Int) -> [Int] -> [Int] id :: Int -> Int (.) :: (Int -> Int) -> (Int -> Int) -> Int -> Int
tests/model/fun.out view
@@ -5,9 +5,9 @@ min  #-tests   =   50  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])-_ :: Int -> Int  (holes: Int -> Int)+_ :: Int+_ :: [Int]+_ :: Int -> Int map :: (Int -> Int) -> [Int] -> [Int] id :: Int -> Int (.) :: (Int -> Int) -> (Int -> Int) -> Int -> Int
tests/model/insertsort-s4.out view
@@ -5,9 +5,9 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])+_ :: Bool+_ :: Int+_ :: [Int] False :: Bool True :: Bool [] :: [Int]
tests/model/insertsort.out view
@@ -5,9 +5,9 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])+_ :: Bool+_ :: Int+_ :: [Int] False :: Bool True :: Bool [] :: [Int]@@ -58,14 +58,14 @@ sort (xs ++ ys) <=  sort xs ++ ys   sort xs ++ xs <=  xs ++ sort xs -            x <= y ==>     insert x (y:xs) == x:y:xs-             x < y ==>     insert y (x:xs) == x:insert y xs-         elem x xs ==> insert x (xs ++ ys) == insert x xs ++ ys+     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)-ordered (ys ++ xs) ==>  sort ys ++ sort xs == sort (xs ++ ys)-     all (x <=) xs ==>         insert x xs == x:xs      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 
tests/model/insertsort0-s4.out view
@@ -5,9 +5,9 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])+_ :: Bool+_ :: Int+_ :: [Int] [] :: [Int] (:) :: Int -> [Int] -> [Int] insert :: Int -> [Int] -> [Int]
tests/model/insertsort0.out view
@@ -5,9 +5,9 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])+_ :: Bool+_ :: Int+_ :: [Int] [] :: [Int] (:) :: Int -> [Int] -> [Int] insert :: Int -> [Int] -> [Int]
tests/model/length-s4.out view
@@ -5,8 +5,8 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])+_ :: Int+_ :: [Int] [] :: [Int] (:) :: Int -> [Int] -> [Int] (++) :: [Int] -> [Int] -> [Int]
tests/model/length.out view
@@ -5,8 +5,8 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])+_ :: Int+_ :: [Int] [] :: [Int] (:) :: Int -> [Int] -> [Int] (++) :: [Int] -> [Int] -> [Int]
tests/model/list-c-s4.out view
@@ -4,103 +4,103 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    3  (for inequational and conditional laws) -_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])+_ :: Int+_ :: [Int] [] :: [Int] (:) :: Int -> [Int] -> [Int] (++) :: [Int] -> [Int] -> [Int] head :: [Int] -> Int tail :: [Int] -> [Int] -_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])+_ :: Int+_ :: [Int] [] :: [Int]-head _ :: Int  (holes: [Int])+head _ :: Int head [] :: Int-tail _ :: [Int]  (holes: [Int])+tail _ :: [Int] tail [] :: [Int]-head (tail _) :: Int  (holes: [Int])+head (tail _) :: Int head (tail []) :: Int-tail (tail _) :: [Int]  (holes: [Int])+tail (tail _) :: [Int] tail (tail []) :: [Int]-_:_ :: [Int]  (holes: Int, [Int])-[_] :: [Int]  (holes: Int)-_ ++ _ :: [Int]  (holes: [Int], [Int])-head (tail (tail _)) :: Int  (holes: [Int])+_:_ :: [Int]+[_] :: [Int]+_ ++ _ :: [Int]+head (tail (tail _)) :: Int head (tail (tail [])) :: Int-head (_ ++ _) :: Int  (holes: [Int], [Int])-tail (tail (tail _)) :: [Int]  (holes: [Int])+head (_ ++ _) :: Int+tail (tail (tail _)) :: [Int] tail (tail (tail [])) :: [Int]-tail (_ ++ _) :: [Int]  (holes: [Int], [Int])-_:tail _ :: [Int]  (holes: Int, [Int])-_:tail [] :: [Int]  (holes: Int)-_ ++ tail _ :: [Int]  (holes: [Int], [Int])-_ ++ tail [] :: [Int]  (holes: [Int])-[] ++ tail _ :: [Int]  (holes: [Int])+tail (_ ++ _) :: [Int]+_:tail _ :: [Int]+_:tail [] :: [Int]+_ ++ tail _ :: [Int]+_ ++ tail [] :: [Int]+[] ++ tail _ :: [Int] [] ++ tail [] :: [Int]-head _:_ :: [Int]  (holes: [Int], [Int])-[head _] :: [Int]  (holes: [Int])-head []:_ :: [Int]  (holes: [Int])+head _:_ :: [Int]+[head _] :: [Int]+head []:_ :: [Int] [head []] :: [Int]-tail _ ++ _ :: [Int]  (holes: [Int], [Int])-tail _ ++ [] :: [Int]  (holes: [Int])-tail [] ++ _ :: [Int]  (holes: [Int])+tail _ ++ _ :: [Int]+tail _ ++ [] :: [Int]+tail [] ++ _ :: [Int] tail [] ++ [] :: [Int]-head (tail (tail (tail _))) :: Int  (holes: [Int])+head (tail (tail (tail _))) :: Int head (tail (tail (tail []))) :: Int-head (tail (_ ++ _)) :: Int  (holes: [Int], [Int])-head (_ ++ tail _) :: Int  (holes: [Int], [Int])-head (_ ++ tail []) :: Int  (holes: [Int])-head ([] ++ tail _) :: Int  (holes: [Int])+head (tail (_ ++ _)) :: Int+head (_ ++ tail _) :: Int+head (_ ++ tail []) :: Int+head ([] ++ tail _) :: Int head ([] ++ tail []) :: Int-head (head _:_) :: Int  (holes: [Int], [Int])-head [head _] :: Int  (holes: [Int])-head (head []:_) :: Int  (holes: [Int])+head (head _:_) :: Int+head [head _] :: Int+head (head []:_) :: Int head [head []] :: Int-head (tail _ ++ _) :: Int  (holes: [Int], [Int])-head (tail _ ++ []) :: Int  (holes: [Int])-head (tail [] ++ _) :: Int  (holes: [Int])+head (tail _ ++ _) :: Int+head (tail _ ++ []) :: Int+head (tail [] ++ _) :: Int head (tail [] ++ []) :: Int-tail (tail (tail (tail _))) :: [Int]  (holes: [Int])+tail (tail (tail (tail _))) :: [Int] tail (tail (tail (tail []))) :: [Int]-tail (tail (_ ++ _)) :: [Int]  (holes: [Int], [Int])-tail (_:tail _) :: [Int]  (holes: Int, [Int])-tail (_:tail []) :: [Int]  (holes: Int)-tail (_ ++ tail _) :: [Int]  (holes: [Int], [Int])-tail (_ ++ tail []) :: [Int]  (holes: [Int])-tail ([] ++ tail _) :: [Int]  (holes: [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]  (holes: [Int], [Int])-tail (tail _ ++ []) :: [Int]  (holes: [Int])-tail (tail [] ++ _) :: [Int]  (holes: [Int])+tail (tail _ ++ _) :: [Int]+tail (tail _ ++ []) :: [Int]+tail (tail [] ++ _) :: [Int] tail (tail [] ++ []) :: [Int]-_:tail (tail _) :: [Int]  (holes: Int, [Int])-_:tail (tail []) :: [Int]  (holes: Int)-_:_:_ :: [Int]  (holes: Int, Int, [Int])-[_,_] :: [Int]  (holes: Int, Int)-_:(_ ++ _) :: [Int]  (holes: Int, [Int], [Int])-_ ++ tail (tail _) :: [Int]  (holes: [Int], [Int])-_ ++ tail (tail []) :: [Int]  (holes: [Int])-_ ++ (_:_) :: [Int]  (holes: [Int], Int, [Int])-_ ++ [_] :: [Int]  (holes: [Int], Int)-_ ++ (_ ++ _) :: [Int]  (holes: [Int], [Int], [Int])-[] ++ tail (tail _) :: [Int]  (holes: [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]  (holes: [Int], [Int])-head _:tail [] :: [Int]  (holes: [Int])-head []:tail _ :: [Int]  (holes: [Int])+head _:tail _ :: [Int]+head _:tail [] :: [Int]+head []:tail _ :: [Int] head []:tail [] :: [Int]-tail _ ++ tail _ :: [Int]  (holes: [Int], [Int])-tail _ ++ tail [] :: [Int]  (holes: [Int])-tail [] ++ tail _ :: [Int]  (holes: [Int])+tail _ ++ tail _ :: [Int]+tail _ ++ tail [] :: [Int]+tail [] ++ tail _ :: [Int] tail [] ++ tail [] :: [Int]-head (tail _):_ :: [Int]  (holes: [Int], [Int])-[head (tail _)] :: [Int]  (holes: [Int])-head (tail []):_ :: [Int]  (holes: [Int])+head (tail _):_ :: [Int]+[head (tail _)] :: [Int]+head (tail []):_ :: [Int] [head (tail [])] :: [Int]-tail (tail _) ++ _ :: [Int]  (holes: [Int], [Int])-tail (tail _) ++ [] :: [Int]  (holes: [Int])-tail (tail []) ++ _ :: [Int]  (holes: [Int])+tail (tail _) ++ _ :: [Int]+tail (tail _) ++ [] :: [Int]+tail (tail []) ++ _ :: [Int] tail (tail []) ++ [] :: [Int]  x :: Int
tests/model/list-c.out view
@@ -4,103 +4,103 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    3  (for inequational and conditional laws) -_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])+_ :: Int+_ :: [Int] [] :: [Int] (:) :: Int -> [Int] -> [Int] (++) :: [Int] -> [Int] -> [Int] head :: [Int] -> Int tail :: [Int] -> [Int] -_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])+_ :: Int+_ :: [Int] [] :: [Int]-head _ :: Int  (holes: [Int])+head _ :: Int head [] :: Int-tail _ :: [Int]  (holes: [Int])+tail _ :: [Int] tail [] :: [Int]-head (tail _) :: Int  (holes: [Int])+head (tail _) :: Int head (tail []) :: Int-tail (tail _) :: [Int]  (holes: [Int])+tail (tail _) :: [Int] tail (tail []) :: [Int]-_:_ :: [Int]  (holes: Int, [Int])-[_] :: [Int]  (holes: Int)-_ ++ _ :: [Int]  (holes: [Int], [Int])-head (tail (tail _)) :: Int  (holes: [Int])+_:_ :: [Int]+[_] :: [Int]+_ ++ _ :: [Int]+head (tail (tail _)) :: Int head (tail (tail [])) :: Int-head (_ ++ _) :: Int  (holes: [Int], [Int])-tail (tail (tail _)) :: [Int]  (holes: [Int])+head (_ ++ _) :: Int+tail (tail (tail _)) :: [Int] tail (tail (tail [])) :: [Int]-tail (_ ++ _) :: [Int]  (holes: [Int], [Int])-_:tail _ :: [Int]  (holes: Int, [Int])-_:tail [] :: [Int]  (holes: Int)-_ ++ tail _ :: [Int]  (holes: [Int], [Int])-_ ++ tail [] :: [Int]  (holes: [Int])-[] ++ tail _ :: [Int]  (holes: [Int])+tail (_ ++ _) :: [Int]+_:tail _ :: [Int]+_:tail [] :: [Int]+_ ++ tail _ :: [Int]+_ ++ tail [] :: [Int]+[] ++ tail _ :: [Int] [] ++ tail [] :: [Int]-head _:_ :: [Int]  (holes: [Int], [Int])-[head _] :: [Int]  (holes: [Int])-head []:_ :: [Int]  (holes: [Int])+head _:_ :: [Int]+[head _] :: [Int]+head []:_ :: [Int] [head []] :: [Int]-tail _ ++ _ :: [Int]  (holes: [Int], [Int])-tail _ ++ [] :: [Int]  (holes: [Int])-tail [] ++ _ :: [Int]  (holes: [Int])+tail _ ++ _ :: [Int]+tail _ ++ [] :: [Int]+tail [] ++ _ :: [Int] tail [] ++ [] :: [Int]-head (tail (tail (tail _))) :: Int  (holes: [Int])+head (tail (tail (tail _))) :: Int head (tail (tail (tail []))) :: Int-head (tail (_ ++ _)) :: Int  (holes: [Int], [Int])-head (_ ++ tail _) :: Int  (holes: [Int], [Int])-head (_ ++ tail []) :: Int  (holes: [Int])-head ([] ++ tail _) :: Int  (holes: [Int])+head (tail (_ ++ _)) :: Int+head (_ ++ tail _) :: Int+head (_ ++ tail []) :: Int+head ([] ++ tail _) :: Int head ([] ++ tail []) :: Int-head (head _:_) :: Int  (holes: [Int], [Int])-head [head _] :: Int  (holes: [Int])-head (head []:_) :: Int  (holes: [Int])+head (head _:_) :: Int+head [head _] :: Int+head (head []:_) :: Int head [head []] :: Int-head (tail _ ++ _) :: Int  (holes: [Int], [Int])-head (tail _ ++ []) :: Int  (holes: [Int])-head (tail [] ++ _) :: Int  (holes: [Int])+head (tail _ ++ _) :: Int+head (tail _ ++ []) :: Int+head (tail [] ++ _) :: Int head (tail [] ++ []) :: Int-tail (tail (tail (tail _))) :: [Int]  (holes: [Int])+tail (tail (tail (tail _))) :: [Int] tail (tail (tail (tail []))) :: [Int]-tail (tail (_ ++ _)) :: [Int]  (holes: [Int], [Int])-tail (_:tail _) :: [Int]  (holes: Int, [Int])-tail (_:tail []) :: [Int]  (holes: Int)-tail (_ ++ tail _) :: [Int]  (holes: [Int], [Int])-tail (_ ++ tail []) :: [Int]  (holes: [Int])-tail ([] ++ tail _) :: [Int]  (holes: [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]  (holes: [Int], [Int])-tail (tail _ ++ []) :: [Int]  (holes: [Int])-tail (tail [] ++ _) :: [Int]  (holes: [Int])+tail (tail _ ++ _) :: [Int]+tail (tail _ ++ []) :: [Int]+tail (tail [] ++ _) :: [Int] tail (tail [] ++ []) :: [Int]-_:tail (tail _) :: [Int]  (holes: Int, [Int])-_:tail (tail []) :: [Int]  (holes: Int)-_:_:_ :: [Int]  (holes: Int, Int, [Int])-[_,_] :: [Int]  (holes: Int, Int)-_:(_ ++ _) :: [Int]  (holes: Int, [Int], [Int])-_ ++ tail (tail _) :: [Int]  (holes: [Int], [Int])-_ ++ tail (tail []) :: [Int]  (holes: [Int])-_ ++ (_:_) :: [Int]  (holes: [Int], Int, [Int])-_ ++ [_] :: [Int]  (holes: [Int], Int)-_ ++ (_ ++ _) :: [Int]  (holes: [Int], [Int], [Int])-[] ++ tail (tail _) :: [Int]  (holes: [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]  (holes: [Int], [Int])-head _:tail [] :: [Int]  (holes: [Int])-head []:tail _ :: [Int]  (holes: [Int])+head _:tail _ :: [Int]+head _:tail [] :: [Int]+head []:tail _ :: [Int] head []:tail [] :: [Int]-tail _ ++ tail _ :: [Int]  (holes: [Int], [Int])-tail _ ++ tail [] :: [Int]  (holes: [Int])-tail [] ++ tail _ :: [Int]  (holes: [Int])+tail _ ++ tail _ :: [Int]+tail _ ++ tail [] :: [Int]+tail [] ++ tail _ :: [Int] tail [] ++ tail [] :: [Int]-head (tail _):_ :: [Int]  (holes: [Int], [Int])-[head (tail _)] :: [Int]  (holes: [Int])-head (tail []):_ :: [Int]  (holes: [Int])+head (tail _):_ :: [Int]+[head (tail _)] :: [Int]+head (tail []):_ :: [Int] [head (tail [])] :: [Int]-tail (tail _) ++ _ :: [Int]  (holes: [Int], [Int])-tail (tail _) ++ [] :: [Int]  (holes: [Int])-tail (tail []) ++ _ :: [Int]  (holes: [Int])+tail (tail _) ++ _ :: [Int]+tail (tail _) ++ [] :: [Int]+tail (tail []) ++ _ :: [Int] tail (tail []) ++ [] :: [Int]  x :: Int
tests/model/list-s4.out view
@@ -4,8 +4,8 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    3  (for inequational and conditional laws) -_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])+_ :: Int+_ :: [Int] [] :: [Int] (:) :: Int -> [Int] -> [Int] (++) :: [Int] -> [Int] -> [Int]
tests/model/list.out view
@@ -4,8 +4,8 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    3  (for inequational and conditional laws) -_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])+_ :: Int+_ :: [Int] [] :: [Int] (:) :: Int -> [Int] -> [Int] (++) :: [Int] -> [Int] -> [Int]
tests/model/minus-c-s4.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)+_ :: Int 0 :: Int 1 :: Int id :: Int -> Int@@ -13,32 +13,32 @@ negate :: Int -> Int (-) :: Int -> Int -> Int -_ :: Int  (holes: Int)+_ :: Int 0 :: Int 1 :: Int-negate _ :: Int  (holes: Int)+negate _ :: Int negate 1 :: Int-_ + _ :: Int  (holes: Int, Int)-_ + 1 :: Int  (holes: Int)+_ + _ :: Int+_ + 1 :: Int 1 + 1 :: Int-_ - _ :: Int  (holes: Int, Int)-_ - 1 :: Int  (holes: Int)-1 - _ :: Int  (holes: Int)-negate (_ + _) :: Int  (holes: Int, Int)-negate (_ + 1) :: Int  (holes: Int)+_ - _ :: Int+_ - 1 :: Int+1 - _ :: Int+negate (_ + _) :: Int+negate (_ + 1) :: Int negate (1 + 1) :: Int-_ + (_ + _) :: Int  (holes: Int, Int, Int)-_ + (_ + 1) :: Int  (holes: Int, Int)-_ + (1 + 1) :: Int  (holes: Int)-_ + (_ - _) :: Int  (holes: Int, Int, Int)-_ + (_ - 1) :: Int  (holes: Int, Int)-_ + (1 - _) :: Int  (holes: Int, Int)+_ + (_ + _) :: Int+_ + (_ + 1) :: Int+_ + (1 + 1) :: Int+_ + (_ - _) :: Int+_ + (_ - 1) :: Int+_ + (1 - _) :: Int 1 + (1 + 1) :: Int-1 + (1 - _) :: Int  (holes: Int)-_ - (_ + _) :: Int  (holes: Int, Int, Int)-_ - (_ + 1) :: Int  (holes: Int, Int)-_ - (1 + 1) :: Int  (holes: Int)-1 - (_ + _) :: Int  (holes: Int, Int)+1 + (1 - _) :: Int+_ - (_ + _) :: Int+_ - (_ + 1) :: Int+_ - (1 + 1) :: Int+1 - (_ + _) :: Int  x :: Int 0 :: Int
tests/model/minus-c.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)+_ :: Int 0 :: Int 1 :: Int id :: Int -> Int@@ -13,32 +13,32 @@ negate :: Int -> Int (-) :: Int -> Int -> Int -_ :: Int  (holes: Int)+_ :: Int 0 :: Int 1 :: Int-negate _ :: Int  (holes: Int)+negate _ :: Int negate 1 :: Int-_ + _ :: Int  (holes: Int, Int)-_ + 1 :: Int  (holes: Int)+_ + _ :: Int+_ + 1 :: Int 1 + 1 :: Int-_ - _ :: Int  (holes: Int, Int)-_ - 1 :: Int  (holes: Int)-1 - _ :: Int  (holes: Int)-negate (_ + _) :: Int  (holes: Int, Int)-negate (_ + 1) :: Int  (holes: Int)+_ - _ :: Int+_ - 1 :: Int+1 - _ :: Int+negate (_ + _) :: Int+negate (_ + 1) :: Int negate (1 + 1) :: Int-_ + (_ + _) :: Int  (holes: Int, Int, Int)-_ + (_ + 1) :: Int  (holes: Int, Int)-_ + (1 + 1) :: Int  (holes: Int)-_ + (_ - _) :: Int  (holes: Int, Int, Int)-_ + (_ - 1) :: Int  (holes: Int, Int)-_ + (1 - _) :: Int  (holes: Int, Int)+_ + (_ + _) :: Int+_ + (_ + 1) :: Int+_ + (1 + 1) :: Int+_ + (_ - _) :: Int+_ + (_ - 1) :: Int+_ + (1 - _) :: Int 1 + (1 + 1) :: Int-1 + (1 - _) :: Int  (holes: Int)-_ - (_ + _) :: Int  (holes: Int, Int, Int)-_ - (_ + 1) :: Int  (holes: Int, Int)-_ - (1 + 1) :: Int  (holes: Int)-1 - (_ + _) :: Int  (holes: Int, Int)+1 + (1 - _) :: Int+_ - (_ + _) :: Int+_ - (_ + 1) :: Int+_ - (1 + 1) :: Int+1 - (_ + _) :: Int  x :: Int 0 :: Int
tests/model/minus-s4.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)+_ :: Int 0 :: Int 1 :: Int id :: Int -> Int
tests/model/minus.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)+_ :: Int 0 :: Int 1 :: Int id :: Int -> Int
tests/model/monad-s4.out view
@@ -5,16 +5,16 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])-_ :: Int -> [Int]  (holes: Int -> [Int])+_ :: 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 >=> g) x == (f x >>= g)+    (f x >>= g) == (f >=> g) x  (f >=> return) == f  (return >=> f) == f 
tests/model/monad.out view
@@ -5,16 +5,16 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])-_ :: Int -> [Int]  (holes: Int -> [Int])+_ :: 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 >=> g) x == (f x >>= g)+       (f x >>= g) == (f >=> g) x ((xs >>= f) >>= g) == (xs >>= (f >=> g))     (f >=> return) == f     (return >=> f) == f
tests/model/nord-s4.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: EqButNotOrd  (holes: EqButNotOrd)+_ :: EqButNotOrd C0 :: EqButNotOrd id :: EqButNotOrd -> EqButNotOrd 
tests/model/nord.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: EqButNotOrd  (holes: EqButNotOrd)+_ :: EqButNotOrd C0 :: EqButNotOrd id :: EqButNotOrd -> EqButNotOrd 
tests/model/oddeven-s4.out view
@@ -5,8 +5,8 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Int  (holes: Int)+_ :: Bool+_ :: Int 0 :: Int 1 :: Int 2 :: Int@@ -18,9 +18,9 @@ (==) :: Int -> Int -> Bool (==) :: Bool -> Bool -> Bool +         (x == x) == True          (p == p) == True       (p == True) == p-         (x == x) == True          (x == y) == (y == x)   odd (x `mod` 2) == odd x  even (x `mod` 2) == even x
tests/model/oddeven.out view
@@ -5,8 +5,8 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Int  (holes: Int)+_ :: Bool+_ :: Int 0 :: Int 1 :: Int 2 :: Int@@ -18,9 +18,9 @@ (==) :: Int -> Int -> Bool (==) :: Bool -> Bool -> Bool +           (x == x) == True            (p == p) == True         (p == True) == p-           (x == x) == True            (x == y) == (y == x)     odd (x `mod` 2) == odd x    even (x `mod` 2) == even x@@ -47,6 +47,6 @@  odd x ==>           x `mod` x == 0  odd x ==>           0 `mod` x == 0  odd x ==>           x `mod` 2 == 1- odd y ==> (x `mod` y) `mod` y == x `mod` y even x ==>           x `mod` 2 == 0+ odd y ==> (x `mod` y) `mod` y == x `mod` y 
tests/model/plus-abs-s4.out view
@@ -5,8 +5,8 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Int  (holes: Int)+_ :: Bool+_ :: Int (+) :: Int -> Int -> Int id :: Int -> Int abs :: Int -> Int
tests/model/plus-abs.out view
@@ -5,8 +5,8 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Int  (holes: Int)+_ :: Bool+_ :: Int (+) :: Int -> Int -> Int id :: Int -> Int abs :: Int -> Int@@ -61,8 +61,8 @@       x + y <=  x + abs y abs (x + 1) <=  1 + abs x -    y <= x ==> abs (x + abs y) == x + abs y     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 
tests/model/pretty-s4.out view
@@ -5,9 +5,9 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    3  (for inequational and conditional laws) -_ :: Doc  (holes: Doc)-_ :: Int  (holes: Int)-_ :: [Char]  (holes: [Char])+_ :: Doc+_ :: Int+_ :: [Char] ($$) :: Doc -> Doc -> Doc (<>) :: Doc -> Doc -> Doc nest :: Int -> Doc -> Doc
tests/model/pretty.out view
@@ -5,9 +5,9 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    3  (for inequational and conditional laws) -_ :: Doc  (holes: Doc)-_ :: Int  (holes: Int)-_ :: [Char]  (holes: [Char])+_ :: Doc+_ :: Int+_ :: [Char] ($$) :: Doc -> Doc -> Doc (<>) :: Doc -> Doc -> Doc nest :: Int -> Doc -> Doc
tests/model/ratio-s4.out view
@@ -5,8 +5,8 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Integer  (holes: Integer)-_ :: Ratio Integer  (holes: Ratio Integer)+_ :: Integer+_ :: Ratio Integer id :: Ratio Integer -> Ratio Integer abs :: Ratio Integer -> Ratio Integer negate :: Ratio Integer -> Ratio Integer
tests/model/ratio.out view
@@ -5,8 +5,8 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Integer  (holes: Integer)-_ :: Ratio Integer  (holes: Ratio Integer)+_ :: Integer+_ :: Ratio Integer id :: Ratio Integer -> Ratio Integer abs :: Ratio Integer -> Ratio Integer negate :: Ratio Integer -> Ratio Integer@@ -43,8 +43,8 @@                           q + r == r + q                           q * r == r * q     numerator q % denominator q == q-  denominator q % denominator q == 1 % 1              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)
tests/model/regexes-s4.out view
@@ -4,8 +4,8 @@ max  #-tests   =   30 max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: RE Symbol  (holes: RE Symbol)+_ :: Bool+_ :: RE Symbol Empty :: RE Symbol None :: RE Symbol Star :: RE Symbol -> RE Symbol
tests/model/regexes.out view
@@ -4,8 +4,8 @@ max  #-tests   =   30 max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: RE Symbol  (holes: RE Symbol)+_ :: Bool+_ :: RE Symbol Empty :: RE Symbol None :: RE Symbol Star :: RE Symbol -> RE Symbol
tests/model/sets-s4.out view
@@ -5,9 +5,9 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Int  (holes: Int)-_ :: Set Int  (holes: Set Int)+_ :: Bool+_ :: Int+_ :: Set Int emptyS :: Set Int singleS :: Int -> Set Int insertS :: Int -> Set Int -> Set Int
tests/model/sets.out view
@@ -5,9 +5,9 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Int  (holes: Int)-_ :: Set Int  (holes: Set Int)+_ :: Bool+_ :: Int+_ :: Set Int emptyS :: Set Int singleS :: Int -> Set Int insertS :: Int -> Set Int -> Set Int
tests/model/speculate-reason-s4.out view
@@ -4,11 +4,11 @@ max  #-tests   = 6000 max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Equation  (holes: Equation)-_ :: Expr  (holes: Expr)-_ :: Thyght  (holes: Thyght)-_ :: [Expr]  (holes: [Expr])+_ :: Bool+_ :: Equation+_ :: Expr+_ :: Thyght+_ :: [Expr] okThy :: Thyght -> Bool insert :: Expr -> Thyght -> Thyght complete :: Thyght -> Thyght
tests/model/speculate-reason.out view
@@ -4,11 +4,11 @@ max  #-tests   = 6000 max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Equation  (holes: Equation)-_ :: Expr  (holes: Expr)-_ :: Thyght  (holes: Thyght)-_ :: [Expr]  (holes: [Expr])+_ :: Bool+_ :: Equation+_ :: Expr+_ :: Thyght+_ :: [Expr] okThy :: Thyght -> Bool insert :: Expr -> Thyght -> Thyght complete :: Thyght -> Thyght
tests/model/string-s4.out view
@@ -5,8 +5,8 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: [Char]  (holes: [Char])-_ :: [[Char]]  (holes: [[Char]])+_ :: [Char]+_ :: [[Char]] "" :: [Char] " " :: [Char] "\n" :: [Char]@@ -22,12 +22,12 @@    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 (unlines (lines cs)) == words cs-          words (unwords css) == words (unlines css)                   "" <= cs                  cs <= cs ++ ds
tests/model/string.out view
@@ -5,8 +5,8 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: [Char]  (holes: [Char])-_ :: [[Char]]  (holes: [[Char]])+_ :: [Char]+_ :: [[Char]] "" :: [Char] " " :: [Char] "\n" :: [Char]@@ -31,12 +31,12 @@           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 (unlines (lines cs)) == words cs-                 words (unwords css) == words (unlines css)            words (cs ++ unwords css) == words (cs ++ unlines css)                             "" <= cs@@ -48,10 +48,10 @@            unwords (lines cs) <= cs ++ ds                    "\n" ++ cs <= ds ++ " "            unlines (lines cs) <= cs ++ cs-                   "\n" ++ cs <= cs ++ "\n" unwords (lines (unwords css)) <= unwords css-                   cs ++ "\n" <= cs ++ " "+                   "\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 ++ " "
tests/model/tauts-s4.out view
@@ -5,9 +5,9 @@ min  #-tests   =  200  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Name  (holes: Name)-_ :: Prop  (holes: Prop)+_ :: Bool+_ :: Name+_ :: Prop False :: Bool True :: Bool (==) :: Prop -> Prop -> Bool@@ -19,9 +19,9 @@ (==) :: Name -> Name -> Bool       (p == p) == True+     (p == p) == True   (p == True) == p      (n == n) == True-     (p == p) == True taut (eval p) == taut p      (p == q) == (q == p) eval (eval p) == eval p
tests/model/tauts.out view
@@ -5,9 +5,9 @@ min  #-tests   =  200  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Name  (holes: Name)-_ :: Prop  (holes: Prop)+_ :: Bool+_ :: Name+_ :: Prop False :: Bool True :: Bool (==) :: Prop -> Prop -> Bool@@ -19,9 +19,9 @@ (==) :: Name -> Name -> Bool       (p == p) == True+     (p == p) == True   (p == True) == p      (n == n) == True-     (p == p) == True taut (eval p) == taut p      (p == q) == (q == p) eval (eval p) == eval p
tests/model/tuples-s4.out view
@@ -4,10 +4,10 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    3  (for inequational and conditional laws) -_ :: ()  (holes: ())-_ :: Int  (holes: Int)-_ :: (Int,Int)  (holes: (Int,Int))-_ :: (Int,Int,Int)  (holes: (Int,Int,Int))+_ :: ()+_ :: Int+_ :: (Int,Int)+_ :: (Int,Int,Int) () :: () id :: () -> () id :: Int -> Int
tests/model/tuples.out view
@@ -4,10 +4,10 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    3  (for inequational and conditional laws) -_ :: ()  (holes: ())-_ :: Int  (holes: Int)-_ :: (Int,Int)  (holes: (Int,Int))-_ :: (Int,Int,Int)  (holes: (Int,Int,Int))+_ :: ()+_ :: Int+_ :: (Int,Int)+_ :: (Int,Int,Int) () :: () id :: () -> () id :: Int -> Int
tests/model/unit-s4.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: ()  (holes: ())+_ :: () () :: () id :: () -> () 
tests/model/unit.out view
@@ -5,7 +5,7 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    2  (for inequational and conditional laws) -_ :: ()  (holes: ())+_ :: () () :: () id :: () -> () 
tests/model/zip-s4.out view
@@ -5,10 +5,10 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    3  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])-_ :: [(Int,Int)]  (holes: [(Int,Int)])+_ :: Bool+_ :: Int+_ :: [Int]+_ :: [(Int,Int)] (++) :: [Int] -> [Int] -> [Int] (==) :: Int -> Int -> Bool length :: [Int] -> Int
tests/model/zip.out view
@@ -3,10 +3,10 @@ min  #-tests   =   25  (to consider p ==> q true) max  #-vars    =    3  (for inequational and conditional laws) -_ :: Bool  (holes: Bool)-_ :: Int  (holes: Int)-_ :: [Int]  (holes: [Int])-_ :: [(Int,Int)]  (holes: [(Int,Int)])+_ :: Bool+_ :: Int+_ :: [Int]+_ :: [(Int,Int)] (++) :: [Int] -> [Int] -> [Int] (==) :: Int -> Int -> Bool length :: [Int] -> Int
tests/test-creason.hs view
@@ -6,7 +6,7 @@  -- Utils import Test.Speculate.Reason (canonicalEqn, canonicalizeEqn, emptyThy)-import Test.Speculate.Expr (falseE)+import Test.Speculate.Expr (val)  main :: IO () main = mainTest tests 10000@@ -35,10 +35,10 @@       emptyChy{cequations = [(zero -<=- xx, abs' xx, xx)]}       (zero -<=- yy) (abs' yy -+- yy) (yy -+- yy) -  , holds n $ \e1 e2    -> canonicalCEqn compare (falseE,e1,e2) == canonicalEqn emptyThy (e1,e2)-  , holds n $ \e1 e2    -> sndTrd (canonicalizeCEqn compare (falseE,e1,e2))+  , 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 (falseE,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!
tests/test-engine.hs view
@@ -7,8 +7,6 @@ -- Helper functions import Test.Speculate.Reason (emptyThy) import Test.Speculate.Utils-import Data.List-import Data.Maybe  main :: IO () main = mainTest tests 10000@@ -17,41 +15,10 @@ tests n =   [ True   -  , tiersExprTypeCorrect (n*2)--  , holds n $ \e -> mostGeneral  e == head (vassignments e)-  , holds n $ \e -> mostSpecific e == last (vassignments e)--  , vassignments (zero -+- xx) == [zero -+- xx]-  , vassignments (zero -+- i_) == [zero -+- xx]-  , vassignments (i_ -+- i_) == [xx -+- yy, xx -+- xx]-  , map canonicalize (vassignments (i_ -+- (i_ -+- ord' c_)))-    == [ xx -+- (yy -+- ord' cc)-       , xx -+- (xx -+- ord' cc) ]--  , vassignments (ii -+- i_) == [ii -+- xx]-  , map canonicalize (vassignments ((i_ -+- i_) -+- (ord' c_ -+- ord' c_)))-    == [ (xx -+- yy) -+- (ord' cc -+- ord' dd)-       , (xx -+- yy) -+- (ord' cc -+- ord' cc)-       , (xx -+- xx) -+- (ord' cc -+- ord' dd)-       , (xx -+- xx) -+- (ord' cc -+- ord' cc) ]--  , holds n $ \e -> all (null . snd) (vars e)-                ==> let xs = map (length . vars) $ vassignments e-                    in (head xs >) `all` tail xs-                    && (last xs <) `all` init xs-  , holds n $ \e -> all null (map snd $ vars e)-                ==> unrepeatedVars (head (vassignments e))-  , holds n $ \e -> all (null . snd) (vars e)-                ==> let es = vassignments e-                    in (`isInstanceOf` head es) `all` tail es-                    && (last es `isInstanceOf`) `all` init es+  , 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))-                  $ vassignments e-  , holds n $ \e -> let es = vassignments e-                    in length (nub (sort es)) == length es-  , holds n $ \e -> length (vassignments e)-                 == product (map (bell . snd) . counts $ holes e)+                  $ fastCanonicalVariations e    , equivalencesBetween (===) (i_ -+- i_) (i_ -+- i_)     == [ ( xx -+- yy, yy -+- xx ) ]@@ -64,8 +31,6 @@        , ( xx -+- (yy -+- zz), (zz -+- xx) -+- yy )        , ( xx -+- (yy -+- zz), (zz -+- yy) -+- xx ) ] -  , holds n $ \(SameTypeE e1 e2) -> unEquation (phonyEquation e1 e2) == (e1,e2)- -- 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@@ -101,13 +66,13 @@        , yy -+- yy -+- ord' cc        , yy -+- yy -+- ord' dd ] -  , expansionsOfType intTy ["x","y"] (i_ -+- i_ -+- ord' c_)+  , 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 intTy [] (i_ -+- i_ -+- ord' c_) == []+  , expansionsOfType i_ [] (i_ -+- i_ -+- ord' c_) == []    , expansionsWith [xx, yy]     (i_ -+- i_ -+- ord' c_)     == [ xx -+- xx -+- ord' c_
tests/test-eval.hs view
@@ -3,11 +3,8 @@  -- Functions under test import Test.Speculate.Expr.Ground-import Test.Speculate.Utils import Test.Speculate.Expr -import Data.Maybe- -- TODO: rename test-eval to test-ground  main :: IO ()@@ -17,32 +14,23 @@ tests n =   [ True -  , holds n' $ \e -> if isEqE preludeInstances e-                      then e === e-                      else e =/= e   ,                                    xx -+- yy === yy -+- xx-  , holds n' $ \(IntE e1) (IntE e2) -> e1 -+- e2 === e2 -+- e1+  , 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' $       zero //= one-  , holds n' $ not $   xx //= yy--  , holds n' $ \e1 e2 -> case equation preludeInstances e1 e2 of-                           Just e1e2 -> condEqual preludeInstances 500 e1e2 e1 e2-                           Nothing   -> True-  , holds n' $ \e1 e2 -> case equation preludeInstances e1 e2 of-                           Just e1e2 -> condEqualM preludeInstances 500 0 e1e2 e1 e2-                           Nothing   -> True-  , fails n' $ \e1 e2 -> case equation preludeInstances e1 e2 of-                           Just e1e2 -> condEqualM preludeInstances 500 500 e1e2 e1 e2-                           Nothing   -> True--  , trueBinds preludeInstances 500 (xx -==- zero) == [[("x",zero)]]-  , trueBinds preludeInstances 500 (xx -==- one)  == [[("x",one)]]-  , trueBinds preludeInstances 500 ((xx -==- one) -&&- (yy -==- zero))  == [[("x",one),("y",zero)]]+  , 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 -:> ()@@ -50,18 +38,18 @@   , 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 =/=-  x //= y = inequal preludeInstances 500 x y  (*==*), (*/=*), (*<=*), (*<*) :: (Show a, Typeable a) => a -> a -> Bool-x *==* y = eval undefined $ showConstant x -==- showConstant y-x */=* y = eval undefined $ showConstant x -/=- showConstant y-x *<=* y = eval undefined $ showConstant x -<=- showConstant y-x *<*  y = eval undefined $ showConstant x -<-  showConstant 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+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)
tests/test-expr.hs view
@@ -1,21 +1,11 @@-{-# Language DeriveDataTypeable, StandaloneDeriving #-} -- Travis-{-# LANGUAGE CPP #-} -- Test library import Test-import qualified Test.LeanCheck.Utils as LC (comparison)  -- Functions under test import Test.Speculate.Expr-import Test.Speculate.Utils-import Test.Speculate.Reason (emptyThy)-import Data.List (sort)-import Data.Functor ((<$>)) -- for GHC < 7.10-import Data.Typeable (typeOf)-import Data.Maybe (isJust) --- for Travis:-deriving instance Typeable Thyght-deriving instance Typeable Equation+-- Helper functions+import Data.Functor ((<$>)) -- for GHC < 7.10  main :: IO () main = mainTest tests 10000@@ -23,208 +13,71 @@ tests :: Int -> [Bool] tests n =   [ True-  -  , consts (xx -+- yy) == [plusE]-  , consts (xx -+- (yy -+- zz)) == [plusE]-  , consts (zero -+- one) =$ sort $= [zero, one, plusE]-  , consts ((zero -+- abs' zero) -+- (ord' aa -+- ord' cc))-      =$ sort $= [zero, aa, absE, plusE, ordE]-  , holds n $ \e1 e2 -> timesE `elem` consts (e1 -*- e2) --  , arity zero == 0-  , arity xx == 0-  , arity absE == 1-  , arity plusE == 2-  , arity timesE == 2---  , holds n $ okEqOrd -:> expr-  , holds n $ okEqOrd -:> (undefined :: Instance)-  , holds n $ compare ==== compareComplexity-  , holds n $ LC.comparison lexicompare-  , holds n $ LC.comparison compareComplexity--  , holds n $ \(FunE e1) (FunE e2) e3 -> let cmp = lexicompare-                                         in typ e1 == typ e2 && isJust (e1 $$ e3) && isJust (e2 $$ e3)-                                        ==> e1 `cmp` e2 == (e1 :$ e3) `cmp` (e2 :$ e3)-  , holds n $ \(FunE e1) (FunE e2) e3 -> let cmp = lexicompareBy (flip compare)-                                         in typ e1 == typ e2 && isJust (e1 $$ e3) && isJust (e2 $$ e3)-                                        ==> e1 `cmp` e2 == (e1 :$ e3) `cmp` (e2 :$ e3)--  , holds n $ equivalence (eqExprCommuting [plusE])-  , holds n $ equivalence (eqExprCommuting [timesE])-  , holds n $ equivalence (eqExprCommuting [plusE,timesE])--  , xx -+- yy == xx -+- yy-  , xx -+- yy /= yy -+- xx-  , not $ eqExprCommuting [timesE] (xx -+- yy) (yy -+- xx)-  ,       eqExprCommuting [plusE]  (xx -+- yy) (yy -+- xx)-  ,       eqExprCommuting [plusE]  (zz -+- (xx -+- yy)) ((yy -+- xx) -+- zz)-  ,       eqExprCommuting [plusE,timesE]  (zz -+- (xx -*- yy)) ((yy -*- xx) -+- zz)--  -- Holes < Values < Apps-  , xx < zero-  , zero < zero -+- one-  , xx < xx -+- yy-  , zero < xx -+- yy--  -- Less arity is less-  , zero < absE-  , absE < timesE-  , aa   < ordE-  , ordE < timesE-  , constant "id" (id -:>  int)  < constant "id"    (id    -:>  [int])-  , constant "id" (id -:> [int]) < constant "id"    (id    -:> [[int]])-  , constant "id" (id -:>  int)  < constant "sum"   (sum   -:>  [int])-  , constant "id" (id -:>  int)  < constant "(:[])" ((:[]) -:>   int)--  -- precedent types-  , pp < xx-  , cc < xx-  , pp < cc-  , xx < xxs-  , aa < zero-  , Test.true < zero-  , Test.true < aa-  , zero < ll--  -- further precedent types-  , constant "xx" xx < zero-  , constant "xxeqxx" (Equation xx xx) < constant "xx" xx-  , constant "xx" xx < constant "emptyThyght" (Thyght emptyThy)--  , unfoldApp (abs' xx)          == [absE, xx]-  , unfoldApp (abs' (xx -+- yy)) == [absE, xx -+- yy]-  , unfoldApp (xx -+- abs' xx)   == [plusE, xx, abs' xx]--  , holds n $ \e -> renameBy id e == e-  , holds n $ \e -> renameBy tail (renameBy ('x':) e) == e-  , renameBy (++ "1") (xx -+- yy) == (var "x1" int -+- var "y1" int)-  , renameBy (\(c:cs) -> succ c:cs) ((xx -+- yy) -+- ord' cc)-                                 == ((yy -+- zz) -+- ord' dd)--  , canonicalize (xx -+- yy)-              == (xx -+- yy)-  , canonicalize (jj -+- (ii -+- ii))-              == (xx -+- (yy -+- yy))-  , canonicalize ((jj -+- ii) -+- (xx -+- xx))-              == ((xx -+- yy) -+- (zz -+- zz))--  , typ zero == typ one-  , typ zero == typ xx-  , typ zero == typ ii-  , typ xx /= typ cc-  , typ xx == typ (ord' cc)-  , holds n $ \(SameTypeE e1 e2) -> typ e1 == typ e2-  , holds n $ \(IntE  e) -> typ e == typ i_-  , holds n $ \(BoolE e) -> typ e == typ b_-  , holds n $ \(CharE e) -> typ e == typ c_-  , holds n $ \(ListE e) -> typ e == typ xxs-  , etyp (xx :$ yy) == Left (i_ :$ i_)-  , etyp (xx :$ (cc :$ yy)) == Left (i_ :$ (c_ :$ i_))-  , etyp (ff xx :$ (ord' cc :$ gg yy)) == Left (i_ :$ (i_ :$ i_))-  , holds n $ \(SameTypeE ef eg) (SameTypeE ex ey) -> (etyp (ef :$ ex) == etyp (eg :$ ey))-  , holds n $ \ef eg ex ey -> (etyp ef == etyp eg && etyp ex == etyp ey)-                           == (etyp (ef :$ ex) == etyp (eg :$ ey))-  , holds n $ \e -> case etyp e of-                      Right t -> t == typ e-                      Left  _ -> error "Either Listable Expr is generating ill typed expressions or etyp is wrong!"--  , lengthE zero == 1-  , depthE  zero == 1-  , lengthE one  == 1-  , depthE  one  == 1-  , lengthE (zero -+- one) == 3-  , depthE  (zero -+- one) == 2-  , lengthE (zero -+- (xx -+- yy)) == 5-  , depthE  (zero -+- (xx -+- yy)) == 3-  , lengthE (((xx -+- yy) -*- zz) -==- ((xx -*- zz) -+- (yy -*- zz))) == 13-  , depthE  (((xx -+- yy) -*- zz) -==- ((xx -*- zz) -+- (yy -*- zz))) ==  4-  , depthE  (xx -*- yy -+- xx -*- zz -==- xx -*- (yy -+- zz)) == 4-  , lengthE (xx -*- yy -+- xx -*- zz -==- xx -*- (yy -+- zz)) == 13-  , depthE  (xx -*- yy -+- xx -*- zz) == 3-  , depthE  (xx -*- (yy -+- zz)) == 3--  , allUnique (take (n`div`10) list :: [Expr])-  , allUnique (take (n`div`10) $ map unSameTypeE list)-  , allUnique (take (n`div`10) $ map unIntE list)--  , holds n $ \(IntE e)            -> e `isInstanceOf` xx-  , holds n $ \(IntE e)            -> abs' e `isInstanceOf` abs' xx-  , holds n $ \(IntE e)            -> (e -+- e) `isInstanceOf` (xx -+- xx)-  , holds n $ \(IntE e1) (IntE e2) -> (e1 -+- e2) `isInstanceOf` (xx -+- yy)-  , holds n $ \(IntE e1) (IntE e2) -> e1 /= e2 ==> not ((e1 -+- e2) `isInstanceOf` (xx -+- xx))-  , holds n $ \e                   -> e /= zero ==> not (e `isInstanceOf` zero)--  ,       (zero -+- one)       `isInstanceOf` (xx -+- yy)-  ,       (zero -+- zero)      `isInstanceOf` (xx -+- yy)-  ,       (yy -+- xx)          `isInstanceOf` (xx -+- yy)-  ,       (zero -+- zero)      `isInstanceOf` (xx -+- xx)-  , not $ (zero -+- one)       `isInstanceOf` (xx -+- xx)-  ,       zero                 `isInstanceOf`          xx-  , not $ xx                   `isInstanceOf`        zero-  ,       (xx -+- (yy -+- xx)) `isInstanceOf` (xx -+- yy)-  ,       (xx -+- (xx -+- xx)) `isInstanceOf` (xx -+- yy)-  , not $ (xx -+- (xx -+- xx)) `isInstanceOf` (xx -+- xx)+  , ((xx -+- yy) -+- (yy -+- zz)) //- [(yy, yy -+- zz)]+      == (xx -+- (yy -+- zz)) -+- ((yy -+- zz) -+- zz) -  , vars (xx -+- yy) == [(intTy,"x"),(intTy,"y")]-  , vars (xx -+- xx) == [(intTy,"x")]-  , vars (xx -+- xx -+- yy) == [(intTy,"x"),(intTy,"y")]-  , vars (yy -+- xx -+- yy) == [(intTy,"x"),(intTy,"y")]+  , (xx -+- yy) // [(yy, yy -+- zz), (xx, xx -+- yy)]+      == (xx -+- yy) -+- (yy -+- zz) -  ,  (xx -+- xx)         < (xx -+- (xx -+- xx))-  , ((xx -+- xx) -+- xx) > (xx -+- (xx -+- xx))-  , xx < yy-  , zero < one-  , xx < zero+  , sub (xx -+- yy) zero ((xx -+- yy) -+- zz) == (zero -+- zz)+  , sub (xx -+- yy) zero (xx -+- (yy -+- zz)) == (xx -+- (yy -+- zz)) -  , holds n $ \(IntE e1) (IntE e2) -> isTuple (pair e1 e2)-                                   && unfoldTuple (pair e1 e2) == [e1,e2]-  , holds n $ \(IntE e1) (IntE e2) (IntE e3) ->-      isTuple (triple e1 e2 e3) && unfoldTuple (triple e1 e2 e3) == [e1,e2,e3]-  , holds n $ \(IntE e1) (IntE e2) (IntE e3) (IntE e4) ->-      isTuple (quadruple e1 e2 e3 e4) &&-      unfoldTuple (quadruple e1 e2 e3 e4) == [e1,e2,e3,e4]-  , holds n $ \(IntE  e) -> not (isTuple e) && unfoldTuple e == []-  , holds n $ \(CharE e) -> not (isTuple e) && unfoldTuple e == []-  , holds n $ \(BoolE e) -> not (isTuple e) && unfoldTuple e == []-  , holds n $ \(ListE e) -> not (isTuple e) && unfoldTuple e == []-  , holds n $ \(FunE  e) -> not (isTuple e) && unfoldTuple e == []+  , 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 $ \e1 e2 -> e1 `isSub` e2 == (e1 `elem` subexprsV e2)+  , holds n $ \(SameTypeE e1 e2) -> unify e1 e2 =$ fmap canonicalize $= unify e2 e1 -  , show (emptyString) == "\"\" :: [Char]"-  , show (space -:- emptyString) == "\" \" :: [Char]"-  , show (space -:- ccs)         == "' ':cs :: [Char]"-  , show (aa -:- bb -:- emptyString) == "\"ab\" :: [Char]"-  , show (aa -:- bb -:- ccs)         == "'a':'b':cs :: [Char]"-  , show (aa -:- space -:- bb -:- lineBreak -:- emptyString) == "\"a b\\n\" :: [Char]"-  , show (cc -:- space -:- dd -:- lineBreak -:- emptyString) == "c:' ':d:\"\\n\" :: [Char]"-  , show (cc -:- space -:- dd -:- lineBreak -:- ccs)         == "c:' ':d:'\\n':cs :: [Char]"-  , show (cc -:- aa -:- bb -:- emptyString) == "c:\"ab\" :: [Char]"-  , show (cc -:- aa -:- bb -:- space -:- aa -:- bb -:- emptyString) == "c:\"ab ab\" :: [Char]"+  , 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)] -  , show one                     == "1 :: Int"-  , show (minusOne)              == "-1 :: Int"-  , show (one -+- one)           == "1 + 1 :: Int"-  , show (minusOne -+- minusOne) == "(-1) + (-1) :: Int"+  -- 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)+            ]+  ] -  , show (zero -|- one)          == "(0,1) :: (Int,Int)"-  , show (minusOne -|- minusOne) == "(-1,-1) :: (Int,Int)"-  , show (triple zero one two)   == "(0,1,2) :: (Int,Int,Int)"-  , show (quadruple minusOne zero one two) == "(-1,0,1,2) :: (Int,Int,Int,Int)"-  , show (quintuple minusOne zero one two three) == "(-1,0,1,2,3) :: (Int,Int,Int,Int,Int)"-  , show (sixtuple minusTwo minusOne zero one two three) == "(-2,-1,0,1,2,3) :: (Int,Int,Int,Int,Int,Int)"+ff2 :: Expr -> Expr -> Expr+ff2 e1 e2 = ffE :$ e1 :$ e2+  where ffE = value "f" (undefined :: Int -> Int -> Int) -  , show (one -:- ll)                     == "[1] :: [Int]"-  , show (zero -:- one -:- ll)            == "[0,1] :: [Int]"-  , show (minusOne -:- ll)                == "[-1] :: [Int]"-  , show (minusOne -:- minusTwo -:- ll)   == "[-1,-2] :: [Int]"-  , show (xx -:- minusTwo -:- yy -:- ll)  == "[x,-2,y] :: [Int]"-  , show (xx -:- minusTwo -:- yy -:- xxs) == "x:(-2):y:xs :: [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) -  , show (ffE -$- zero)     == "f $ 0 :: Int"-  , show (ggE -$- xx)       == "g $ x :: Int"-  , show (ffE -$- minusOne) == "f $ (-1) :: 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)
− tests/test-match.hs
@@ -1,92 +0,0 @@--- Test library-import Test---- Functions under test-import Test.Speculate.Expr.Match-import Test.Speculate.Expr---- Helper functions-import Test.Speculate.Utils-import Data.List-import Data.Maybe-import Data.Functor ((<$>)) -- for GHC < 7.10--main :: IO ()-main = mainTest tests 10000--tests :: Int -> [Bool]-tests n =-  [ True--  , holds n $ \(IntE e1) (IntE e2) -> match (e1 -+- e2) (xx -+- yy) == Just [("y",e2),("x",e1)]-  , holds n $ \(IntE e)            -> match (e -+- e)   (xx -+- xx) == Just [("x",e)]-  , holds n $ \(IntE e1) (IntE e2) -> e1 /= e2 ==> match (e1 -+- e2) (xx -+- xx) == Nothing-  , holds n $ \(IntE e1) (IntE e2) (IntE e3) -> e2 /= e3-                ==> match ((e1 -+- e1) -+- (e2 -+- e3)) (xx -+- (yy -+- yy)) == Nothing-  , holds n $ \(IntE e1) (IntE e2) -> matchWith [("x",e1)] (e1 -+- e2) (xx -+- yy) == Just [("y",e2),("x",e1)]-  , holds n $ \(IntE e1) (IntE e2) -> e1 /= e2 ==> matchWith [("x",e2)] (e1 -+- e2) (xx -+- yy) == Nothing-  , holds n $ \e1 e2 -> e1 `match` e2 == matchWith [] e1 e2-  , holds n $ \(SameTypeE e1 e2) (SameTypeE e3 e4) ->-                not (isFunTy $ typ e1) && not (isFunTy $ typ e3)-                  ==>-                (e1 -==- e2) `match` (e3 -==- e4) == (e1,e2) `match2` (e3,e4)---  , assign "y" (yy -+- zz) ((xx -+- yy) -+- (yy -+- zz))-      == (xx -+- (yy -+- zz)) -+- ((yy -+- zz) -+- zz)--  , ((xx -+- yy) -+- (yy -+- zz)) `assigning` [("y",yy -+- zz)]-      == (xx -+- (yy -+- zz)) -+- ((yy -+- zz) -+- zz)--  , (xx -+- yy) `assigning` [("y",yy -+- zz),("x",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 [("x",yy)]-  , (canonicalize <$> unify xx yy) == Just xx-  , unification zero zero == Just []-  , unification zero one  == Nothing-  , unification xx one == Just [("x",one)]-  , unification (zero -+- xx) (zero -+- one) == Just [("x",one)]-  , unification (zero -+- xx) (yy -+- one) == Just [("x",one),("y",zero)]-  , unify (zero -+- xx) (yy -+- one) == Just (zero -+- one)-  , unification (ff xx) (ff (gg yy)) == Just [("x",gg yy)]-  , unification (ff xx -+- xx) (yy -+- zero) == Just [("x",zero),("y",ff zero)]-  , unify (ff xx -+- xx) (yy -+- zero) == Just (ff zero -+- zero)-  , unification (ff xx) (gg yy) == Nothing-  , unification (ff xx) (ff yy) == unification xx yy-  , (canonicalize <$> unify (negate' (negate' xx) -+- yy) (zz -+- zero))-    == Just (negate' (negate' xx) -+- zero)-  , unification (xx -+- one) (one -+- xx) == Just [("x",one)]-  , unification (xx -+- xx) (one -+- one) == Just [("x",one)]-  , unification (zz -+- zz) (xx -+- yy) == Just [("x",yy),("z",yy)]-  , unification (xx    -*- (-+-) xx xx)-                (ff zz -*- (-+-) xx yy) == Just [("y",ff zz),("x",ff 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 [ ("i",xx)-            , ("k",ff2 (ff2 xx xx) (ff2 xx xx))-            , ("j",ff2 xx xx)-            , ("z",ff2 (ff2 xx xx) (ff2 xx xx))-            , ("y",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 [ ("i",xx)-            , ("i'",ff2 (ff2 (ff2 xx xx) (ff2 xx xx)) (ff2 (ff2 xx xx) (ff2 xx xx)))-            , ("k",ff2 (ff2 xx xx) (ff2 xx xx))-            , ("j",ff2 xx xx)-            , ("x'",ff2 (ff2 (ff2 xx xx) (ff2 xx xx)) (ff2 (ff2 xx xx) (ff2 xx xx)))-            , ("z",ff2 (ff2 xx xx) (ff2 xx xx))-            , ("y",ff2 xx xx)-            ]-  ]
− tests/test-misc.hs
@@ -1,91 +0,0 @@--- Test library-import Test---- Functions under test-import Test.Speculate.Misc---- Utils-import Test.Speculate.Expr-import Test.Speculate.Utils--main :: IO ()-main = mainTest tests 10000---- NOTE: remember that in the expressions returned by functions<N> the--- variables are actually values (bound by the arguments of the returned--- function)--tests :: Int -> [Bool]-tests n =-  [ True-  , fillings (ord' c_) [cc,dd,xx] == [ord' cc, ord' dd]--  , map (show *** ($1))                  (functions1 (i_ -+- i_) :: [(Expr,Int->Int)])-    == [("x + x :: Int", 2)]--  , map (show *** (($1).($2)))           (functions2 (i_ -+- i_) :: [(Expr,Int->Int->Int)])-    == [ ("x + x :: Int", 4)-       , ("x + y :: Int", 3)-       , ("y + x :: Int", 3)-       , ("y + y :: Int", 2) ]--  , map (show *** (($1).($2).($3)))      (functions3 (i_ -+- i_) :: [(Expr,Int->Int->Int->Int)])-    == [ ("x + x :: Int",6)-       , ("x + y :: Int",5)-       , ("y + x :: Int",5)-       , ("x + z :: Int",4)-       , ("y + y :: Int",4)-       , ("z + x :: Int",4)-       , ("y + z :: Int",3)-       , ("z + y :: Int",3)-       , ("z + z :: Int",2) ]--  , map (show *** (($1).($2).($3).($4))) (functions4 (i_ -+- i_) :: [(Expr,Int->Int->Int->Int->Int)])-    == [ ("x + x :: Int",8)-       , ("x + y :: Int",7)-       , ("y + x :: Int",7)-       , ("x + z :: Int",6)-       , ("y + y :: Int",6)-       , ("z + x :: Int",6)-       , ("x + w :: Int",5)-       , ("y + z :: Int",5)-       , ("z + y :: Int",5)-       , ("w + x :: Int",5)-       , ("y + w :: Int",4)-       , ("z + z :: Int",4)-       , ("w + y :: Int",4)-       , ("z + w :: Int",3)-       , ("w + z :: Int",3)-       , ("w + w :: Int",2) ]--  , take 3 (expressionsOf [ zero, xx, absE, plusE ])-    == [ [ zero, xx, absE, plusE ]-       , [ abs' zero, abs' xx, plusE :$ zero, plusE :$ xx ]-       , [ abs' (abs' zero)-         , abs' (abs' xx)-         , plusE :$ abs' zero-         , plusE :$ abs' xx-         , zero -+- zero-         , zero -+- xx-         , xx -+- zero-         , xx -+- xx ] ]--  , take 3 (valuedExpressionsOf [ zero, one, absE, plusE ])-    == [ [ (zero, 0 :: Int)-         , (one,  1) ]-       , [ (abs' zero, 0)-         , (abs' one,  1) ]-       , [ (abs' (abs' zero), 0)-         , (abs' (abs' one),  1)-         , (zero -+- zero, 0)-         , (zero -+- one,  1)-         , (one -+- zero,  1)-         , (one -+- one,   2) ] ]--  , take 3 (mapT (id *** ($ (10::Int))) $ valuedExpressionsOf [ zero, one, absE, plusE ])-    == [ [ (absE, 10 :: Int) ]-       , [ (plusE :$ zero, 10)-         , (plusE :$ one,  11) ]-       , [ (plusE :$ abs' zero, 10)-         , (plusE :$ abs' one,  11) ] ]-  ]
tests/test-order.hs view
@@ -1,25 +1,74 @@+{-# 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 -main :: IO ()-main = do-  n <- getMaxTestsFromArgs 10000+import Data.Monoid ((<>)) -  reportTests (tests n)+-- 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 (|>|)-  , holds n $ simplificationOrder ( >|)-  , holds n $ simplificationOrder (|> )-  , holds n $ simplificationOrder (dwoBy (<))+  , 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)@@ -51,7 +100,7 @@   , fails n $ closedUnderSub      lgt   , fails n $ subtermProperty     lgt -  -- compareComplexity has the subtermProperty+  -- compare has the subtermProperty (Expr)   , fails n $ simplificationOrder cgt   , fails n $ compatible          cgt   , fails n $ closedUnderSub      cgt@@ -59,7 +108,7 @@   ]   where   e1 `lgt` e2 = e1 `lexicompare` e2 == GT-  e1 `cgt` e2 = e1 `compareComplexity` 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@@ -77,15 +126,15 @@  compatible :: (Expr -> Expr -> Bool) -> Expr -> Expr -> Expr -> Bool compatible (>) = \e e1 e2 -> e1 > e2 && typ e1 == typ e2-                         ==> and [ assign n e1 e > assign n e2 e-                                 | (t,n) <- vars e-                                 , t == typ e1-                                 , t == 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 [ assign n e e1 > assign n e e2-                                     | (t,n) <- vars e1 `nubMerge` vars e2-                                     , t == typ e ]+                             ==> and [ (e1 //- [(v,e)]) > (e2 //- [(v,e)])+                                     | v <- vars e1 `nubMerge` vars e2+                                     , typ v == typ e ]
tests/test-reason.hs view
@@ -4,13 +4,12 @@ import Test.Speculate.Utils  -- Functions under test-import Test.Speculate import Test.Speculate.Expr import Test.Speculate.Reason import Test.Speculate.Reason.Order import Data.Tuple (swap) import Data.Function (on)-import Data.List (sortBy,permutations)+import Data.List (permutations)  theorize' :: [(Expr,Expr)] -> Thy theorize' eqs = finalize $ foldl (flip insert) emptyThy {closureLimit = 3, keepE = keepMaxOf eqs} eqs@@ -64,8 +63,34 @@   , holds n $ \(SameTypedPairsE eqs) -> theorize eqs == theorize (map swap eqs)   , holds n $ \(SameTypedPairsE eqs) -> theorize eqs == theorize (reverse eqs) -  , holds n $ \(SameTypedPairsE eqs) -> theorize'  eqs == theorize eqs-  , holds n $ \(SameTypedPairsE eqs) -> theorize'' eqs == theorize 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@@ -116,7 +141,7 @@   , holds 4000   $ \(Thyght thy') (SameTypeE e1 e2) -> closureLimit thy' > 0 ==>        let thy = insert (e1,e2)-               $ thy' { keepE = keepUpToLength (max (lengthE e1) (lengthE e2)) }+               $ thy' { keepE = keepUpToLength (max (size e1) (size e2)) }        in  equivalent thy e1 e2    , holds n $ idempotent finalize@@ -130,22 +155,22 @@       == [ (negate' (id' xx), id' (negate' xx)) ]    , criticalPairs emptyThy { canReduceTo = dwoBy (\e1 e2 -> e1 `lexicompare` e2 == GT)-                           , rules = [ (ff (gg (ff xx)), xx)-                                     , (ff (gg xx), gg (ff xx)) ] }+                           , 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-           $ [ (gg xx,                ff (gg (gg (ff xx))))-             , (gg (ff xx),           ff (gg xx))-             , (gg (ff (ff xx)),      xx)-             , (gg (ff (ff (gg xx))), gg xx) ])+           $ [ (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 = [ (ff (gg (ff xx)), xx)-                                     , (ff (gg xx), gg (ff xx)) ] }-      == [ (gg (ff xx),           ff (gg xx))-         , (gg (ff (ff xx)),      xx)-         , (ff (gg (gg (ff xx))), gg xx)-         , (gg (ff (ff (gg xx))), gg 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 ]     |==|@@ -228,3 +253,6 @@    -- TODO: restore tests losts after removing test-kbc   ]++succ' :: Expr -> Expr+succ'  =  (value "succ" ((1+) :: Int -> Int) :$)
tests/test-sdist view
@@ -4,12 +4,17 @@ # # 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
tests/test-stats.hs view
@@ -1,12 +1,7 @@ -- Test library import Test --- Helper-import Data.Function (on)- -- Functions under test-import Test.Speculate-import Test.Speculate.Expr import Test.Speculate.Reason import Test.Speculate.Utils @@ -17,8 +12,8 @@   putStrLn "typ (e :: Expr)"   reportCountsBy typ            (take n list :: [Expr]) -  putStrLn "lengthE (e :: Expr)"-  reportCountsBy lengthInterval (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)@@ -38,8 +33,8 @@   putStrLn "length (equations thy + rules thy)"   reportCountsBy (show . length . (\thy -> rules thy ++ equations thy)) (take n list) -lengthInterval :: Expr -> (Int,Int)-lengthInterval e = (l, l+2) where l = (lengthE e `div` 3) * 3+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)
tests/test-utils.hs view
@@ -17,19 +17,14 @@ tests n =   [ True   -  -- iss is sound-  , and [ length xs == n     | m <- [0..5], n <- [0..5], xs <- iss m n ]-  , and [ head (iss 0 n) == [0..(n-1)]    | n <- [0..10] ]-  , and [ last (iss 0 n) == replicate n 0 | n <- [0..10] ]-  , and [ firsts xs `isPrefixOf` [0..]    | n <- [0..10], xs <- iss 0 n ]   , 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] ]+  , and [ nubMerge xs xs == xs | n <- [0..10], let xs = [0..n] :: [Int] ] -  , collectOn snd [(1,2),(2,2),(2,3),(3,3)] == [[(1,2),(2,2)],[(2,3),(3,3)]]-  , collectOn fst [(1,2),(2,2),(2,3),(3,3)] == [[(1,2)],[(2,2),(2,3)],[(3,3)]]-  , collectOn (uncurry (+)) [(1,2),(2,2),(2,3),(3,3)] == [[(1,2)],[(2,2)],[(2,3)],[(3,3)]]-  , collectBy (compare `on` snd) [(1,2),(2,2),(2,3),(3,3)] == [[(1,2),(2,2)],[(2,3),(3,3)]]+  , 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)]@@ -48,23 +43,6 @@   , holds n $ \xs -> not (null xs) ==>       discardOthers (>) xs == replicate (count (minimum xs) xs) (minimum xs::Int) -  , ["x","y","z","x'","y'"]    `isPrefixOf` namesFromTemplate "x"-  , ["xs","ys","zs","xs'"]     `isPrefixOf` namesFromTemplate "xs"-  , ["xss","yss","zss","xss'"] `isPrefixOf` namesFromTemplate "xss"-  , ["c","d","e","c'","d'"]    `isPrefixOf` namesFromTemplate "c"-  , ["s","t","u","s'","t'"]    `isPrefixOf` namesFromTemplate "s"-  , ["0","1","2","3","4"]      `isPrefixOf` namesFromTemplate "0"-  , ["1","2","3","4","5"]      `isPrefixOf` namesFromTemplate "1"---, ["z","a","b","z'","a'"]    `isPrefixOf` namesFromTemplate "z" -- TODO: make this pass-  , ["x1","x2","x3","x4"]      `isPrefixOf` namesFromTemplate "x1"-  , ["a0","a1","a2","a3"]      `isPrefixOf` namesFromTemplate "a0"-  , ["e1","e2","e3","e4"]      `isPrefixOf` namesFromTemplate "e1"-  , ["xs1","xs2","xs3"]        `isPrefixOf` namesFromTemplate "xs1"-  , ["xy","zw","xy'","zw'"]    `isPrefixOf` namesFromTemplate "xy"-  , ["ab","cd","ab'","cd'"]    `isPrefixOf` namesFromTemplate "ab"-  , ["xys","zws","xys'"]       `isPrefixOf` namesFromTemplate "xys"-  , ["xyz","xyz'","xyz''"]     `isPrefixOf` namesFromTemplate "xyz"-   , table "l  l  l" [ ["asdf", "qwer",     "zxvc\nzxvc"]                     , ["0",    "1",        "2"]                     , ["123",  "456\n789", "3"] ] ==@@ -103,10 +81,10 @@   , splitAtCommas "123,456,789," == ["123","456","789"]   , splitAtCommas "123 456,789"  == ["123","456","789"] -- weird behaviour, but fine for speculate -  , compareIndex [3,2,1] 3 1 == LT-  , compareIndex [3,2,1] 1 3 == GT-  , compareIndex [3,2,1] 4 1 == GT-  , compareIndex [3,2,1] 1 0 == LT+  , 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 '#' '*' "" == ("","")@@ -126,11 +104,11 @@    , holds n $ nubSort === nub . sort -:> [int] -  , halve []        == ([],[]::[Int])-  , halve [1]       == ([],[1])-  , halve [1,2]     == ([1],[2])-  , halve [1,2,3]   == ([1],[2,3])-  , halve [1,2,3,4] == ([1,2],[3,4])+  , 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])