@@ -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 :=
0 commit comments