Skip to content

Commit 1c5095b

Browse files
authored
Merge pull request #64 from coq-ext-lib/finite-map-remove-facts
Finite map facts about remove
2 parents f27a18a + 5ab128b commit 1c5095b

File tree

3 files changed

+108
-34
lines changed

3 files changed

+108
-34
lines changed

theories/Data/Map/FMapAList.v

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,12 +139,39 @@ Section keyed.
139139
intros. eapply mapsto_remove_neq_alist in H. eapply H.
140140
Qed.
141141

142+
Theorem remove_eq_alist:
143+
forall (m : alist) (k : K), alist_find k (alist_remove k m) = None.
144+
Proof.
145+
unfold mapsto_alist.
146+
induction m; simpl; eauto; try congruence.
147+
intros; consider (k ?[ R ] fst a); simpl; intros; eauto.
148+
destruct a; simpl in *.
149+
consider (k ?[ R ] k0); eauto. tauto.
150+
Qed.
151+
152+
Theorem remove_neq_alist:
153+
forall (m : alist) (k k' : K), ~R k' k -> alist_find k (alist_remove k' m) = alist_find k m.
154+
Proof.
155+
unfold mapsto_alist.
156+
induction m; simpl; eauto; try congruence.
157+
destruct a; simpl.
158+
intros; consider (k' ?[ R ] k); simpl; intros; eauto.
159+
{ consider (k0 ?[ R ] k); intros; eauto.
160+
exfalso. eapply H. etransitivity; eauto. }
161+
{ consider (k0 ?[ R ] k); eauto. }
162+
Qed.
163+
142164
Global Instance MapLaws_alist : MapOk R Map_alist.
143165
Proof.
144166
refine {| mapsto := fun k v m => mapsto_alist m k v |};
145167
eauto using mapsto_lookup_alist, mapsto_add_eq_alist, mapsto_add_neq_alist.
146168
{ intros; intro. inversion H. }
147-
Qed.
169+
{ unfold mapsto_alist; simpl. intros.
170+
rewrite remove_eq_alist. congruence. }
171+
{ unfold mapsto_alist. simpl; intros.
172+
erewrite (@remove_neq_alist m _ _ H).
173+
reflexivity. }
174+
Defined.
148175

149176
End proofs.
150177

theories/Data/Map/FMapPositive.v

Lines changed: 74 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -31,53 +31,53 @@ Section pmap.
3131
| Branch _ _ r => r
3232
end.
3333

34-
Fixpoint pmap_lookup (p : positive) (m : pmap) : option T :=
34+
Fixpoint pmap_lookup (p : positive) (m : pmap) {struct p} : option T :=
3535
match m with
36-
| Empty => None
37-
| Branch d l r =>
38-
match p with
39-
| xH => d
40-
| xO p => pmap_lookup p l
41-
| xI p => pmap_lookup p r
42-
end
36+
| Empty => None
37+
| Branch d l r =>
38+
match p with
39+
| xH => d
40+
| xO p => pmap_lookup p l
41+
| xI p => pmap_lookup p r
42+
end
4343
end.
4444

45-
Fixpoint pmap_insert (p : positive) (v : T) (m : pmap) : pmap :=
45+
Fixpoint pmap_insert (p : positive) (v : T) (m : pmap) {struct p} : pmap :=
4646
match p with
47-
| xH => Branch (Some v) (pmap_left m) (pmap_right m)
48-
| xO p =>
49-
Branch (pmap_here m) (pmap_insert p v (pmap_left m)) (pmap_right m)
50-
| xI p =>
51-
Branch (pmap_here m) (pmap_left m) (pmap_insert p v (pmap_right m))
47+
| xH => Branch (Some v) (pmap_left m) (pmap_right m)
48+
| xO p =>
49+
Branch (pmap_here m) (pmap_insert p v (pmap_left m)) (pmap_right m)
50+
| xI p =>
51+
Branch (pmap_here m) (pmap_left m) (pmap_insert p v (pmap_right m))
5252
end.
5353

5454
Definition branch (o : option T) (l r : pmap) : pmap :=
5555
match o , l , r with
56-
| None , Empty , Empty => Empty
57-
| _ , _ , _ => Branch o l r
56+
| None , Empty , Empty => Empty
57+
| _ , _ , _ => Branch o l r
5858
end.
5959

60-
Fixpoint pmap_remove (p : positive) (m : pmap) : pmap :=
60+
Fixpoint pmap_remove (p : positive) (m : pmap) {struct p} : pmap :=
6161
match m with
62-
| Empty => Empty
63-
| Branch d l r =>
64-
match p with
65-
| xH => branch None l r
66-
| xO p => branch d (pmap_remove p l) r
67-
| xI p => branch d l (pmap_remove p r)
68-
end
62+
| Empty => Empty
63+
| Branch d l r =>
64+
match p with
65+
| xH => branch None l r
66+
| xO p => branch d (pmap_remove p l) r
67+
| xI p => branch d l (pmap_remove p r)
68+
end
6969
end.
7070

7171
Definition pmap_empty : pmap := Empty.
7272

7373
Fixpoint pmap_union (f m : pmap) : pmap :=
7474
match f with
75-
| Empty => m
76-
| Branch d l r =>
77-
Branch (match d with
78-
| Some x => Some x
79-
| None => pmap_here m
80-
end) (pmap_union l (pmap_left m)) (pmap_union r (pmap_right m))
75+
| Empty => m
76+
| Branch d l r =>
77+
Branch (match d with
78+
| Some x => Some x
79+
| None => pmap_here m
80+
end) (pmap_union l (pmap_left m)) (pmap_union r (pmap_right m))
8181
end.
8282

8383
Global Instance Map_pmap : Map positive T pmap :=
@@ -153,7 +153,7 @@ Section pmap.
153153
{ destruct k'; simpl; destruct m; simpl;
154154
autorewrite with pmap_rw; Cases.rewrite_all_goal; try reflexivity; try congruence. }
155155
Qed.
156-
156+
157157
Lemma pmap_lookup_insert_None_neq
158158
: forall (m : pmap) (k : positive) (v : T) (k' : positive),
159159
k <> k' ->
@@ -185,13 +185,56 @@ Section pmap.
185185
apply pmap_lookup_insert_None_neq; intuition].
186186
Qed.
187187

188+
Lemma pmap_lookup_remove_eq
189+
: forall (m : pmap) (k : positive) (v : T),
190+
pmap_lookup k (pmap_remove k m) <> Some v.
191+
Proof.
192+
induction m; destruct k; simpl; intros; try congruence.
193+
{ destruct o; simpl; eauto.
194+
destruct m1; simpl; eauto.
195+
destruct (pmap_remove k m2) eqn:?; try congruence.
196+
rewrite <- Heqp. eauto. }
197+
{ destruct o; simpl; eauto.
198+
destruct (pmap_remove k m1) eqn:?; try congruence.
199+
- destruct m2; try congruence; eauto.
200+
destruct k; simpl; congruence.
201+
- rewrite <- Heqp. eauto. }
202+
{ destruct m1; try congruence.
203+
destruct m2; try congruence. }
204+
Qed.
205+
206+
Lemma pmap_lookup_remove_neq
207+
: forall (m : pmap) (k k' : positive),
208+
k <> k' ->
209+
forall v' : T, pmap_lookup k' m = Some v' <-> pmap_lookup k' (pmap_remove k m) = Some v'.
210+
Proof.
211+
induction m.
212+
Local Ltac t :=
213+
unfold branch;
214+
repeat match goal with
215+
| |- context [ match ?X with _ => _ end ] =>
216+
lazymatch X with
217+
| match _ with _ => _ end => fail
218+
| _ => destruct X eqn:?; subst; try tauto
219+
end
220+
end.
221+
{ destruct k; simpl; split; try congruence. }
222+
{ destruct k', k; simpl; intros; try solve [ t; rewrite lookup_empty; tauto ].
223+
{ assert (k <> k') by congruence.
224+
rewrite IHm2; eauto. simpl. t. rewrite lookup_empty. tauto. }
225+
{ assert (k <> k') by congruence.
226+
rewrite IHm1; eauto. simpl. t. rewrite lookup_empty. tauto. } }
227+
Qed.
228+
188229
Global Instance MapOk_pmap : MapOk (@eq _) Map_pmap.
189230
Proof.
190231
refine {| mapsto := fun k v m => pmap_lookup k m = Some v |}.
191232
{ abstract (induction k; simpl; congruence). }
192233
{ abstract (induction k; simpl; intros; forward). }
193234
{ eauto using pmap_lookup_insert_eq. }
194235
{ eauto using pmap_lookup_insert_Some_neq. }
236+
{ eauto using pmap_lookup_remove_eq. }
237+
{ eauto using pmap_lookup_remove_neq. }
195238
Defined.
196239

197240
Definition from_list : list T -> pmap :=

theories/Structures/Maps.v

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ Section Maps.
2929
; mapsto_add_neq : forall m k v k',
3030
~R k k' ->
3131
forall v', (mapsto k' v' m <-> mapsto k' v' (add k v m))
32+
; mapsto_remove_eq: forall m k v, ~ mapsto k v (remove k m)
33+
; mapsto_remove_neq : forall m k k',
34+
~ R k k' ->
35+
forall v', (mapsto k' v' m <-> mapsto k' v' (remove k m))
3236
}.
3337

3438
Variable M : Map.
@@ -61,8 +65,8 @@ Section Maps.
6165
else acc) empty m.
6266

6367
Definition submap_with (le : V -> V -> bool) (m1 m2 : map) : bool :=
64-
fold (fun k_v (acc : bool) =>
65-
if acc then
68+
fold (fun k_v (acc : bool) =>
69+
if acc then
6670
let '(k,v) := k_v in
6771
match lookup k m2 with
6872
| None => false

0 commit comments

Comments
 (0)