14
data List (a : Set) : Set where
16
_::_ : a -> List a -> List a
18
map : {a b : Set} -> (a -> b) -> List a -> List b
20
map f (x :: xs) = f x :: map f xs
22
member : (a : Datoid) -> El a -> List (El a) -> Set
23
member _ x nil = Absurd
24
member a x (y :: ys) = Either (rel' (datoidEq a) x y) (member a x ys)
33
memberPreservesEq xy nil abs = abs
34
memberPreservesEq {a} xy (z :: zs) (left xz) =
35
left (dTrans a (dSym a xy) xz)
36
memberPreservesEq {a} xy (z :: zs) (right xzs) =
37
right (memberPreservesEq {a} xy zs xzs)
40
noCopies' : (a : Datoid) -> (x y : El a) -> Dec (datoidRel a x y)
42
noCopies' _ _ _ (left _) n = suc n
43
noCopies' _ _ _ (right _) n = n
45
noCopies : (a : Datoid) -> El a -> List (El a) -> Nat
46
noCopies a x nil = zero
47
noCopies a x (y :: ys) =
48
noCopies' a x y (datoidDecRel a x y) (noCopies a x ys)
50
NoDuplicates : (a : Datoid) -> List (El a) -> Set
51
NoDuplicates _ nil = Unit
52
NoDuplicates a (x :: b) = Pair (Not (member a x b)) (NoDuplicates a b)
58
-> Dec (datoidRel a x y)
59
-> (ys delXYs : List (El a))
61
delete' _ _ _ (left _) ys _ = ys
62
delete' _ _ _ (right _) _ delXYs = delXYs
64
-- Removes first occurrence if any.
65
delete : (a : Datoid) -> El a -> List (El a) -> List (El a)
67
delete a x (y :: ys) = delete' a x y (datoidDecRel a x y) ys (delete a x ys)
70
Perm : (a : Datoid) -> (xs ys : List (El a)) -> Set
71
Perm a xs ys = forall z -> datoidRel natDatoid (noCopies a z xs)
74
refl' : {a : Datoid} -> (xs : List (El a)) -> Perm a xs xs
75
refl' {a} xs = \z -> dRefl natDatoid {noCopies a z xs}
77
sym' : {a : Datoid} -> (xs ys : List (El a))
78
-> Perm a xs ys -> Perm a ys xs
80
\z -> dSym natDatoid {noCopies a z xs} {noCopies a z ys} (xy z)
82
trans' : {a : Datoid} -> (xs ys zs : List (El a))
83
-> Perm a xs ys -> Perm a ys zs -> Perm a xs zs
84
trans' {a} xs ys zs xy yz =
85
\z -> dTrans natDatoid
86
{noCopies a z xs} {noCopies a z ys} {noCopies a z zs}
90
dec' : {a : Datoid} -> (xs ys : List (El a))
91
-> Either (Perm a xs ys) (Not (Perm a xs ys))
93
Permutation : (a : Datoid) -> DecidableEquiv (List (El a))
94
Permutation a = decEquiv (equiv (Perm a) (refl' {a}) (sym' {a}) (trans' {a})) (dec (dec' {a}))