Skip to content

Commit b378d4b

Browse files
jamesmckinnaandreasabel
authored andcommitted
Data.List.Base.reverse is self adjoint wrt Data.List.Relation.Binary.Subset.Setoid._⊆_ (#2378)
* `reverse` is `SelfInverse` * use `Injective` for `reverse-injective` * fixes #2353 * combinatory form * removed redundant implicits * added comment on unit/counit of the adjunction
1 parent 5515a8c commit b378d4b

File tree

4 files changed

+86
-12
lines changed

4 files changed

+86
-12
lines changed

CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,13 +329,20 @@ Additions to existing modules
329329
i*j≢0 : .{{_ : NonZero i}} .{{_ : NonZero j}} → NonZero (i * j)
330330
```
331331

332+
* In `Data.List.Membership.Setoid.Properties`:
333+
```agda
334+
reverse⁺ : x ∈ xs → x ∈ reverse xs
335+
reverse⁻ : x ∈ reverse xs → x ∈ xs
336+
```
337+
332338
* In `Data.List.Properties`:
333339
```agda
334340
length-catMaybes : length (catMaybes xs) ≤ length xs
335341
applyUpTo-∷ʳ : applyUpTo f n ∷ʳ f n ≡ applyUpTo f (suc n)
336342
applyDownFrom-∷ʳ : applyDownFrom (f ∘ suc) n ∷ʳ f 0 ≡ applyDownFrom f (suc n)
337343
upTo-∷ʳ : upTo n ∷ʳ n ≡ upTo (suc n)
338344
downFrom-∷ʳ : applyDownFrom suc n ∷ʳ 0 ≡ downFrom (suc n)
345+
reverse-selfInverse : SelfInverse {A = List A} _≡_ reverse
339346
reverse-applyUpTo : reverse (applyUpTo f n) ≡ applyDownFrom f n
340347
reverse-upTo : reverse (upTo n) ≡ downFrom n
341348
reverse-applyDownFrom : reverse (applyDownFrom f n) ≡ applyUpTo f n
@@ -373,6 +380,13 @@ Additions to existing modules
373380
map-catMaybes : map f ∘ catMaybes ≗ catMaybes ∘ map (Maybe.map f)
374381
```
375382

383+
* In `Data.List.Relation.Binary.Subset.Setoid.Properties`:
384+
```agda
385+
reverse-selfAdjoint : as ⊆ reverse bs → reverse as ⊆ bs
386+
reverse⁺ : as ⊆ bs → reverse as ⊆ reverse bs
387+
reverse⁻ : reverse as ⊆ reverse bs → as ⊆ bs
388+
```
389+
376390
* In `Data.List.Relation.Unary.All.Properties`:
377391
```agda
378392
All-catMaybes⁺ : All (Maybe.All P) xs → All P (catMaybes xs)

src/Data/List/Membership/Setoid/Properties.agda

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,19 @@ module _ (S : Setoid c ℓ) where
238238
∈-concat⁻′ xss v∈c[xss] with find (∈-concat⁻ xss v∈c[xss])
239239
... | xs , t , s = xs , s , t
240240

241+
------------------------------------------------------------------------
242+
-- reverse
243+
244+
module _ (S : Setoid c ℓ) where
245+
246+
open Membership S using (_∈_)
247+
248+
reverse⁺ : {x xs} x ∈ xs x ∈ reverse xs
249+
reverse⁺ = Any.reverse⁺
250+
251+
reverse⁻ : {x xs} x ∈ reverse xs x ∈ xs
252+
reverse⁻ = Any.reverse⁻
253+
241254
------------------------------------------------------------------------
242255
-- cartesianProductWith
243256

src/Data/List/Properties.agda

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
module Data.List.Properties where
1313

1414
open import Algebra.Bundles
15-
open import Algebra.Definitions as AlgebraicDefinitions using (Involutive)
15+
open import Algebra.Consequences.Propositional
16+
using (selfInverse⇒involutive; selfInverse⇒injective)
17+
open import Algebra.Definitions as AlgebraicDefinitions using (SelfInverse; Involutive)
1618
open import Algebra.Morphism.Structures using (IsMagmaHomomorphism; IsMonoidHomomorphism)
1719
import Algebra.Structures as AlgebraicStructures
1820
open import Data.Bool.Base using (Bool; false; true; not; if_then_else_)
@@ -1350,7 +1352,7 @@ foldl-ʳ++ f b (x ∷ xs) {ys} = begin
13501352
unfold-reverse : (x : A) xs reverse (x ∷ xs) ≡ reverse xs ∷ʳ x
13511353
unfold-reverse x xs = ʳ++-defn xs
13521354

1353-
-- reverse is an involution with respect to append.
1355+
-- reverse is an anti-homomorphism with respect to append.
13541356

13551357
reverse-++ : (xs ys : List A)
13561358
reverse (xs ++ ys) ≡ reverse ys ++ reverse xs
@@ -1361,20 +1363,27 @@ reverse-++ xs ys = begin
13611363
ys ʳ++ reverse xs ≡⟨ ʳ++-defn ys ⟩
13621364
reverse ys ++ reverse xs ∎
13631365

1366+
-- reverse is self-inverse.
1367+
1368+
reverse-selfInverse : SelfInverse {A = List A} _≡_ reverse
1369+
reverse-selfInverse {x = xs} {y = ys} xs⁻¹≈ys = begin
1370+
reverse ys ≡⟨⟩
1371+
ys ʳ++ [] ≡⟨ cong (_ʳ++ []) xs⁻¹≈ys ⟨
1372+
reverse xs ʳ++ [] ≡⟨⟩
1373+
(xs ʳ++ []) ʳ++ [] ≡⟨ ʳ++-ʳ++ xs ⟩
1374+
[] ʳ++ xs ++ [] ≡⟨⟩
1375+
xs ++ [] ≡⟨ ++-identityʳ xs ⟩
1376+
xs ∎
1377+
13641378
-- reverse is involutive.
13651379

13661380
reverse-involutive : Involutive {A = List A} _≡_ reverse
1367-
reverse-involutive xs = begin
1368-
reverse (reverse xs) ≡⟨⟩
1369-
(xs ʳ++ []) ʳ++ [] ≡⟨ ʳ++-ʳ++ xs ⟩
1370-
[] ʳ++ xs ++ [] ≡⟨⟩
1371-
xs ++ [] ≡⟨ ++-identityʳ xs ⟩
1372-
xs ∎
1381+
reverse-involutive = selfInverse⇒involutive reverse-selfInverse
13731382

13741383
-- reverse is injective.
13751384

1376-
reverse-injective : {xs ys : List A} reverse xs ≡ reverse ys xs ≡ ys
1377-
reverse-injective = subst₂ _≡_ (reverse-involutive _) (reverse-involutive _) ∘ cong reverse
1385+
reverse-injective : Injective {A = List A} _≡_ _≡_ reverse
1386+
reverse-injective = selfInverse⇒injective reverse-selfInverse
13781387

13791388
-- reverse preserves length.
13801389

src/Data/List/Relation/Binary/Subset/Setoid/Properties.agda

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,19 @@ module Data.List.Relation.Binary.Subset.Setoid.Properties where
1010

1111
open import Data.Bool.Base using (Bool; true; false)
1212
open import Data.List.Base hiding (_∷ʳ_; find)
13+
import Data.List.Properties as List
1314
open import Data.List.Relation.Unary.Any as Any using (Any; here; there)
1415
open import Data.List.Relation.Unary.All as All using (All)
1516
import Data.List.Membership.Setoid as Membership
16-
open import Data.List.Membership.Setoid.Properties
17+
import Data.List.Membership.Setoid.Properties as Membershipₚ
1718
open import Data.Nat.Base using (ℕ; s≤s; _≤_)
1819
import Data.List.Relation.Binary.Subset.Setoid as Subset
1920
import Data.List.Relation.Binary.Sublist.Setoid as Sublist
2021
import Data.List.Relation.Binary.Equality.Setoid as Equality
2122
import Data.List.Relation.Binary.Permutation.Setoid as Permutation
2223
import Data.List.Relation.Binary.Permutation.Setoid.Properties as Permutationₚ
2324
open import Data.Product.Base using (_,_)
24-
open import Function.Base using (_∘_; _∘₂_)
25+
open import Function.Base using (_∘_; _∘₂_; _$_)
2526
open import Level using (Level)
2627
open import Relation.Nullary using (¬_; does; yes; no)
2728
open import Relation.Nullary.Negation using (contradiction)
@@ -49,6 +50,7 @@ module _ (S : Setoid a ℓ) where
4950
open Subset S
5051
open Equality S
5152
open Membership S
53+
open Membershipₚ
5254

5355
⊆-reflexive : _≋_ ⇒ _⊆_
5456
⊆-reflexive xs≋ys = ∈-resp-≋ S xs≋ys
@@ -167,6 +169,7 @@ module _ (S : Setoid a ℓ) where
167169
open Setoid S
168170
open Subset S
169171
open Membership S
172+
open Membershipₚ
170173

171174
xs⊆x∷xs : xs x xs ⊆ x ∷ xs
172175
xs⊆x∷xs xs x = there
@@ -186,6 +189,7 @@ module _ (S : Setoid a ℓ) where
186189

187190
open Subset S
188191
open Membership S
192+
open Membershipₚ
189193

190194
xs⊆xs++ys : xs ys xs ⊆ xs ++ ys
191195
xs⊆xs++ys xs ys = ∈-++⁺ˡ S
@@ -206,13 +210,47 @@ module _ (S : Setoid a ℓ) where
206210
++⁺ : {ws xs ys zs} ws ⊆ xs ys ⊆ zs ws ++ ys ⊆ xs ++ zs
207211
++⁺ ws⊆xs ys⊆zs = ⊆-trans S (++⁺ˡ _ ws⊆xs) (++⁺ʳ _ ys⊆zs)
208212

213+
------------------------------------------------------------------------
214+
-- reverse
215+
216+
module _ (S : Setoid a ℓ) where
217+
218+
open Setoid S renaming (Carrier to A)
219+
open Subset S
220+
221+
reverse-selfAdjoint : {as bs} as ⊆ reverse bs reverse as ⊆ bs
222+
reverse-selfAdjoint rs = reverse⁻ ∘ rs ∘ reverse⁻
223+
where reverse⁻ = Membershipₚ.reverse⁻ S
224+
225+
-- NB. the unit and counit of this adjunction are given by:
226+
-- reverse-η : ∀ {xs} → xs ⊆ reverse xs
227+
-- reverse-η = Membershipₚ.reverse⁺ S
228+
-- reverse-ε : ∀ {xs} → reverse xs ⊆ xs
229+
-- reverse-ε = Membershipₚ.reverse⁻ S
230+
231+
reverse⁺ : {as bs} as ⊆ bs reverse as ⊆ reverse bs
232+
reverse⁺ {as} {bs} rs = reverse-selfAdjoint $ begin
233+
as ⊆⟨ rs ⟩
234+
bs ≡⟨ List.reverse-involutive bs ⟨
235+
reverse (reverse bs) ∎
236+
where open ⊆-Reasoning S
237+
238+
reverse⁻ : {as bs} reverse as ⊆ reverse bs as ⊆ bs
239+
reverse⁻ {as} {bs} rs = begin
240+
as ≡⟨ List.reverse-involutive as ⟨
241+
reverse (reverse as) ⊆⟨ reverse-selfAdjoint rs ⟩
242+
bs ∎
243+
where open ⊆-Reasoning S
244+
245+
209246
------------------------------------------------------------------------
210247
-- filter
211248

212249
module _ (S : Setoid a ℓ) where
213250

214251
open Setoid S renaming (Carrier to A)
215252
open Subset S
253+
open Membershipₚ
216254

217255
filter-⊆ : {P : Pred A p} (P? : Decidable P)
218256
xs filter P? xs ⊆ xs

0 commit comments

Comments
 (0)