Skip to content

Commit 3365fa5

Browse files
Prove properties about nub
1 parent dac005f commit 3365fa5

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

lib/Haskell/Data/List.agda

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,66 @@ 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+
lemma-neq-trans
46+
: ∀ ⦃ _ : Eq a ⦄ ⦃ _ : IsLawfulEq a ⦄
47+
(x y z : a)
48+
(x == z) ≡ True
49+
(y == z) ≡ False
50+
(x == y) ≡ False
51+
--
52+
lemma-neq-trans x y z eqxz
53+
rewrite equality x z eqxz
54+
rewrite eqSymmetry y z
55+
= λ x x
56+
57+
-- | A deleted item is no longer an element.
58+
--
59+
prop-elem-deleteAll
60+
: ∀ ⦃ _ : Eq a ⦄ ⦃ _ : IsLawfulEq a ⦄
61+
(x y : a) (zs : List a)
62+
elem x (deleteAll y zs)
63+
≡ (if x == y then False else elem x zs)
64+
--
65+
prop-elem-deleteAll x y []
66+
with x == y
67+
... | False = refl
68+
... | True = refl
69+
prop-elem-deleteAll x y (z ∷ zs)
70+
with recurse prop-elem-deleteAll x y zs
71+
with y == z in eqyz
72+
... | True
73+
with x == z in eqxz
74+
... | True
75+
rewrite equality' _ _ (trans (equality x z eqxz) (sym (equality y z eqyz)))
76+
= recurse
77+
... | False
78+
= recurse
79+
prop-elem-deleteAll x y (z ∷ zs)
80+
| False
81+
with x == z in eqxz
82+
... | True
83+
rewrite (lemma-neq-trans x y z eqxz eqyz)
84+
= refl
85+
... | False
86+
= recurse
87+
88+
-- | An item is an element of the 'nub' iff it is
89+
-- an element of the original list.
90+
--
91+
prop-elem-nub
92+
: ∀ ⦃ _ : Eq a ⦄ ⦃ _ : IsLawfulEq a ⦄
93+
(x : a) (ys : List a)
94+
elem x (nub ys)
95+
≡ elem x ys
96+
--
97+
prop-elem-nub x [] = refl
98+
prop-elem-nub x (y ∷ ys)
99+
rewrite prop-elem-deleteAll x y (nub ys)
100+
with x == y
101+
... | True = refl
102+
... | False = prop-elem-nub x ys

0 commit comments

Comments
 (0)