|
1 | 1 | module Haskell.Data.List where |
2 | 2 |
|
3 | 3 | open import Haskell.Prelude |
| 4 | + |
4 | 5 | open import Haskell.Data.Ord using (comparing) |
5 | 6 |
|
| 7 | +open import Haskell.Law.Eq |
| 8 | +open import Haskell.Law.Equality |
| 9 | + |
6 | 10 | {----------------------------------------------------------------------------- |
7 | 11 | Operations |
8 | 12 | ------------------------------------------------------------------------------} |
@@ -40,3 +44,67 @@ sortOn f = |
40 | 44 | map snd |
41 | 45 | ∘ sortBy (comparing fst) |
42 | 46 | ∘ 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