length :: [Int] -> Int
-- testing 360 combinations of argument values
-- pruning with 4/8 rules
-- 2 candidates of size 1
-- 2 candidates of size 2
-- 0 candidates of size 3
-- 2 candidates of size 4
-- 2 candidates of size 5
-- tested 8 candidates
length [] = 0
length (x:xs) = length xs + 1
reverse :: [Int] -> [Int]
-- testing 360 combinations of argument values
-- pruning with 4/4 rules
-- 2 candidates of size 1
-- 1 candidates of size 2
-- 1 candidates of size 3
-- 3 candidates of size 4
-- 4 candidates of size 5
-- 7 candidates of size 6
-- 10 candidates of size 7
-- tested 26 candidates
reverse [] = []
reverse (x:xs) = reverse xs ++ [x]
(++) :: [Int] -> [Int] -> [Int]
-- testing 360 combinations of argument values
-- pruning with 0/0 rules
-- 3 candidates of size 1
-- 8 candidates of size 2
-- 11 candidates of size 3
-- 23 candidates of size 4
-- 86 candidates of size 5
-- 72 candidates of size 6
-- tested 149 candidates
[] ++ xs = xs
(x:xs) ++ ys = x:(xs ++ ys)
(++) :: [Int] -> [Int] -> [Int]
-- testing 360 combinations of argument values
-- pruning with 2/2 rules
-- 3 candidates of size 1
-- 8 candidates of size 2
-- 11 candidates of size 3
-- 27 candidates of size 4
-- tested 35 candidates
xs ++ ys = foldr (:) ys xs
last :: [Int] -> Int
-- testing 360 combinations of argument values
-- pruning with 5/5 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
-- 4 candidates of size 7
-- tested 5 candidates
last [] = undefined
last (x:xs) = if null xs
then x
else last xs
zip :: [Int] -> [Int] -> [(Int,Int)]
-- 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
-- 2 candidates of size 6
-- 6 candidates of size 7
-- 6 candidates of size 8
-- 30 candidates of size 9
-- tested 25 candidates
zip [] xs = []
zip (x:xs) [] = []
zip (x:xs) (y:ys) = (x,y):zip xs ys
(\/) :: [Int] -> [Int] -> [Int]
-- testing 360 combinations of argument values
-- pruning with 0/0 rules
-- 3 candidates of size 1
-- 8 candidates of size 2
-- 11 candidates of size 3
-- 23 candidates of size 4
-- 86 candidates of size 5
-- 72 candidates of size 6
-- tested 151 candidates
[] \/ xs = xs
(x:xs) \/ ys = x:ys \/ xs
ordered :: [Int] -> Bool
-- testing 360 combinations of argument values
-- pruning with 29/39 rules
-- 2 candidates of size 1
-- 2 candidates of size 2
-- 2 candidates of size 3
-- 2 candidates of size 4
-- 4 candidates of size 5
-- 12 candidates of size 6
-- 20 candidates of size 7
-- 30 candidates of size 8
-- 56 candidates of size 9
-- 112 candidates of size 10
-- 200 candidates of size 11
-- tested 319 candidates
ordered [] = True
ordered (x:xs) = ordered xs && (null xs || x <= head xs)