Redundant candidates for: foo :: Int -> Int pruning with 15/35 rules [3,3,8,13,29] candidates 46/56 unique candidates 10/56 redundant candidates rules: x * y == x + y x * y == y + x x - x == 0 x + 0 == x 0 + x == x x - 0 == x (x + y) + z == x + (y + z) (x + y) + z == y + (x + z) x - (y - z) == z + (x - y) (x - y) - z == x - (y + z) (x - y) - z == x - (z + y) (x + y) - z == x + (y - z) (x + y) - z == y + (x - z) x + (y - x) == y (x - y) + y == x equations: y + x == x + y y + (x + z) == x + (y + z) z + (x + y) == x + (y + z) z + (y + x) == x + (y + z) y + (x - z) == x + (y - z) (x - z) + y == x + (y - z) (z - y) + x == (x - y) + z y - (x + y) == 0 - x y - (y + x) == 0 - x z - (y + z) == x - (x + y) z - (y + z) == x - (y + x) z - (z + y) == x - (x + y) z - (z + y) == x - (y + x) x + (0 - y) == x - y (0 - y) + x == x - y x - (x + 1) == 0 - 1 x - (1 + x) == 0 - 1 y - (y + 1) == x - (x + 1) y - (y + 1) == x - (1 + x) y - (1 + y) == x - (1 + x) class of 2 equivalent candidates: foo x = x + x foo 0 = 0 foo x = x + x class of 2 equivalent candidates: foo x = x + 1 foo 0 = 1 foo x = x + 1 class of 2 equivalent candidates: foo x = x - 1 foo 1 = 0 foo x = x - 1 class of 4 equivalent candidates: foo x = 0 - x foo 0 = 0 foo x = 0 - x foo x = x - (x + x) foo x = 1 - (x + 1) class of 4 equivalent candidates: foo x = 1 - x foo 0 = 1 foo x = 1 - x foo x = 1 + (0 - x) foo 1 = 0 foo x = 1 - x class of 2 equivalent candidates: foo x = x + (x + 1) foo x = 1 + (x + x) Redundant candidates for: ? :: Int -> Int -> Int pruning with 10/23 rules [3,7,22,53,129] candidates 192/214 unique candidates 22/214 redundant candidates rules: x * y == x + y x * y == y + x x + 0 == x 0 + x == x dec (x + y) == x + dec y dec (x + y) == y + dec x dec (x + y) == dec x + y dec (x + y) == dec y + x (x + y) + z == x + (y + z) (x + y) + z == y + (x + z) equations: y + x == x + y y + dec x == x + dec y dec x + y == x + dec y dec y + x == dec x + y x + dec 0 == dec x dec 0 + x == dec x y + (x + z) == x + (y + z) z + (x + y) == x + (y + z) z + (y + x) == x + (y + z) y + dec (dec x) == x + dec (dec y) dec (dec x) + y == x + dec (dec y) x + dec (dec 0) == dec (dec x) dec (dec 0) + x == dec (dec x) class of 2 equivalent candidates: x ? y = x + x 0 ? x = 0 x ? y = x + x class of 4 equivalent candidates: x ? y = x + y x ? 0 = x x ? y = x + y 0 ? x = x x ? y = x + y 0 ? x = x x ? 0 = x x ? y = x + y class of 2 equivalent candidates: x ? y = y + y x ? 0 = 0 x ? y = y + y class of 2 equivalent candidates: x ? y = x + dec y x ? y = y + dec x class of 2 equivalent candidates: x ? 0 = x x ? y = x + x 0 ? x = 0 x ? 0 = x x ? y = x + x class of 2 equivalent candidates: x ? 0 = 0 x ? y = x + x 0 ? x = 0 x ? 0 = 0 x ? y = x + x class of 2 equivalent candidates: x ? 0 = 0 x ? y = x + y 0 ? x = x x ? 0 = 0 x ? y = x + y class of 2 equivalent candidates: 0 ? x = x x ? y = y + y 0 ? x = x x ? 0 = 0 x ? y = y + y class of 2 equivalent candidates: 0 ? x = 0 x ? y = x + y 0 ? x = 0 x ? 0 = x x ? y = x + y class of 2 equivalent candidates: 0 ? x = 0 x ? y = y + y 0 ? x = 0 x ? 0 = 0 x ? y = y + y class of 2 equivalent candidates: x ? y = x + (x + y) x ? y = y + (x + x) class of 2 equivalent candidates: x ? y = x + (y + y) x ? y = y + (x + y) class of 2 equivalent candidates: x ? y = x + dec (dec x) x ? y = dec x + dec x class of 3 equivalent candidates: x ? y = x + dec (dec y) x ? y = y + dec (dec x) x ? y = dec x + dec y class of 2 equivalent candidates: x ? y = y + dec (dec y) x ? y = dec y + dec y class of 2 equivalent candidates: x ? 0 = x x ? y = x + dec y x ? 0 = x x ? y = y + dec x class of 2 equivalent candidates: x ? 0 = 0 x ? y = x + dec y x ? 0 = 0 x ? y = y + dec x class of 2 equivalent candidates: 0 ? x = x x ? y = x + dec y 0 ? x = x x ? y = y + dec x class of 2 equivalent candidates: 0 ? x = 0 x ? y = x + dec y 0 ? x = 0 x ? y = y + dec x Redundant candidates for: goo :: [Int] -> [Int] pruning with 4/4 rules [2,1,2,2,4] candidates 9/11 unique candidates 2/11 redundant candidates rules: xs ++ [] == xs [] ++ xs == xs (xs ++ ys) ++ zs == xs ++ (ys ++ zs) (x:xs) ++ ys == x:(xs ++ ys) class of 2 equivalent candidates: goo xs = xs goo [] = [] goo (x:xs) = x:goo xs class of 2 equivalent candidates: goo xs = [] goo [] = [] goo (x:xs) = goo xs Redundant candidates for: ?? :: [Int] -> [Int] -> [Int] pruning with 4/4 rules [3,7,15,57,134] candidates 160/216 unique candidates 56/216 redundant candidates rules: xs ++ [] == xs [] ++ xs == xs (xs ++ ys) ++ zs == xs ++ (ys ++ zs) (x:xs) ++ ys == x:(xs ++ ys) class of 2 equivalent candidates: xs ?? ys = xs xs ?? [] = xs xs ?? (x:ys) = xs ?? ys class of 2 equivalent candidates: xs ?? ys = ys [] ?? xs = xs (x:xs) ?? ys = xs ?? ys class of 22 equivalent candidates: xs ?? ys = [] xs ?? [] = [] xs ?? (x:ys) = xs ?? ys xs ?? [] = [] xs ?? (x:ys) = ys ?? xs xs ?? [] = [] xs ?? (x:ys) = ys ?? ys xs ?? [] = [] xs ?? (x:ys) = [] ?? xs xs ?? [] = [] xs ?? (x:ys) = [] ?? ys [] ?? xs = [] (x:xs) ?? ys = xs ?? xs [] ?? xs = [] (x:xs) ?? ys = xs ?? ys [] ?? xs = [] (x:xs) ?? ys = xs ?? [] [] ?? xs = [] (x:xs) ?? ys = ys ?? xs [] ?? xs = [] (x:xs) ?? ys = ys ?? [] [] ?? xs = [] (x:xs) ?? [] = xs ?? xs (x:xs) ?? (y:ys) = [] [] ?? xs = [] (x:xs) ?? [] = xs ?? [] (x:xs) ?? (y:ys) = [] [] ?? xs = [] (x:xs) ?? [] = [] (x:xs) ?? (y:ys) = xs ?? xs [] ?? xs = [] (x:xs) ?? [] = [] (x:xs) ?? (y:ys) = xs ?? ys [] ?? xs = [] (x:xs) ?? [] = [] (x:xs) ?? (y:ys) = xs ?? [] [] ?? xs = [] (x:xs) ?? [] = [] (x:xs) ?? (y:ys) = ys ?? xs [] ?? xs = [] (x:xs) ?? [] = [] (x:xs) ?? (y:ys) = ys ?? ys [] ?? xs = [] (x:xs) ?? [] = [] (x:xs) ?? (y:ys) = ys ?? [] [] ?? [] = [] [] ?? (x:xs) = xs ?? xs (x:xs) ?? ys = [] [] ?? [] = [] [] ?? (x:xs) = xs ?? [] (x:xs) ?? ys = [] [] ?? [] = [] [] ?? (x:xs) = [] ?? xs (x:xs) ?? ys = [] class of 5 equivalent candidates: xs ?? [] = xs xs ?? (x:ys) = [] xs ?? [] = xs xs ?? (x:ys) = ys ?? ys xs ?? [] = xs xs ?? (x:ys) = [] ?? xs xs ?? [] = xs xs ?? (x:ys) = [] ?? ys [] ?? xs = [] (x:xs) ?? [] = x:xs (x:xs) ?? (y:ys) = [] class of 2 equivalent candidates: xs ?? [] = [] xs ?? (x:ys) = xs [] ?? xs = [] (x:xs) ?? [] = [] (x:xs) ?? (y:ys) = x:xs class of 3 equivalent candidates: xs ?? [] = [] xs ?? (x:ys) = ys [] ?? [] = [] [] ?? (x:xs) = xs (x:xs) ?? ys = xs ?? ys [] ?? [] = [] [] ?? (x:xs) = xs (x:xs) ?? ys = [] ?? ys class of 10 equivalent candidates: [] ?? xs = xs (x:xs) ?? ys = [] [] ?? xs = xs (x:xs) ?? ys = xs ?? xs [] ?? xs = xs (x:xs) ?? ys = xs ?? [] [] ?? xs = xs (x:xs) ?? ys = ys ?? [] [] ?? xs = xs (x:xs) ?? [] = xs ?? xs (x:xs) ?? (y:ys) = [] [] ?? xs = xs (x:xs) ?? [] = xs ?? [] (x:xs) ?? (y:ys) = [] [] ?? xs = xs (x:xs) ?? [] = [] (x:xs) ?? (y:ys) = xs ?? xs [] ?? xs = xs (x:xs) ?? [] = [] (x:xs) ?? (y:ys) = xs ?? [] [] ?? xs = xs (x:xs) ?? [] = [] (x:xs) ?? (y:ys) = ys ?? ys [] ?? xs = xs (x:xs) ?? [] = [] (x:xs) ?? (y:ys) = ys ?? [] class of 2 equivalent candidates: [] ?? xs = [] (x:xs) ?? ys = xs [] ?? [] = [] [] ?? (x:xs) = [] ?? xs (x:xs) ?? ys = xs class of 3 equivalent candidates: [] ?? xs = [] (x:xs) ?? ys = ys [] ?? [] = [] [] ?? (x:xs) = xs ?? [] (x:xs) ?? ys = ys [] ?? [] = [] [] ?? (x:xs) = [] ?? xs (x:xs) ?? ys = ys class of 3 equivalent candidates: [] ?? xs = xs (x:xs) ?? [] = xs (x:xs) ?? (y:ys) = [] [] ?? xs = xs (x:xs) ?? [] = xs (x:xs) ?? (y:ys) = xs ?? xs [] ?? xs = xs (x:xs) ?? [] = xs (x:xs) ?? (y:ys) = ys ?? ys class of 2 equivalent candidates: [] ?? xs = xs (x:xs) ?? [] = [] (x:xs) ?? (y:ys) = xs [] ?? xs = xs (x:xs) ?? [] = xs ?? [] (x:xs) ?? (y:ys) = xs class of 2 equivalent candidates: [] ?? xs = xs (x:xs) ?? [] = [] (x:xs) ?? (y:ys) = ys [] ?? xs = xs (x:xs) ?? [] = xs ?? [] (x:xs) ?? (y:ys) = ys class of 3 equivalent candidates: [] ?? xs = [] (x:xs) ?? [] = xs (x:xs) ?? (y:ys) = [] [] ?? xs = [] (x:xs) ?? [] = xs (x:xs) ?? (y:ys) = xs ?? xs [] ?? xs = [] (x:xs) ?? [] = xs (x:xs) ?? (y:ys) = ys ?? ys class of 2 equivalent candidates: [] ?? xs = [] (x:xs) ?? [] = [] (x:xs) ?? (y:ys) = xs [] ?? xs = [] (x:xs) ?? [] = xs ?? [] (x:xs) ?? (y:ys) = xs class of 2 equivalent candidates: [] ?? xs = [] (x:xs) ?? [] = [] (x:xs) ?? (y:ys) = ys [] ?? xs = [] (x:xs) ?? [] = xs ?? [] (x:xs) ?? (y:ys) = ys class of 2 equivalent candidates: [] ?? [] = [] [] ?? (x:xs) = xs (x:xs) ?? ys = ys [] ?? [] = [] [] ?? (x:xs) = xs ?? xs (x:xs) ?? ys = ys class of 4 equivalent candidates: [] ?? [] = [] [] ?? (x:xs) = xs (x:xs) ?? ys = [] [] ?? [] = [] [] ?? (x:xs) = xs (x:xs) ?? ys = xs ?? xs [] ?? [] = [] [] ?? (x:xs) = xs (x:xs) ?? ys = xs ?? [] [] ?? [] = [] [] ?? (x:xs) = xs (x:xs) ?? ys = ys ?? [] class of 2 equivalent candidates: [] ?? xs = xs (x:xs) ?? ys = ys ?? xs [] ?? xs = xs (x:xs) ?? [] = xs (x:xs) ?? (y:ys) = xs ?? ys class of 2 equivalent candidates: [] ?? [] = [] [] ?? (x:xs) = xs ?? xs (x:xs) ?? ys = xs [] ?? [] = [] [] ?? (x:xs) = xs ?? [] (x:xs) ?? ys = xs Redundant candidates for: ton :: Bool -> Bool pruning with 39/49 rules [3,2,0,0,0] candidates 4/5 unique candidates 1/5 redundant candidates rules: not False == True not True == False p && p == p p || p == p not (not p) == p p && False == False p && True == p False && p == False True && p == p p || False == p p || True == True False || p == p True || p == True not (p && q) == not p || not q not (p && q) == not q || not p not (p || q) == not p && not q not (p || q) == not q && not p p && not p == False not p && p == False p || not p == True not p || p == True (p && q) && r == p && (q && r) (p && q) && r == q && (p && r) (p || q) || r == p || (q || r) (p || q) || r == q || (p || r) p && (p && q) == p && q p && (q && p) == p && q p && (q && p) == q && p p || (p || q) == p || q p || (q || p) == p || q p || (q || p) == q || p p && (p || q) == p p && (q || p) == p (p || q) && p == p (p || q) && q == q p || p && q == p p || q && p == p p && q || p == p p && q || q == q equations: q && p == p && q q || p == p || q q && (p && r) == p && (q && r) r && (p && q) == p && (q && r) r && (q && p) == p && (q && r) q || (p || r) == p || (q || r) r || (p || q) == p || (q || r) r || (q || p) == p || (q || r) (r || q) && p == p && (q || r) r && q || p == p || q && r class of 2 equivalent candidates: ton p = not p ton False = True ton True = False Redundant candidates for: &| :: Bool -> Bool -> Bool pruning with 39/49 rules [4,12,20,6,2] candidates 16/44 unique candidates 28/44 redundant candidates rules: not False == True not True == False p && p == p p || p == p not (not p) == p p && False == False p && True == p False && p == False True && p == p p || False == p p || True == True False || p == p True || p == True not (p && q) == not p || not q not (p && q) == not q || not p not (p || q) == not p && not q not (p || q) == not q && not p p && not p == False not p && p == False p || not p == True not p || p == True (p && q) && r == p && (q && r) (p && q) && r == q && (p && r) (p || q) || r == p || (q || r) (p || q) || r == q || (p || r) p && (p && q) == p && q p && (q && p) == p && q p && (q && p) == q && p p || (p || q) == p || q p || (q || p) == p || q p || (q || p) == q || p p && (p || q) == p p && (q || p) == p (p || q) && p == p (p || q) && q == q p || p && q == p p || q && p == p p && q || p == p p && q || q == q equations: q && p == p && q q || p == p || q q && (p && r) == p && (q && r) r && (p && q) == p && (q && r) r && (q && p) == p && (q && r) q || (p || r) == p || (q || r) r || (p || q) == p || (q || r) r || (q || p) == p || (q || r) (r || q) && p == p && (q || r) r && q || p == p || q && r class of 2 equivalent candidates: p &| q = not p False &| p = True True &| p = False class of 4 equivalent candidates: p &| q = not q p &| False = True p &| True = False False &| p = not p True &| False = True True &| True = False False &| False = True False &| True = False True &| p = not p class of 4 equivalent candidates: p &| False = p p &| True = False False &| p = False True &| p = not p False &| p = False True &| False = True True &| True = False p &| q = p && not q class of 3 equivalent candidates: p &| False = p p &| True = True False &| p = p True &| p = True p &| q = p || q class of 3 equivalent candidates: p &| False = False p &| True = p False &| p = False True &| p = p p &| q = p && q class of 4 equivalent candidates: p &| False = True p &| True = p False &| p = not p True &| p = True False &| False = True False &| True = False True &| p = True p &| q = p || not q class of 3 equivalent candidates: False &| p = p True &| p = False p &| False = False p &| True = not p p &| q = q && not p class of 3 equivalent candidates: False &| p = True True &| p = p p &| False = not p p &| True = True p &| q = q || not p class of 3 equivalent candidates: p &| False = p p &| True = not p False &| p = p True &| p = not p False &| p = p True &| False = True True &| True = False class of 4 equivalent candidates: p &| False = True p &| True = not p False &| p = True True &| p = not p False &| p = True True &| False = True True &| True = False p &| q = not p || not q class of 3 equivalent candidates: p &| False = not p p &| True = p False &| p = not p True &| p = p False &| False = True False &| True = False True &| p = p class of 4 equivalent candidates: p &| False = not p p &| True = False False &| p = not p True &| p = False False &| False = True False &| True = False True &| p = False p &| q = not p && not q