module Math.Combinat.Sets
(
choose
, combine
, tuplesFromList
, listTensor
, kSublists
, sublists
, countKSublists
, countSublists
)
where
import Math.Combinat.Numbers (binomial)
choose :: Int -> [a] -> [[a]]
choose 0 _ = [[]]
choose k [] = []
choose k (x:xs) = map (x:) (choose (k1) xs) ++ choose k xs
combine :: Int -> [a] -> [[a]]
combine 0 _ = [[]]
combine k [] = []
combine k xxs@(x:xs) = map (x:) (combine (k1) xxs) ++ combine k xs
tuplesFromList :: Int -> [a] -> [[a]]
tuplesFromList 0 _ = [[]]
tuplesFromList k xs = [ (y:ys) | y <- xs, ys <- tuplesFromList (k1) xs ]
listTensor :: [[a]] -> [[a]]
listTensor [] = [[]]
listTensor (xs:xss) = [ y:ys | y <- xs, ys <- listTensor xss ]
kSublists :: Int -> [a] -> [[a]]
kSublists = choose
countKSublists :: Int -> Int -> Integer
countKSublists k n = binomial n k
sublists :: [a] -> [[a]]
sublists [] = [[]]
sublists (x:xs) = map (x:) (sublists xs) ++ sublists xs
countSublists :: Int -> Integer
countSublists n = 2 ^ n