Skip to content

Commit 15f452e

Browse files
Prove properties about nub
1 parent dac005f commit 15f452e

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

lib/Haskell/Data/List.agda

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,56 @@ sortOn f =
3737
map snd
3838
∘ sortBy (comparing fst)
3939
∘ map (λ x let y = f x in seq y (y , x))
40+
41+
{-----------------------------------------------------------------------------
42+
Properties
43+
------------------------------------------------------------------------------}
44+
45+
-- | A deleted item is no longer an element.
46+
--
47+
prop-elem-deleteAll
48+
: ∀ ⦃ _ : Eq a ⦄ ⦃ _ : IsLawfulEq a ⦄
49+
(x y : a) (zs : List a)
50+
elem x (deleteAll y zs)
51+
≡ (if x == y then False else elem x zs)
52+
--
53+
prop-elem-deleteAll x y []
54+
with x == y
55+
... | False = refl
56+
... | True = refl
57+
prop-elem-deleteAll x y (z ∷ zs)
58+
with recurse prop-elem-deleteAll x y zs
59+
with y == z in eqyz
60+
... | True
61+
with x == z in eqxz
62+
... | True
63+
rewrite equality' _ _ (trans (equality x z eqxz) (sym (equality y z eqyz)))
64+
= recurse
65+
... | False
66+
= recurse
67+
prop-elem-deleteAll x y (z ∷ zs)
68+
| False
69+
with x == z in eqxz
70+
... | True
71+
rewrite equality x z eqxz
72+
rewrite eqSymmetry y z
73+
rewrite eqyz
74+
= refl
75+
... | False
76+
= recurse
77+
78+
-- | An item is an element of the 'nub' iff it is
79+
-- an element of the original list.
80+
--
81+
prop-elem-nub
82+
: ∀ ⦃ _ : Eq a ⦄ ⦃ _ : IsLawfulEq a ⦄
83+
(x : a) (ys : List a)
84+
elem x (nub ys)
85+
≡ elem x ys
86+
--
87+
prop-elem-nub x [] = refl
88+
prop-elem-nub x (y ∷ ys)
89+
rewrite prop-elem-deleteAll x y (nub ys)
90+
with x == y
91+
... | True = refl
92+
... | False = prop-elem-nub x ys

0 commit comments

Comments
 (0)