-- count.hs: elem and set functions
import Conjure

count :: Eq a => a -> [a] -> Int
count x  =  c
  where
  c []  =  0
  c (y:ys)  =  (if x == y then 1 else 0) + c ys

-- this is the expected function
countIf :: A -> [A] -> Int
  3
  4
  16
     5   6 7    8    9       10      11 12    13    14    15   16

count' :: A -> [A] -> Int
count' 0 [0]  =  1
count' 0 [1]  =  0
count' 1 [0]  =  0
count' 1 [1]  =  1
count' 0 [0,0]  =  2
count' 0 [0,1]  =  1
count' 0 [1,2]  =  0
count' 1 [0,0]  =  0
count' 1 [0,1]  =  1
count' 1 [1,2]  =  1
count' 0 [0,0,0]  =  3
count' 0 [0,0,1]  =  2
count' 0 [1,0,0]  =  2

main :: IO ()
main = do
  -- count x xs  =  length (filter (== x) xs)
                 1        2        3   4   5
  conjure "count" count'
    [ prim "length" (length :: [A] -> Int)
    , prim "filter" (filter :: (A -> Bool) -> [A] -> [A])
    , prim "==" ((==) :: A -> A -> Bool)
    ]

  conjureWithMaxSize 16 "count" count'
    [ pr (0 :: Int)
    , pr (1 :: Int)
    , prim "+" ((+) :: Int -> Int -> Int)
    , prim "head" (head :: [A] -> A)
    , prim "tail" (tail :: [A] -> [A])
    , prim "null" (null :: [A] -> Bool)
    , prim "==" ((==) :: A -> A -> Bool)
    , prif (undefined :: Int)
    ]

 count.hs: elem and set functions
 this is the expected function
 count x xs  =  length (filter (== x) xs)
import Conjure

count :: Eq a => a -> [a] -> Int
count x  =  c
  where
  c []  =  0
  c (y:ys)  =  (if x == y then 1 else 0) + c ys

countIf :: A -> [A] -> Int
  3
  4
  16
     5   6 7    8    9       10      11 12    13    14    15   16

count' :: A -> [A] -> Int
count' 0 [0]  =  1
count' 0 [1]  =  0
count' 1 [0]  =  0
count' 1 [1]  =  1
count' 0 [0,0]  =  2
count' 0 [0,1]  =  1
count' 0 [1,2]  =  0
count' 1 [0,0]  =  0
count' 1 [0,1]  =  1
count' 1 [1,2]  =  1
count' 0 [0,0,0]  =  3
count' 0 [0,0,1]  =  2
count' 0 [1,0,0]  =  2

main :: IO ()
main = do
                 1        2        3   4   5
  conjure "count" count'
    [ prim "length" (length :: [A] -> Int)
    , prim "filter" (filter :: (A -> Bool) -> [A] -> [A])
    , prim "==" ((==) :: A -> A -> Bool)
    ]

  conjureWithMaxSize 16 "count" count'
    [ pr (0 :: Int)
    , pr (1 :: Int)
    , prim "+" ((+) :: Int -> Int -> Int)
    , prim "head" (head :: [A] -> A)
    , prim "tail" (tail :: [A] -> [A])
    , prim "null" (null :: [A] -> Bool)
    , prim "==" ((==) :: A -> A -> Bool)
    , prif (undefined :: Int)
    ]
