
module TestExpl where


data Peano = Z | S Peano deriving (Show,Eq,Ord)

foo :: a -> a
foo a = a

-- BK for sort only, does not work alone
insert :: Peano -> [Peano] -> [Peano]
--insert Z [] = [Z]
--insert (S Z) [] = [S Z]
--insert (S(S Z)) = [S(S Z)]
insert x [] = [x]   
insert Z [S Z] = [Z,S Z]
insert Z [S(S Z)] = [Z,S(S Z)]
--insert Z [S Z, S(S Z)] = [Z, S(S Z)]
--insert Z (x:xs) = (Z:x:xs)
insert (S Z) [Z] = [Z,(S Z)]
insert (S Z) [S(S Z)] = [S Z, S(S Z)]
insert (S(S Z)) [Z] = [Z, S(S Z)]
insert (S(S Z)) [S Z] = [S Z, S(S Z)]   
insert Z [S Z, S(S Z)] = [Z, S Z, S(S Z)]
insert (S Z) [Z,S(S Z)] = [Z, S Z, S(S Z)]
insert (S(S Z)) [Z, S Z] = [Z, S Z, S(S Z)]

mem :: Int -> [Int] -> Bool
mem x [] = False
mem 1 [1] = True
mem 1 [2] = False
mem 2 [1] = False
mem 2 [2] = True
mem 1 [2,1] = True
mem 1 [2,2] = False
mem 2 [1,2] = True
mem 2 [1,1] = False

evens :: [Peano] -> [Peano]
evens []  = []
evens [Z] = [Z]
evens [Z,Z] = [Z,Z]
evens [Z,S Z] = [Z]
evens [Z,S (S Z)] = [Z,S (S Z)]
evens [Z,S (S (S Z))] = [Z]
evens [S Z, Z] = [Z]
evens [S Z, S Z] = []
evens [S Z, S (S Z)] = [S (S Z)]
evens [S Z, S( S (S Z))] = []
evens [S (S Z), Z] = [S (S Z),Z]
evens [S (S Z), S Z] = [S (S Z)]
evens [S (S Z), S (S Z)] = [S (S Z),S (S Z)]
evens [S (S Z), S( S (S Z))] = [S (S Z)]
evens [S( S (S Z)), Z] = [Z]
evens [S( S (S Z)), S Z] = []
evens [S( S (S Z)), S (S Z)] = [S (S Z)]
evens [S( S (S Z)), S( S (S Z))] = []

zeros :: [Peano] -> [Peano]
zeros [] = []
zeros [Z] = [Z]
zeros [S x] = []
zeros [Z,S x] = [Z]
zeros [S x,Z] = [Z]
zeros [S x,S y] = []
zeros [Z,Z] = [Z,Z]
zeros [Z,S x,S y] = [Z]
zeros [S x,Z,S y] = [Z]
zeros [S y,S x,Z] = [Z]
zeros [Z,Z,S x] = [Z,Z]
zeros [Z,S x,Z] = [Z,Z]
zeros [S x,Z,Z] = [Z,Z]
zeros [Z,Z,Z] = [Z,Z,Z]

