사용자 정의 집합의 파티션 집합을 반환 할 수있는 하스켈 프로그램을 작성하려고합니다. 집합 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}'를 어떻게 분할 할 수 있습니까? –
사소한 스타일의 주석 : 당신이 게시 한'if'는 각각 회상적인 방법으로 쓰이는 것처럼 보입니다. 1)'x == y || isElement x ys'와 2)'isElement y xs && subset ys xs'입니다. 여기서'do'는 필요 없으며'== True'는 항상 중복됩니다. – chi