Skip to content

Commit 9fca9dc

Browse files
authored
Some lemmata for lists and non-empty lists (#2730)
* [add]: map-id for Data.List.NonEmpty * [changelog]: map-id for Data.List.NonEmpty * [add]: some lemmata for ⁺++⁺ of Data.List.NonEmpty * [changelog]: some lemmata for ⁺++⁺ * [add]: ∷→∷⁺ and ∷⁺→∷ * [changelog]: ∷→∷⁺ and ∷⁺→∷ * [add]: ⁺++⁺-assoc for Data.List.NonEmpty * [changelog]: ⁺++⁺-assoc for Data.List.NonEmpty * [add]: ⁺++⁺-cancelˡ for Data.List.Empty * [changelog]: ⁺++⁺-cancelˡ for Data.List.Empty * [add]: ⁺++⁺-cancelʳ for Data.List.Empty * [changelog]: ⁺++⁺-cancelʳ for Data.List.Empty * [add]: ⁺++⁺-cancel for Data.List.NonEmpty * [changelog]: ⁺++⁺-cancel for Data.List.NonEmpty * [add]: map-⁺++⁺ * [changelog]: map-⁺++⁺ * [changelog] remove implicit args in List.NonEmpty * [changelog]: style adaptions for List.NonEmpty * [add]: length-++-≤ in Data.List.Properties * [changelog]: length-++-≤ in Data.List.Properties * [refactor] avoid rewrite in length-⁺++⁺-≤ * [add]: length-++-sucˡ, length-++-sucʳ * [changelog]: length-++-sucˡ, length-++-sucʳ * [refactor]: rename length-++-≤ to length-++-≤ˡ * [refactor]: anon. modules Data.List.Properties separates the anonymous module for algebraic definitions and structures around _++_ into two modules * [refactor]: move length-++ theorems moves these theorems below the theorems on the algebraic properties of _++_ so that we can later reuse them for further symmetric theorems * [add]: length-++-comm * [changelog]: length-++-comm * [add]: length-++-≤ʳ * [changelog]: length-++-≤ʳ * [add]: length-⁺++⁺-≤ʳ * [changelog]: length-⁺++⁺-≤ʳ * [add]: length-⁺++⁺-comm * [changelog]: length-⁺++⁺-comm
1 parent 32f786e commit 9fca9dc

File tree

3 files changed

+123
-4
lines changed

3 files changed

+123
-4
lines changed

CHANGELOG.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,11 @@ Additions to existing modules
264264

265265
* In `Data.List.Properties`:
266266
```agda
267+
length-++-sucˡ : ∀ (x : A) (xs ys : List A) → length (x ∷ xs ++ ys) ≡ suc (length (xs ++ ys))
268+
length-++-sucʳ : ∀ (xs : List A) (y : A) (ys : List A) → length (xs ++ y ∷ ys) ≡ suc (length (xs ++ ys))
269+
length-++-comm : ∀ (xs ys : List A) → length (xs ++ ys) ≡ length (ys ++ xs)
270+
length-++-≤ˡ : ∀ (xs : List A) → length xs ≤ length (xs ++ ys)
271+
length-++-≤ʳ : ∀ (ys : List A) → length ys ≤ length (xs ++ ys)
267272
map-applyUpTo : ∀ (f : ℕ → A) (g : A → B) n → map g (applyUpTo f n) ≡ applyUpTo (g ∘ f) n
268273
map-applyDownFrom : ∀ (f : ℕ → A) (g : A → B) n → map g (applyDownFrom f n) ≡ applyDownFrom (g ∘ f) n
269274
map-upTo : ∀ (f : ℕ → A) n → map f (upTo n) ≡ applyUpTo f n
@@ -280,6 +285,24 @@ Additions to existing modules
280285
filter-↭ : ∀ (P? : Pred.Decidable P) → xs ↭ ys → filter P? xs ↭ filter P? ys
281286
```
282287

288+
* In `Data.List.NonEmpty.Properties`:
289+
```agda
290+
∷→∷⁺ : (x List.∷ xs) ≡ (y List.∷ ys) →
291+
(x List⁺.∷ xs) ≡ (y List⁺.∷ ys)
292+
∷⁺→∷ : (x List⁺.∷ xs) ≡ (y List⁺.∷ ys) →
293+
(x List.∷ xs) ≡ (y List.∷ ys)
294+
length-⁺++⁺ : (xs ys : List⁺ A) → length (xs ⁺++⁺ ys) ≡ length xs + length ys
295+
length-⁺++⁺-comm : ∀ (xs ys : List⁺ A) → length (xs ⁺++⁺ ys) ≡ length (ys ⁺++⁺ xs)
296+
length-⁺++⁺-≤ˡ : (xs ys : List⁺ A) → length xs ≤ length (xs ⁺++⁺ ys)
297+
length-⁺++⁺-≤ʳ : (xs ys : List⁺ A) → length ys ≤ length (xs ⁺++⁺ ys)
298+
map-⁺++⁺ : ∀ (f : A → B) xs ys → map f (xs ⁺++⁺ ys) ≡ map f xs ⁺++⁺ map f ys
299+
⁺++⁺-assoc : Associative _⁺++⁺_
300+
⁺++⁺-cancelˡ : LeftCancellative _⁺++⁺_
301+
⁺++⁺-cancelʳ : RightCancellative _⁺++⁺_
302+
⁺++⁺-cancel : Cancellative _⁺++⁺_
303+
map-id : map id ≗ id {A = List⁺ A}
304+
```
305+
283306
* In `Data.Product.Function.Dependent.Propositional`:
284307
```agda
285308
Σ-↪ : (I↪J : I ↪ J) → (∀ {j} → A (from I↪J j) ↪ B j) → Σ I A ↪ Σ J B

src/Data/List/NonEmpty/Properties.agda

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,28 @@
88

99
module Data.List.NonEmpty.Properties where
1010

11+
import Algebra.Definitions as AlgebraicDefinitions
1112
open import Effect.Monad using (RawMonad)
12-
open import Data.Nat.Base using (suc; _+_)
13+
open import Data.Nat.Base using (suc; _+_; _≤_; s≤s)
1314
open import Data.Nat.Properties using (suc-injective)
1415
open import Data.Maybe.Properties using (just-injective)
1516
open import Data.Bool.Base using (Bool; true; false)
1617
open import Data.List.Base as List using (List; []; _∷_; _++_)
1718
open import Data.List.Effectful using () renaming (monad to listMonad)
19+
open import Data.List.Properties using (length-++; length-++-comm; length-++-≤ˡ; length-++-≤ʳ; ++-assoc; map-++)
1820
open import Data.List.NonEmpty.Effectful using () renaming (monad to list⁺Monad)
19-
open import Data.List.NonEmpty
21+
open import Data.List.NonEmpty as List⁺
2022
using (List⁺; _∷_; tail; head; toList; _⁺++_; _⁺++⁺_; _++⁺_; length; fromList;
2123
drop+; map; inits; tails; groupSeqs; ungroupSeqs)
2224
open import Data.List.NonEmpty.Relation.Unary.All using (All; toList⁺; _∷_)
2325
open import Data.List.Relation.Unary.All using ([]; _∷_) renaming (All to ListAll)
2426
import Data.List.Properties as List
27+
open import Data.Product.Base using (_,_)
2528
open import Data.Sum.Base using (inj₁; inj₂)
2629
open import Data.Sum.Relation.Unary.All using (inj₁; inj₂)
2730
import Data.Sum.Relation.Unary.All as Sum using (All; inj₁; inj₂)
2831
open import Level using (Level)
29-
open import Function.Base using (_∘_; _$_)
32+
open import Function.Base using (id; _∘_; _$_)
3033
open import Relation.Binary.PropositionalEquality.Core
3134
using (_≡_; refl; cong; cong₂; _≗_)
3235
open import Relation.Binary.PropositionalEquality.Properties
@@ -69,6 +72,56 @@ toList->>= f (x ∷ xs) = begin
6972
List.concat (List.map toList (List.map f (x ∷ xs)))
7073
7174

75+
-- turning equalities of lists that are not empty to equalities on non-empty lists ...
76+
∷→∷⁺ : {x y : A} {xs ys : List A}
77+
(x List.∷ xs) ≡ (y List.∷ ys)
78+
(x List⁺.∷ xs) ≡ (y List⁺.∷ ys)
79+
∷→∷⁺ refl = refl
80+
81+
-- ... and vice versa
82+
∷⁺→∷ : {x y : A} {xs ys : List A}
83+
(x List⁺.∷ xs) ≡ (y List⁺.∷ ys)
84+
(x List.∷ xs) ≡ (y List.∷ ys)
85+
∷⁺→∷ refl = refl
86+
87+
------------------------------------------------------------------------
88+
-- _⁺++⁺_
89+
90+
length-⁺++⁺ : (xs ys : List⁺ A)
91+
length (xs ⁺++⁺ ys) ≡ length xs + length ys
92+
length-⁺++⁺ (x ∷ xs) (y ∷ ys) = length-++ (x ∷ xs)
93+
94+
length-⁺++⁺-comm : (xs ys : List⁺ A)
95+
length (xs ⁺++⁺ ys) ≡ length (ys ⁺++⁺ xs)
96+
length-⁺++⁺-comm (x ∷ xs) (y ∷ ys) = length-++-comm (x ∷ xs) (y ∷ ys)
97+
98+
length-⁺++⁺-≤ˡ : (xs ys : List⁺ A)
99+
length xs ≤ length (xs ⁺++⁺ ys)
100+
length-⁺++⁺-≤ˡ (x ∷ xs) (y ∷ ys) = s≤s (length-++-≤ˡ xs)
101+
102+
length-⁺++⁺-≤ʳ : (xs ys : List⁺ A)
103+
length ys ≤ length (xs ⁺++⁺ ys)
104+
length-⁺++⁺-≤ʳ (x ∷ xs) (y ∷ ys) = length-++-≤ʳ (y ∷ ys) {x ∷ xs}
105+
106+
map-⁺++⁺ : (f : A B) xs ys
107+
map f (xs ⁺++⁺ ys) ≡ map f xs ⁺++⁺ map f ys
108+
map-⁺++⁺ f (x ∷ xs) (y ∷ ys) = ∷→∷⁺ (map-++ f (x ∷ xs) (y ∷ ys))
109+
110+
module _ {A : Set a} where
111+
open AlgebraicDefinitions {A = List⁺ A} _≡_
112+
113+
⁺++⁺-assoc : Associative _⁺++⁺_
114+
⁺++⁺-assoc (x ∷ xs) (y ∷ ys) (z ∷ zs) = cong (x ∷_) (++-assoc xs (y ∷ ys) (z ∷ zs))
115+
116+
⁺++⁺-cancelˡ : LeftCancellative _⁺++⁺_
117+
⁺++⁺-cancelˡ (x ∷ xs) (y ∷ ys) (z ∷ zs) eq = ∷→∷⁺ (List.++-cancelˡ (x ∷ xs) (y ∷ ys) (z ∷ zs) (∷⁺→∷ eq))
118+
119+
⁺++⁺-cancelʳ : RightCancellative _⁺++⁺_
120+
⁺++⁺-cancelʳ (x ∷ xs) (y ∷ ys) (z ∷ zs) eq = ∷→∷⁺ (List.++-cancelʳ (x ∷ xs) (y ∷ ys) (z ∷ zs) (∷⁺→∷ eq))
121+
122+
⁺++⁺-cancel : Cancellative _⁺++⁺_
123+
⁺++⁺-cancel = ⁺++⁺-cancelˡ , ⁺++⁺-cancelʳ
124+
72125
------------------------------------------------------------------------
73126
-- _++⁺_
74127

@@ -118,6 +171,9 @@ map-cong f≗g (x ∷ xs) = cong₂ _∷_ (f≗g x) (List.map-cong f≗g xs)
118171
map-∘ : {g : B C} {f : A B} map (g ∘ f) ≗ map g ∘ map f
119172
map-∘ (x ∷ xs) = cong (_ ∷_) (List.map-∘ xs)
120173

174+
map-id : map id ≗ id {A = List⁺ A}
175+
map-id (x ∷ xs) = cong (x ∷_) (List.map-id xs)
176+
121177
------------------------------------------------------------------------
122178
-- inits
123179

src/Data/List/Properties.agda

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,6 @@ length-++ (x ∷ xs) = cong suc (length-++ xs)
134134
module _ {A : Set a} where
135135

136136
open AlgebraicDefinitions {A = List A} _≡_
137-
open AlgebraicStructures {A = List A} _≡_
138137

139138
++-assoc : Associative _++_
140139
++-assoc [] ys zs = refl
@@ -190,6 +189,47 @@ module _ {A : Set a} where
190189
++-conical : Conical [] _++_
191190
++-conical = ++-conicalˡ , ++-conicalʳ
192191

192+
length-++-sucˡ : (x : A) (xs ys : List A)
193+
length (x ∷ xs ++ ys) ≡ suc (length (xs ++ ys))
194+
length-++-sucˡ _ _ _ = refl
195+
196+
length-++-sucʳ : (xs : List A) (y : A) (ys : List A)
197+
length (xs ++ y ∷ ys) ≡ suc (length (xs ++ ys))
198+
length-++-sucʳ [] _ _ = refl
199+
length-++-sucʳ (_ ∷ xs) y ys = cong suc (length-++-sucʳ xs y ys)
200+
201+
length-++-comm : (xs ys : List A)
202+
length (xs ++ ys) ≡ length (ys ++ xs)
203+
length-++-comm xs [] = cong length (++-identityʳ xs)
204+
length-++-comm [] (y ∷ ys) = sym (cong length (++-identityʳ (y ∷ ys)))
205+
length-++-comm (x ∷ xs) (y ∷ ys) =
206+
begin
207+
length (x ∷ xs ++ y ∷ ys)
208+
≡⟨⟩
209+
suc (length (xs ++ y ∷ ys))
210+
≡⟨ cong suc (length-++-sucʳ xs y ys) ⟩
211+
suc (suc (length (xs ++ ys)))
212+
≡⟨ cong suc (cong suc (length-++-comm xs ys)) ⟩
213+
suc (suc (length (ys ++ xs)))
214+
≡⟨ cong suc (length-++-sucʳ ys x xs) ⟨
215+
suc (length (ys ++ x ∷ xs))
216+
≡⟨⟩
217+
length (y ∷ ys ++ x ∷ xs)
218+
219+
220+
length-++-≤ˡ : (xs : List A) {ys}
221+
length xs ≤ length (xs ++ ys)
222+
length-++-≤ˡ [] = z≤n
223+
length-++-≤ˡ (x ∷ xs) = s≤s (length-++-≤ˡ xs)
224+
225+
length-++-≤ʳ : (ys : List A) {xs}
226+
length ys ≤ length (xs ++ ys)
227+
length-++-≤ʳ ys {xs} = ≤-trans (length-++-≤ˡ ys) (≤-reflexive (length-++-comm ys xs))
228+
229+
module _ {A : Set a} where
230+
231+
open AlgebraicStructures {A = List A} _≡_
232+
193233
++-isMagma : IsMagma _++_
194234
++-isMagma = record
195235
{ isEquivalence = isEquivalence

0 commit comments

Comments
 (0)