我正在尝试编写一个Haskell程序,可以返回用户定义集合的分区集。 集合S的分区被定义为S的非空、两两不相交子集的集合,它们的并集是S。 因此,
[1,2,3]
返回 [[[2],[3,1]],[[2,1],[3]],[[3,2,1]],[[1],[3,2]],[[1],[2],[3]]]
。我认为我可以利用我之前编写的从两个集合中找到笛卡尔积的不同程序。因此,[1,2,3] ['a', 'b']
返回 [(1,'a'),(1,'b'),(2,'a'),(2,'b'),(3,'a'),(3,'b')]
。然而,我不确定该如何做。如果可以适当地进行调整,我认为这需要递归。以下是子集代码:type Set a = [a]
isElement :: Eq a => a -> [a] -> Bool
isElement x [] = False
isElement x (y:ys) = if(x==y) then True else isElement x ys
subset :: Eq a => Set a -> Set a -> Bool
subset [] xs = True
subset (y:ys) xs = if(isElement y xs == True)
then do subset ys xs
else do False
X
进行分区,那么如何对X∪{a}
进行分区? - n. m.if
语句似乎是一个复杂的写法,分别是1)x == y || isElement x ys
和2)isElement y xs && subset ys xs
。这里不需要使用do
,而且== True
总是多余的。 - chi