@@ -0,0 +1,66 @@
1+> module Set
2+
3+> %default total
4+
5+> postulate soAndIntro : (p : alpha -> Bool) ->
6+> (q : beta -> Bool) ->
7+> (a : alpha) ->
8+> (b : beta) ->
9+> so (p a) ->
10+> so (q b) ->
11+> so (p a && q b)
12+
13+> hasNoDuplicates : (Eq alpha) => List alpha -> Bool
14+> hasNoDuplicates as = as == nub as
15+
16+> %assert_total
17+> setEq : (Eq alpha) => List alpha -> List alpha -> Bool
18+> setEq Nil Nil = True
19+> setEq Nil (y :: ys) = False
20+> setEq (x :: xs) Nil = False
21+> setEq {alpha} (x :: xs) (y :: ys) =
22+> (x == y && setEq xs ys)
23+> ||
24+> (elem x ys && elem y xs &&
25+> setEq (filter (/= y) xs) (filter (/= x) ys)
26+> )
27+
28+> data Set : Type -> Type where
29+> setify : (as : List a) -> Set a
30+
31+> instance (Eq a) => Eq (Set a) where
32+> (==) (setify as) (setify bs) = setEq as bs
33+
34+> postulate reflexive_Set_eqeq : (Eq a) =>
35+> (as : Set a) ->
36+> so (as == as)
37+
38+> unwrap : Set a -> List a
39+> unwrap (setify as) = as
40+
41+> union : Set (Set a) -> Set a
42+> union (setify ss) = setify (concat (map unwrap ss))
43+
44+> listify : (Eq a) => Set a -> List a
45+> listify = nub . unwrap
46+
47+> arePairwiseDisjoint : (Eq a) => Set (Set a) -> Bool
48+> arePairwiseDisjoint (setify ss) =
49+> hasNoDuplicates (concat (map listify ss))
50+
51+> isPartition : (Eq a) => Set (Set a) -> Set a -> Bool
52+> isPartition ass as = arePairwiseDisjoint ass && union ass == as
53+
54+> partitionLemma0 : (Eq alpha) =>
55+> (ass : Set (Set alpha)) ->
56+> so (arePairwiseDisjoint ass) ->
57+> so (ass `isPartition` union ass)
58+> partitionLemma0 ass asspd = (soAndIntro (\ xss => arePairwiseDisjoint xss)
59+> (\ xs => union ass == xs)
60+> ass
61+> (union ass)
62+> asspd
63+> uasseqas) where
64+> uasseqas : so (union ass == union ass)
65+> uasseqas = reflexive_Set_eqeq (union ass)
66+