@@ -74,7 +74,7 @@ split; intro H0; inversion H0; clear H0; subst.
74
74
- apply Table.Raw.InRight; rewrite IHt2; auto.
75
75
Qed .
76
76
77
- Lemma relate_fold_add:
77
+ Lemma relate_fold_add' :
78
78
forall [elt A: Type ]
79
79
[eqv: A -> A -> Prop ]
80
80
(eqv_rel: Equivalence eqv)
@@ -199,6 +199,53 @@ rewrite u_unit.
199
199
reflexivity.
200
200
Qed .
201
201
202
+
203
+ Lemma relate_fold_add:
204
+ forall [elt A: Type ]
205
+ [eqv: A -> A -> Prop ]
206
+ (eqv_rel: Equivalence eqv)
207
+ (lift: Table.key -> elt -> A)
208
+ (lift_prop: forall k k' x, Keys.eq k k' -> eqv (lift k x) (lift k' x))
209
+ (f: A -> A -> A)
210
+ (f_mor: forall x1 y1, eqv x1 y1 ->
211
+ forall x2 y2, eqv x2 y2 ->
212
+ eqv (f x1 x2) (f y1 y2))
213
+ (f_assoc: forall x y z : A, eqv (f x (f y z)) (f (f x y) z))
214
+ (f_commut: forall x y : A, eqv (f x y) (f y x))
215
+ (u: A)
216
+ (u_unit: forall x, eqv (f u x) x)
217
+ (g: Table.key -> elt -> A -> A)
218
+ (g_eqv: forall k x a, eqv (g k x a) (f (lift k x) a))
219
+ (tab: Table.t elt)
220
+ (k: Table.key),
221
+ eqv (Table .fold g tab u)
222
+ (f (match Table .find k tab with Some x => lift k x | None => u end )
223
+ (Table .fold (fun k' x a => if Keys.eq_dec k k' then a else g k' x a) tab u)).
224
+ Proof .
225
+ intros.
226
+ rewrite (relate_fold_add' eqv_rel lift lift_prop f f_mor f_assoc f_commut u u_unit g g_eqv tab k).
227
+ apply f_mor.
228
+ reflexivity.
229
+ rewrite !Table.fold_1.
230
+ clear u_unit.
231
+ revert u.
232
+ induction (Table.elements (elt:=elt) tab); intro.
233
+ simpl. reflexivity.
234
+ simpl.
235
+ rewrite IHl.
236
+ set (ff := fold_left _).
237
+ clearbody ff.
238
+ match goal with |- eqv ?A ?B => replace B with A end.
239
+ reflexivity.
240
+ f_equal.
241
+ set (j := fst a). clearbody j.
242
+ clear.
243
+ destruct (Keys.compare k j); try apply Keys.lt_not_eq in l;
244
+ destruct (Keys.eq_dec k j); try contradiction; auto.
245
+ symmetry in e. contradiction.
246
+ Qed .
247
+
248
+
202
249
Lemma fold_add_ignore:
203
250
forall [elt A]
204
251
(f: Table.key -> elt -> A -> A)
@@ -224,6 +271,51 @@ rewrite ?H; auto.
224
271
rewrite IHis_bst2. auto.
225
272
Qed .
226
273
274
+
275
+
276
+ Lemma relate_fold_add_alt:
277
+ forall [elt A: Type ]
278
+ [eqv: A -> A -> Prop ]
279
+ (eqv_rel: Equivalence eqv)
280
+ (lift: Table.key -> elt -> A)
281
+ (lift_prop: forall k k' x, Keys.eq k k' -> eqv (lift k x) (lift k' x))
282
+ (f: A -> A -> A)
283
+ (f_mor: forall x1 y1, eqv x1 y1 ->
284
+ forall x2 y2, eqv x2 y2 ->
285
+ eqv (f x1 x2) (f y1 y2))
286
+ (f_assoc: forall x y z : A, eqv (f x (f y z)) (f (f x y) z))
287
+ (f_commut: forall x y : A, eqv (f x y) (f y x))
288
+ (u: A)
289
+ (u_unit: forall x, eqv (f u x) x)
290
+ (g: Table.key -> elt -> A -> A)
291
+ (g_eqv: forall k x a, eqv (g k x a) (f (lift k x) a))
292
+ (tab: Table.t elt)
293
+ (k: Table.key) (new oldnew : elt),
294
+ eqv (f (lift k new) (match Table .find k tab with Some x => lift k x | None => u end )) (lift k oldnew) ->
295
+ eqv (f (lift k new) (Table .fold g tab u)) (Table .fold g (Table .add k oldnew tab) u).
296
+ Proof .
297
+ intros.
298
+ pose proof relate_fold_add eqv_rel lift lift_prop f f_mor f_assoc f_commut u u_unit g g_eqv.
299
+ etransitivity.
300
+ apply f_mor.
301
+ reflexivity.
302
+ apply H0 with (k:=k).
303
+ rewrite f_assoc.
304
+ etransitivity.
305
+ apply f_mor.
306
+ apply H.
307
+ reflexivity.
308
+ rewrite H0 with (k:=k).
309
+ apply f_mor.
310
+ erewrite Table.find_1 by (apply Table.add_1; reflexivity).
311
+ reflexivity.
312
+ rewrite fold_add_ignore.
313
+ reflexivity.
314
+ intros.
315
+ destruct (Keys.eq_dec k k'); try contradiction.
316
+ auto.
317
+ Qed .
318
+
227
319
End FMapAVL_extra.
228
320
229
321
Module Demonstration.
@@ -276,34 +368,39 @@ Lemma add_to_table_correct:
276
368
Proof .
277
369
intros.
278
370
pose (lift (k: Table.key) p := Z.pos p).
279
- pose proof relate_fold_add Z.eq_equiv lift
371
+ pose (oldnew := Z.to_pos (lift k p + match Table.find (elt:=positive) k tab with
372
+ | Some x => lift k x
373
+ | None => 0
374
+ end)).
375
+ pose proof relate_fold_add_alt Z.eq_equiv lift
280
376
ltac:(intros; rewrite H; auto)
281
377
Z.add
282
378
ltac:(intros; subst; auto)
283
379
Z.add_assoc Z.add_comm
284
380
Z0
285
381
Z.add_0_l
286
- (fun k p x => Z.add (Z.pos p) x)
287
- ltac:(intros; subst; reflexivity).
288
- unfold addup_table.
289
- rewrite (H (add_to_table k p tab) k).
290
- rewrite (H tab k).
291
- clear H.
292
- unfold add_to_table.
293
- destruct (Table.find k tab) eqn:?H;
294
- rewrite (Table.find_1 (Table.add_1 tab _ (eq_refl k)));
295
- rewrite fold_add_ignore
296
- by (intros; rewrite <- H0;
297
- destruct (Keys.compare k k); auto; contradiction (Z.lt_irrefl k l));
382
+ (fun k p x => Z.add (lift k p) x)
383
+ ltac:(intros; subst; reflexivity)
384
+ tab k p oldnew.
385
+ unfold addup_table, add_to_table.
386
+ set (f := fun (k : Table.key) (p : positive) (x : Z) => (lift k p + x)%Z) in *.
387
+ change (fun (_ : Table.key) (p1 : positive) (i : Z) => (Z.pos p1 + i)%Z) with f in *.
388
+ rewrite Z.add_comm.
389
+ change (Z.pos p) with (lift k p).
390
+ rewrite H; clear H.
391
+ f_equal.
392
+ destruct (Table.find k tab) eqn:?H; auto.
393
+ unfold oldnew.
394
+ set (b := match Table.find (elt:=positive) k tab with
395
+ | Some x => lift k x
396
+ | None => 0%Z
397
+ end).
398
+ assert (0 <= b)%Z.
399
+ subst b.
298
400
unfold lift.
299
- rewrite Pos.add_comm.
300
- rewrite Pos2Z.inj_add.
301
- rewrite <- !Z.add_assoc.
302
- rewrite (Z.add_comm (Z.pos p)).
303
- auto.
304
- set (u := Table.fold _ _ _).
305
- rewrite Z.add_0_l.
306
- apply Z.add_comm.
401
+ destruct (Table.find (elt:=positive) k tab); simpl; Lia.lia.
402
+ unfold lift.
403
+ Lia.lia.
307
404
Qed .
308
405
309
406
End Demonstration.
0 commit comments