import Data.List poset = foldr (\x p -> p ++ map (x:) p) [[]] ncsubs [] = [[]] ncsubs (x:xs) = tail $ nc [x] xs where nc [_] [] = [[]] nc (_:x:xs) [] = nc [x] xs nc xs (y:ys) = (nc (xs++[y]) ys) ++ map (xs++) (tail $ poset ys)