sum :: [Int] -> Int
-- testing 3 combinations of argument values
-- pruning with 4/8 rules
-- 1 candidates of size 1
-- 0 candidates of size 2
-- 0 candidates of size 3
-- 0 candidates of size 4
-- 1 candidates of size 5
-- tested 2 candidates
sum []  =  0
sum (x:xs)  =  x + sum xs

app :: [Int] -> [Int] -> [Int]
-- testing 3 combinations of argument values
-- pruning with 0/0 rules
-- 2 candidates of size 1
-- 0 candidates of size 2
-- 0 candidates of size 3
-- 6 candidates of size 4
-- 0 candidates of size 5
-- 10 candidates of size 6
-- tested 13 candidates
app xs []  =  xs
app xs (x:ys)  =  x:app xs ys

mem :: Int -> [Int] -> Bool
-- testing 5 combinations of argument values
-- pruning with 29/42 rules
-- 1 candidates of size 1
-- 0 candidates of size 2
-- 0 candidates of size 3
-- 0 candidates of size 4
-- 0 candidates of size 5
-- 0 candidates of size 6
-- 0 candidates of size 7
-- 8 candidates of size 8
-- tested 8 candidates
mem x []  =  False
mem x (y:xs)  =  mem x xs || x == y

sub :: [Int] -> [Int] -> Bool
-- testing 9 combinations of argument values
-- pruning with 9/18 rules
-- 2 candidates of size 1
-- 0 candidates of size 2
-- 0 candidates of size 3
-- 0 candidates of size 4
-- 4 candidates of size 5
-- 0 candidates of size 6
-- 16 candidates of size 7
-- 12 candidates of size 8
-- 68 candidates of size 9
-- 214 candidates of size 10
-- 184 candidates of size 11
-- 1400 candidates of size 12
-- 987 candidates of size 13
-- 5970 candidates of size 14
-- tested 8437 candidates
sub [] xs  =  True
sub (x:xs) []  =  False
sub (x:xs) (y:ys)  =  if x == y
                      then sub xs ys
                      else sub (x:xs) ys

set :: [Int] -> Bool
-- testing 8 combinations of argument values
-- pruning with 15/19 rules
-- 0 candidates of size 1
-- 0 candidates of size 2
-- 0 candidates of size 3
-- 1 candidates of size 4
-- 0 candidates of size 5
-- 0 candidates of size 6
-- 1 candidates of size 7
-- 3 candidates of size 8
-- tested 4 candidates
set []  =  True
set (x:xs)  =  set xs && not (elem x xs)

take :: Int -> [A] -> [A]
-- testing 143 combinations of argument values
-- pruning with 4/7 rules
-- 2 candidates of size 1
-- 1 candidates of size 2
-- 0 candidates of size 3
-- 0 candidates of size 4
-- 0 candidates of size 5
-- 3 candidates of size 6
-- 2 candidates of size 7
-- 6 candidates of size 8
-- 5 candidates of size 9
-- tested 15 candidates
take 0 xs  =  []
take x []  =  []
take x (y:xs)  =  y:take (x - 1) xs

drop :: Int -> [A] -> [A]
-- testing 143 combinations of argument values
-- pruning with 4/7 rules
-- 2 candidates of size 1
-- 1 candidates of size 2
-- 0 candidates of size 3
-- 0 candidates of size 4
-- 2 candidates of size 5
-- 2 candidates of size 6
-- 3 candidates of size 7
-- tested 8 candidates
drop 0 xs  =  xs
drop x []  =  []
drop x (y:xs)  =  drop (x - 1) xs

ord :: [Int] -> Bool
-- testing 6 combinations of argument values
-- pruning with 29/39 rules
-- 1 candidates of size 1
-- 1 candidates of size 2
-- 0 candidates of size 3
-- 0 candidates of size 4
-- 0 candidates of size 5
-- 2 candidates of size 6
-- 0 candidates of size 7
-- 4 candidates of size 8
-- 0 candidates of size 9
-- 0 candidates of size 10
-- 20 candidates of size 11
-- tested 12 candidates
ord []  =  True
ord (x:xs)  =  ord xs && (null xs || x <= head xs)

merge :: [Int] -> [Int] -> [Int]
-- testing 360 combinations of argument values
-- pruning with 4/4 rules
-- 3 candidates of size 1
-- 0 candidates of size 2
-- 0 candidates of size 3
-- 10 candidates of size 4
-- 0 candidates of size 5
-- 16 candidates of size 6
-- 13 candidates of size 7
-- 22 candidates of size 8
-- 114 candidates of size 9
-- 36 candidates of size 10
-- 472 candidates of size 11
-- 604 candidates of size 12
-- 1442 candidates of size 13
-- 5188 candidates of size 14
-- 5474 candidates of size 15
-- tested 13394 candidates
cannot conjure

zip :: [A] -> [B] -> [(A,B)]
-- testing 360 combinations of argument values
-- pruning with 0/0 rules
-- 1 candidates of size 1
-- 0 candidates of size 2
-- 0 candidates of size 3
-- 0 candidates of size 4
-- 0 candidates of size 5
-- 0 candidates of size 6
-- 0 candidates of size 7
-- 0 candidates of size 8
-- 1 candidates of size 9
-- tested 2 candidates
zip [] xs  =  []
zip (x:xs) []  =  []
zip (x:xs) (y:ys)  =  (,) x y:zip xs ys

assocs :: Int -> [(Int,A)] -> [A]
-- testing 67 combinations of argument values
-- pruning with 4/5 rules
-- 1 candidates of size 1
-- 0 candidates of size 2
-- 0 candidates of size 3
-- 0 candidates of size 4
-- 0 candidates of size 5
-- 0 candidates of size 6
-- 1 candidates of size 7
-- 1 candidates of size 8
-- 0 candidates of size 9
-- 3 candidates of size 10
-- 3 candidates of size 11
-- 0 candidates of size 12
-- 9 candidates of size 13
-- 7 candidates of size 14
-- 2 candidates of size 15
-- tested 26 candidates
assocs x []  =  []
assocs x (xy:xys)  =  if x == fst xy
                      then snd xy:assocs x xys
                      else assocs x xys

