@@ -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