~ubuntu-branches/ubuntu/vivid/agda-stdlib/vivid

« back to all changes in this revision

Viewing changes to src/Data/List/Any/Membership.agda

  • Committer: Package Import Robot
  • Author(s): Iain Lane
  • Date: 2011-11-29 17:00:35 UTC
  • mfrom: (1.1.3)
  • Revision ID: package-import@ubuntu.com-20111129170035-00v3pq4mmhoo5ulf
Tags: 0.6~darcs20111129t1640-1
* [ef445ab] Imported Upstream version 0.6~darcs20111129t1640
  + Darcs snapshot required for Agda 2.3.0 compatibility
* [f801f83] Update BDs and deps to require Agda 2.3.0
* [c52be90] Use 3.0 (quilt) for bz2 orig

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
------------------------------------------------------------------------
 
2
-- The Agda standard library
 
3
--
2
4
-- Properties related to list membership
3
5
------------------------------------------------------------------------
4
6
 
5
 
{-# OPTIONS --universe-polymorphism #-}
6
 
 
7
7
-- List membership is defined in Data.List.Any. This module does not
8
8
-- treat the general variant of list membership, parametrised on a
9
9
-- setoid, only the variant where the equality is fixed to be
17
17
open import Data.Empty
18
18
open import Function
19
19
open import Function.Equality using (_⟨$⟩_)
20
 
open import Function.Equivalence using (module Equivalent)
 
20
open import Function.Equivalence using (module Equivalence)
21
21
import Function.Injection as Inj
22
 
open import Function.Inverse as Inv using (_⇿_; module Inverse)
23
 
open import Function.Inverse.TypeIsomorphisms
 
22
open import Function.Inverse as Inv using (_↔_; module Inverse)
 
23
import Function.Related as Related
 
24
open import Function.Related.TypeIsomorphisms
24
25
open import Data.List as List
25
26
open import Data.List.Any as Any using (Any; here; there)
26
27
open import Data.List.Any.Properties
28
29
import Data.Nat.Properties as NatProp
29
30
open import Data.Product as Prod
30
31
open import Data.Sum as Sum
31
 
open import Level
32
32
open import Relation.Binary
33
33
open import Relation.Binary.PropositionalEquality as P
34
34
  using (_≡_; refl; _≗_)
46
46
------------------------------------------------------------------------
47
47
-- Properties relating _∈_ to various list functions
48
48
 
49
 
map-∈⇿ : ∀ {a b} {A : Set a} {B : Set b} {f : A → B} {y xs} →
50
 
         (∃ λ x → x ∈ xs × y ≡ f x) ⇿ y ∈ List.map f xs
51
 
map-∈⇿ {a} {b} {f = f} {y} {xs} =
52
 
  (∃ λ x → x ∈ xs × y ≡ f x)  ⇿⟨ Any⇿ {a = a} {p = b} ⟩
53
 
  Any (λ x → y ≡ f x) xs      ⇿⟨ map⇿ {a = a} {b = b} {p = b} ⟩
 
49
map-∈↔ : ∀ {a b} {A : Set a} {B : Set b} {f : A → B} {y xs} →
 
50
         (∃ λ x → x ∈ xs × y ≡ f x) ↔ y ∈ List.map f xs
 
51
map-∈↔ {a} {b} {f = f} {y} {xs} =
 
52
  (∃ λ x → x ∈ xs × y ≡ f x)  ↔⟨ Any↔ {a = a} {p = b} ⟩
 
53
  Any (λ x → y ≡ f x) xs      ↔⟨ map↔ {a = a} {b = b} {p = b} ⟩
54
54
  y ∈ List.map f xs           ∎
55
 
  where open Inv.EquationalReasoning
 
55
  where open Related.EquationalReasoning
56
56
 
57
 
concat-∈⇿ : ∀ {a} {A : Set a} {x : A} {xss} →
58
 
            (∃ λ xs → x ∈ xs × xs ∈ xss) ⇿ x ∈ concat xss
59
 
concat-∈⇿ {a} {x = x} {xss} =
60
 
  (∃ λ xs → x ∈ xs × xs ∈ xss)  ⇿⟨ Σ.cong {a₁ = a} {b₁ = a} {b₂ = a} Inv.id $ ×⊎.*-comm _ _ ⟩
61
 
  (∃ λ xs → xs ∈ xss × x ∈ xs)  ⇿⟨ Any⇿ {a = a} {p = a} ⟩
62
 
  Any (Any (_≡_ x)) xss         ⇿⟨ concat⇿ {a = a} {p = a} ⟩
 
57
concat-∈↔ : ∀ {a} {A : Set a} {x : A} {xss} →
 
58
            (∃ λ xs → x ∈ xs × xs ∈ xss) ↔ x ∈ concat xss
 
59
concat-∈↔ {a} {x = x} {xss} =
 
60
  (∃ λ xs → x ∈ xs × xs ∈ xss)  ↔⟨ Σ.cong {a₁ = a} {b₁ = a} {b₂ = a} Inv.id $ ×⊎.*-comm _ _ ⟩
 
61
  (∃ λ xs → xs ∈ xss × x ∈ xs)  ↔⟨ Any↔ {a = a} {p = a} ⟩
 
62
  Any (Any (_≡_ x)) xss         ↔⟨ concat↔ {a = a} {p = a} ⟩
63
63
  x ∈ concat xss                ∎
64
 
  where open Inv.EquationalReasoning
 
64
  where open Related.EquationalReasoning
65
65
 
66
 
>>=-∈⇿ : ∀ {ℓ} {A B : Set ℓ} {xs} {f : A → List B} {y} →
67
 
         (∃ λ x → x ∈ xs × y ∈ f x) ⇿ y ∈ (xs >>= f)
68
 
>>=-∈⇿ {ℓ} {xs = xs} {f} {y} =
69
 
  (∃ λ x → x ∈ xs × y ∈ f x)  ⇿⟨ Any⇿ {a = ℓ} {p = ℓ} ⟩
70
 
  Any (Any (_≡_ y) ∘ f) xs    ⇿⟨ >>=⇿ {ℓ = ℓ} {p = ℓ} ⟩
 
66
>>=-∈↔ : ∀ {ℓ} {A B : Set ℓ} {xs} {f : A → List B} {y} →
 
67
         (∃ λ x → x ∈ xs × y ∈ f x) ↔ y ∈ (xs >>= f)
 
68
>>=-∈↔ {ℓ} {xs = xs} {f} {y} =
 
69
  (∃ λ x → x ∈ xs × y ∈ f x)  ↔⟨ Any↔ {a = ℓ} {p = ℓ} ⟩
 
70
  Any (Any (_≡_ y) ∘ f) xs    ↔⟨ >>=↔ {ℓ = ℓ} {p = ℓ} ⟩
71
71
  y ∈ (xs >>= f)              ∎
72
 
  where open Inv.EquationalReasoning
 
72
  where open Related.EquationalReasoning
73
73
 
74
 
⊛-∈⇿ : ∀ {ℓ} {A B : Set ℓ} (fs : List (A → B)) {xs y} →
75
 
       (∃₂ λ f x → f ∈ fs × x ∈ xs × y ≡ f x) ⇿ y ∈ fs ⊛ xs
76
 
⊛-∈⇿ {ℓ} fs {xs} {y} =
77
 
  (∃₂ λ f x → f ∈ fs × x ∈ xs × y ≡ f x)       ⇿⟨ Σ.cong {a₁ = ℓ} {b₁ = ℓ} {b₂ = ℓ} Inv.id (∃∃⇿∃∃ {a = ℓ} {b = ℓ} {p = ℓ} _) ⟩
78
 
  (∃ λ f → f ∈ fs × ∃ λ x → x ∈ xs × y ≡ f x)  ⇿⟨ Σ.cong {a₁ = ℓ} {b₁ = ℓ} {b₂ = ℓ}
79
 
                                                         Inv.id ((_ ∎) ⟨ ×⊎.*-cong {ℓ = ℓ} ⟩ Any⇿ {a = ℓ} {p = ℓ}) ⟩
80
 
  (∃ λ f → f ∈ fs × Any (_≡_ y ∘ f) xs)        ⇿⟨ Any⇿ {a = ℓ} {p = ℓ} ⟩
81
 
  Any (λ f → Any (_≡_ y ∘ f) xs) fs            ⇿⟨ ⊛⇿ ⟩
 
74
⊛-∈↔ : ∀ {ℓ} {A B : Set ℓ} (fs : List (A → B)) {xs y} →
 
75
       (∃₂ λ f x → f ∈ fs × x ∈ xs × y ≡ f x) ↔ y ∈ fs ⊛ xs
 
76
⊛-∈↔ {ℓ} fs {xs} {y} =
 
77
  (∃₂ λ f x → f ∈ fs × x ∈ xs × y ≡ f x)       ↔⟨ Σ.cong {a₁ = ℓ} {b₁ = ℓ} {b₂ = ℓ} Inv.id (∃∃↔∃∃ {a = ℓ} {b = ℓ} {p = ℓ} _) ⟩
 
78
  (∃ λ f → f ∈ fs × ∃ λ x → x ∈ xs × y ≡ f x)  ↔⟨ Σ.cong {a₁ = ℓ} {b₁ = ℓ} {b₂ = ℓ}
 
79
                                                         Inv.id ((_ ∎) ⟨ ×⊎.*-cong {ℓ = ℓ} ⟩ Any↔ {a = ℓ} {p = ℓ}) ⟩
 
80
  (∃ λ f → f ∈ fs × Any (_≡_ y ∘ f) xs)        ↔⟨ Any↔ {a = ℓ} {p = ℓ} ⟩
 
81
  Any (λ f → Any (_≡_ y ∘ f) xs) fs            ↔⟨ ⊛↔ ⟩
82
82
  y ∈ fs ⊛ xs                                  ∎
83
 
  where open Inv.EquationalReasoning
 
83
  where open Related.EquationalReasoning
84
84
 
85
 
⊗-∈⇿ : ∀ {A B : Set} {xs ys} {x : A} {y : B} →
86
 
       (x ∈ xs × y ∈ ys) ⇿ (x , y) ∈ (xs ⊗ ys)
87
 
⊗-∈⇿ {A} {B} {xs} {ys} {x} {y} =
88
 
  (x ∈ xs × y ∈ ys)                ⇿⟨ ⊗⇿′ ⟩
89
 
  Any (_≡_ x ⟨×⟩ _≡_ y) (xs ⊗ ys)  ⇿⟨ Any-cong helper (_ ∎) ⟩
 
85
⊗-∈↔ : ∀ {A B : Set} {xs ys} {x : A} {y : B} →
 
86
       (x ∈ xs × y ∈ ys) ↔ (x , y) ∈ (xs ⊗ ys)
 
87
⊗-∈↔ {A} {B} {xs} {ys} {x} {y} =
 
88
  (x ∈ xs × y ∈ ys)                ↔⟨ ⊗↔′ ⟩
 
89
  Any (_≡_ x ⟨×⟩ _≡_ y) (xs ⊗ ys)  ↔⟨ Any-cong helper (_ ∎) ⟩
90
90
  (x , y) ∈ (xs ⊗ ys)              ∎
91
91
  where
92
 
  open Inv.EquationalReasoning
 
92
  open Related.EquationalReasoning
93
93
 
94
 
  helper : (p : A × B) → (x ≡ proj₁ p × y ≡ proj₂ p) ⇿ (x , y) ≡ p
 
94
  helper : (p : A × B) → (x ≡ proj₁ p × y ≡ proj₂ p) ↔ (x , y) ≡ p
95
95
  helper (x′ , y′) = record
96
96
    { to         = P.→-to-⟶ (uncurry $ P.cong₂ _,_)
97
97
    ; from       = P.→-to-⟶ < P.cong proj₁ , P.cong proj₂ >
108
108
mono : ∀ {a p} {A : Set a} {P : A → Set p} {xs ys} →
109
109
       xs ⊆ ys → Any P xs → Any P ys
110
110
mono xs⊆ys =
111
 
  _⟨$⟩_ (Inverse.to Any⇿) ∘′
 
111
  _⟨$⟩_ (Inverse.to Any↔) ∘′
112
112
  Prod.map id (Prod.map xs⊆ys id) ∘
113
 
  _⟨$⟩_ (Inverse.from Any⇿)
 
113
  _⟨$⟩_ (Inverse.from Any↔)
114
114
 
115
115
map-mono : ∀ {a b} {A : Set a} {B : Set b} (f : A → B) {xs ys} →
116
116
           xs ⊆ ys → List.map f xs ⊆ List.map f ys
117
117
map-mono f xs⊆ys =
118
 
  _⟨$⟩_ (Inverse.to map-∈⇿) ∘
 
118
  _⟨$⟩_ (Inverse.to map-∈↔) ∘
119
119
  Prod.map id (Prod.map xs⊆ys id) ∘
120
 
  _⟨$⟩_ (Inverse.from map-∈⇿)
 
120
  _⟨$⟩_ (Inverse.from map-∈↔)
121
121
 
122
122
_++-mono_ : ∀ {a} {A : Set a} {xs₁ xs₂ ys₁ ys₂ : List A} →
123
123
            xs₁ ⊆ ys₁ → xs₂ ⊆ ys₂ → xs₁ ++ xs₂ ⊆ ys₁ ++ ys₂
124
124
_++-mono_ xs₁⊆ys₁ xs₂⊆ys₂ =
125
 
  _⟨$⟩_ (Inverse.to ++⇿) ∘
 
125
  _⟨$⟩_ (Inverse.to ++↔) ∘
126
126
  Sum.map xs₁⊆ys₁ xs₂⊆ys₂ ∘
127
 
  _⟨$⟩_ (Inverse.from ++⇿)
 
127
  _⟨$⟩_ (Inverse.from ++↔)
128
128
 
129
129
concat-mono : ∀ {a} {A : Set a} {xss yss : List (List A)} →
130
130
              xss ⊆ yss → concat xss ⊆ concat yss
131
131
concat-mono {a} xss⊆yss =
132
 
  _⟨$⟩_ (Inverse.to $ concat-∈⇿ {a = a}) ∘
 
132
  _⟨$⟩_ (Inverse.to $ concat-∈↔ {a = a}) ∘
133
133
  Prod.map id (Prod.map id xss⊆yss) ∘
134
 
  _⟨$⟩_ (Inverse.from $ concat-∈⇿ {a = a})
 
134
  _⟨$⟩_ (Inverse.from $ concat-∈↔ {a = a})
135
135
 
136
136
>>=-mono : ∀ {ℓ} {A B : Set ℓ} (f g : A → List B) {xs ys} →
137
137
           xs ⊆ ys → (∀ {x} → f x ⊆ g x) →
138
138
           (xs >>= f) ⊆ (ys >>= g)
139
139
>>=-mono {ℓ} f g xs⊆ys f⊆g =
140
 
  _⟨$⟩_ (Inverse.to $ >>=-∈⇿ {ℓ = ℓ}) ∘
 
140
  _⟨$⟩_ (Inverse.to $ >>=-∈↔ {ℓ = ℓ}) ∘
141
141
  Prod.map id (Prod.map xs⊆ys f⊆g) ∘
142
 
  _⟨$⟩_ (Inverse.from $ >>=-∈⇿ {ℓ = ℓ})
 
142
  _⟨$⟩_ (Inverse.from $ >>=-∈↔ {ℓ = ℓ})
143
143
 
144
144
_⊛-mono_ : ∀ {ℓ} {A B : Set ℓ}
145
145
             {fs gs : List (A → B)} {xs ys : List A} →
146
146
           fs ⊆ gs → xs ⊆ ys → (fs ⊛ xs) ⊆ (gs ⊛ ys)
147
147
_⊛-mono_ {fs = fs} {gs} fs⊆gs xs⊆ys =
148
 
  _⟨$⟩_ (Inverse.to $ ⊛-∈⇿ gs) ∘
 
148
  _⟨$⟩_ (Inverse.to $ ⊛-∈↔ gs) ∘
149
149
  Prod.map id (Prod.map id (Prod.map fs⊆gs (Prod.map xs⊆ys id))) ∘
150
 
  _⟨$⟩_ (Inverse.from $ ⊛-∈⇿ fs)
 
150
  _⟨$⟩_ (Inverse.from $ ⊛-∈↔ fs)
151
151
 
152
152
_⊗-mono_ : {A B : Set} {xs₁ ys₁ : List A} {xs₂ ys₂ : List B} →
153
153
           xs₁ ⊆ ys₁ → xs₂ ⊆ ys₂ → (xs₁ ⊗ xs₂) ⊆ (ys₁ ⊗ ys₂)
154
154
xs₁⊆ys₁ ⊗-mono xs₂⊆ys₂ =
155
 
  _⟨$⟩_ (Inverse.to ⊗-∈⇿) ∘
 
155
  _⟨$⟩_ (Inverse.to ⊗-∈↔) ∘
156
156
  Prod.map xs₁⊆ys₁ xs₂⊆ys₂ ∘
157
 
  _⟨$⟩_ (Inverse.from ⊗-∈⇿)
 
157
  _⟨$⟩_ (Inverse.from ⊗-∈↔)
158
158
 
159
159
any-mono : ∀ {a} {A : Set a} (p : A → Bool) →
160
160
           ∀ {xs ys} → xs ⊆ ys → T (any p xs) → T (any p ys)
161
161
any-mono {a} p xs⊆ys =
162
 
  _⟨$⟩_ (Equivalent.to $ any⇔ {a = a}) ∘
 
162
  _⟨$⟩_ (Equivalence.to $ any⇔ {a = a}) ∘
163
163
  mono xs⊆ys ∘
164
 
  _⟨$⟩_ (Equivalent.from $ any⇔ {a = a})
 
164
  _⟨$⟩_ (Equivalence.from $ any⇔ {a = a})
165
165
 
166
166
map-with-∈-mono :
167
167
  ∀ {a b} {A : Set a} {B : Set b}
170
170
  (xs⊆ys : xs ⊆ ys) → (∀ {x} → f {x} ≗ g ∘ xs⊆ys) →
171
171
  map-with-∈ xs f ⊆ map-with-∈ ys g
172
172
map-with-∈-mono {f = f} {g = g} xs⊆ys f≈g {x} =
173
 
  _⟨$⟩_ (Inverse.to map-with-∈⇿) ∘
 
173
  _⟨$⟩_ (Inverse.to map-with-∈↔) ∘
174
174
  Prod.map id (Prod.map xs⊆ys (λ {x∈xs} x≡fx∈xs → begin
175
175
    x               ≡⟨ x≡fx∈xs ⟩
176
176
    f x∈xs          ≡⟨ f≈g x∈xs ⟩
177
177
    g (xs⊆ys x∈xs)  ∎)) ∘
178
 
  _⟨$⟩_ (Inverse.from map-with-∈⇿)
 
178
  _⟨$⟩_ (Inverse.from map-with-∈↔)
179
179
  where open P.≡-Reasoning
180
180
 
181
181
------------------------------------------------------------------------