Skip to content

Commit bbe636e

Browse files
Prove properties about delete and nub
1 parent d48a285 commit bbe636e

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

lib/Haskell/Data/List.agda

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
module Haskell.Data.List where
22

33
open import Haskell.Prelude
4+
45
open import Haskell.Data.Ord using (comparing)
56

7+
open import Haskell.Law.Eq
8+
open import Haskell.Law.Equality
9+
610
{-----------------------------------------------------------------------------
711
Operations
812
------------------------------------------------------------------------------}
@@ -40,3 +44,67 @@ sortOn f =
4044
map snd
4145
∘ sortBy (comparing fst)
4246
∘ map (λ x let y = f x in seq y (y , x))
47+
48+
{-----------------------------------------------------------------------------
49+
Properties
50+
------------------------------------------------------------------------------}
51+
--
52+
lemma-neq-trans
53+
: ∀ ⦃ _ : Eq a ⦄ ⦃ _ : IsLawfulEq a ⦄
54+
(x y z : a)
55+
(x == z) ≡ True
56+
(y == z) ≡ False
57+
(x == y) ≡ False
58+
--
59+
lemma-neq-trans x y z eqxz
60+
rewrite equality x z eqxz
61+
rewrite eqSymmetry y z
62+
= λ x x
63+
64+
-- | A deleted item is no longer an element.
65+
--
66+
prop-elem-delete
67+
: ∀ ⦃ _ : Eq a ⦄ ⦃ _ : IsLawfulEq a ⦄
68+
(x y : a) (zs : List a)
69+
elem x (delete y zs)
70+
≡ (if x == y then False else elem x zs)
71+
--
72+
prop-elem-delete x y []
73+
with x == y
74+
... | False = refl
75+
... | True = refl
76+
prop-elem-delete x y (z ∷ zs)
77+
with y == z in eqyz
78+
... | True
79+
with x == z in eqxz
80+
with prop-elem-delete x y zs
81+
... | True | recurse
82+
rewrite equality' _ _ (trans (equality x z eqxz) (sym (equality y z eqyz)))
83+
= recurse
84+
... | False | recurse
85+
= recurse
86+
prop-elem-delete x y (z ∷ zs)
87+
| False
88+
with x == z in eqxz
89+
with prop-elem-delete x y zs
90+
... | True | recurse
91+
rewrite (lemma-neq-trans x y z eqxz eqyz)
92+
= refl
93+
... | False | recurse
94+
= recurse
95+
96+
-- | An item is an element of the 'nub' iff it is
97+
-- an element of the original list.
98+
--
99+
prop-elem-nub
100+
: ∀ ⦃ _ : Eq a ⦄ ⦃ _ : IsLawfulEq a ⦄
101+
(x : a) (ys : List a)
102+
elem x (nub ys)
103+
≡ elem x ys
104+
--
105+
prop-elem-nub x [] = refl
106+
prop-elem-nub x (y ∷ ys)
107+
rewrite prop-elem-delete x y (nub ys)
108+
with x == y
109+
... | True = refl
110+
... | False = prop-elem-nub x ys

0 commit comments

Comments
 (0)