summaryrefslogtreecommitdiff
path: root/backend/InterfGraphMapImp.v
diff options
context:
space:
mode:
Diffstat (limited to 'backend/InterfGraphMapImp.v')
-rwxr-xr-xbackend/InterfGraphMapImp.v9401
1 files changed, 0 insertions, 9401 deletions
diff --git a/backend/InterfGraphMapImp.v b/backend/InterfGraphMapImp.v
deleted file mode 100755
index cdd8327..0000000
--- a/backend/InterfGraphMapImp.v
+++ /dev/null
@@ -1,9401 +0,0 @@
-Require Import FSets.
-Require Import Recdef.
-Require Import ZArith.
-Require Import Coq.Init.Wf.
-Require Import FSetInterface.
-Require Import SetsFacts.
-Require Import FMaps.
-Require Import OrderedOption.
-Require Import FMapAVL.
-Require Import Edges.
-Require Import MyRegisters.
-
-Module Register := Regs.
-
-Import Edge.
-
-Module VertexSet := FSetAVL.Make Vertex.
-Module EdgeSet := FSetAVL.Make Edge.
-Module VertexMap := FMapAVL.Make Vertex.
-Module MapFacts := Facts VertexMap.
-Module RegFacts := MyFacts VertexSet.
-Module MEdgeFacts := MyFacts EdgeSet.
-Module RegRegProps := MEdgeFacts.Props.
-Module Props := RegFacts.Props.
-
-Definition adj_set x m :=
-match (VertexMap.find x m) with
-| None => VertexSet.empty
-| Some x => x
-end.
-
-Record tt : Type := Make_Graph {
-vertices : VertexSet.t;
-imap : VertexMap.t VertexSet.t;
-pmap : VertexMap.t VertexSet.t;
-extremities_imap : forall x, VertexMap.In x imap <-> VertexSet.In x vertices;
-extremities_pmap : forall x, VertexMap.In x pmap <-> VertexSet.In x vertices;
-simple_graph : forall x y, VertexSet.In x (adj_set y imap) /\
- VertexSet.In x (adj_set y pmap) -> False;
-sym_imap : forall x y, VertexSet.In x (adj_set y imap) ->
- VertexSet.In y (adj_set x imap);
-sym_pmap : forall x y, VertexSet.In x (adj_set y pmap) ->
- VertexSet.In y (adj_set x pmap);
-not_eq_extremities : forall x y, VertexSet.In x (adj_set y imap) \/
- VertexSet.In x (adj_set y pmap) ->
- ~Vertex.eq x y
-}.
-
-Definition t := tt.
-
-Definition V := vertices.
-
-Definition edgemap_to_edgeset map w :=
-VertexMap.fold
- (fun y imapy s => VertexSet.fold
- (fun z s' => EdgeSet.add (y,z,w) s')
- imapy
- s)
- map
- EdgeSet.empty.
-
-Definition AE g := edgemap_to_edgeset (pmap g) (Some N0).
-
-Definition IE g := edgemap_to_edgeset (imap g) None.
-
-Definition is_precolored v (g : t) := is_mreg v.
-
-Definition imap_remove m x :=
-VertexMap.remove x
-(VertexSet.fold
- (fun y => VertexMap.add y (VertexSet.remove x (adj_set y m)))
- (adj_set x m)
- m
-).
-
-Lemma change_fst : forall x y z,
-fst_ext (x,y,z) = x.
-
-Proof.
-auto.
-Qed.
-
-Lemma change_snd : forall x y z,
-snd_ext (x,y,z) = y.
-
-Proof.
-auto.
-Qed.
-
-Lemma change_weight : forall x y z,
-get_weight (x,y,z) = z.
-
-Proof.
-auto.
-Qed.
-
-(* rewriting tactic *)
-
-Ltac change_rewrite :=
-repeat (try rewrite change_fst in *;try rewrite change_snd in *;try rewrite change_weight in *).
-
-(* two tactics for proving equality of edges *)
-
-Ltac Eq_eq :=
-apply eq_ordered_eq;unfold E.eq;split;[simpl;split;intuition|simpl;apply OptionN_as_OT.eq_refl].
-
-Ltac Eq_comm_eq := rewrite edge_comm;Eq_eq.
-
-Lemma eq_charac : forall x y,
-eq x y -> (Vertex.eq (fst_ext x) (fst_ext y) /\ Vertex.eq (snd_ext x) (snd_ext y)) \/
- (Vertex.eq (fst_ext x) (snd_ext y) /\ Vertex.eq (snd_ext x) (fst_ext y)).
-
-Proof.
-intros x y H;unfold eq in H;unfold ordered_edge in H;
-unfold get_edge in H.
-destruct (OTFacts.lt_dec (snd_ext x) (fst_ext x));
-destruct (OTFacts.lt_dec (snd_ext y) (fst_ext y));
-unfold E.eq in H;simpl in H;intuition.
-Qed.
-
-Section fold_assoc_interf_map.
-
-Variable A : Type.
-
-Inductive eq_set_option : option VertexSet.t -> option VertexSet.t -> Prop :=
-|None_eq : eq_set_option None None
-|Some_eq : forall s s', VertexSet.Equal s s' -> eq_set_option (Some s) (Some s').
-
-Definition EqualSetMap m1 m2 := forall x, eq_set_option (VertexMap.find x m1) (VertexMap.find x m2).
-
-Lemma EqualSetMap_refl : forall m, EqualSetMap m m.
-
-Proof.
-unfold EqualSetMap. intro m. intro x.
-destruct (VertexMap.find x m).
-constructor. intuition.
-constructor.
-Qed.
-
-Lemma EqualSetMap_trans : forall m1 m2 m3,
-EqualSetMap m1 m2 ->
-EqualSetMap m2 m3 ->
-EqualSetMap m1 m3.
-
-Proof.
-intros m1 m2 m3 H H0.
-unfold EqualSetMap in *.
-intro x.
-generalize (H x). clear H. intro H.
-generalize (H0 x). clear H0. intro H0.
-destruct (VertexMap.find x m1).
-inversion H. subst.
-rewrite <-H2 in H0.
-destruct (VertexMap.find x m3).
-constructor. inversion H0. subst.
-rewrite H3. assumption.
-inversion H0.
-destruct (VertexMap.find x m3).
-inversion H0. inversion H. subst. rewrite <-H4 in H1. inversion H1.
-constructor.
-Qed.
-
-Lemma fold_left_compat_map : forall (f : VertexMap.t VertexSet.t -> A -> VertexMap.t VertexSet.t) l e e',
-EqualSetMap e e' ->
-(forall e1 e2 a, EqualSetMap e1 e2 -> EqualSetMap (f e1 a) (f e2 a)) ->
-EqualSetMap (fold_left f l e) (fold_left f l e').
-
-Proof.
-intro f;induction l;simpl.
-auto.
-intros e e' H H0 H1.
-apply (IHl (f e a) (f e' a)).
-apply H0;assumption.
-assumption.
-Qed.
-
-Lemma fold_left_assoc_map : forall l (f : VertexMap.t VertexSet.t -> A -> VertexMap.t VertexSet.t) x h,
-(forall (y z : A) s, EqualSetMap (f (f s y) z) (f (f s z) y)) ->
-(forall e1 e2 a, EqualSetMap e1 e2 -> EqualSetMap (f e1 a) (f e2 a)) ->
-EqualSetMap (fold_left f (h :: l) x) (f (fold_left f l x) h).
-
-Proof.
-induction l;simpl;intros f x h H H0.
-apply EqualSetMap_refl.
-apply EqualSetMap_trans with (m2 := fold_left f (h :: l) (f x a)).
-simpl. apply fold_left_compat_map. apply H.
-assumption.
-apply IHl. assumption. assumption.
-Qed.
-
-End fold_assoc_interf_map.
-
-Lemma fold_assoc : forall g g' y0 z s,
-(forall x y a, EdgeSet.Equal (g x (g' y a)) (g' y (g x a))) ->
-(forall (y z0 : VertexSet.elt) (s0 : EdgeSet.t),
-EdgeSet.Equal (g z0 (g y s0)) (g y (g z0 s0))) ->
-(forall (e1 e2 : EdgeSet.t) (a1 : VertexSet.elt),
-EdgeSet.Equal e1 e2 -> EdgeSet.Equal (g a1 e1) (g a1 e2)) ->
-(forall (e1 e2 : EdgeSet.t) (a1 : VertexSet.elt),
-EdgeSet.Equal e1 e2 -> EdgeSet.Equal (g' a1 e1) (g' a1 e2)) ->
-(forall (y z0 : VertexSet.elt) (s0 : EdgeSet.t),
-EdgeSet.Equal (g' z0 (g' y s0)) (g' y (g' z0 s0))) ->
-EdgeSet.Equal (VertexSet.fold g z (VertexSet.fold g' y0 s))
- (VertexSet.fold g' y0 (VertexSet.fold g z s)).
-
-Proof.
-intros.
-repeat rewrite VertexSet.fold_1.
-set (f1 := fun (a : EdgeSet.t) (e : VertexSet.elt) => g e a).
-set (f2 := fun (a : EdgeSet.t) (e : VertexSet.elt) => g' e a).
-induction (VertexSet.elements z). simpl.
-apply EdgeSet.eq_refl.
-
-set (l' := VertexSet.elements y0) in *.
-assert (EdgeSet.Equal (fold_left f2 l' (fold_left f1 (a :: l) s))
- (fold_left f2 l' (f1 (fold_left f1 l s) a))).
-apply MEdgeFacts.fold_left_compat_set.
-apply MEdgeFacts.fold_left_assoc.
-
-unfold f2. assumption.
-unfold f2. assumption.
-unfold f1. assumption.
-
-apply EdgeSet.eq_trans with (s' := (fold_left f2 l' (f1 (fold_left f1 l s) a))).
-set (s' := fold_left f1 l s) in *.
-cut (EdgeSet.Equal (fold_left f2 l' (f1 s' a)) (f1 (fold_left f2 l' s') a)).
-intro.
-apply EdgeSet.eq_trans with (s' := f1 (fold_left f2 l' s') a).
-rewrite MEdgeFacts.fold_left_assoc.
-apply H1. assumption.
-assumption.
-assumption.
-apply EdgeSet.eq_sym. auto.
-
-clear IHl. clear H4.
-induction l'. simpl. apply EdgeSet.eq_refl.
-assert (EdgeSet.Equal (f1 (fold_left f2 (a0 :: l') s') a)
- (f1 (f2 (fold_left f2 l' s') a0) a)).
-apply H1.
-apply MEdgeFacts.fold_left_assoc.
-assumption.
-assumption.
-apply EdgeSet.eq_trans with (s':= (f1 (f2 (fold_left f2 l' s') a0) a)).
-rewrite MEdgeFacts.fold_left_assoc.
-apply EdgeSet.eq_trans with (s' := f2 (f1 (fold_left f2 l' s') a) a0).
-apply H2. assumption.
-unfold f1. unfold f2.
-unfold EdgeSet.eq. apply EdgeSet.eq_sym.
-apply H.
-assumption.
-assumption.
-apply H1. apply EdgeSet.eq_sym. apply MEdgeFacts.fold_left_assoc.
-assumption.
-assumption.
-apply EdgeSet.eq_sym. auto.
-Qed.
-
-Lemma edgemap_to_edgeset_charac : forall m x y (w : option N),
-(forall a b, VertexSet.In a (adj_set b m) ->
- VertexSet.In b (adj_set a m)) ->
-(EdgeSet.In (x,y,w) (edgemap_to_edgeset m w) <-> VertexSet.In y (adj_set x m)).
-
-Proof.
-intros m x y w Hsym. split; intros.
-unfold edgemap_to_edgeset in H.
-rewrite VertexMap.fold_1 in H.
-generalize VertexMap.elements_2. intro.
-generalize (H0 _ m). clear H0. intro HH.
-induction (VertexMap.elements m).
-simpl in H.
-elim (EdgeSet.empty_1 H).
-set (f := (fun (a : EdgeSet.t) (p : VertexMap.key * VertexSet.t) =>
- VertexSet.fold
- (fun (z : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.add (fst p, z, w) s') (snd p) a)) in *.
-case_eq a; intros; subst.
-rewrite MEdgeFacts.fold_left_assoc in H.
-set (s := fold_left f l EdgeSet.empty) in *.
-unfold f in H. simpl in H.
-assert (EdgeSet.In (x,y,w) s \/ (VertexSet.In y t0 /\ Vertex.eq k x) \/
- (VertexSet.In x t0 /\ Vertex.eq k y)).
-clear IHl. intros.
-rewrite VertexSet.fold_1 in H.
-generalize VertexSet.elements_2.
-intro H0. generalize (H0 t0). clear H0. intro Helt.
-induction (VertexSet.elements t0).
-simpl in H. left. assumption.
-rewrite MEdgeFacts.fold_left_assoc in H.
-destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H).
-fold (eq (k,a,w) (x,y,w)) in H0.
-right.
-destruct (eq_charac _ _ H0); destruct H1; change_rewrite.
-left. split.
-apply Helt. left. apply Vertex.eq_sym. assumption.
-assumption.
-right. split.
-apply Helt. left. apply Vertex.eq_sym. assumption.
-assumption.
-apply IHl0. assumption.
-intros. apply Helt. right. assumption.
-
-intros. apply RegRegProps.add_add.
-intros. apply RegRegProps.Dec.F.add_m. apply eq_refl. assumption.
-
-destruct H0.
-apply IHl.
-assumption.
-intros. apply HH. auto.
-destruct H0.
-assert (VertexMap.MapsTo x t0 m).
-apply HH.
-left.
-constructor; simpl; intuition.
-generalize (VertexMap.find_1 H1). clear H1. intro H1.
-unfold adj_set. rewrite H1. intuition.
-apply Hsym.
-assert (VertexMap.MapsTo y t0 m).
-apply HH.
-left.
-constructor; simpl; intuition.
-generalize (VertexMap.find_1 H1). clear H1. intro H1.
-unfold adj_set. rewrite H1. intuition.
-
-unfold f.
-intros. set (g := (fun (z0 : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.add (fst z, z0, w) s')).
-set (g' := fun (z0 : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.add (fst y0, z0, w) s').
-apply fold_assoc.
-unfold g. unfold g'.
-intros. apply RegRegProps.add_add.
-unfold g. unfold g'.
-intros. apply RegRegProps.add_add.
-intros. apply RegRegProps.Dec.F.add_m. apply eq_refl. assumption.
-intros. apply RegRegProps.Dec.F.add_m. apply eq_refl. assumption.
-unfold g. unfold g'.
-intros. apply RegRegProps.add_add.
-intros.
-unfold f.
-rewrite VertexSet.fold_1.
-rewrite VertexSet.fold_1.
-apply MEdgeFacts.fold_left_compat_set.
-assumption.
-intros. apply RegRegProps.Dec.F.add_m. apply eq_refl. assumption.
-
-unfold edgemap_to_edgeset.
-rewrite VertexMap.fold_1.
-generalize VertexMap.elements_1. intro.
-case_eq (VertexMap.find x m); intros.
-generalize (H0 _ m x t0). clear H0. intro HH.
-induction (VertexMap.elements m).
-simpl.
-assert (VertexMap.MapsTo x t0 m).
-apply VertexMap.find_2. assumption.
-generalize (HH H0). intro H2. inversion H2.
-
-set (f := (fun (a : EdgeSet.t) (p : VertexMap.key * VertexSet.t) =>
- VertexSet.fold
- (fun (z : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.add (fst p, z, w) s') (snd p) a)) in *.
-rewrite MEdgeFacts.fold_left_assoc.
-set (s := fold_left f l EdgeSet.empty) in *.
-unfold f.
-destruct a. simpl.
-rewrite VertexSet.fold_1.
-generalize VertexSet.elements_1.
-intro H2. generalize (H2 t1 y). clear H2. intro HHH.
-induction (VertexSet.elements t1). simpl.
-assert (VertexMap.MapsTo x t0 m).
-apply VertexMap.find_2. assumption.
-generalize (HH H0). intro H2.
-inversion H2; subst.
-inversion H4. simpl in H3. simpl in H5. subst.
-unfold adj_set in H. rewrite H1 in H.
-generalize (HHH H). intro. inversion H5.
-apply IHl. intro. auto.
-
-rewrite MEdgeFacts.fold_left_assoc.
-generalize (VertexMap.find_2 H1). intro.
-generalize (HH H0). clear HH H0. intro HH.
-inversion HH; subst.
-inversion H2; simpl in *; subst. clear H2 HH.
-destruct (Vertex.eq_dec y a).
-apply EdgeSet.add_1.
-Eq_eq.
-apply EdgeSet.add_2.
-apply IHl0.
-intro H2. generalize (HHH H2). clear HHH H2. intro H2.
-inversion H2. subst.
-elim (n H4).
-assumption.
-apply EdgeSet.add_2.
-assert (forall l', EdgeSet.In (x,y,w) s ->
- EdgeSet.In (x, y, w)
- (fold_left
- (fun (a0 : EdgeSet.t) (e : VertexSet.elt) => EdgeSet.add (k, e, w) a0)
- l' s)).
-clear H HH H1 H2 IHl IHl0 HHH Hsym.
-intros.
-induction l'. simpl. assumption.
-rewrite MEdgeFacts.fold_left_assoc.
-destruct (Edge.eq_dec (k,a0,w) (x,y,w)).
-apply EdgeSet.add_1. auto.
-apply EdgeSet.add_2. apply IHl'.
-
-intros. apply RegRegProps.add_add.
-intros. apply RegRegProps.Dec.F.add_m. apply eq_refl. assumption.
-
-apply H0.
-apply IHl.
-auto.
-
-intros. apply RegRegProps.add_add.
-intros. apply RegRegProps.Dec.F.add_m. apply eq_refl. assumption.
-
-unfold f.
-intros. set (g := (fun (z0 : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.add (fst z, z0, w) s')).
-set (g' := fun (z0 : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.add (fst y0, z0, w) s').
-apply fold_assoc.
-unfold g. unfold g'.
-intros. apply RegRegProps.add_add.
-unfold g. unfold g'.
-intros. apply RegRegProps.add_add.
-intros. apply RegRegProps.Dec.F.add_m. apply eq_refl. assumption.
-intros. apply RegRegProps.Dec.F.add_m. apply eq_refl. assumption.
-unfold g. unfold g'.
-intros. apply RegRegProps.add_add.
-intros.
-unfold f.
-rewrite VertexSet.fold_1.
-rewrite VertexSet.fold_1.
-apply MEdgeFacts.fold_left_compat_set.
-assumption.
-intros. apply RegRegProps.Dec.F.add_m. apply eq_refl. assumption.
-
-unfold adj_set in H. rewrite H1 in H. elim (VertexSet.empty_1 H).
-Qed.
-
-Require Import FMapFacts.
-
-Module InterfFacts := FMapFacts.Facts VertexMap.
-
-Lemma imap_remove_1 : forall x y m r,
-~Vertex.eq r x ->
-~Vertex.eq r y ->
-VertexSet.In x (adj_set y m) ->
-VertexSet.In x (adj_set y (imap_remove m r)).
-
-Proof.
-intros.
-unfold imap_remove.
-unfold adj_set.
-cut (VertexSet.In x match
- (VertexMap.find (elt:=VertexSet.t) y
- (VertexMap.remove (elt:=VertexSet.t) r
- (VertexSet.fold
- (fun y0 : VertexSet.elt =>
- VertexMap.add y0 (VertexSet.remove r (adj_set y0 m)))
- (adj_set r m) m))) with
- | Some x0 => x0
- | None => VertexSet.empty
-end); auto.
-rewrite MapFacts.remove_neq_o.
-
-rewrite VertexSet.fold_1.
-induction (VertexSet.elements (adj_set r m)); intros.
-simpl. assumption.
-
-set (f:= (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove r (adj_set e m)) a)) in *.
-assert (EqualSetMap (fold_left f (a :: l) m) (f (fold_left f l m) a)).
-apply fold_left_assoc_map.
-intros.
-unfold f. unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.remove_m. apply Vertex.eq_refl.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_trans (Vertex.eq_sym e) e0)).
-apply VertexSet.eq_refl. apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.remove_m. apply Vertex.eq_refl.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.remove_m. apply Vertex.eq_refl.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-apply Regs.eq_sym. auto.
-
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s); constructor; auto.
-apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-intros.
-unfold f.
-unfold EqualSetMap.
-intros.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Vertex.eq_sym. assumption.
-apply Vertex.eq_sym. assumption.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H2. auto. auto.
-unfold EqualSetMap in H2.
-generalize (H2 y). intro H3.
-case_eq (VertexMap.find y (fold_left f (a :: l) m)); intros.
-rewrite H4 in H3. inversion H3. subst.
-unfold f in H6.
-destruct (Vertex.eq_dec y a).
-rewrite MapFacts.add_eq_o in H6. inversion H6.
-rewrite H7. rewrite H8. apply VertexSet.remove_2.
-auto. unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e)). assumption.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o in H6.
-rewrite H7. unfold f in IHl.
-case_eq (VertexMap.find (elt:=VertexSet.t) y
- (fold_left
- (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove r (adj_set e m)) a) l m)); intros;
-rewrite H5 in *.
-inversion H6. subst.
-assumption.
-inversion H6.
-auto.
-rewrite H4 in H3. inversion H3. subst.
-unfold f in H5.
-destruct (Vertex.eq_dec y a).
-rewrite MapFacts.add_eq_o in H5.
-inversion H5.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o in H5.
-unfold f in IHl.
-case_eq (VertexMap.find (elt:=VertexSet.t) y
- (fold_left
- (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove r (adj_set e m)) a) l m)); intros;
-rewrite H6 in *.
-inversion H5.
-assumption.
-auto.
-auto.
-Qed.
-
-Lemma imap_remove_2 : forall x y m r,
-Vertex.eq r x \/ Vertex.eq r y ->
-(forall a b, VertexSet.In a (adj_set b m) ->
- VertexSet.In b (adj_set a m)) ->
-~VertexSet.In x (adj_set y (imap_remove m r)).
-
-Proof.
-intros x y m r H HH.
-unfold imap_remove.
-unfold adj_set.
-cut (~VertexSet.In x match
- (VertexMap.find (elt:=VertexSet.t) y
- (VertexMap.remove (elt:=VertexSet.t) r
- (VertexSet.fold
- (fun y0 : VertexSet.elt =>
- VertexMap.add y0 (VertexSet.remove r (adj_set y0 m)))
- (adj_set r m) m))) with
- | Some x0 => x0
- | None => VertexSet.empty
-end); auto.
-destruct (Vertex.eq_dec r y).
-rewrite MapFacts.remove_eq_o.
-apply VertexSet.empty_1.
-assumption.
-rewrite MapFacts.remove_neq_o.
-destruct H.
-
-generalize VertexSet.elements_1. intro HHH.
-generalize (HHH (adj_set r m) y). clear HHH. intro HHH.
-rewrite VertexSet.fold_1.
-induction (VertexSet.elements (adj_set r m)); intros.
-simpl. intro H0.
-generalize (HH _ _ H0). intro H1.
-assert (InA Vertex.eq y nil).
-apply HHH.
-unfold adj_set. rewrite (MapFacts.find_o _ H). assumption.
-inversion H2.
-
-set (f:= (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove r (adj_set e m)) a)) in *.
-assert (EqualSetMap (fold_left f (a :: l) m) (f (fold_left f l m) a)).
-apply fold_left_assoc_map.
-intros.
-unfold f. unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.remove_m. apply Vertex.eq_refl.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_trans (Vertex.eq_sym e) e0)).
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.remove_m. apply Vertex.eq_refl.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.remove_m. apply Vertex.eq_refl.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s); constructor; auto.
-apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-intros.
-unfold f.
-unfold EqualSetMap.
-intros.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Vertex.eq_sym. assumption.
-apply Vertex.eq_sym. assumption.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H0. auto. auto.
-
-unfold EqualSetMap in H0.
-generalize (H0 y). intro H1.
-case_eq (VertexMap.find y (fold_left f (a :: l) m)); intros.
-rewrite H2 in H1. inversion H1. subst.
-unfold f in H4.
-destruct (Vertex.eq_dec y a).
-rewrite MapFacts.add_eq_o in H4. inversion H4.
-rewrite H5. rewrite H6. apply VertexSet.remove_1. auto. apply Regs.eq_sym. auto.
-
-rewrite MapFacts.add_neq_o in H4.
-rewrite H5. unfold f in IHl.
-case_eq (VertexMap.find (elt:=VertexSet.t) y
- (fold_left
- (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove r (adj_set e m)) a) l m)); intros;
-rewrite H3 in *.
-inversion H4. subst.
-apply IHl.
-intros; intuition.
-inversion H7; subst.
-elim (n0 H9). assumption.
-inversion H4.
-auto.
-apply VertexSet.empty_1.
-elim (n H).
-auto.
-Qed.
-
-Lemma imap_remove_3 : forall x y m r,
-VertexSet.In x (adj_set y (imap_remove m r)) ->
-VertexSet.In x (adj_set y m).
-
-Proof.
-intros.
-assert (VertexSet.In x match
- (VertexMap.find (elt:=VertexSet.t) y
- (VertexMap.remove (elt:=VertexSet.t) r
- (VertexSet.fold
- (fun y0 : VertexSet.elt =>
- VertexMap.add y0 (VertexSet.remove r (adj_set y0 m)))
- (adj_set r m) m))) with
- | Some x0 => x0
- | None => VertexSet.empty
-end) by auto. generalize H0. clear H H0. intro H.
-destruct (Vertex.eq_dec y r).
-rewrite MapFacts.remove_eq_o in H.
-elim (VertexSet.empty_1 H). apply Regs.eq_sym. auto.
-rewrite MapFacts.remove_neq_o in H.
-unfold adj_set.
-rewrite VertexSet.fold_1 in H.
-
-generalize VertexSet.elements_2. intro.
-generalize (H0 (adj_set y m) x). clear H0. intro HH.
-
-induction (VertexSet.elements (adj_set r m)). simpl in H. assumption.
-
-set (f:= (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove r (adj_set e m)) a)) in *.
-assert (EqualSetMap (fold_left f (a :: l) m) (f (fold_left f l m) a)).
-apply fold_left_assoc_map.
-intros.
-unfold f. unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.remove_m. apply Vertex.eq_refl.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_trans (Vertex.eq_sym e) e0)).
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.remove_m. apply Vertex.eq_refl.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.remove_m. apply Vertex.eq_refl.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s); constructor; auto.
-apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-intros.
-unfold f.
-unfold EqualSetMap.
-intros.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Vertex.eq_sym. assumption.
-apply Vertex.eq_sym. assumption.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H0. auto. auto.
-
-unfold EqualSetMap in H0.
-generalize (H0 y).
-case_eq (VertexMap.find y (fold_left f (a :: l) m)); intros.
-rewrite H1 in *. inversion H2. subst.
-unfold f in H4.
-destruct (Vertex.eq_dec y a).
-rewrite MapFacts.add_eq_o in H4.
-apply HH.
-apply VertexSet.elements_1.
-unfold adj_set. rewrite (MapFacts.find_o _ e). fold (adj_set a m).
-apply VertexSet.remove_3 with (x:=r).
-inversion H4. subst. rewrite <-H5. assumption.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o in H4.
-fold f in H4. rewrite <-H4 in IHl.
-apply IHl.
-rewrite <-H5. assumption.
-auto.
-
-inversion H2. subst. rewrite <-H3 in *. rewrite H1 in *.
-elim (VertexSet.empty_1 H).
-auto.
-Qed.
-
-Lemma imap_remove_4 : forall x m r,
-VertexMap.In x (imap_remove m r) ->
-(forall a b, VertexSet.In a (adj_set b m) ->
- VertexSet.In b (adj_set a m)) ->
-VertexMap.In x m.
-
-Proof.
-intros x m r H Hsym.
-unfold imap_remove in H.
-destruct (Vertex.eq_dec x r).
-elim (VertexMap.remove_1 (Vertex.eq_sym e) H).
-apply (proj2 (MapFacts.in_find_iff _ _)).
-generalize (proj1 (MapFacts.in_find_iff _ _) H). clear H. intro H.
-rewrite MapFacts.remove_neq_o in H.
-rewrite VertexSet.fold_1 in H. intro H0. elim H. clear H.
-
-generalize VertexSet.elements_2. intro.
-generalize (H (adj_set r m) x). clear H. intro HH.
-
-induction (VertexSet.elements (adj_set r m)). simpl.
-assumption.
-
-set (f:= (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove r (adj_set e m)) a)) in *.
-assert (EqualSetMap (fold_left f (a :: l) m) (f (fold_left f l m) a)).
-apply fold_left_assoc_map.
-intros.
-unfold f. unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.remove_m. apply Vertex.eq_refl.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_trans (Vertex.eq_sym e) e0)).
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.remove_m. apply Vertex.eq_refl.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.remove_m. apply Vertex.eq_refl.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s); constructor; auto.
-apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-intros.
-unfold f.
-unfold EqualSetMap.
-intros.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Vertex.eq_sym. assumption.
-apply Vertex.eq_sym. assumption.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H. auto. auto.
-
-generalize (H x). clear H. intro H.
-case_eq (VertexMap.find x (fold_left f (a :: l) m)); intros.
-rewrite H1 in H. inversion H. subst.
-unfold f in H3.
-destruct (Vertex.eq_dec x a).
-assert (VertexSet.In r (adj_set x m)).
-apply Hsym. apply HH. left. auto.
-unfold adj_set in H2. rewrite H0 in H2. elim (VertexSet.empty_1 H2).
-rewrite MapFacts.add_neq_o in H3.
-fold f in H3.
-assert (VertexMap.find x (fold_left f l m) = None).
-apply IHl.
-intro. apply HH. auto.
-rewrite H2 in H3. inversion H3.
-auto.
-reflexivity.
-auto.
-Qed.
-
-Lemma imap_remove_5 : forall r x m,
-VertexMap.In x m ->
-~Vertex.eq x r ->
-VertexMap.In x (imap_remove m r).
-
-Proof.
-intros.
-unfold imap_remove.
-rewrite MapFacts.in_find_iff.
-rewrite MapFacts.remove_neq_o.
-rewrite VertexSet.fold_1.
-set (f := (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove r (adj_set e m)) a)).
-induction (VertexSet.elements (adj_set r m)). simpl.
-rewrite MapFacts.in_find_iff in H. assumption.
-
-cut (VertexMap.find x (f (fold_left f l m) a) <> None).
-intro H1.
-cut (EqualSetMap (fold_left f (a :: l) m) (f (fold_left f l m) a)). intro H2.
-generalize (H2 x). clear H2. intro H2. inversion H2.
-simpl. rewrite <-H4 in *. rewrite <-H5 in *. assumption.
-simpl. rewrite <-H3 in *. congruence.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f. intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.remove_m. apply Vertex.eq_refl.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_trans (Vertex.eq_sym e) e0)).
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.remove_m. apply Vertex.eq_refl.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.remove_m. apply Vertex.eq_refl.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s); constructor; auto.
-apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-intros.
-unfold f.
-unfold EqualSetMap.
-intros.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Vertex.eq_sym. assumption.
-apply Vertex.eq_sym. assumption.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H2. auto. auto.
-
-set (tmp := fold_left f l m) in *.
-unfold f.
-destruct (Vertex.eq_dec x a).
-rewrite MapFacts.add_eq_o. congruence.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-assumption.
-auto.
-auto.
-Qed.
-
-Lemma extremities_in_remove_vertex_imap v g :
-forall x,
-VertexMap.In x (imap_remove (imap g) v) <->
-VertexSet.In x (VertexSet.remove v (V g)).
-
-Proof.
-split; intros.
-apply VertexSet.remove_2.
-unfold imap_remove in H.
-intro Helim; apply (VertexMap.remove_1 Helim H).
-apply (extremities_imap g x); apply imap_remove_4 with (r:=v); try assumption.
-exact (sym_imap g).
-
-generalize (proj2 (extremities_imap g x)). intro.
-generalize (H0 (VertexSet.remove_3 H)). clear H0. intro H0.
-apply imap_remove_5. assumption.
-intro H1. elim (VertexSet.remove_1 (Vertex.eq_sym H1) H).
-Qed.
-
-Lemma extremities_in_remove_vertex_pmap v g :
-forall x,
-VertexMap.In x (imap_remove (pmap g) v) <->
-VertexSet.In x (VertexSet.remove v (V g)).
-
-Proof.
-split; intros.
-apply VertexSet.remove_2.
-unfold imap_remove in H.
-intro Helim; apply (VertexMap.remove_1 Helim H).
-apply (extremities_pmap g x); apply imap_remove_4 with (r:=v); try assumption.
-exact (sym_pmap g).
-
-generalize (proj2 (extremities_pmap g x)). intro.
-generalize (H0 (VertexSet.remove_3 H)). clear H0. intro H0.
-apply imap_remove_5. assumption.
-intro H1. elim (VertexSet.remove_1 (Vertex.eq_sym H1) H).
-Qed.
-
-Lemma simple_graph_remove_vertex_map v g :
-forall x y,
-VertexSet.In x (adj_set y (imap_remove (imap g) v)) /\
-VertexSet.In x (adj_set y (imap_remove (pmap g) v)) ->
-False.
-
-Proof.
-intros.
-apply (simple_graph g x y).
-destruct H.
-generalize (imap_remove_3 _ _ _ _ H).
-generalize (imap_remove_3 _ _ _ _ H0).
-auto.
-Qed.
-
-Lemma not_eq_extremities_remove_vertex_map v g : forall x y,
-VertexSet.In x (adj_set y (imap_remove (imap g) v)) \/
-VertexSet.In x (adj_set y (imap_remove (pmap g) v)) ->
-~Vertex.eq x y.
-
-Proof.
-intros.
-apply (not_eq_extremities g).
-destruct H;[left|right]; apply (imap_remove_3 _ _ _ _ H).
-Qed.
-
-Lemma sym_imap_remove_vertex v g :
-forall (x : VertexSet.elt) (y : VertexMap.key),
-VertexSet.In x (adj_set y (imap_remove (imap g) v)) ->
-VertexSet.In y (adj_set x (imap_remove (imap g) v)).
-
-Proof.
-intros.
-generalize (imap_remove_2 x y (imap g) v). intro H0.
-apply imap_remove_1.
-intro H1. elim (H0 (or_intror _ H1) (sym_imap g) H).
-intro H1. elim (H0 (or_introl _ H1) (sym_imap g) H).
-generalize (imap_remove_3 _ _ _ _ H). intro H1.
-apply (sym_imap g). assumption.
-Qed.
-
-Lemma sym_pmap_remove_vertex v g :
-forall (x : VertexSet.elt) (y : VertexMap.key),
-VertexSet.In x (adj_set y (imap_remove (pmap g) v)) ->
-VertexSet.In y (adj_set x (imap_remove (pmap g) v)).
-
-Proof.
-intros.
-generalize (imap_remove_2 x y (pmap g) v). intro H0.
-apply imap_remove_1.
-intro H1. elim (H0 (or_intror _ H1) (sym_pmap g) H).
-intro H1. elim (H0 (or_introl _ H1) (sym_pmap g) H).
-generalize (imap_remove_3 _ _ _ _ H). intro H1.
-apply (sym_pmap g). assumption.
-Qed.
-
-Definition remove_vertex v g :=
-Make_Graph (VertexSet.remove v (V g))
- (imap_remove (imap g) v)
- (imap_remove (pmap g) v)
- (extremities_in_remove_vertex_imap v g)
- (extremities_in_remove_vertex_pmap v g)
- (simple_graph_remove_vertex_map v g)
- (sym_imap_remove_vertex v g)
- (sym_pmap_remove_vertex v g)
- (not_eq_extremities_remove_vertex_map v g).
-
-Definition map_merge e map :=
-let adj_snd := VertexSet.remove (fst_ext e) (adj_set (snd_ext e) map) in
-let adj_fst := VertexSet.remove (snd_ext e) (adj_set (fst_ext e) map) in
-let new_fst_adj := VertexSet.union adj_fst adj_snd in
-(*
-let new_fst_adj_ := VertexSet.union (adj_set (fst_ext e) map) (adj_set (snd_ext e) map) in
-let new_fst_adj := VertexSet.remove (fst_ext e) (VertexSet.remove (snd_ext e) new_fst_adj_) in
-let m := VertexMap.add (fst_ext e) new_fst_adj map in
-*)
-let redirect_m :=
- VertexSet.fold
- (fun y m' =>
- VertexMap.add y
- (VertexSet.add (fst_ext e) (VertexSet.remove (snd_ext e) (adj_set y map))) m')
- adj_snd
-(*
- (VertexSet.remove (fst_ext e) (adj_set (snd_ext e) m))
-*)
- map in
-VertexMap.remove (snd_ext e)
-(VertexMap.add (fst_ext e) new_fst_adj redirect_m).
-
-Definition imap_merge e g := map_merge e (imap g).
-
-Definition resolve_conflicts y pm padj iadj :=
-let m' := VertexSet.fold
- (fun x m => VertexMap.add x (VertexSet.remove y (adj_set x pm)) m)
- (VertexSet.inter padj iadj)
- pm
-in VertexMap.add y (VertexSet.diff padj iadj) m'.
-
-Definition pmap_merge e g im :=
-let pm := map_merge e (pmap g) in
-resolve_conflicts (fst_ext e) pm (adj_set (fst_ext e) pm) (adj_set (fst_ext e) im).
-
-Definition In_graph_edge e g :=
-EdgeSet.In e (AE g) \/ EdgeSet.In e (IE g).
-
-Lemma In_graph_edge_dec : forall e g,
-{In_graph_edge e g}+{~In_graph_edge e g}.
-
-Proof.
-intros e g.
-destruct (RegRegProps.In_dec e (AE g)).
-left. left. assumption.
-destruct (RegRegProps.In_dec e (IE g)).
-left. right. assumption.
-right. intro H. destruct H;[elim n|elim n0];assumption.
-Qed.
-
-Lemma aff_edge_dec : forall e,
-{aff_edge e}+{~aff_edge e}.
-
-Proof.
-intro e.
-case_eq (get_weight e).
-intros n H. left. unfold aff_edge. exists n. auto.
-intro H. right. intro H0. unfold aff_edge in H0.
-destruct H0 as [w H0]. rewrite H0 in H. inversion H.
-Qed.
-
-Definition In_graph (v : Vertex.t) g := VertexSet.In v (V g).
-
-Add Morphism get_weight : get_weight_m.
-
-Proof.
-intros x y H.
-rewrite (weight_ordered_weight x);rewrite (weight_ordered_weight y).
-unfold get_weight;unfold E.eq in H.
-destruct H as [_ H];inversion H;[|rewrite H2];reflexivity.
-Qed.
-
-Lemma E_weights_aux : forall e map w s,
-EdgeSet.In e
-(VertexMap.fold
- (fun y imapy s => VertexSet.fold
- (fun z s' => EdgeSet.add (y,z,w) s')
- imapy
- s)
- map
- s) ->
-EdgeSet.In e s \/ get_weight e = w.
-
-Proof.
-intros.
-rewrite VertexMap.fold_1 in H.
-generalize H. clear H. generalize (VertexMap.elements map) s.
-induction l.
-simpl. auto.
-intros. simpl in H.
-set (s' := VertexSet.fold
- (fun (z : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.add (fst a, z, w) s') (snd a) s0) in H.
-generalize (IHl s' H). intro H0.
-destruct H0.
-unfold s' in H0.
-
-assert (EdgeSet.In e (VertexSet.fold (fun (z : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.add (fst a, z, w) s') (snd a) s0) -> EdgeSet.In e s0 \/ get_weight e = w).
-clear H IHl.
-rewrite VertexSet.fold_1.
-induction (VertexSet.elements (snd a)).
-simpl. auto.
-rewrite MEdgeFacts.fold_left_assoc.
-intro H1. destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H1).
-fold (eq (fst a, a0, w) e) in H.
-right. rewrite <-H. simpl. reflexivity.
-apply IHl0. assumption.
-
-intros. apply RegRegProps.add_add.
-intros. apply RegRegProps.Dec.F.add_m.
-apply eq_refl.
-assumption.
-apply H1. assumption.
-right. assumption.
-Qed.
-
-Lemma E_weights : forall e m w,
-EdgeSet.In e (edgemap_to_edgeset m w) -> get_weight e = w.
-
-Proof.
-intros.
-generalize (E_weights_aux e m w EdgeSet.empty). intro H0.
-destruct H0.
-assumption.
-elim (EdgeSet.empty_1 H0).
-assumption.
-Qed.
-
-Lemma IE_weights : forall g e,
-EdgeSet.In e (IE g) -> get_weight e = None.
-
-Proof.
-unfold IE. intros. eapply E_weights. eassumption.
-Qed.
-
-Lemma AE_weights : forall g e,
-EdgeSet.In e (AE g) -> get_weight e = Some N0.
-
-Proof.
-unfold AE. intros. eapply E_weights. eassumption.
-Qed.
-
-(* extremities of edges are in the graph *)
-Lemma In_graph_edge_in_ext : forall e g,
-In_graph_edge e g -> In_graph (fst_ext e) g /\ In_graph (snd_ext e) g.
-
-Proof.
-intros.
-split. destruct H.
-apply (proj1 (extremities_pmap g (fst_ext e))).
-
-generalize (AE_weights _ _ H). intro Hw.
-unfold AE in *.
-rewrite (edge_eq e) in H.
-simpl in Hw. rewrite Hw in H.
-generalize (proj1 (edgemap_to_edgeset_charac _ _ _ _(sym_pmap g)) H). intro H0.
-apply (proj2 (InterfFacts.in_find_iff _ _)).
-unfold adj_set in H0.
-case_eq (VertexMap.find (fst_ext e) (pmap g)); intros; rewrite H1 in H0.
-intro Helim. inversion Helim.
-elim (VertexSet.empty_1 H0).
-
-apply (proj1 (extremities_imap g (fst_ext e))).
-generalize (IE_weights _ _ H). intro Hw.
-unfold IE in *.
-rewrite (edge_eq e) in H.
-simpl in Hw. rewrite Hw in H.
-generalize (proj1 (edgemap_to_edgeset_charac _ _ _ _ (sym_imap g)) H). intro H0.
-apply (proj2 (InterfFacts.in_find_iff _ _)).
-unfold adj_set in H0.
-case_eq (VertexMap.find (fst_ext e) (imap g)); intros; rewrite H1 in H0.
-intro Helim. inversion Helim.
-elim (VertexSet.empty_1 H0).
-
-destruct H.
-apply (proj1 (extremities_pmap g (snd_ext e))).
-generalize (AE_weights _ _ H). intro Hw.
-unfold AE in *.
-rewrite (edge_eq e) in H. rewrite edge_comm in H.
-simpl in Hw. rewrite Hw in H.
-generalize (proj1 (edgemap_to_edgeset_charac _ _ _ _ (sym_pmap g)) H). intro H0.
-apply (proj2 (InterfFacts.in_find_iff _ _)).
-unfold adj_set in H0.
-case_eq (VertexMap.find (snd_ext e) (pmap g)); intros; rewrite H1 in H0.
-intro Helim. inversion Helim.
-elim (VertexSet.empty_1 H0).
-
-apply (proj1 (extremities_imap g (snd_ext e))).
-generalize (IE_weights _ _ H). intro Hw.
-unfold IE in *.
-rewrite (edge_eq e) in H. rewrite edge_comm in H.
-simpl in Hw. rewrite Hw in H.
-generalize (proj1 (edgemap_to_edgeset_charac _ _ _ _ (sym_imap g)) H). intro H0.
-apply (proj2 (InterfFacts.in_find_iff _ _)).
-unfold adj_set in H0.
-case_eq (VertexMap.find (snd_ext e) (imap g)); intros; rewrite H1 in H0.
-intro Helim. inversion Helim.
-elim (VertexSet.empty_1 H0).
-Qed.
-
-Lemma not_eq_extremities_map_merge : forall x y e m,
-(forall a b, VertexSet.In a (adj_set b m) -> ~Vertex.eq a b) ->
-VertexSet.In x (adj_set y (map_merge e m)) ->
-~Vertex.eq x y.
-
-Proof.
-intros x y e m Hsimp H.
-unfold map_merge in H.
-set (f := (fun (y : VertexSet.elt) (m' : VertexMap.t VertexSet.t) =>
- VertexMap.add y
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set y m))) m')) in *.
-set (s := (VertexSet.union
- (VertexSet.remove (snd_ext e) (adj_set (fst_ext e) m))
- (VertexSet.remove (fst_ext e) (adj_set (snd_ext e) m)))) in *.
-set (s' := (VertexSet.remove (fst_ext e) (adj_set (snd_ext e) m))) in *.
-intro.
-unfold adj_set in H. rewrite MapFacts.remove_neq_o in H.
-destruct (Vertex.eq_dec y (fst_ext e)).
-rewrite MapFacts.add_eq_o in H.
-unfold s in H.
-destruct (VertexSet.union_1 H).
-generalize (VertexSet.remove_3 H1). clear H1. intro H1.
-rewrite H0 in H1. rewrite e0 in H1.
-elim (Hsimp _ _ H1). auto.
-unfold s' in H1.
-rewrite H0 in H1. rewrite e0 in H1. elim (VertexSet.remove_1 (Vertex.eq_refl _) H1).
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o in H.
-
-rewrite VertexSet.fold_1 in H.
-set (f' := fun a e => f e a) in *.
-induction (VertexSet.elements s'). simpl in H.
-unfold adj_set in H.
-fold (adj_set y m) in H.
-elim (Hsimp _ _ H). assumption.
-
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H1 y). clear H1. intro H1. simpl in H. inversion H1; clear H1.
-unfold adj_set in H. rewrite <-H3 in H. elim (VertexSet.empty_1 H).
-
-rewrite <-H2 in H.
-set (tmp := fold_left f' l m) in *.
-unfold f' in H3. unfold f in H3.
-destruct (Vertex.eq_dec y a).
-rewrite MapFacts.add_eq_o in H3.
-inversion H3. subst. clear H3.
-rewrite H4 in H. clear H4.
-rewrite H0 in H.
-destruct (proj1 (Props.Dec.F.add_iff _ _ _) H).
-elim (n (Vertex.eq_sym H1)).
-generalize (VertexSet.remove_3 H1). intro.
-elim (Hsimp _ _ H3). auto. apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o in H3.
-rewrite <-H3 in IHl.
-apply IHl. rewrite <-H4. assumption.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H1. auto.
-auto.
-
-auto.
-
-intro. rewrite MapFacts.remove_eq_o in H. elim (VertexSet.empty_1 H). auto.
-Qed.
-
-Lemma resolve_conflicts_map_0 : forall x y e g,
-VertexSet.In x (adj_set y (resolve_conflicts (fst_ext e) (map_merge e (pmap g))
- (adj_set (fst_ext e) (map_merge e (pmap g)))
- (adj_set (fst_ext e) (imap_merge e g)))) ->
-VertexSet.In x (adj_set y (map_merge e (pmap g))).
-
-Proof.
-intros.
-unfold resolve_conflicts in H.
-set (f := (fun (x : VertexSet.elt) (m : VertexMap.t VertexSet.t) =>
- VertexMap.add x (VertexSet.remove (fst_ext e) (adj_set x (map_merge e (pmap g)))) m)) in *.
-set (s := (VertexSet.diff (adj_set (fst_ext e) (map_merge e (pmap g)))
- (adj_set (fst_ext e) (imap_merge e g)))) in *.
-set (inter := (VertexSet.inter (adj_set (fst_ext e) (map_merge e (pmap g)))
- (adj_set (fst_ext e) (imap_merge e g)))) in *.
-unfold adj_set in H.
-destruct (Vertex.eq_dec y (fst_ext e)). rewrite MapFacts.add_eq_o in H.
-unfold s in H.
-generalize (VertexSet.diff_1 H). intro H0.
-unfold adj_set. rewrite (MapFacts.find_o _ e0). assumption.
-apply Regs.eq_sym. auto.
-
-rewrite MapFacts.add_neq_o in H.
-rewrite VertexSet.fold_1 in H.
-set (f' := fun a e => f e a) in *.
-set (m := map_merge e (pmap g)) in *.
-induction (VertexSet.elements inter). simpl in H. assumption.
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H0 y). clear H0. simpl in H. intro H0. inversion H0; clear H0.
-rewrite <-H2 in H. elim (VertexSet.empty_1 H).
-set (tmp := fold_left f' l m) in *.
-unfold f' in H2. unfold f in H2.
-destruct (Vertex.eq_dec y a). rewrite MapFacts.add_eq_o in H2.
-rewrite <-H1 in H. rewrite H3 in H. clear H3.
-inversion H2; subst; clear H2.
-unfold adj_set. rewrite (MapFacts.find_o _ e0).
-apply (VertexSet.remove_3 H).
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o in H2.
-apply IHl. rewrite <-H2. rewrite <-H1 in H. rewrite <-H3. assumption.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H0. auto.
-auto.
-auto.
-Qed.
-
-Lemma pmap_merge_sub : forall x y e g,
-VertexSet.In x (adj_set y (pmap_merge e g (imap_merge e g))) ->
-VertexSet.In x (adj_set y (map_merge e (pmap g))).
-
-Proof.
-exact (fun x y e g H => resolve_conflicts_map_0 _ _ _ _ H).
-Qed.
-
-Lemma pmap_merge_domain_1 : forall x e g,
-In_graph_edge e g ->
-VertexMap.In x (map_merge e (pmap g)) ->
-VertexSet.In x (VertexSet.remove (snd_ext e) (V g)).
-
-Proof.
-intros x e g HH H.
-unfold map_merge in H.
-set (m := pmap g) in *.
-set (s := VertexSet.remove (fst_ext e) (adj_set (snd_ext e) m)) in *.
-set (adj := (VertexSet.union
- (VertexSet.remove (snd_ext e) (adj_set (fst_ext e) m)) s)) in *.
-set (f := (fun (y : VertexSet.elt) (m'0 : VertexMap.t VertexSet.t) =>
- VertexMap.add y
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set y m))) m'0)) in *.
-rewrite VertexSet.fold_1 in H.
-set (f' := fun a e => f e a) in *.
-rewrite MapFacts.in_find_iff in H.
-assert (~Vertex.eq x (snd_ext e)).
-intro. rewrite MapFacts.remove_eq_o in H. congruence. apply Regs.eq_sym. auto.
-apply VertexSet.remove_2. auto.
-rewrite MapFacts.remove_neq_o in H.
-destruct (Vertex.eq_dec x (fst_ext e)).
-rewrite e0. apply (proj1 (In_graph_edge_in_ext _ _ HH)).
-
-cut (forall z, VertexSet.In z s -> VertexSet.In z (V g)). intro HHH.
-generalize VertexSet.elements_2. intro H1.
-generalize (H1 s x). clear H1. intro Helt.
-
-induction (VertexSet.elements s). simpl in H.
-apply (proj1 (extremities_pmap g x)).
-rewrite MapFacts.in_find_iff.
-rewrite MapFacts.add_neq_o in H.
-assumption.
-auto.
-
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H1 x). clear H1. intro H1. simpl in H. inversion H1.
-rewrite MapFacts.add_neq_o in H.
-rewrite <-H3 in H. congruence. auto.
-set (tmp := fold_left f' l m) in *.
-unfold f' in H3. unfold f in H3.
-destruct (Vertex.eq_dec x a).
-apply HHH. apply Helt. left. auto.
-rewrite MapFacts.add_neq_o in H3.
-apply IHl.
-rewrite MapFacts.add_neq_o.
-congruence.
-auto.
-intro. apply Helt. right. auto. auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f. intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. unfold f'. unfold f. intros.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H1.
-auto.
-auto.
-
-intros.
-unfold s in H1.
-generalize (VertexSet.remove_3 H1). clear H1. intro H1.
-apply (proj1 (extremities_pmap g z)).
-rewrite MapFacts.in_find_iff.
-generalize (sym_pmap g _ _ H1). clear H1. intro H1.
-unfold adj_set in H1.
-destruct (VertexMap.find z (pmap g)).
-congruence.
-elim (VertexSet.empty_1 H1).
-auto.
-Qed.
-
-Lemma pmap_merge_domain_2 : forall x e g,
-In_graph_edge e g ->
-VertexSet.In x (VertexSet.remove (snd_ext e) (V g)) ->
-VertexMap.In x (map_merge e (pmap g)).
-
-Proof.
-intros x e g HH H.
-unfold map_merge.
-set (m := pmap g) in *.
-set (s := VertexSet.remove (fst_ext e) (adj_set (snd_ext e) m)) in *.
-set (adj := (VertexSet.union
- (VertexSet.remove (snd_ext e) (adj_set (fst_ext e) m)) s)) in *.
-set (f := (fun (y : VertexSet.elt) (m'0 : VertexMap.t VertexSet.t) =>
- VertexMap.add y
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set y m))) m'0)) in *.
-rewrite VertexSet.fold_1.
-set (f' := fun a e => f e a) in *.
-rewrite MapFacts.in_find_iff.
-assert (~Vertex.eq x (snd_ext e)).
-intro. elim (VertexSet.remove_1 (Vertex.eq_sym H0) H).
-generalize (VertexSet.remove_3 H). clear H. intro H.
-rewrite MapFacts.remove_neq_o.
-destruct (Vertex.eq_dec x (fst_ext e)).
-rewrite MapFacts.add_eq_o. congruence. apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-
-induction (VertexSet.elements s). simpl.
-rewrite <-MapFacts.in_find_iff.
-apply (proj2 (extremities_pmap g x)). assumption.
-
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H1 x). clear H1. intro H1. simpl. inversion H1.
-set (tmp := fold_left f' l m) in *.
-unfold f' in H4. unfold f in H4.
-destruct (Vertex.eq_dec x a).
-rewrite MapFacts.add_eq_o in H4. congruence. apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o in H4. congruence. auto.
-congruence.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f. intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. unfold f'. unfold f. intros.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H1.
-auto.
-auto.
-
-auto.
-auto.
-Qed.
-
-(* there is no loop in the graph *)
-Lemma In_graph_edge_diff_ext : forall e g,
-In_graph_edge e g -> ~Vertex.eq (snd_ext e) (fst_ext e).
-
-Proof.
-intros.
-apply (not_eq_extremities g).
-destruct H;[right|left].
-
-generalize (AE_weights _ _ H). intro Hw.
-unfold AE in *.
-rewrite (edge_eq e) in H.
-simpl in Hw. rewrite Hw in H.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ _(sym_pmap g)) H).
-
-generalize (IE_weights _ _ H). intro Hw.
-unfold IE in *.
-rewrite (edge_eq e) in H.
-simpl in Hw. rewrite Hw in H.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ _(sym_imap g)) H).
-Qed.
-
-Lemma extremities_in_merge_map e g :
-In_graph_edge e g ->
-(forall x,
-VertexMap.In x (map_merge e (pmap g)) <->
-VertexSet.In x (VertexSet.remove (snd_ext e) (V g))).
-
-Proof.
-intros e g HH x; split; intro H0.
-generalize H0. intro H.
-unfold map_merge in H0.
-apply VertexSet.remove_2.
-intro H1.
-elim (VertexMap.remove_1 H1 H0).
-generalize (proj1 (MapFacts.remove_in_iff _ _ _) H0). clear H0.
-intro H0. destruct H0.
-generalize (proj1 (MapFacts.add_in_iff _ _ _ _) H1). clear H1.
-intro H1.
-destruct H1.
-rewrite <-H1.
-apply (proj1 (In_graph_edge_in_ext _ _ HH)).
-apply (proj1 (extremities_pmap g x)).
-rewrite VertexSet.fold_1 in H1.
-set (f := (fun (a : VertexMap.t VertexSet.t) (e0 : VertexSet.elt) =>
- VertexMap.add e0
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set e0 (pmap g)))) a)) in *.
-set (s := VertexSet.remove (fst_ext e) (adj_set (snd_ext e) (pmap g))) in *.
-cut (forall z, In z (VertexSet.elements s) ->
- VertexMap.In z (pmap g)).
-intros HHH.
-induction (VertexSet.elements s).
-simpl in H1. assumption.
-set (m := pmap g) in *.
-cut (VertexMap.In x (f (fold_left f l m) a)).
-clear H1. intro H1.
-set (tmp := fold_left f l m) in *.
-unfold f in H1.
-destruct (Vertex.eq_dec x a).
-rewrite e0. apply (HHH a). left. auto.
-rewrite MapFacts.in_find_iff in H1.
-rewrite MapFacts.add_neq_o in H1.
-apply IHl.
-rewrite MapFacts.in_find_iff.
-assumption.
-intros. apply HHH. right. assumption.
-auto.
-
-assert (EqualSetMap (fold_left f (a :: l) m) (f (fold_left f l m) a)).
-apply fold_left_assoc_map.
-
-unfold EqualSetMap. intros.
-unfold f.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.add_m.
-apply Regs.eq_refl.
-apply RegFacts.Props.Dec.F.remove_m.
-apply Regs.eq_refl.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ e1).
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.add_m.
-apply Regs.eq_refl.
-apply RegFacts.Props.Dec.F.remove_m.
-apply Regs.eq_refl.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor. apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H2. auto.
-auto.
-rewrite MapFacts.in_find_iff.
-generalize (H2 x). intro.
-inversion H3.
-rewrite MapFacts.in_find_iff in H1.
-simpl in H1. rewrite <-H5 in H1. assumption.
-congruence.
-
-intros.
-exists (adj_set z (pmap g)). apply VertexMap.elements_2.
-apply VertexMap.elements_1.
-unfold adj_set.
-case_eq (VertexMap.find z (pmap g)); intros.
-apply VertexMap.find_2. assumption.
-
-assert (VertexSet.In z s).
-apply VertexSet.elements_2.
-apply In_InA. apply Regs.eq_refl. assumption.
-unfold s in H4.
-generalize (VertexSet.remove_3 H4). clear H4. intro H4.
-generalize (sym_pmap g _ _ H4). clear H4. intro H4.
-unfold adj_set in H4.
-rewrite H3 in H4. elim (VertexSet.empty_1 H4).
-
-unfold map_merge.
-rewrite MapFacts.in_find_iff.
-rewrite MapFacts.remove_neq_o.
-destruct (Vertex.eq_dec x (fst_ext e)).
-rewrite MapFacts.add_eq_o.
-congruence.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite VertexSet.fold_1.
-set (f := (fun (a : VertexMap.t VertexSet.t) (e0 : VertexSet.elt) =>
- VertexMap.add e0
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set e0 (pmap g)))) a)) in *.
-set (s := VertexSet.remove (fst_ext e) (adj_set (snd_ext e) (pmap g))) in *.
-induction (VertexSet.elements s). simpl.
-generalize (proj2 (extremities_pmap g x) (VertexSet.remove_3 H0)).
-rewrite MapFacts.in_find_iff. auto.
-
-set (m := pmap g) in *.
-assert (EqualSetMap (fold_left f (a :: l) m) (f (fold_left f l m) a)).
-apply fold_left_assoc_map.
-
-unfold EqualSetMap. intros.
-unfold f.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.add_m.
-apply Regs.eq_sym. auto.
-apply RegFacts.Props.Dec.F.remove_m.
-apply Regs.eq_sym. auto.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ e1).
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.add_m.
-apply Regs.eq_sym. auto.
-apply RegFacts.Props.Dec.F.remove_m.
-apply Regs.eq_refl.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor. apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-apply Regs.eq_sym. auto.
-apply Regs.eq_sym. auto.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H. auto.
-auto.
-
-generalize (H x). clear H. intro H.
-inversion H.
-simpl.
-set (tmp := fold_left f l m) in *.
-unfold f in H3.
-destruct (Vertex.eq_dec x a).
-rewrite MapFacts.add_eq_o in H3.
-congruence.
-intuition.
-rewrite MapFacts.add_neq_o in H3.
-rewrite H3 in IHl. congruence.
-auto.
-simpl. rewrite <-H1. congruence.
-auto.
-intro. elim (VertexSet.remove_1 H H0).
-Qed.
-
-Lemma extremities_in_merge_imap e g :
-In_graph_edge e g ->
-(forall x,
-VertexMap.In x (imap_merge e g) <->
-VertexSet.In x (VertexSet.remove (snd_ext e) (V g))).
-
-Proof.
-intros e g HH x; split; intro H0.
-generalize H0. intro H.
-unfold imap_merge in H0.
-unfold map_merge in H0.
-apply VertexSet.remove_2.
-intro H1.
-elim (VertexMap.remove_1 H1 H0).
-generalize (proj1 (MapFacts.remove_in_iff _ _ _) H0). clear H0.
-intro H0. destruct H0.
-generalize (proj1 (MapFacts.add_in_iff _ _ _ _) H1). clear H1.
-intro H1.
-destruct H1.
-rewrite <-H1.
-apply (proj1 (In_graph_edge_in_ext _ _ HH)).
-apply (proj1 (extremities_imap g x)).
-rewrite VertexSet.fold_1 in H1.
-set (f := (fun (a : VertexMap.t VertexSet.t) (e0 : VertexSet.elt) =>
- VertexMap.add e0
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set e0 (imap g)))) a)) in *.
-set (s := VertexSet.remove (fst_ext e) (adj_set (snd_ext e) (imap g))) in *.
-cut (forall z, In z (VertexSet.elements s) ->
- VertexMap.In z (imap g)).
-intros HHH.
-induction (VertexSet.elements s).
-simpl in H1. assumption.
-set (m := imap g) in *.
-cut (VertexMap.In x (f (fold_left f l m) a)).
-clear H1. intro H1.
-set (tmp := fold_left f l m) in *.
-unfold f in H1.
-destruct (Vertex.eq_dec x a).
-rewrite e0. apply (HHH a). left. auto.
-rewrite MapFacts.in_find_iff in H1.
-rewrite MapFacts.add_neq_o in H1.
-apply IHl.
-rewrite MapFacts.in_find_iff.
-assumption.
-intros. apply HHH. right. assumption.
-auto.
-
-assert (EqualSetMap (fold_left f (a :: l) m) (f (fold_left f l m) a)).
-apply fold_left_assoc_map.
-
-unfold EqualSetMap. intros.
-unfold f.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.add_m.
-intuition.
-apply RegFacts.Props.Dec.F.remove_m.
-intuition.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ e1).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.add_m.
-intuition.
-apply RegFacts.Props.Dec.F.remove_m.
-intuition.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor. apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H2. auto.
-auto.
-rewrite MapFacts.in_find_iff.
-generalize (H2 x). intro.
-inversion H3.
-rewrite MapFacts.in_find_iff in H1.
-simpl in H1. rewrite <-H5 in H1. assumption.
-congruence.
-
-intros.
-exists (adj_set z (imap g)). apply VertexMap.elements_2.
-apply VertexMap.elements_1.
-unfold adj_set.
-case_eq (VertexMap.find z (imap g)); intros.
-apply VertexMap.find_2. assumption.
-
-assert (VertexSet.In z s).
-apply VertexSet.elements_2.
-apply In_InA. intuition. auto.
-unfold s in H4.
-generalize (VertexSet.remove_3 H4). clear H4. intro H4.
-generalize (sym_imap g _ _ H4). clear H4. intro H4.
-unfold adj_set in H4.
-rewrite H3 in H4. elim (VertexSet.empty_1 H4).
-
-unfold imap_merge.
-unfold map_merge.
-rewrite MapFacts.in_find_iff.
-rewrite MapFacts.remove_neq_o.
-destruct (Vertex.eq_dec x (fst_ext e)).
-rewrite MapFacts.add_eq_o.
-congruence.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite VertexSet.fold_1.
-set (f := (fun (a : VertexMap.t VertexSet.t) (e0 : VertexSet.elt) =>
- VertexMap.add e0
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set e0 (imap g)))) a)) in *.
-set (s := VertexSet.remove (fst_ext e) (adj_set (snd_ext e) (imap g))) in *.
-induction (VertexSet.elements s). simpl.
-generalize (proj2 (extremities_imap g x) (VertexSet.remove_3 H0)).
-rewrite MapFacts.in_find_iff. auto.
-
-set (m := imap g) in *.
-assert (EqualSetMap (fold_left f (a :: l) m) (f (fold_left f l m) a)).
-apply fold_left_assoc_map.
-
-unfold EqualSetMap. intros.
-unfold f.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.add_m.
-intuition.
-apply RegFacts.Props.Dec.F.remove_m.
-intuition.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ e1).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply RegFacts.Props.Dec.F.add_m.
-intuition.
-apply RegFacts.Props.Dec.F.remove_m.
-intuition.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor. apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H. auto.
-auto.
-
-generalize (H x). clear H. intro H.
-inversion H.
-simpl.
-set (tmp := fold_left f l m) in *.
-unfold f in H3.
-destruct (Vertex.eq_dec x a).
-rewrite MapFacts.add_eq_o in H3.
-congruence.
-intuition.
-rewrite MapFacts.add_neq_o in H3.
-rewrite H3 in IHl. congruence.
-intuition.
-simpl. rewrite <-H1. congruence.
-auto.
-intro. elim (VertexSet.remove_1 H H0).
-Qed.
-
-Lemma sym_map_merge_map : forall e g m x y,
-aff_edge e ->
-In_graph_edge e g ->
-(forall a b, VertexSet.In a (adj_set b m) ->
- VertexSet.In b (adj_set a m)) ->
-(forall a b, VertexSet.In a (adj_set b (map_merge e m)) ->
- ~Vertex.eq a b) ->
-~Vertex.eq x (snd_ext e) ->
-~Vertex.eq y (snd_ext e) ->
-VertexSet.In x (adj_set y (map_merge e m)) ->
-VertexSet.In y (adj_set x (map_merge e m)).
-
-Proof.
-intros e g m x y Haff Hin Hsym Hnoteq Hsndx Hsndy H.
-assert (~Vertex.eq x y) as Hdiff.
-apply Hnoteq. assumption.
-unfold map_merge in *.
-set (f := (fun (y : VertexSet.elt) (m' : VertexMap.t VertexSet.t) =>
- VertexMap.add y
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set y m)))
- m')) in *.
-set (s := (VertexSet.union
- (VertexSet.remove (snd_ext e)
- (adj_set (fst_ext e) m))
- (VertexSet.remove (fst_ext e)
- (adj_set (snd_ext e) m)))) in *.
-set (s' := adj_set (snd_ext e) m) in *.
-cut (forall z, VertexSet.In z s' -> ~Vertex.eq z (fst_ext e) -> VertexSet.In z s). intro Himp.
-unfold adj_set. rewrite MapFacts.remove_neq_o.
-destruct (Vertex.eq_dec x (fst_ext e)).
-rewrite MapFacts.add_eq_o.
-
-unfold adj_set in H.
-rewrite MapFacts.remove_neq_o in H.
-destruct (Vertex.eq_dec y (fst_ext e)).
-rewrite MapFacts.add_eq_o in H.
-rewrite e1. rewrite <-e0. assumption.
-intuition.
-
-rewrite MapFacts.add_neq_o in H.
-case_eq (VertexMap.find y (VertexSet.fold f (VertexSet.remove (fst_ext e) s') m)); intros.
-rewrite H0 in H.
-
-rewrite VertexSet.fold_1 in H0.
-set (f' := fun a e => f e a) in *.
-
-assert (eq_set_option (VertexMap.find (elt:=VertexSet.t) y
- (fold_left f' (VertexSet.elements (VertexSet.remove (fst_ext e) s'))
- m)) (Some t0)). rewrite H0. constructor. apply VertexSet.eq_refl.
-generalize H1. clear H0 H1. intro H0.
-generalize VertexSet.elements_2. intro.
-generalize (H1 (VertexSet.remove (fst_ext e) s')). clear H1. intro HH.
-induction (VertexSet.elements (VertexSet.remove (fst_ext e) s')).
-unfold s. apply VertexSet.union_2.
-apply VertexSet.remove_2.
-auto.
-apply Hsym. rewrite <-e0.
-unfold adj_set. inversion H0. subst. rewrite H3. assumption.
-
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H1 y). clear H1. intro H1. simpl in H0. inversion H1.
-inversion H0. congruence.
-set (tmp := fold_left f' l m) in *.
-unfold f' in H3. unfold f in H3.
-destruct (Vertex.eq_dec y a).
-rewrite e1.
-apply Himp.
-apply VertexSet.remove_3 with (x:= fst_ext e).
-apply HH. left. intuition.
-assert (VertexSet.In a (VertexSet.remove (fst_ext e) s')).
-apply HH. left. intuition.
-intro. elim (VertexSet.remove_1 (Vertex.eq_sym H6) H5).
-rewrite MapFacts.add_neq_o in H3. clear H1.
-apply IHl.
-inversion H0. subst.
-rewrite <-H1 in H2. clear H1. inversion H2. subst. clear H2.
-rewrite <-H3. constructor.
-rewrite <-H4. assumption.
-
-intros. apply HH. right. assumption.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e2)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H1. auto. auto.
-
-rewrite H0 in H.
-elim (VertexSet.empty_1 H).
-auto.
-auto.
-intuition.
-
-rewrite MapFacts.add_neq_o.
-unfold adj_set in H.
-rewrite MapFacts.remove_neq_o in H.
-destruct (Vertex.eq_dec y (fst_ext e)).
-rewrite MapFacts.add_eq_o in H.
-
-rewrite VertexSet.fold_1.
-generalize VertexSet.elements_1. intro H0.
-generalize (H0 (VertexSet.remove (fst_ext e) s') x). clear H0. intro H0.
-induction (VertexSet.elements (VertexSet.remove (fst_ext e) s')). simpl.
-unfold s in H.
-destruct (VertexSet.union_1 H).
-generalize (VertexSet.remove_3 H1). clear H1. intro H1.
-generalize (Hsym _ _ H1). clear H1. intro H1.
-rewrite <-e0 in H1. assumption.
-generalize (VertexSet.remove_3 H1). clear H1. intro H1.
-assert (VertexSet.In x (VertexSet.remove (fst_ext e) s')) by
- (apply VertexSet.remove_2; auto).
-generalize (H0 H2). intro H3. inversion H3.
-set (f' := fun a e => f e a) in *.
-
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H1 x). clear H1. intro H1. simpl. inversion H1.
-set (tmp := fold_left f' l m) in *.
-unfold f' in H4. unfold f in H4.
-destruct (Vertex.eq_dec x a).
-rewrite MapFacts.add_eq_o in H4. congruence.
-intuition.
-rewrite MapFacts.add_neq_o in H4. rewrite <-H4 in IHl.
-apply IHl. intro.
-generalize (H0 H2). clear H2. intro H2.
-inversion H2; subst.
-elim (n0 H6).
-assumption.
-auto.
-
-set (tmp := fold_left f' l m) in *.
-unfold f' in H3. unfold f in H3.
-destruct (Vertex.eq_dec x a).
-rewrite MapFacts.add_eq_o in H3.
-inversion H3. subst. clear H3. clear H1.
-rewrite H4. apply VertexSet.add_1. intuition. intuition.
-rewrite MapFacts.add_neq_o in H3. rewrite <-H3 in IHl.
-rewrite H4. apply IHl. intro.
-generalize (H0 H5). clear H5. intro H5.
-inversion H5; subst.
-elim (n0 H7).
-assumption.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e2)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H1. auto. auto.
-
-intuition.
-
-rewrite MapFacts.add_neq_o in H.
-rewrite VertexSet.fold_1 in H. rewrite VertexSet.fold_1.
-set (f' := fun a e => f e a) in *.
-induction (VertexSet.elements (VertexSet.remove (fst_ext e) s')). simpl in H. simpl.
-apply (Hsym _ _ H).
-
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H0 x). generalize (H0 y). clear H0. intros H0 HH0. simpl. simpl in H. inversion H0.
-rewrite <-H2 in H. elim (VertexSet.empty_1 H).
-set (tmp := fold_left f' l m) in *.
-unfold f' in H2. unfold f in H2.
-destruct (Vertex.eq_dec y a).
-rewrite MapFacts.add_eq_o in H2.
-inversion HH0.
-unfold f' in H6. unfold f in H6.
-destruct (Vertex.eq_dec x a).
-elim Hdiff. apply (Vertex.eq_trans e1 (Vertex.eq_sym e0)).
-rewrite MapFacts.add_neq_o in H6.
-
-cut (VertexMap.In x tmp).
-intro H7. rewrite MapFacts.in_find_iff in H7. congruence.
-cut (VertexMap.In x m -> VertexMap.In x tmp).
-intro H7. apply H7. clear H7.
-rewrite MapFacts.in_find_iff. intro.
-
-rewrite <-H1 in *. rewrite H3 in H. clear H0 HH0 H1 H5 H6 IHl.
-inversion H2. subst. clear H2. clear H3.
-destruct (proj1 (Props.Dec.F.add_iff _ _ _) H). elim n. auto.
-generalize (VertexSet.remove_3 H0). clear H H0. intro H.
-generalize (Hsym _ _ H). clear H. intro H.
-unfold adj_set in H. rewrite H4 in H. elim (VertexSet.empty_1 H).
-
-clear IHl H H0 HH0 H1 H2 H3 H5 H6. intro.
-unfold tmp.
-induction l. simpl. assumption.
-
-cut (EqualSetMap (fold_left f' (a0 :: l) m) (f' (fold_left f' l m) a0)). intro.
-generalize (H0 x). clear H0. simpl. intro H0. inversion H0.
-set (tmp' := fold_left f' l m) in *.
-unfold f' in H3. unfold f in H3.
-destruct (Vertex.eq_dec x a0).
-rewrite MapFacts.add_eq_o in H3. congruence. intuition.
-rewrite MapFacts.add_neq_o in H3.
-rewrite MapFacts.in_find_iff in IHl. congruence. intuition.
-rewrite MapFacts.in_find_iff. congruence.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e2)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s1); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a1).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H0. auto. auto.
-
-auto.
-clear H0 HH0.
-rewrite <-H1 in H.
-unfold f' in H5. unfold f in H5.
-destruct (Vertex.eq_dec x a).
-elim Hdiff. apply Vertex.eq_trans with (y:=a); auto.
-rewrite MapFacts.add_neq_o in H5.
-rewrite <-H5 in *.
-inversion H2. subst. clear H2.
-rewrite H3 in H.
-destruct (proj1 (Props.Dec.F.add_iff _ _ _) H). elim n. auto.
-generalize (VertexSet.remove_3 H0). clear H H0. intro H.
-
-case_eq (VertexMap.find y tmp); intros.
-rewrite H0 in IHl.
-rewrite H6. apply IHl.
-
-clear IHl H1 H6 H4 H3 H5.
-unfold tmp in H0.
-unfold adj_set in H. rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)) in H.
-assert (eq_set_option (VertexMap.find y (fold_left f' l m)) (Some t0)).
-rewrite H0. constructor. apply VertexSet.eq_refl.
-generalize H1. clear H0 H1. intro H0.
-induction l. simpl in H0. inversion H0. subst. clear H0. rewrite <-H1 in H. rewrite <-H3. assumption.
-cut (EqualSetMap (fold_left f' (a0 :: l) m) (f' (fold_left f' l m) a0)). intro.
-generalize (H1 y). clear H1. simpl in H0. intro H1. inversion H1. clear H1.
-set (tmp' := fold_left f' l m) in *.
-unfold f' in H4. unfold f in H4.
-destruct (Vertex.eq_dec y a0).
-rewrite MapFacts.add_eq_o in H4. congruence. intuition.
-rewrite MapFacts.add_neq_o in H4.
-
-case_eq (VertexMap.find y m); intros.
-clear H.
-
-assert (VertexMap.In y tmp').
-clear H3 H4 IHl H0.
-unfold tmp'. induction l. simpl.
-rewrite MapFacts.in_find_iff. congruence.
-
-cut (EqualSetMap (fold_left f' (a1 :: l) m) (f' (fold_left f' l m) a1)). intro.
-generalize (H y). clear H. intro H. simpl. inversion H. clear H.
-set (tmp'' := fold_left f' l m) in *.
-unfold f' in H3. unfold f in H3.
-destruct (Vertex.eq_dec y a1).
-rewrite MapFacts.add_eq_o in H3. congruence. intuition.
-rewrite MapFacts.add_neq_o in H3.
-rewrite MapFacts.in_find_iff in IHl. rewrite <-H3 in IHl. congruence.
-auto.
-rewrite MapFacts.in_find_iff. rewrite <-H0. congruence.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e2)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s2); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a2).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H. auto. auto.
-
-rewrite MapFacts.in_find_iff in H. congruence.
-rewrite H1 in H. elim (VertexSet.empty_1 H).
-auto.
-
-rewrite <-H2 in *. inversion H0. subst. clear H0 H1.
-
-set (tmp' := fold_left f' l m) in *.
-unfold f' in H3. unfold f in H3.
-destruct (Vertex.eq_dec y a0). rewrite MapFacts.add_eq_o in H3.
-inversion H3. subst. clear H3.
-case_eq (VertexMap.find y m); intros.
-rewrite H0 in H.
-rewrite <-H7. rewrite H4.
-apply VertexSet.add_2.
-apply VertexSet.remove_2.
-auto.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-rewrite H0. assumption.
-rewrite H0 in H. elim (VertexSet.empty_1 H).
-intuition.
-rewrite MapFacts.add_neq_o in H3.
-
-apply IHl.
-rewrite <-H3. constructor.
-rewrite <-H4. rewrite <-H7. apply VertexSet.eq_refl.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e2)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s2); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a1).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H1. auto. auto.
-
-unfold adj_set in H. rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)) in H.
-clear IHl H1 H6 H4 H5 H3.
-unfold tmp in H0.
-induction l. simpl in H0.
-rewrite H0 in H. elim (VertexSet.empty_1 H).
-
-cut (EqualSetMap (fold_left f' (a0 :: l) m) (f' (fold_left f' l m) a0)). intro.
-generalize (H1 y). clear H1. intro H1. simpl in H0. inversion H1.
-set (tmp' := fold_left f' l m) in *.
-unfold f' in H4. unfold f in H4.
-destruct (Vertex.eq_dec y a0).
-rewrite MapFacts.add_eq_o in H4. congruence. intuition.
-rewrite MapFacts.add_neq_o in H4.
-apply IHl. auto. auto.
-
-congruence.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e2)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s2); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a1).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H1. auto. auto.
-
-auto.
-intuition.
-rewrite MapFacts.add_neq_o in H2.
-rewrite <-H2 in *. rewrite <-H1 in *.
-
-inversion HH0.
-unfold f' in H6. unfold f in H6.
-destruct (Vertex.eq_dec x a).
-rewrite MapFacts.add_eq_o in H6. congruence. intuition.
-rewrite MapFacts.add_neq_o in H6.
-rewrite <-H6 in IHl.
-apply IHl. rewrite <-H3. assumption.
-auto.
-
-unfold f' in H5. unfold f in H5.
-destruct (Vertex.eq_dec x a).
-rewrite MapFacts.add_eq_o in H5.
-clear H0 HH0.
-
-inversion H5. subst. clear H5.
-rewrite H6.
-apply VertexSet.add_2.
-apply VertexSet.remove_2.
-auto.
-apply Hsym.
-rewrite <-e0.
-rewrite H3 in H. clear IHl H1 H4 H6.
-unfold tmp in H2.
-assert (eq_set_option (Some s'0) (VertexMap.find y (fold_left f' l m))).
-rewrite <-H2. constructor. apply VertexSet.eq_refl.
-generalize H0. clear H0 H2. intro H2.
-induction l. simpl in H2.
-unfold adj_set. inversion H2. subst. rewrite <-H4. assumption.
-
-cut (EqualSetMap (fold_left f' (a0 :: l) m) (f' (fold_left f' l m) a0)). intro.
-generalize (H0 y). clear H0. simpl in H2. intro H0. inversion H0. clear H0.
-rewrite <-H4 in H2. inversion H2.
-set (tmp' := fold_left f' l m) in *.
-unfold f' in H4. unfold f in H4.
-destruct (Vertex.eq_dec y a0).
-rewrite MapFacts.add_eq_o in H4. inversion H4. subst. clear H4.
-inversion H2. subst. rewrite <-H6 in H1. inversion H1. subst.
-apply VertexSet.remove_3 with (x:=snd_ext e).
-apply VertexSet.add_3 with (x:= fst_ext e).
-auto.
-unfold adj_set. rewrite (MapFacts.find_o _ e1). rewrite <-H5. rewrite <-H7. assumption.
-intuition.
-rewrite MapFacts.add_neq_o in H4.
-apply IHl.
-rewrite <-H4. constructor. rewrite <-H1 in H2. inversion H2. subst.
-rewrite H8. assumption.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e2)).
-apply VertexSet.eq_refl. intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s2); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a1).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H0. auto. auto.
-intuition.
-rewrite MapFacts.add_neq_o in H5.
-rewrite <-H5 in *.
-rewrite H6. apply IHl.
-rewrite <-H3. assumption.
-auto.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H0. auto. auto.
-
-auto.
-auto.
-auto.
-auto.
-
-clear H.
-unfold s. unfold s'. intros z H Hne.
-apply VertexSet.union_3. apply VertexSet.remove_2; auto.
-Qed.
-
-Lemma not_eq_extremities_merge_map : forall e g,
-aff_edge e ->
-forall x y,
-VertexSet.In x (adj_set y (imap_merge e g)) \/
-VertexSet.In x (adj_set y (pmap_merge e g (imap_merge e g))) ->
-~Vertex.eq x y.
-
-Proof.
-intros. destruct H0.
-apply (not_eq_extremities_map_merge x y e (imap g)).
-intros. apply (not_eq_extremities g). left. assumption. assumption.
-apply (not_eq_extremities_map_merge x y e (pmap g)).
-intros. apply (not_eq_extremities g). right. assumption.
-apply pmap_merge_sub. assumption.
-Qed.
-
-Lemma sym_merge : forall e g,
-aff_edge e ->
-In_graph_edge e g ->
-forall x y,
-VertexSet.In x (adj_set y (map_merge e (pmap g))) ->
-VertexSet.In y (adj_set x (map_merge e (pmap g))).
-
-Proof.
-intros e g Haff Hin x y H.
-apply sym_map_merge_map with (g:=g); auto.
-apply (sym_pmap g).
-intros. apply (not_eq_extremities_map_merge _ _ e (pmap g)).
-intros. apply (not_eq_extremities g). right. auto.
-assumption.
-
-assert (~Vertex.eq y (snd_ext e)) as Hy.
-intro.
-generalize (extremities_in_merge_map e g Hin y).
-rewrite MapFacts.in_find_iff. intro.
-unfold adj_set in H.
-case_eq (VertexMap.find y (map_merge e (pmap g))); intros.
-rewrite H2 in H1.
-assert (VertexSet.In y (VertexSet.remove (snd_ext e) (V g))).
-rewrite <-H1. congruence.
-elim (VertexSet.remove_1 (Vertex.eq_sym H0) H3).
-rewrite H2 in H. elim (VertexSet.empty_1 H).
-
-intro.
-unfold map_merge in H.
-
-set (f := (fun (y : VertexSet.elt) (m' : VertexMap.t VertexSet.t) =>
- VertexMap.add y
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set y (pmap g))))
- m')) in *.
-set (s := (VertexSet.union
- (VertexSet.remove (snd_ext e)
- (adj_set (fst_ext e) (pmap g)))
- (VertexSet.remove (fst_ext e)
- (adj_set (snd_ext e) (pmap g))))) in *.
-set (s' := adj_set (snd_ext e) (pmap g)) in *.
-
-unfold adj_set in H.
-rewrite MapFacts.remove_neq_o in H.
-destruct (Vertex.eq_dec y (fst_ext e)).
-rewrite MapFacts.add_eq_o in H.
-unfold s in H.
-destruct (VertexSet.union_1 H).
-elim (VertexSet.remove_1 (Vertex.eq_sym H0) H1).
-generalize (VertexSet.remove_3 H1). clear H1. intro H1.
-unfold s' in H1.
-
-elim (not_eq_extremities g x (snd_ext e)).
-right. assumption.
-assumption.
-intuition.
-rewrite MapFacts.add_neq_o in H.
-
-rewrite VertexSet.fold_1 in H.
-set (f' := fun a e => f e a) in *.
-generalize VertexSet.elements_1. intro.
-generalize (H1 (VertexSet.remove (fst_ext e) s') y). clear H1. intro H1.
-induction (VertexSet.elements (VertexSet.remove (fst_ext e) s')).
-simpl in H.
-unfold s' in H1.
-assert (InA Vertex.eq y nil).
-apply H1.
-apply VertexSet.remove_2. auto.
-apply (sym_pmap g). rewrite <-H0. assumption. inversion H2.
-
-cut (EqualSetMap (fold_left f' (a :: l) (pmap g)) (f' (fold_left f' l (pmap g)) a)). intro.
-generalize (H2 y). clear H2. intro H2. simpl in H. inversion H2; clear H2.
-rewrite <-H4 in *.
-elim (VertexSet.empty_1 H).
-set (tmp := fold_left f' l (pmap g)) in *.
-unfold f' in H4. unfold f in H4.
-destruct (Vertex.eq_dec y a).
-rewrite MapFacts.add_eq_o in H4.
-rewrite <-H3 in *. clear H3. inversion H4. subst. clear H4.
-rewrite H5 in H. clear H5.
-destruct (proj1 (Props.Dec.F.add_iff _ _ _) H).
-elim (In_graph_edge_diff_ext _ _ Hin).
-apply Vertex.eq_trans with (y := x); auto.
-elim (VertexSet.remove_1 (Vertex.eq_sym H0) H2).
-intuition.
-rewrite MapFacts.add_neq_o in H4. rewrite <-H4 in IHl.
-apply IHl.
-rewrite <-H5. rewrite <-H3 in H. assumption.
-intro. generalize (H1 H2). clear H2. intro H2.
-inversion H2; subst.
-elim (n0 H7).
-assumption.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H2. auto. auto.
-
-auto.
-auto.
-
-intro.
-generalize (extremities_in_merge_map e g Hin y).
-rewrite MapFacts.in_find_iff. intro.
-unfold adj_set in H.
-case_eq (VertexMap.find y (map_merge e (pmap g))); intros.
-rewrite H2 in H1.
-assert (VertexSet.In y (VertexSet.remove (snd_ext e) (V g))).
-rewrite <-H1. congruence.
-elim (VertexSet.remove_1 (Vertex.eq_sym H0) H3).
-rewrite H2 in H. elim (VertexSet.empty_1 H).
-Qed.
-
-Lemma sym_imap_merge_map : forall e g,
-aff_edge e ->
-In_graph_edge e g ->
-forall x y,
-VertexSet.In x (adj_set y (imap_merge e g)) ->
-VertexSet.In y (adj_set x (imap_merge e g)).
-
-Proof.
-intros e g Haff Hin x y H.
-apply sym_map_merge_map with (g:=g); auto.
-apply (sym_imap g).
-intros. apply (not_eq_extremities_merge_map e g Haff). left. assumption.
-
-assert (~Vertex.eq y (snd_ext e)) as Hy.
-intro.
-generalize (extremities_in_merge_imap e g Hin y).
-rewrite MapFacts.in_find_iff. intro.
-unfold adj_set in H.
-case_eq (VertexMap.find y (imap_merge e g)); intros.
-rewrite H2 in H1.
-assert (VertexSet.In y (VertexSet.remove (snd_ext e) (V g))).
-rewrite <-H1. congruence.
-elim (VertexSet.remove_1 (Vertex.eq_sym H0) H3).
-rewrite H2 in H. elim (VertexSet.empty_1 H).
-
-intro.
-unfold imap_merge in H.
-unfold map_merge in H.
-
-set (f := (fun (y : VertexSet.elt) (m' : VertexMap.t VertexSet.t) =>
- VertexMap.add y
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set y (imap g))))
- m')) in *.
-set (s := (VertexSet.union
- (VertexSet.remove (snd_ext e)
- (adj_set (fst_ext e) (imap g)))
- (VertexSet.remove (fst_ext e)
- (adj_set (snd_ext e) (imap g))))) in *.
-set (s' := adj_set (snd_ext e) (imap g)) in *.
-
-unfold adj_set in H.
-rewrite MapFacts.remove_neq_o in H.
-destruct (Vertex.eq_dec y (fst_ext e)).
-rewrite MapFacts.add_eq_o in H.
-unfold s in H.
-destruct (VertexSet.union_1 H).
-elim (VertexSet.remove_1 (Vertex.eq_sym H0) H1).
-generalize (VertexSet.remove_3 H1). clear H1. intro H1.
-unfold s' in H1.
-
-elim (not_eq_extremities g x (snd_ext e)).
-left. assumption.
-assumption.
-intuition.
-rewrite MapFacts.add_neq_o in H.
-
-rewrite VertexSet.fold_1 in H.
-set (f' := fun a e => f e a) in *.
-generalize VertexSet.elements_1. intro.
-generalize (H1 (VertexSet.remove (fst_ext e) s') y). clear H1. intro H1.
-induction (VertexSet.elements (VertexSet.remove (fst_ext e) s')).
-simpl in H.
-unfold s' in H1.
-assert (InA Vertex.eq y nil).
-apply H1.
-apply VertexSet.remove_2. auto.
-apply (sym_imap g). rewrite <-H0. assumption. inversion H2.
-
-cut (EqualSetMap (fold_left f' (a :: l) (imap g)) (f' (fold_left f' l (imap g)) a)). intro.
-generalize (H2 y). clear H2. intro H2. simpl in H. inversion H2; clear H2.
-rewrite <-H4 in *.
-elim (VertexSet.empty_1 H).
-set (tmp := fold_left f' l (imap g)) in *.
-unfold f' in H4. unfold f in H4.
-destruct (Vertex.eq_dec y a).
-rewrite MapFacts.add_eq_o in H4.
-rewrite <-H3 in *. clear H3. inversion H4. subst. clear H4.
-rewrite H5 in H. clear H5.
-destruct (proj1 (Props.Dec.F.add_iff _ _ _) H).
-elim (In_graph_edge_diff_ext _ _ Hin).
-apply Vertex.eq_trans with (y := x); auto.
-elim (VertexSet.remove_1 (Vertex.eq_sym H0) H2).
-intuition.
-rewrite MapFacts.add_neq_o in H4. rewrite <-H4 in IHl.
-apply IHl.
-rewrite <-H5. rewrite <-H3 in H. assumption.
-intro. generalize (H1 H2). clear H2. intro H2.
-inversion H2; subst.
-elim (n0 H7).
-assumption.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H2. auto. auto.
-
-auto.
-auto.
-
-intro.
-generalize (extremities_in_merge_imap e g Hin y).
-rewrite MapFacts.in_find_iff. intro.
-unfold adj_set in H.
-case_eq (VertexMap.find y (imap_merge e g)); intros.
-rewrite H2 in H1.
-assert (VertexSet.In y (VertexSet.remove (snd_ext e) (V g))).
-rewrite <-H1. congruence.
-elim (VertexSet.remove_1 (Vertex.eq_sym H0) H3).
-rewrite H2 in H. elim (VertexSet.empty_1 H).
-Qed.
-
-Lemma pmap_merge_in_merge : forall x e g,
-aff_edge e ->
-In_graph_edge e g ->
-VertexMap.In x (pmap_merge e g (imap_merge e g)) ->
-VertexMap.In x (map_merge e (pmap g)).
-
-Proof.
-intros x e g Haff HH H.
-unfold pmap_merge in H.
-unfold resolve_conflicts in H.
-set (f := (fun (x : VertexSet.elt) (m : VertexMap.t VertexSet.t) =>
- VertexMap.add x
- (VertexSet.remove (fst_ext e)
- (adj_set x (map_merge e (pmap g)))) m)) in *.
-rewrite MapFacts.in_find_iff in *. intro H0.
-destruct (Vertex.eq_dec x (fst_ext e)).
-rewrite (MapFacts.find_o _ e0) in H0.
-assert (VertexMap.In (fst_ext e) (map_merge e (pmap g))).
-apply pmap_merge_domain_2. assumption.
-apply VertexSet.remove_2. apply (In_graph_edge_diff_ext _ _ HH).
-apply (proj1 (In_graph_edge_in_ext _ _ HH)).
-rewrite MapFacts.in_find_iff in H1. congruence.
-rewrite MapFacts.add_neq_o in H.
-set (s' := (VertexSet.inter (adj_set (fst_ext e) (map_merge e (pmap g)))
- (adj_set (fst_ext e) (imap_merge e g)))) in *.
-set (m := map_merge e (pmap g)) in *.
-rewrite VertexSet.fold_1 in H.
-set (f' := fun a e => f e a) in *.
-assert (forall z, InA Vertex.eq z (VertexSet.elements s') ->
- VertexMap.In z m) as Hin.
-intros.
-apply pmap_merge_domain_2. assumption.
-generalize (VertexSet.elements_2 H1). clear H1. intro H1.
-unfold s' in H1. generalize (VertexSet.inter_1 H1).
-generalize (VertexSet.inter_2 H1). clear H1. intros.
-rewrite <-(extremities_in_merge_imap e g HH).
-generalize (sym_imap_merge_map e g Haff HH _ _ H1). intro.
-rewrite MapFacts.in_find_iff. intro.
-unfold adj_set in H3. rewrite H4 in H3. elim (VertexSet.empty_1 H3).
-induction (VertexSet.elements s'). simpl in H. congruence.
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H1 x). clear H1. simpl in H. intro H1. inversion H1; clear H1.
-congruence.
-set (tmp := fold_left f' l m) in *.
-unfold f' in H3. unfold f in H3.
-destruct (Vertex.eq_dec x a).
-rewrite MapFacts.add_eq_o in H3. inversion H3; subst; clear H3.
-rewrite <-H2 in H.
-rewrite (MapFacts.find_o _ e0) in H0.
-assert (VertexMap.In a m).
-apply Hin. left. auto.
-rewrite MapFacts.in_find_iff in H1. congruence.
-intuition.
-rewrite MapFacts.add_neq_o in H3.
-apply IHl. congruence.
-intros. apply Hin. right. auto.
-auto.
-
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H1. auto. auto.
-auto.
-Qed.
-
-Lemma pmap_merge_merge_in : forall x e g,
-In_graph_edge e g ->
-VertexMap.In x (map_merge e (pmap g)) ->
-VertexMap.In x (pmap_merge e g (imap_merge e g)).
-
-Proof.
-intros x e g HH H.
-unfold pmap_merge.
-unfold resolve_conflicts.
-set (f := (fun (x0 : VertexSet.elt) (m : VertexMap.t VertexSet.t) =>
- VertexMap.add x0
- (VertexSet.remove (fst_ext e) (adj_set x0 (map_merge e (pmap g))))
- m)) in *.
-set (s := (VertexSet.inter (adj_set (fst_ext e) (map_merge e (pmap g)))
- (adj_set (fst_ext e) (imap_merge e g)))) in *.
-rewrite MapFacts.in_find_iff.
-destruct (Vertex.eq_dec x (fst_ext e)).
-rewrite MapFacts.add_eq_o. congruence.
-intuition.
-rewrite MapFacts.add_neq_o.
-intro H0.
-rewrite VertexSet.fold_1 in H0.
-set (f' := fun a e => f e a) in *.
-assert (VertexMap.find x (map_merge e (pmap g)) = None).
-induction (VertexSet.elements s). simpl in H0. assumption.
-set (m := map_merge e (pmap g)) in *.
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H1 x). clear H1. intro H1. simpl in H0. inversion H1; clear H1.
-set (tmp := fold_left f' l m) in *.
-unfold f' in H4. unfold f in H4.
-destruct (Vertex.eq_dec x a). rewrite MapFacts.add_eq_o in H4. congruence.
-intuition.
-rewrite MapFacts.add_neq_o in H4.
-apply IHl. auto.
-auto.
-
-congruence.
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H1. auto. auto.
-auto.
-
-rewrite MapFacts.in_find_iff in H. congruence.
-auto.
-Qed.
-
-Lemma extremities_in_merge_pmap e g :
-aff_edge e ->
-In_graph_edge e g ->
-(forall x,
-VertexMap.In x (pmap_merge e g (imap_merge e g)) <->
-VertexSet.In x (VertexSet.remove (snd_ext e) (V g))).
-
-Proof.
-intros e g Haff HH x;split; intro H0.
-apply pmap_merge_domain_1. assumption.
-apply pmap_merge_in_merge. assumption.
-assumption. assumption.
-apply pmap_merge_merge_in. assumption.
-apply pmap_merge_domain_2. assumption.
-assumption.
-Qed.
-
-Lemma merge_conflicts_aux_1 : forall e g,
-aff_edge e ->
-In_graph_edge e g ->
-forall x y,
-VertexSet.In x (adj_set y (imap_merge e g)) ->
-~Vertex.eq y (fst_ext e) ->
-~Vertex.eq x (fst_ext e) ->
-VertexSet.In x (adj_set y (imap g)).
-
-Proof.
-intros.
-unfold imap_merge in H1.
-unfold map_merge in H1.
-set (m := imap g) in *.
-set (f := fun (y : VertexSet.elt) (m' : VertexMap.t VertexSet.t) =>
- VertexMap.add y
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set y m)))
- m') in *.
-set (s := (VertexSet.union
- (VertexSet.remove (snd_ext e)
- (adj_set (fst_ext e) m))
- (VertexSet.remove (fst_ext e)
- (adj_set (snd_ext e) m)))) in *.
-set (s' := (adj_set (snd_ext e) m)) in *.
-unfold adj_set in H1.
-destruct (Vertex.eq_dec y (snd_ext e)).
-rewrite MapFacts.remove_eq_o in H1. elim (VertexSet.empty_1 H1).
-intuition.
-rewrite MapFacts.remove_neq_o in H1. rewrite MapFacts.add_neq_o in H1.
-rewrite VertexSet.fold_1 in H1. set (f' := fun a e => f e a) in *.
-induction (VertexSet.elements (VertexSet.remove (fst_ext e) s')). simpl in H1.
-assumption.
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H4 y). clear H4. intro H4. simpl in H1. inversion H4; subst; clear H4.
-rewrite <-H6 in H1. elim (VertexSet.empty_1 H1).
-set (tmp := fold_left f' l m) in *.
-unfold f' in H6. unfold f in H6.
-destruct (Vertex.eq_dec y a). rewrite MapFacts.add_eq_o in H6.
-rewrite <-H5 in H1. rewrite H7 in H1.
-inversion H6; subst; clear H6.
-destruct (proj1 (Props.Dec.F.add_iff _ _ _) H1). elim H3; auto.
-generalize (VertexSet.remove_3 H4). intro.
-unfold adj_set. rewrite (MapFacts.find_o _ e0). assumption.
-intuition.
-rewrite MapFacts.add_neq_o in H6.
-rewrite <-H6 in IHl.
-apply IHl. rewrite <-H7. rewrite <-H5 in H1. assumption.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H4. auto. auto.
-
-auto.
-auto.
-Qed.
-
-Lemma merge_conflicts_aux_2 : forall e g,
-aff_edge e ->
-In_graph_edge e g ->
-forall x y,
-VertexSet.In x (adj_set y (map_merge e (pmap g))) ->
-~Vertex.eq y (fst_ext e) ->
-~Vertex.eq x (fst_ext e) ->
-VertexSet.In x (adj_set y (pmap g)).
-
-Proof.
-intros.
-unfold map_merge in H1.
-set (m := pmap g) in *.
-set (f := fun (y : VertexSet.elt) (m' : VertexMap.t VertexSet.t) =>
- VertexMap.add y
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set y m)))
- m') in *.
-set (s := (VertexSet.union
- (VertexSet.remove (snd_ext e)
- (adj_set (fst_ext e) m))
- (VertexSet.remove (fst_ext e)
- (adj_set (snd_ext e) m)))) in *.
-set (s' := (adj_set (snd_ext e) m)) in *.
-unfold adj_set in H1.
-destruct (Vertex.eq_dec y (snd_ext e)).
-rewrite MapFacts.remove_eq_o in H1. elim (VertexSet.empty_1 H1).
-intuition.
-rewrite MapFacts.remove_neq_o in H1. rewrite MapFacts.add_neq_o in H1.
-rewrite VertexSet.fold_1 in H1. set (f' := fun a e => f e a) in *.
-induction (VertexSet.elements (VertexSet.remove (fst_ext e) s')). simpl in H1.
-assumption.
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H4 y). clear H4. intro H4. simpl in H1. inversion H4; subst; clear H4.
-rewrite <-H6 in H1. elim (VertexSet.empty_1 H1).
-set (tmp := fold_left f' l m) in *.
-unfold f' in H6. unfold f in H6.
-destruct (Vertex.eq_dec y a). rewrite MapFacts.add_eq_o in H6.
-rewrite <-H5 in H1. rewrite H7 in H1.
-inversion H6; subst; clear H6.
-destruct (proj1 (Props.Dec.F.add_iff _ _ _) H1). elim H3; auto.
-generalize (VertexSet.remove_3 H4). intro.
-unfold adj_set. rewrite (MapFacts.find_o _ e0). assumption.
-intuition.
-rewrite MapFacts.add_neq_o in H6.
-rewrite <-H6 in IHl.
-apply IHl. rewrite <-H7. rewrite <-H5 in H1. assumption.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H4. auto. auto.
-
-auto.
-auto.
-Qed.
-
-Lemma merge_conflicts : forall e g,
-aff_edge e ->
-In_graph_edge e g ->
-forall x y,
-VertexSet.In x (adj_set y (imap_merge e g)) ->
-VertexSet.In x (adj_set y (map_merge e (pmap g))) ->
-~Vertex.eq y (fst_ext e) ->
-~Vertex.eq x (fst_ext e) ->
-False.
-
-Proof.
-intros.
-apply (simple_graph g x y).
-split.
-apply (merge_conflicts_aux_1 e g H H0 x y H1 H3 H4).
-apply (merge_conflicts_aux_2 e g H H0 x y H2 H3 H4).
-Qed.
-
-Lemma resolve_conflicts_map_3 : forall x y e g,
-aff_edge e ->
-In_graph_edge e g ->
-VertexSet.In x (adj_set y (imap_merge e g)) /\
-VertexSet.In x (adj_set y (resolve_conflicts (fst_ext e) (map_merge e (pmap g))
- (adj_set (fst_ext e) (map_merge e (pmap g)))
- (adj_set (fst_ext e) (imap_merge e g))))
-
--> False.
-
-Proof.
-intros x y e g Haff Hin H. destruct H.
-unfold resolve_conflicts in H0.
-set (f := (fun (x : VertexSet.elt) (m : VertexMap.t VertexSet.t) =>
- VertexMap.add x
- (VertexSet.remove (fst_ext e)
- (adj_set x (map_merge e (pmap g)))) m)) in *.
-set (s := (VertexSet.diff (adj_set (fst_ext e) (map_merge e (pmap g)))
- (adj_set (fst_ext e) (imap_merge e g)))) in *.
-set (s' := (VertexSet.inter (adj_set (fst_ext e) (map_merge e (pmap g)))
- (adj_set (fst_ext e) (imap_merge e g)))) in *.
-rewrite VertexSet.fold_1 in H0.
-set (f' := fun a e => f e a) in *.
-generalize VertexSet.elements_1. intro HH.
-generalize (HH s' y). clear HH. intro HH.
-induction (VertexSet.elements s'). simpl in H0.
-destruct (Vertex.eq_dec y (fst_ext e)).
-unfold adj_set in H0. rewrite MapFacts.add_eq_o in H0.
-elim (VertexSet.diff_2 H0).
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)). assumption.
-intuition.
-unfold adj_set in H0. rewrite MapFacts.add_neq_o in H0.
-
-assert (InA Vertex.eq y nil).
-apply HH.
-unfold s'. apply VertexSet.inter_3.
-cut (Vertex.eq x (fst_ext e)). intro.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym H1)).
-apply sym_merge; auto.
-destruct (Vertex.eq_dec x (fst_ext e)).
-intuition.
-apply False_ind. apply (merge_conflicts e g Haff Hin x y); auto.
-
-destruct (Vertex.eq_dec x (fst_ext e)).
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-apply (sym_imap_merge_map e g Haff Hin). assumption.
-apply False_ind.
-apply (merge_conflicts e g Haff Hin x y); auto. inversion H1.
-auto.
-
-set (m := map_merge e (pmap g)) in *.
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H1 y). clear H1. simpl in H0. intro H1. inversion H1; clear H1.
-set (tmp := fold_left f' l m) in *.
-unfold f' in H4. unfold f in H4.
-destruct (Vertex.eq_dec y a). rewrite MapFacts.add_eq_o in H4. congruence.
-intuition.
-rewrite MapFacts.add_neq_o in H4.
-destruct (Vertex.eq_dec y (fst_ext e)).
-unfold adj_set in H0. rewrite MapFacts.add_eq_o in H0.
-unfold adj_set in IHl. rewrite MapFacts.add_eq_o in IHl.
-apply IHl. assumption. intros.
-generalize (HH H1). intro H2. inversion H2; subst.
-elim (n H6). auto.
-intuition.
-intuition.
-
-unfold adj_set in H0. rewrite MapFacts.add_neq_o in H0.
-rewrite <-H3 in H0. elim (VertexSet.empty_1 H0).
-auto.
-auto.
-
-set (tmp := fold_left f' l m) in *.
-unfold f' in H3. unfold f in H3.
-destruct (Vertex.eq_dec y a). rewrite MapFacts.add_eq_o in H3.
-destruct (Vertex.eq_dec y (fst_ext e)).
-unfold adj_set in H0.
-rewrite MapFacts.add_eq_o in H0.
-elim (VertexSet.diff_2 H0).
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)). assumption.
-intuition.
-unfold adj_set in H0. rewrite MapFacts.add_neq_o in H0.
-rewrite <-H2 in H0.
-inversion H3; subst; clear H3.
-rewrite H4 in H0. clear H4.
-destruct (Vertex.eq_dec x (fst_ext e)).
-elim (VertexSet.remove_1 (Vertex.eq_sym e1) H0).
-apply (merge_conflicts e g Haff Hin x y); auto.
-unfold adj_set. rewrite (MapFacts.find_o _ e0). apply (VertexSet.remove_3 H0).
-auto.
-intuition.
-
-rewrite MapFacts.add_neq_o in H3.
-unfold adj_set in IHl.
-destruct (Vertex.eq_dec y (fst_ext e)).
-rewrite MapFacts.add_eq_o in IHl.
-unfold adj_set in H0.
-rewrite MapFacts.add_eq_o in H0.
-apply IHl. assumption. intro.
-generalize (HH H1). intro.
-inversion H5; subst.
-elim (n H7).
-assumption.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o in IHl. rewrite <-H3 in IHl.
-unfold adj_set in H0. rewrite MapFacts.add_neq_o in H0.
-rewrite <-H2 in H0.
-apply IHl. rewrite <-H4. assumption.
-intro. generalize (HH H1). intro.
-inversion H5; subst.
-elim (n H7).
-assumption.
-auto.
-auto.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H1. auto. auto.
-Qed.
-
-Lemma simple_graph_merge_map : forall e g,
-aff_edge e ->
-In_graph_edge e g ->
-forall x y,
-VertexSet.In x (adj_set y (imap_merge e g)) /\
-VertexSet.In x (adj_set y (pmap_merge e g (imap_merge e g))) ->
-False.
-
-Proof.
-exact (fun e g H H0 x y H1 =>
- (resolve_conflicts_map_3 x y e g H H0 H1)).
-Qed.
-
-Lemma sym_map_merge_pmap : forall e g x y,
-aff_edge e ->
-In_graph_edge e g ->
-VertexSet.In x (adj_set y (map_merge e (pmap g))) ->
-VertexSet.In y (adj_set x (map_merge e (pmap g))).
-
-Proof.
-intros e g x y Haff Hin H.
-apply sym_map_merge_map with (g:=g); auto.
-apply (sym_pmap g).
-intros.
-apply (not_eq_extremities_map_merge a b e (pmap g)).
-intros. apply (not_eq_extremities g). right. assumption. assumption.
-
-assert (~Vertex.eq y (snd_ext e)) as Hy.
-intro.
-assert (VertexSet.In y (VertexSet.remove (snd_ext e) (V g))).
-apply (pmap_merge_domain_1 y _ _ Hin).
-rewrite MapFacts.in_find_iff. intro.
-unfold adj_set in H. rewrite H1 in H. elim (VertexSet.empty_1 H).
-elim (VertexSet.remove_1 (Vertex.eq_sym H0) H1).
-
-intro.
-unfold map_merge in H.
-
-set (f := (fun (y : VertexSet.elt) (m' : VertexMap.t VertexSet.t) =>
- VertexMap.add y
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set y (pmap g))))
- m')) in *.
-set (s := (VertexSet.union
- (VertexSet.remove (snd_ext e)
- (adj_set (fst_ext e) (pmap g)))
- (VertexSet.remove (fst_ext e)
- (adj_set (snd_ext e) (pmap g))))) in *.
-set (s' := adj_set (snd_ext e) (pmap g)) in *.
-
-unfold adj_set in H.
-rewrite MapFacts.remove_neq_o in H.
-destruct (Vertex.eq_dec y (fst_ext e)).
-rewrite MapFacts.add_eq_o in H.
-unfold s in H.
-destruct (VertexSet.union_1 H).
-elim (VertexSet.remove_1 (Vertex.eq_sym H0) H1).
-generalize (VertexSet.remove_3 H1). clear H1. intro H1.
-unfold s' in H1.
-
-elim (not_eq_extremities g x (snd_ext e)).
-right. assumption.
-assumption.
-intuition.
-rewrite MapFacts.add_neq_o in H.
-
-rewrite VertexSet.fold_1 in H.
-set (f' := fun a e => f e a) in *.
-generalize VertexSet.elements_1. intro.
-generalize (H1 (VertexSet.remove (fst_ext e) s') y). clear H1. intro H1.
-induction (VertexSet.elements (VertexSet.remove (fst_ext e) s')).
-simpl in H.
-unfold s' in H1.
-assert (InA Vertex.eq y nil).
-apply H1.
-apply VertexSet.remove_2. auto.
-apply (sym_pmap g). rewrite <-H0. assumption. inversion H2.
-
-cut (EqualSetMap (fold_left f' (a :: l) (pmap g)) (f' (fold_left f' l (pmap g)) a)). intro.
-generalize (H2 y). clear H2. intro H2. simpl in H. inversion H2; clear H2.
-rewrite <-H4 in *.
-elim (VertexSet.empty_1 H).
-set (tmp := fold_left f' l (pmap g)) in *.
-unfold f' in H4. unfold f in H4.
-destruct (Vertex.eq_dec y a).
-rewrite MapFacts.add_eq_o in H4.
-rewrite <-H3 in *. clear H3. inversion H4. subst. clear H4.
-rewrite H5 in H. clear H5.
-destruct (proj1 (Props.Dec.F.add_iff _ _ _) H).
-elim (In_graph_edge_diff_ext _ _ Hin).
-apply Vertex.eq_trans with (y := x); auto.
-elim (VertexSet.remove_1 (Vertex.eq_sym H0) H2).
-intuition.
-rewrite MapFacts.add_neq_o in H4. rewrite <-H4 in IHl.
-apply IHl.
-rewrite <-H5. rewrite <-H3 in H. assumption.
-intro. generalize (H1 H2). clear H2. intro H2.
-inversion H2; subst.
-elim (n0 H7).
-assumption.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H2. auto. auto.
-
-auto.
-auto.
-
-intro.
-assert (VertexSet.In y (VertexSet.remove (snd_ext e) (V g))).
-apply (pmap_merge_domain_1 y _ _ Hin).
-rewrite MapFacts.in_find_iff. intro.
-unfold adj_set in H. rewrite H1 in H. elim (VertexSet.empty_1 H).
-elim (VertexSet.remove_1 (Vertex.eq_sym H0) H1).
-Qed.
-
-Lemma sym_resolve : forall x y e g,
-aff_edge e ->
-In_graph_edge e g ->
-VertexSet.In x (adj_set y (resolve_conflicts (fst_ext e) (map_merge e (pmap g))
- (adj_set (fst_ext e) (map_merge e (pmap g)))
- (adj_set (fst_ext e) (imap_merge e g)))) ->
-VertexSet.In y (adj_set x (resolve_conflicts (fst_ext e) (map_merge e (pmap g))
- (adj_set (fst_ext e) (map_merge e (pmap g)))
- (adj_set (fst_ext e) (imap_merge e g)))).
-
-Proof.
-unfold resolve_conflicts; intros x y e g p q H.
-set (f := (fun (x0 : VertexSet.elt) (m : VertexMap.t VertexSet.t) =>
- VertexMap.add x0
- (VertexSet.remove (fst_ext e)
- (adj_set x0 (map_merge e (pmap g)))) m)) in *.
-set (s := (VertexSet.diff (adj_set (fst_ext e) (map_merge e (pmap g)))
- (adj_set (fst_ext e) (imap_merge e g)))) in *.
-set (s' := (VertexSet.inter (adj_set (fst_ext e) (map_merge e (pmap g)))
- (adj_set (fst_ext e) (imap_merge e g)))) in *.
-set (m := map_merge e (pmap g)) in *.
-rewrite VertexSet.fold_1 in *.
-set (f' := fun a e => f e a) in *.
-generalize VertexSet.elements_1. intro.
-generalize (H0 s' y). clear H0. intro HH.
-generalize VertexSet.elements_2. intro.
-generalize (H0 s'). clear H0. intro HHH.
-induction (VertexSet.elements s'). simpl in *.
-destruct (Vertex.eq_dec x (fst_ext e)).
-unfold adj_set. rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec y (fst_ext e)).
-unfold adj_set in H. rewrite MapFacts.add_eq_o in H.
-generalize (VertexSet.diff_1 H). intro H0.
-rewrite e0 in H0.
-unfold m in H0. unfold map_merge in H0.
-unfold adj_set in H0.
-rewrite MapFacts.remove_neq_o in H0.
-rewrite MapFacts.add_eq_o in H0.
-fold (adj_set (fst_ext e) (pmap g)) in H0.
-fold (adj_set (snd_ext e) (pmap g)) in H0.
-destruct (VertexSet.union_1 H0).
-generalize (VertexSet.remove_3 H1). intro.
-elim (not_eq_extremities g (fst_ext e) (fst_ext e)). right. auto.
-intuition.
-elim (VertexSet.remove_1 (Vertex.eq_refl _) H1).
-intuition.
-apply (In_graph_edge_diff_ext _ _ q). intuition.
-unfold adj_set in H. rewrite MapFacts.add_neq_o in H.
-fold (adj_set y m) in H.
-destruct (Props.In_dec y (adj_set (fst_ext e) (imap_merge e g))).
-assert (InA Vertex.eq y nil).
-apply HH. apply VertexSet.inter_3.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-apply (sym_map_merge_pmap e g _ _ p q H). assumption. inversion H0.
-apply VertexSet.diff_3.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-apply (sym_map_merge_pmap e g _ _ p q H). assumption.
-auto.
-intuition.
-
-unfold adj_set. rewrite MapFacts.add_neq_o.
-fold (adj_set x m).
-destruct (Vertex.eq_dec y (fst_ext e)).
-unfold adj_set in H. rewrite MapFacts.add_eq_o in H.
-apply (sym_map_merge_pmap e g _ _ p q).
-unfold adj_set. rewrite (MapFacts.find_o _ e0).
-apply (VertexSet.diff_1 H).
-intuition.
-unfold adj_set in H. rewrite MapFacts.add_neq_o in H.
-apply (sym_map_merge_pmap e g _ _ p q H).
-auto.
-auto.
-
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-destruct (Vertex.eq_dec x (fst_ext e)).
-unfold adj_set. rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec y (fst_ext e)).
-unfold adj_set in H. rewrite MapFacts.add_eq_o in H.
-rewrite e1. rewrite <-e0. assumption.
-intuition.
-unfold adj_set in H. rewrite MapFacts.add_neq_o in H.
-generalize (H0 y). simpl in H. intro H1. inversion H1; clear H1.
-rewrite <-H3 in H.
-elim (VertexSet.empty_1 H).
-rewrite <-H2 in H. clear H2.
-set (tmp := fold_left f' l m) in *.
-unfold f' in H3. unfold f in H3.
-destruct (Vertex.eq_dec y a). rewrite MapFacts.add_eq_o in H3.
-inversion H3; subst; clear H3.
-rewrite H4 in H. elim (VertexSet.remove_1 (Vertex.eq_sym e0) H).
-intuition.
-rewrite MapFacts.add_neq_o in H3.
-unfold adj_set in IHl. rewrite MapFacts.add_neq_o in IHl.
- rewrite MapFacts.add_eq_o in IHl.
-rewrite <-H3 in IHl.
-apply IHl. rewrite <-H4. assumption.
-intros. generalize (HH H1). intro.
-inversion H2; subst.
-elim (n0 H6).
-assumption.
-auto.
-intuition.
-auto.
-auto.
-auto.
-intuition.
-
-unfold adj_set. rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec y (fst_ext e)).
-unfold adj_set in H. rewrite MapFacts.add_eq_o in H.
-generalize (H0 x). intro H1. inversion H1; subst; clear H1.
-set (tmp := fold_left f' l m) in *.
-unfold f' in H4. unfold f in H4.
-destruct (Vertex.eq_dec x a).
-rewrite MapFacts.add_eq_o in H4. congruence. intuition.
-destruct (Vertex.eq_dec y a).
-assert (VertexSet.In y s'). apply HHH.
-left. auto.
-rewrite e0 in H1.
-unfold s' in H1.
-elim (not_eq_extremities_merge_map e g p (fst_ext e) (fst_ext e)).
-left. apply (VertexSet.inter_2 H1).
-intuition.
-rewrite MapFacts.add_neq_o in H4.
-unfold adj_set in IHl. rewrite MapFacts.add_eq_o in IHl.
- rewrite MapFacts.add_neq_o in IHl.
-rewrite <-H4 in IHl.
-assert (VertexSet.In y VertexSet.empty).
-apply IHl. assumption.
-intro. generalize (HH H1). intro.
-inversion H2; subst.
-elim (n1 H6). auto.
-intros. apply HHH. right. auto.
-elim (VertexSet.empty_1 H1).
-auto.
-intuition.
-auto.
-
-unfold adj_set in IHl. rewrite MapFacts.add_eq_o in IHl.
- rewrite MapFacts.add_neq_o in IHl.
-simpl. rewrite <-H2. rewrite H4.
-set (tmp := fold_left f' l m) in *.
-unfold f' in H3. unfold f in H3.
-destruct (Vertex.eq_dec x a).
-rewrite MapFacts.add_eq_o in H3.
-inversion H3; subst; clear H3.
-assert (VertexSet.In x s').
-apply HHH. left. auto.
-elim (VertexSet.diff_2 H (VertexSet.inter_2 H1)). intuition.
-rewrite MapFacts.add_neq_o in H3.
-rewrite <-H3 in IHl.
-destruct (Vertex.eq_dec y a).
-assert (VertexSet.In y s'). apply HHH. left. intuition.
-unfold s' in H1.
-elim (not_eq_extremities_merge_map e g p (fst_ext e) (fst_ext e)).
-left. rewrite e0 in H1. apply (VertexSet.inter_2 H1). intuition.
-
-apply IHl.
-assumption.
-intro. generalize (HH H1). intro.
-inversion H5; subst.
-elim (n1 H7).
-auto.
-
-intros. apply HHH. right. auto.
-auto.
-auto.
-intuition.
-intuition.
-
-unfold adj_set in H. rewrite MapFacts.add_neq_o in H.
-simpl in H.
-unfold adj_set in IHl. rewrite MapFacts.add_neq_o in IHl.
- rewrite MapFacts.add_neq_o in IHl.
-generalize (H0 y). intro H1. inversion H1; clear H1.
-rewrite <-H3 in H. elim (VertexSet.empty_1 H).
-rewrite <-H2 in H.
-set (tmp := fold_left f' l m) in *.
-unfold f' in H3. unfold f in H3.
-destruct (Vertex.eq_dec y a). rewrite MapFacts.add_eq_o in H3.
-inversion H3; subst; clear H3.
-generalize H. clear H. intro H. rewrite H4 in H.
-generalize (VertexSet.remove_3 H). clear H. intro H.
-unfold adj_set in H. rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)) in H.
-fold (adj_set y m) in H.
-generalize (sym_map_merge_pmap e g _ _ p q H). clear H. intro H.
-fold m in H.
-clear IHl H0 H2 HH HHH.
-
-set (l' := a :: l) in *.
-induction l'. simpl. assumption.
-
-(*
- unfold f'. unfold f.
-destruct (Vertex.eq_dec x a). rewrite MapFacts.add_eq_o.
-apply VertexSet.remove_2; auto.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)). auto.
-auto.
-rewrite MapFacts.add_neq_o. assumption.
-auto.
-*)
-
-cut (EqualSetMap (fold_left f' (a0 :: l') m) (f' (fold_left f' l' m) a0)). intro.
-generalize (H0 x). clear H0. intro H0. simpl. inversion H0; clear H0.
-set (tmp' := fold_left f' l' m) in *.
-unfold f' in H3. unfold f in H3.
-destruct (Vertex.eq_dec x a0).
-rewrite MapFacts.add_eq_o in H3. congruence. intuition.
-rewrite MapFacts.add_neq_o in H3.
-rewrite <-H3 in IHl'. elim (VertexSet.empty_1 IHl').
-auto.
-set (tmp' := fold_left f' l' m) in *.
-unfold f' in H2. unfold f in H2.
-destruct (Vertex.eq_dec x a0).
-rewrite MapFacts.add_eq_o in H2. inversion H2; subst; clear H2.
-rewrite H3. apply VertexSet.remove_2. auto.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)). assumption.
-intuition.
-rewrite MapFacts.add_neq_o in H2.
-rewrite <-H2 in IHl'.
-rewrite H3. auto.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e2)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-apply VertexSet.eq_refl. intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s1); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a1).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H0. auto. intuition.
-
-intuition.
-rewrite MapFacts.add_neq_o in H3.
-rewrite <-H3 in IHl.
-
-generalize (H0 x). intro. inversion H1; clear H1.
-unfold f' in H7. unfold f in H7.
-destruct (Vertex.eq_dec x a).
-rewrite MapFacts.add_eq_o in H7. congruence. intuition.
-rewrite MapFacts.add_neq_o in H7.
-rewrite <-H7 in IHl. simpl. rewrite <-H6.
-apply IHl.
-rewrite <-H4. auto.
-
-intro. generalize (HH H1). intro.
-inversion H5; subst.
-elim (n1 H9).
-auto.
-
-intros. apply HHH. right. auto.
-auto.
-
-unfold f' in H6. unfold f in H6.
-destruct (Vertex.eq_dec x a).
-rewrite MapFacts.add_eq_o in H6.
-inversion H6; subst; clear H6.
-simpl. rewrite <-H5.
-rewrite H7.
-apply VertexSet.remove_2. auto.
-
-case_eq (VertexMap.find x tmp); intros.
-rewrite H1 in IHl.
-assert (VertexSet.In y t0).
-apply IHl. rewrite <-H4. assumption.
-
-intro. generalize (HH H6). intro.
-inversion H8; subst.
-elim (n1 H10).
-auto.
-
-intros. apply HHH. right. auto.
-clear H HH HHH IHl H0 H4 H2 H3 H5 H7.
-assert (eq_set_option (Some t0) (VertexMap.find x tmp)).
-rewrite H1. constructor. apply VertexSet.eq_refl. clear H1.
-unfold tmp in H.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-fold (adj_set x m).
-induction l. simpl in H. inversion H.
-unfold adj_set. rewrite <-H1. rewrite <-H2. auto.
-
-cut (EqualSetMap (fold_left f' (a0 :: l) m) (f' (fold_left f' l m) a0)). intro.
-generalize (H0 x). clear H0. intro H0. simpl in H. inversion H0; subst.
-rewrite <-H2 in H. inversion H.
-set (tmp' := fold_left f' l m) in *.
-unfold f' in H2. unfold f in H2.
-destruct (Vertex.eq_dec x a0).
-rewrite MapFacts.add_eq_o in H2.
-inversion H; subst. rewrite <-H1 in H5.
-inversion H5; subst; clear H5.
-rewrite H7 in H6. rewrite H3 in H6. inversion H2; subst; clear H2 H3 H7.
-unfold adj_set. rewrite (MapFacts.find_o _ e1). apply (VertexSet.remove_3 H6). intuition.
-rewrite MapFacts.add_neq_o in H2. rewrite <-H2 in IHl.
-apply IHl. constructor. rewrite <-H1 in H. inversion H; subst.
-rewrite H7. auto.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e2)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-apply VertexSet.eq_refl. intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s2); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a1).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H0. auto. auto.
-
-rewrite H1 in IHl.
-assert (VertexSet.In y VertexSet.empty).
-apply IHl.
-rewrite <-H4. auto.
-intro. generalize (HH H6). intro.
-inversion H8; subst.
-elim (n1 H10).
-auto.
-
-intros. apply HHH. right. auto.
-elim (VertexSet.empty_1 H6). intuition.
-
-rewrite MapFacts.add_neq_o in H6.
-rewrite <-H6 in IHl. simpl. rewrite <-H5.
-rewrite H7. apply IHl.
-rewrite <-H4. auto.
-intro. generalize (HH H1). intro.
-inversion H8; subst.
-elim (n1 H10).
-auto.
-
-intros. apply HHH. right. auto.
-auto.
-auto.
-auto.
-auto.
-auto.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-apply VertexSet.eq_refl. intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H0. auto. auto.
-Qed.
-
-Lemma sym_pmap_merge_map e g :
-aff_edge e ->
-In_graph_edge e g ->
-forall x y,
-VertexSet.In x (adj_set y (pmap_merge e g (imap_merge e g))) ->
-VertexSet.In y (adj_set x (pmap_merge e g (imap_merge e g))).
-
-Proof.
-intros. apply sym_resolve; assumption.
-Qed.
-
-Definition merge e g
- (q : In_graph_edge e g)
- (p : aff_edge e) :=
- let im := imap_merge e g in
- let pm := pmap_merge e g im in
- Make_Graph (VertexSet.remove (snd_ext e) (V g))
- im
- pm
- (extremities_in_merge_imap e g q)
- (extremities_in_merge_pmap e g p q)
- (simple_graph_merge_map e g p q)
- (sym_imap_merge_map e g p q)
- (sym_pmap_merge_map e g p q)
- (not_eq_extremities_merge_map e g p).
-
-Lemma In_graph_dec : forall v g,
-{In_graph v g} + {~In_graph v g}.
-
-Proof.
-exact (fun v g => Props.In_dec v (V g)).
-Qed.
-
-Definition pmap_delete_preferences v g :=
-let pm := pmap g in
-let m := VertexMap.add v VertexSet.empty pm in
-VertexSet.fold
- (fun y m' => VertexMap.add y (VertexSet.remove v (adj_set y pm)) m')
- (adj_set v pm)
- m.
-
-Lemma delete_preference_sub : forall x v g,
-VertexSet.Subset (adj_set x (pmap_delete_preferences v g))
- (adj_set x (pmap g)).
-
-Proof.
-unfold VertexSet.Subset;intros.
-unfold pmap_delete_preferences in H.
-rewrite VertexSet.fold_1 in H.
-
-generalize VertexSet.elements_2.
-intro H0. generalize (H0 (adj_set v (pmap g))). clear H0. intro H0.
-induction (VertexSet.elements (adj_set v (pmap g))); intros.
-simpl in H.
-unfold adj_set in H.
-destruct (Vertex.eq_dec v x).
-rewrite InterfFacts.add_eq_o in H.
-elim (VertexSet.empty_1 H).
-assumption.
-rewrite InterfFacts.add_neq_o in H. auto.
-assumption.
-cut (EqualSetMap
- (fold_left
- (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove v (adj_set e (pmap g))) a) (a0 :: l)
- (VertexMap.add v VertexSet.empty (pmap g)))
- (VertexMap.add a0
- (VertexSet.remove v
- (adj_set a0 (pmap g)))
- (fold_left
- (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove v (adj_set e (pmap g))) a) l
- (VertexMap.add v VertexSet.empty (pmap g))))).
-
-intro.
-assert (VertexSet.In a (adj_set x
- (VertexMap.add a0
- (VertexSet.remove v
- (adj_set a0 (pmap g)))
- (fold_left
- (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove v (adj_set e (pmap g))) a) l
- (VertexMap.add v VertexSet.empty (pmap g)))))).
-unfold EqualSetMap in H1. generalize (H1 x). intro H2.
-inversion H2.
-unfold adj_set. unfold adj_set in H5. rewrite <-H5.
-unfold adj_set in *. simpl in H. rewrite <-H4 in H.
-assumption.
-unfold adj_set in *. rewrite <-H4.
-unfold adj_set in *. simpl in H. rewrite <-H3 in H.
-rewrite <-H5. assumption.
-generalize (H1 x). clear H1. intro H1. inversion H1.
-simpl in H. unfold adj_set in H. unfold adj_set in H4. rewrite <-H4 in H.
-elim (VertexSet.empty_1 H).
-clear H1.
-destruct (Vertex.eq_dec x a0).
-unfold adj_set in H2. rewrite InterfFacts.add_eq_o in H2.
-generalize (VertexSet.remove_3 H2). unfold adj_set.
-rewrite (InterfFacts.find_o _ e). auto. intuition.
-apply IHl.
-rewrite InterfFacts.add_neq_o in H4.
-unfold adj_set in *. rewrite <-H4.
-rewrite <-H5. simpl in H. rewrite <-H3 in *.
-assumption.
-auto.
-intuition.
-
-apply fold_left_assoc_map.
-
-intros.
-unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite InterfFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite InterfFacts.add_eq_o.
-constructor.
-generalize (Vertex.eq_trans (Vertex.eq_sym e0) e). intro HH.
-unfold adj_set.
-rewrite (InterfFacts.find_o _ HH). apply VertexSet.eq_refl. intuition.
-
-rewrite InterfFacts.add_neq_o.
-rewrite InterfFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-
-rewrite InterfFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite InterfFacts.add_eq_o.
-rewrite InterfFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-
-intros.
-unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 y).
-rewrite InterfFacts.add_eq_o.
-rewrite InterfFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite InterfFacts.add_neq_o.
-rewrite InterfFacts.add_neq_o.
-rewrite InterfFacts.add_neq_o.
-apply EqualSetMap_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 a1).
-rewrite InterfFacts.add_eq_o.
-rewrite InterfFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite InterfFacts.add_neq_o.
-rewrite InterfFacts.add_neq_o.
-apply (H1 x0).
-auto.
-auto.
-Qed.
-
-Lemma in_pmap_delete_in : forall x v g,
-In_graph v g ->
-VertexMap.In x (pmap_delete_preferences v g) ->
-VertexMap.In x (pmap g).
-
-Proof.
-intros x v g H1 H.
-unfold pmap_delete_preferences in H.
-rewrite VertexSet.fold_1 in H.
-
-generalize VertexSet.elements_2. intro HH.
-generalize (HH (adj_set v (pmap g))). clear HH. intro HH.
-
-induction (VertexSet.elements (adj_set v (pmap g))); intros.
-simpl in H.
-destruct (proj1 (InterfFacts.add_in_iff _ _ _ _) H).
-apply (proj2 (extremities_pmap g x)).
-rewrite <-H0. assumption.
-assumption.
-
-cut (EqualSetMap
- (fold_left
- (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove v (adj_set e (pmap g))) a) (a :: l)
- (VertexMap.add v VertexSet.empty (pmap g)))
- (VertexMap.add a
- (VertexSet.remove v
- (adj_set a (pmap g)))
- (fold_left
- (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove v (adj_set e (pmap g))) a) l
- (VertexMap.add v VertexSet.empty (pmap g))))). intro.
-unfold EqualSetMap in H0.
-
-generalize (proj1 (InterfFacts.in_find_iff _ _) H). clear H. intro H.
-generalize (H0 x). intro H2.
-inversion H2.
-unfold adj_set in *. simpl in H. rewrite <-H4 in H.
-elim H. auto.
-clear H2.
-destruct (Vertex.eq_dec x a).
-rewrite InterfFacts.add_eq_o in H4.
-apply (proj2 (InterfFacts.in_find_iff _ _)).
-assert (VertexSet.In v (adj_set x (pmap g))).
-apply (sym_pmap g).
-apply HH. left. auto.
-unfold adj_set in H2.
-destruct (VertexMap.find x (pmap g)).
-intro Helim. inversion Helim.
-elim (VertexSet.empty_1 H2). intuition.
-rewrite InterfFacts.add_neq_o in H4.
-apply IHl.
-apply (proj2 (InterfFacts.in_find_iff _ _)).
-rewrite <-H4. intro Helim. inversion Helim.
-intuition.
-auto.
-
-apply fold_left_assoc_map.
-intros.
-unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite InterfFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite InterfFacts.add_eq_o.
-constructor.
-generalize (Vertex.eq_trans (Vertex.eq_sym e0) e). intro HHH.
-unfold adj_set.
-rewrite (InterfFacts.find_o _ HHH). apply VertexSet.eq_refl. intuition.
-
-rewrite InterfFacts.add_neq_o.
-rewrite InterfFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-
-rewrite InterfFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite InterfFacts.add_eq_o.
-rewrite InterfFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-
-intros.
-unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 y).
-rewrite InterfFacts.add_eq_o.
-rewrite InterfFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite InterfFacts.add_neq_o.
-rewrite InterfFacts.add_neq_o.
-rewrite InterfFacts.add_neq_o.
-apply EqualSetMap_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 a0).
-rewrite InterfFacts.add_eq_o.
-rewrite InterfFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite InterfFacts.add_neq_o.
-rewrite InterfFacts.add_neq_o.
-apply (H0 x0).
-auto.
-auto.
-Qed.
-
-Lemma extremities_in_delete_preferences_imap (v : Vertex.t) g :
-forall x,
-VertexMap.In x (imap g) <-> VertexSet.In x (V g).
-
-Proof.
-exact (fun v g => extremities_imap g).
-Qed.
-
-Lemma extremities_in_delete_preferences_pmap v g :
-In_graph v g ->
-(forall x,
-VertexMap.In x (pmap_delete_preferences v g) <->
-VertexSet.In x (V g)).
-
-Proof.
-split; intros.
-apply (proj1 (extremities_pmap g x)).
-apply in_pmap_delete_in with (v:=v); auto.
-
-unfold pmap_delete_preferences.
-set (f := (fun (y : VertexSet.elt) (m' : VertexMap.t VertexSet.t) =>
- VertexMap.add y (VertexSet.remove v (adj_set y (pmap g))) m')) in *.
-set (m := VertexMap.add v VertexSet.empty (pmap g)).
-rewrite VertexSet.fold_1.
-induction (VertexSet.elements (adj_set v (pmap g))). simpl.
-unfold m.
-rewrite MapFacts.in_find_iff.
-destruct (Vertex.eq_dec x v).
-rewrite MapFacts.add_eq_o.
-congruence. intuition.
-rewrite MapFacts.add_neq_o.
-generalize (proj2 (extremities_pmap g x) H0).
-rewrite MapFacts.in_find_iff. auto.
-auto.
-set (h := (fun (a0 : VertexMap.t VertexSet.t) (e : VertexSet.elt) => f e a0)) in *.
-
-cut (EqualSetMap (fold_left h (a :: l) m) (h (fold_left h l m) a)). intro.
-generalize (H1 x). clear H1. intro H1.
-inversion H1.
-set (tmp := fold_left h l m) in *.
-unfold h in H4.
-unfold f in H4.
-destruct (Vertex.eq_dec x a).
-rewrite MapFacts.add_eq_o in H4.
-congruence. intuition.
-rewrite MapFacts.add_neq_o in H4.
-rewrite MapFacts.in_find_iff in IHl. rewrite <-H4 in IHl.
-congruence. intuition.
-simpl. rewrite MapFacts.in_find_iff. rewrite <-H2. congruence.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold h. unfold f. intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite InterfFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite InterfFacts.add_eq_o.
-constructor.
-generalize (Vertex.eq_trans (Vertex.eq_sym e0) e). intro HHH.
-unfold adj_set.
-rewrite (InterfFacts.find_o _ HHH). apply VertexSet.eq_refl.
-intuition.
-
-rewrite InterfFacts.add_neq_o.
-rewrite InterfFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-
-rewrite InterfFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y).
-rewrite InterfFacts.add_eq_o.
-rewrite InterfFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s); constructor.
-apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-intros.
-unfold EqualSetMap. unfold h. unfold f. intros.
-destruct (Vertex.eq_dec x0 a0).
-rewrite InterfFacts.add_eq_o.
-rewrite InterfFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite InterfFacts.add_neq_o.
-rewrite InterfFacts.add_neq_o.
-apply H1. auto. auto.
-Qed.
-
-(*
-Lemma extremities_in_delete_preferences v g :
-forall x,
-VertexMap.In x (imap g) \/
-VertexMap.In x (pmap_delete_preferences v g) <->
-VertexSet.In x (V g).
-
-Proof.
-split; intros.
-destruct (Vertex.eq_dec v x).
-apply (proj1 (extremities g x)).
-destruct H;[left|right].
-assumption.
-apply in_pmap_delete_in with (v:=v); auto.
-
-Qed.
-*)
-
-Lemma simple_graph_delete_preferences v g : forall x y,
-VertexSet.In x (adj_set y (imap g)) /\
-VertexSet.In x (adj_set y (pmap_delete_preferences v g)) -> False.
-
-Proof.
-intros.
-destruct H.
-generalize (delete_preference_sub _ _ _ _ H0). clear H0. intro H0.
-apply (simple_graph g x y). intuition.
-Qed.
-
-Lemma sym_imap_delete_preferences (v : Vertex.t) g :
-forall x y,
-VertexSet.In x (adj_set y (imap g)) ->
-VertexSet.In y (adj_set x (imap g)).
-
-Proof.
-exact (fun v g => sym_imap g).
-Qed.
-
-Lemma in_adj_delete_preference_not_eq_1 : forall x y v g,
-VertexSet.In x (adj_set y (pmap_delete_preferences v g)) ->
-~Vertex.eq y v.
-
-Proof.
-intros.
-unfold pmap_delete_preferences in H.
-rewrite VertexSet.fold_1 in H.
-set (f:= (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove v (adj_set e (pmap g))) a)) in *.
-set (l := VertexSet.elements (adj_set v (pmap g))) in *.
-generalize VertexSet.elements_2. intro HH.
-generalize (HH (adj_set v (pmap g))). clear HH. intro HH.
-fold l in HH.
-assert (forall z, In z l -> ~Vertex.eq v z) as Hneq.
-clear H.
-intros. intro H0.
-induction l. inversion H.
-simpl in H. destruct H. subst.
-assert (VertexSet.In v (adj_set v (pmap g))).
-apply HH. left. auto.
-elim (not_eq_extremities g v v).
-right. assumption.
-auto.
-apply IHl.
-intros. apply HH. auto.
-assumption.
-
-induction l. simpl in H.
-unfold adj_set in H. intro Helim.
-rewrite MapFacts.add_eq_o in H.
-elim (VertexSet.empty_1 H). intuition.
-set (s := VertexMap.add v VertexSet.empty (pmap g)) in *.
-
-assert (EqualSetMap (fold_left f (a :: l) s) (f (fold_left f l s) a)).
-apply fold_left_assoc_map.
-
-unfold f. unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-apply Props.Equal_remove.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_trans (Vertex.eq_sym e) e0)).
-apply VertexSet.eq_refl. intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor.
-apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold f. unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H0.
-auto.
-auto.
-
-intro Helim.
-cut (VertexSet.In x (adj_set y (f (fold_left f l s) a))).
-set (tmp := fold_left f l s) in *.
-intro H1.
-unfold f in H1.
-generalize (H0 x). clear H0. intro H0.
-unfold adj_set in H1. inversion H0.
-rewrite <-H4 in *.
-destruct (Vertex.eq_dec y a).
-elim (Hneq a). left. auto.
-apply (Vertex.eq_trans (Vertex.eq_sym Helim) e).
-rewrite MapFacts.add_neq_o in H1.
-apply IHl.
-assumption.
-intros. apply HH. auto.
-intros. apply Hneq. right. auto.
-assumption.
-auto.
-
-rewrite <-H3 in *.
-destruct (Vertex.eq_dec y a).
-elim (Hneq a). left. auto.
-apply (Vertex.eq_trans (Vertex.eq_sym Helim) e).
-rewrite MapFacts.add_neq_o in H1.
-apply IHl.
-assumption.
-intros. apply HH. auto.
-intros. apply Hneq. right. auto.
-assumption.
-auto.
-
-clear HH Hneq IHl.
-unfold adj_set in H. unfold adj_set.
-generalize (H0 y). clear H0. intro H0.
-simpl in H.
-inversion H0; subst.
-rewrite <-H3 in *.
-simpl in H. rewrite <-H2 in *.
-elim (VertexSet.empty_1 H).
-rewrite <-H1 in *.
-rewrite <-H2 in *.
-rewrite <-H3. assumption.
-Qed.
-
-Lemma in_adj_delete_preference_not_eq_2 : forall x y v g,
-VertexSet.In x (adj_set y (pmap_delete_preferences v g)) ->
-~Vertex.eq x v.
-
-Proof.
-intros. intro Helim. generalize H. intro Hcopy.
-unfold pmap_delete_preferences in H.
-rewrite VertexSet.fold_1 in H.
-set (f:= (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove v (adj_set e (pmap g))) a)) in *.
-generalize VertexSet.elements_1. intro.
-generalize (H0 (adj_set v (pmap g)) y). clear H0. intro HH.
-set (l := VertexSet.elements (adj_set v (pmap g))) in *.
-induction l. simpl in H.
-unfold adj_set in H.
-rewrite MapFacts.add_neq_o in H.
-generalize (sym_pmap g). intro Hsym.
-generalize (Hsym _ _ H). intro H0.
-unfold adj_set in H0.
-rewrite (MapFacts.find_o _ Helim) in H0.
-generalize (HH H0). intro H1. inversion H1.
-generalize (in_adj_delete_preference_not_eq_1 x y v g Hcopy). auto.
-set (s := VertexMap.add v VertexSet.empty (pmap g)) in *.
-
-assert (EqualSetMap (fold_left f (a :: l) s) (f (fold_left f l s) a)).
-apply fold_left_assoc_map.
-
-unfold f. unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-apply Props.Equal_remove.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_trans (Vertex.eq_sym e) e0)).
-apply VertexSet.eq_refl. intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor.
-apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold f. unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H0.
-auto.
-auto.
-
-clear Hcopy.
-cut (VertexSet.In x (adj_set y (f (fold_left f l s) a))).
-set (tmp := fold_left f l s) in *.
-intro H1.
-unfold f in H1. unfold adj_set in H1.
-destruct (Vertex.eq_dec y a).
-rewrite MapFacts.add_eq_o in H1.
-elim (VertexSet.remove_1 (Vertex.eq_sym Helim) H1). intuition.
-rewrite MapFacts.add_neq_o in H1.
-apply IHl.
-assumption.
-intro. generalize (HH H2). intro H3.
-inversion H3; subst.
-elim (n H5).
-assumption.
-auto.
-
-unfold adj_set.
-generalize (H0 y). clear H0. intro H0.
-inversion H0; subst.
-simpl in H. unfold adj_set in H. rewrite <-H2 in H.
-assumption.
-simpl in H. unfold adj_set in H. rewrite <-H1 in H.
-rewrite <-H3. assumption.
-Qed.
-
-Lemma sym_pmap_delete_preferences (v : Vertex.t) g :
-forall x y,
-VertexSet.In x (adj_set y (pmap_delete_preferences v g)) ->
-VertexSet.In y (adj_set x (pmap_delete_preferences v g)).
-
-Proof.
-intros.
-generalize (in_adj_delete_preference_not_eq_1 x y v g H). intro Hneqy.
-generalize (in_adj_delete_preference_not_eq_2 x y v g H). intro Hneqx.
-generalize (delete_preference_sub y v g x H). intro HH.
-generalize (sym_pmap g _ _ HH). clear HH. intro HH.
-unfold pmap_delete_preferences in *.
-rewrite VertexSet.fold_1 in *.
-set (f := fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove v (adj_set e (pmap g))) a) in *.
-induction (VertexSet.elements (adj_set v (pmap g))).
-simpl in *.
-destruct (Vertex.eq_dec x v).
-destruct (Vertex.eq_dec y v).
-unfold adj_set in H. rewrite MapFacts.add_eq_o in H.
-elim (VertexSet.empty_1 H).
-case_eq (VertexMap.find y (VertexMap.add v VertexSet.empty (pmap g))). intros.
-rewrite H0 in H.
-rewrite MapFacts.add_eq_o in H0. inversion H0. subst.
-elim (VertexSet.empty_1 H). intuition.
-rewrite MapFacts.add_eq_o. congruence. intuition.
-
-elim (Hneqx e).
-
-unfold adj_set. rewrite MapFacts.add_neq_o. assumption. intuition.
-
-set (s := VertexMap.add v VertexSet.empty (pmap g)) in *.
-assert (EqualSetMap (fold_left f (a :: l) s) (f (fold_left f l s) a)).
-apply fold_left_assoc_map.
-
-unfold f. unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-apply Props.Equal_remove.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_trans (Vertex.eq_sym e) e0)).
-apply VertexSet.eq_refl. intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor.
-apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold f. unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H0.
-auto.
-auto.
-
-unfold EqualSetMap in H0.
-unfold adj_set.
-case_eq (VertexMap.find x (fold_left f (a :: l) s)); intros.
-generalize (H0 x). intro HH0.
-rewrite H1 in HH0. inversion HH0. subst.
-set (tmp := fold_left f l s) in *.
-unfold adj_set in H.
-unfold f in H3.
-destruct (Vertex.eq_dec x a).
-rewrite MapFacts.add_eq_o in H3.
-inversion H3. subst. clear H3.
-rewrite H4. apply VertexSet.remove_2.
-auto.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e)). assumption.
-intuition.
-
-rewrite MapFacts.add_neq_o in H3.
-rewrite H4.
-cut (VertexSet.In y (adj_set x tmp)).
-intro.
-unfold adj_set in H2.
-rewrite <-H3 in H2. assumption.
-apply IHl.
-assert (VertexSet.In x (adj_set y (pmap g)) -> VertexSet.In x (adj_set y tmp)).
-clear IHl H0 H1 HH0 H4 H3 HH H.
-intros.
-unfold tmp.
-induction l. simpl. unfold s.
-unfold adj_set.
-rewrite MapFacts.add_neq_o. assumption.
-auto.
-
-assert (EqualSetMap (fold_left f (a0 :: l) s) (f (fold_left f l s) a0)).
-apply fold_left_assoc_map.
-
-unfold f. unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-apply Props.Equal_remove.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_trans (Vertex.eq_sym e) e0)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor.
-apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold f. unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 a1).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H0.
-auto.
-auto.
-
-generalize (H0 y). clear H0. intro H0.
-inversion H0; subst.
-unfold adj_set. simpl. rewrite <-H2.
-set (tmp' := fold_left f l s) in *.
-unfold f in H3.
-destruct (Vertex.eq_dec y a0).
-rewrite MapFacts.add_eq_o in H3. inversion H3.
-intuition.
-rewrite MapFacts.add_neq_o in H3.
-unfold adj_set in IHl. rewrite <-H3 in IHl.
-assumption.
-auto.
-unfold adj_set. simpl. rewrite <-H1.
-rewrite H3.
-set (tmp' := fold_left f l s) in *.
-unfold f in H2.
-destruct (Vertex.eq_dec y a0).
-rewrite MapFacts.add_eq_o in H2.
-inversion H2. subst. clear H2.
-apply VertexSet.remove_2.
-auto.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e)).
-assumption.
-intuition.
-rewrite MapFacts.add_neq_o in H2.
-assert (VertexSet.In x (adj_set y tmp')).
-apply IHl.
-unfold adj_set in H4.
-rewrite <-H2 in H4. assumption.
-auto.
-apply H2.
-apply (sym_pmap g). assumption.
-auto.
-
-generalize (H0 x). clear H0. intro H0.
-rewrite H1 in H0. inversion H0. subst.
-set (tmp := fold_left f l s) in *.
-unfold f in H2.
-destruct (Vertex.eq_dec x a).
-rewrite MapFacts.add_eq_o in H2.
-inversion H2.
-intuition.
-rewrite MapFacts.add_neq_o in H2.
-
-assert (VertexSet.In y (adj_set x (pmap g)) -> VertexSet.In y (adj_set x tmp)).
-clear IHl H H0 HH H2 H1.
-intros.
-unfold tmp.
-induction l. simpl. unfold s.
-unfold adj_set.
-rewrite MapFacts.add_neq_o. assumption.
-intuition.
-
-assert (EqualSetMap (fold_left f (a0 :: l) s) (f (fold_left f l s) a0)).
-apply fold_left_assoc_map.
-
-unfold f. unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-apply Props.Equal_remove.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_trans (Vertex.eq_sym e) e0)).
-apply VertexSet.eq_refl. intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor.
-apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold f. unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x0 a1).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H0.
-auto.
-auto.
-
-generalize (H0 x). clear H0. intro H0.
-inversion H0; subst.
-unfold adj_set. simpl. rewrite <-H2.
-set (tmp' := fold_left f l s) in *.
-unfold f in H3.
-destruct (Vertex.eq_dec x a0).
-rewrite MapFacts.add_eq_o in H3. inversion H3.
-intuition.
-rewrite MapFacts.add_neq_o in H3.
-unfold adj_set in IHl. rewrite <-H3 in IHl.
-assumption.
-auto.
-unfold adj_set. simpl. rewrite <-H1.
-rewrite H3.
-set (tmp' := fold_left f l s) in *.
-unfold f in H2.
-destruct (Vertex.eq_dec x a0).
-rewrite MapFacts.add_eq_o in H2.
-inversion H2. subst. clear H2.
-apply VertexSet.remove_2.
-auto.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e)).
-assumption.
-intuition.
-rewrite MapFacts.add_neq_o in H2.
-assert (VertexSet.In y (adj_set x tmp')).
-apply IHl.
-unfold adj_set in H4.
-rewrite <-H2 in H4. assumption.
-auto.
-assert (VertexSet.In y (adj_set x tmp)).
-apply H3. assumption.
-unfold adj_set in H4.
-rewrite <-H2 in H4.
-assumption.
-auto.
-Qed.
-
-Lemma not_eq_extremities_delete_preferences v g :
-forall x y,
-VertexSet.In x (adj_set y (imap g)) \/
-VertexSet.In x (adj_set y (pmap_delete_preferences v g)) ->
-~Vertex.eq x y.
-
-Proof.
-intros.
-apply (not_eq_extremities g).
-destruct H;[left|right].
-assumption.
-apply (delete_preference_sub _ _ _ _ H).
-Qed.
-
-Definition delete_preference_edges v g H :=
-Make_Graph (V g)
- (imap g)
- (pmap_delete_preferences v g)
- (extremities_in_delete_preferences_imap v g)
- (extremities_in_delete_preferences_pmap v g H)
- (simple_graph_delete_preferences v g)
- (sym_imap_delete_preferences v g)
- (sym_pmap_delete_preferences v g)
- (not_eq_extremities_delete_preferences v g).
-
-Definition Prefere x y g :=
-exists w, In_graph_edge (x,y,Some w) g.
-
-Definition Interfere x y g :=
-In_graph_edge (x,y,None) g.
-
-Definition precolored g :=
-VertexSet.filter (fun v => is_precolored v g) (V g).
-
-Parameter mreg_ext : forall x y,
-Vertex.eq x y -> is_mreg x = is_mreg y.
-
-Lemma mem_ext : forall x y s,
-Vertex.eq x y -> VertexSet.mem x s = VertexSet.mem y s.
-
-Proof.
-intros.
-case_eq (VertexSet.mem x s); intros.
-generalize (VertexSet.mem_2 H0). intro H1.
-rewrite H in H1. generalize (VertexSet.mem_1 H1). auto.
-case_eq (VertexSet.mem y s); intros.
-generalize (VertexSet.mem_2 H1). intro H2.
-rewrite <-H in H2. generalize (VertexSet.mem_1 H2). intro H3.
-rewrite H3 in H0. inversion H0.
-reflexivity.
-Qed.
-
-Lemma compat_bool_is_precolored : forall g,
-compat_bool Vertex.eq (fun x => is_precolored x g).
-
-Proof.
-unfold compat_bool. intros.
-unfold is_precolored.
-apply mreg_ext. auto.
-Qed.
-
-(* Equivalence of predicate and function *)
-Lemma precolored_equiv : forall x g,
-VertexSet.In x (precolored g) <-> (is_precolored x g = true /\ In_graph x g).
-
-Proof.
-split; intros.
-split.
-apply (VertexSet.filter_2 (compat_bool_is_precolored _) H).
-apply (VertexSet.filter_1 (compat_bool_is_precolored _) H).
-apply VertexSet.filter_3. apply compat_bool_is_precolored.
-unfold is_precolored in H.
-case_eq (VertexSet.mem x (V g)); intros.
-apply VertexSet.mem_2. assumption. intuition. intuition.
-Qed.
-
-Lemma In_graph_aff_edge_in_AE : forall e g,
-EdgeSet.In e (AE g) <-> aff_edge e /\ In_graph_edge e g.
-
-Proof.
-intros e g. split; intro H.
-split.
-unfold aff_edge. exists N0. exact (AE_weights g e H).
-left. assumption.
-destruct H as [H H0].
-destruct H0.
-assumption.
-unfold aff_edge in H. destruct H as [w H].
-rewrite (IE_weights g e H0) in H. inversion H.
-Qed.
-
-Lemma In_graph_interf_edge_in_IE : forall e g,
-EdgeSet.In e (IE g) <-> interf_edge e /\ In_graph_edge e g.
-
-Proof.
-intros e g. split; intro H.
-split.
-exact (IE_weights g e H).
-right. assumption.
-destruct H as [H H0].
-destruct H0.
-unfold interf_edge in H.
-rewrite (AE_weights g e H0) in H. inversion H.
-assumption.
-Qed.
-
-(* Spec of Prefere *)
-Lemma Prefere_1 : forall e g,
-aff_edge e ->
-In_graph_edge e g ->
-Prefere (fst_ext e) (snd_ext e) g.
-
-Proof.
-intros.
-unfold Prefere.
-destruct H0.
-exists N0. rewrite <-(AE_weights g e H0). rewrite <-edge_eq. left. assumption.
-generalize (proj1 (In_graph_interf_edge_in_IE _ _) H0). intro H1.
-destruct H1 as [H1 _]. unfold interf_edge in H1. unfold aff_edge in H.
-rewrite H1 in H. inversion H. inversion H2.
-Qed.
-
-Lemma Prefere_2 : forall x y g,
-Prefere x y g ->
-In_graph_edge (x,y,Some N0) g.
-
-Proof.
-intros.
-unfold Prefere in H.
-destruct H.
-assert (EdgeSet.In (x,y,Some x0) (AE g)).
-rewrite In_graph_aff_edge_in_AE. split. exists x0. auto. auto.
-generalize (AE_weights _ _ H0). intro. simpl in H1. rewrite H1 in H. auto.
-Qed.
-
-(* spec of Interfere *)
-Lemma Interfere_1 : forall e g,
-interf_edge e ->
-In_graph_edge e g ->
-Interfere (fst_ext e) (snd_ext e) g.
-
-Proof.
-intros.
-unfold Interfere.
-destruct H0.
-generalize (proj1 (In_graph_aff_edge_in_AE _ _) H0). intro H1.
-destruct H1 as [H1 _]. unfold interf_edge in H. unfold aff_edge in H1.
-rewrite H in H1. inversion H1. inversion H2.
-rewrite <-(IE_weights g e H0). rewrite <-edge_eq. right. assumption.
-Qed.
-
-Lemma Interfere_2 : forall x y g,
-Interfere x y g ->
-In_graph_edge (x,y,None) g.
-
-Proof.
-auto.
-Qed.
-
-(* Machine registers are registers *)
-Lemma In_precolored : forall g ,
-VertexSet.Subset (precolored g) (V g).
-
-Proof.
-intros.
-unfold VertexSet.Subset; intros.
-apply (VertexSet.filter_1 (compat_bool_is_precolored _) H).
-Qed.
-
-(* specification of remove_vertex *)
-Lemma In_remove : forall x r g,
-In_graph x g ->
-~Vertex.eq x r ->
-In_graph x (remove_vertex r g).
-
-Proof.
-intros.
-unfold remove_vertex. simpl.
-apply VertexSet.remove_2; auto.
-Qed.
-
-(* A precolored vertex cannot be removed from the graph *)
-Lemma not_in_remove : forall r g,
-~In_graph r (remove_vertex r g).
-
-Proof.
-intros.
-unfold remove_vertex.
-apply VertexSet.remove_1. apply Vertex.eq_refl.
-Qed.
-
-Lemma in_remove_in : forall x r g,
-In_graph x (remove_vertex r g) ->
-In_graph x g.
-
-Proof.
-intros.
-unfold remove_vertex in H.
-unfold In_graph in H. simpl in H.
-apply (VertexSet.remove_3 H).
-Qed.
-
-Add Morphism In_graph : In_graph_m.
-
-Proof.
-intros.
-unfold In_graph.
-rewrite H. reflexivity.
-Qed.
-
-(* Probably redundant, TODO get out of interface *)
-Lemma precolored_remove_vertex2 : forall x y g,
-VertexSet.In x (VertexSet.remove y (precolored g)) <->
-VertexSet.In x (precolored (remove_vertex y g)).
-
-Proof.
-intros.
-split; intros.
-generalize (VertexSet.remove_3 H). intro H0.
-generalize (VertexSet.filter_1 (compat_bool_is_precolored _) H0). intro.
-generalize (VertexSet.filter_2 (compat_bool_is_precolored _) H0). clear H0. intro.
-apply VertexSet.filter_3.
-apply compat_bool_is_precolored.
-unfold remove_vertex. simpl.
-apply VertexSet.remove_2. intro. apply (VertexSet.remove_1 H2 H).
-assumption.
-unfold is_precolored. assumption.
-generalize (proj1 (precolored_equiv _ _) H). clear H. intro H. destruct H.
-apply VertexSet.remove_2.
-intro H1. rewrite <-H1 in H0. elim (not_in_remove _ _ H0).
-apply (proj2 (precolored_equiv _ _)).
-split.
-assumption.
-apply in_remove_in with (r:=y). assumption.
-Qed.
-
-Lemma In_remove_edge_ : forall e r g,
-In_graph_edge e g ->
-~incident e r ->
-In_graph_edge e (remove_vertex r g).
-
-Proof.
-intros.
-destruct H;[left|right].
-generalize (AE_weights _ _ H). intro Hw.
-unfold AE in *.
-unfold remove_vertex.
-simpl.
-rewrite (edge_eq e) in *.
-simpl in Hw. rewrite Hw.
-apply (proj2 (edgemap_to_edgeset_charac _ _ _ _ (sym_pmap_remove_vertex r g))).
-apply imap_remove_1.
-intro H1. elim H0. right. auto.
-intro H1. elim H0. left. auto.
-rewrite Hw in H.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ _ (sym_pmap g)) H).
-
-generalize (IE_weights _ _ H). intro Hw.
-unfold IE in *.
-unfold remove_vertex.
-simpl.
-rewrite (edge_eq e) in *.
-simpl in Hw. rewrite Hw.
-apply (proj2 (edgemap_to_edgeset_charac _ _ _ _ (sym_imap_remove_vertex r g))).
-apply imap_remove_1.
-intro H1. elim H0. right. auto.
-intro H1. elim H0. left. auto.
-rewrite Hw in H.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ _ (sym_imap g)) H).
-Qed.
-
-Lemma in_remove_in_edge : forall e r g,
-In_graph_edge e (remove_vertex r g) ->
-In_graph_edge e g.
-
-Proof.
-intros.
-destruct H;[left|right].
-generalize (AE_weights _ _ H). intro Hw.
-unfold AE in *.
-unfold remove_vertex in H.
-simpl in H.
-rewrite (edge_eq e) in *.
-simpl in Hw. rewrite Hw.
-apply (proj2 (edgemap_to_edgeset_charac _ _ _ _ (sym_pmap g))).
-apply imap_remove_3 with (r:=r).
-rewrite Hw in H.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ _(sym_pmap_remove_vertex r g)) H).
-
-generalize (IE_weights _ _ H). intro Hw.
-unfold IE in *.
-unfold remove_vertex in H.
-simpl in H.
-rewrite (edge_eq e) in *.
-simpl in Hw. rewrite Hw.
-apply (proj2 (edgemap_to_edgeset_charac _ _ _ _ (sym_imap g))).
-apply imap_remove_3 with (r:=r).
-rewrite Hw in H.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ _(sym_imap_remove_vertex r g)) H).
-Qed.
-
-Lemma not_in_remove_edge : forall e r g,
-incident e r ->
-~In_graph_edge e (remove_vertex r g).
-
-Proof.
-intros. generalize H. intro H0.
-destruct (In_graph_edge_dec e g).
-assert (In_graph r g) as Hin.
-destruct H.
-rewrite H. apply (proj1 (In_graph_edge_in_ext _ _ i)).
-rewrite H. apply (proj2 (In_graph_edge_in_ext _ _ i)).
-intro H1. destruct H1.
-generalize (AE_weights _ _ H1). intro Hw.
-unfold AE in *.
-unfold remove_vertex in H1.
-simpl in H1.
-rewrite (edge_eq e) in H1.
-rewrite Hw in H1. rewrite edge_comm in H1.
-generalize (proj1 (edgemap_to_edgeset_charac _ _ _ _ (sym_pmap_remove_vertex r g)) H1).
-intro H3.
-apply (imap_remove_2 _ _ (pmap g) _ H (sym_pmap g) H3).
-
-generalize (IE_weights _ _ H1). intro Hw.
-unfold IE in *.
-unfold remove_vertex in H1.
-simpl in H1.
-rewrite (edge_eq e) in H1.
-rewrite Hw in H1. rewrite edge_comm in H1.
-generalize (proj1 (edgemap_to_edgeset_charac _ _ _ _ (sym_imap_remove_vertex r g)) H1).
-intro H3.
-apply (imap_remove_2 _ _ (imap g) _ H (sym_imap g) H3).
-intro H1. elim (n (in_remove_in_edge _ _ _ H1)).
-Qed.
-
-
-(* spec of merge *)
-Lemma In_merge_in : forall g e x p q,
-In_graph x (merge e g p q) -> In_graph x g.
-
-Proof.
-intros.
-unfold merge in H.
-destruct (aff_edge_dec e).
-destruct (In_graph_edge_dec e g).
-unfold In_graph in H. simpl in H.
-apply (VertexSet.remove_3 H).
-elim (n p).
-elim (n q).
-Qed.
-
-(* the second extremity must not be precolored,
- cause it is removed from the graph *)
-Lemma merge_1 : forall e g p q,
-~In_graph (snd_ext e) (merge e g p q).
-
-Proof.
-intros.
-unfold merge. unfold In_graph. simpl.
-apply VertexSet.remove_1. apply Vertex.eq_refl.
-Qed.
-
-Lemma merge_2 : forall x e g p q,
-~Vertex.eq x (snd_ext e) ->
-In_graph x g ->
-In_graph x (merge e g p q).
-
-Proof.
-intros. unfold merge.
-unfold In_graph. simpl. apply VertexSet.remove_2 with (x:=(snd_ext e)); auto.
-Qed.
-
-Lemma merge_3 : forall e e' g p q,
-In_graph_edge e' g ->
-interf_edge e' ->
-In_graph_edge (redirect (snd_ext e) (fst_ext e) e') (merge e g p q).
-
-Proof.
-intros e e' g p q H0 H1. generalize I. intro H.
-assert (EdgeSet.In (fst_ext e, snd_ext e, Some N0) (AE g)) as He.
-destruct p. rewrite (edge_eq e) in H2.
-generalize (AE_weights _ _ H2). intro. simpl in H3.
-rewrite H3 in H2. assumption.
-generalize (IE_weights _ _ H2). inversion q. congruence.
-assert (VertexSet.In (snd_ext e) (adj_set (fst_ext e) (pmap g))) as Hee.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))).
-assumption.
-assert (EdgeSet.In (fst_ext e', snd_ext e', None) (IE g)) as He'.
-destruct H0. generalize (AE_weights _ _ H0). intro H2. inversion H2. congruence.
-rewrite (edge_eq e') in H0. generalize (IE_weights _ _ H0). intro. simpl in H2.
-rewrite H2 in H0. assumption.
-assert (VertexSet.In (snd_ext e') (adj_set (fst_ext e') (imap g))) as Hee'.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ None (sym_imap g))).
-assumption.
-assert (forall a b, VertexSet.In a (adj_set b (imap_merge e g)) ->
- VertexSet.In b (adj_set a (imap_merge e g))) as Hsym.
-apply sym_imap_merge_map; auto.
-
-right.
-unfold merge. unfold IE. simpl.
-unfold redirect.
-destruct (OTFacts.eq_dec (fst_ext e') (snd_ext e)).
-rewrite H1. apply (proj2 (edgemap_to_edgeset_charac (imap_merge e g) _ _ None Hsym)).
-
-unfold imap_merge.
-unfold map_merge.
-set (s := (VertexSet.union
- (VertexSet.remove (snd_ext e) (adj_set (fst_ext e) (imap g)))
- (VertexSet.remove (fst_ext e) (adj_set (snd_ext e) (imap g))))) in *.
-set (m := imap g) in *.
-set (f := (fun (y : VertexSet.elt) (m' : VertexMap.t VertexSet.t) =>
- VertexMap.add y
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set y m))) m')) in *.
-set (s' := VertexSet.remove (fst_ext e) (adj_set (snd_ext e) m)) in *.
-unfold adj_set.
-rewrite MapFacts.remove_neq_o.
-rewrite MapFacts.add_eq_o.
-unfold s.
-apply VertexSet.union_3.
-unfold s'.
-apply VertexSet.remove_2.
-intro.
-elim (simple_graph g (fst_ext e) (snd_ext e)).
-split.
-rewrite H2. unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym r)).
-fold (adj_set (fst_ext e') (imap g)).
-assumption.
-apply (sym_pmap g). assumption.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym r)).
-fold (adj_set (fst_ext e') m).
-assumption.
-intuition.
-apply (In_graph_edge_diff_ext _ _ p).
-
-destruct (OTFacts.eq_dec (snd_ext e') (snd_ext e)).
-rewrite H1.
-apply (proj2 (edgemap_to_edgeset_charac (imap_merge e g) _ _ None Hsym)).
-unfold imap_merge.
-unfold map_merge.
-set (s := (VertexSet.union
- (VertexSet.remove (snd_ext e) (adj_set (fst_ext e) (imap g)))
- (VertexSet.remove (fst_ext e) (adj_set (snd_ext e) (imap g))))) in *.
-set (m := imap g) in *.
-set (f := (fun (y : VertexSet.elt) (m' : VertexMap.t VertexSet.t) =>
- VertexMap.add y
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set y m))) m')) in *.
-set (s' := VertexSet.remove (fst_ext e) (adj_set (snd_ext e) m)) in *.
-unfold adj_set.
-rewrite MapFacts.remove_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite VertexSet.fold_1.
-set (f' := fun a e => f e a).
-generalize VertexSet.elements_1. intro HH.
-generalize (HH s' (fst_ext e')). clear HH. intro HH.
-induction (VertexSet.elements s'). simpl.
-assert (InA Vertex.eq (fst_ext e') nil).
-apply HH.
-unfold s'. apply VertexSet.remove_2.
-intro.
-elim (simple_graph g (fst_ext e) (snd_ext e)).
-split.
-rewrite H2. unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym r)).
-fold (adj_set (fst_ext e') (imap g)).
-apply (sym_imap g). assumption.
-apply (sym_pmap g). assumption.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym r)).
-apply (sym_imap g). assumption.
-inversion H2.
-
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H2 (fst_ext e')). clear H2. intro H2. simpl. inversion H2;clear H2.
-set (tmp := fold_left f' l m) in *.
-unfold f' in H5. unfold f in H5.
-destruct (Vertex.eq_dec (fst_ext e') a).
-rewrite MapFacts.add_eq_o in H5. congruence. intuition.
-rewrite MapFacts.add_neq_o in H5. rewrite <-H5 in IHl.
-apply IHl.
-intro. generalize (HH H2). clear HH. intro HH.
-inversion HH; subst.
-elim (n0 H6).
-assumption.
-auto.
-
-set (tmp := fold_left f' l m) in *.
-unfold f' in H4. unfold f in H4.
-destruct (Vertex.eq_dec (fst_ext e') a).
-rewrite MapFacts.add_eq_o in H4.
-rewrite H5. inversion H4; subst; clear H4.
-apply VertexSet.add_1. intuition. intuition.
-rewrite MapFacts.add_neq_o in H4.
-rewrite <-H4 in IHl.
-rewrite H5. apply IHl.
-intro. generalize (HH H2). clear HH. intro HH. inversion HH; subst.
-elim (n0 H7).
-assumption.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x y).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-apply VertexSet.eq_refl. intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x y).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H2. auto. auto.
-
-intro.
-elim (simple_graph g (fst_ext e) (snd_ext e)).
-split.
-rewrite H2. unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym r)).
-fold (adj_set (fst_ext e') (imap g)).
-apply (sym_imap g). assumption.
-apply (sym_pmap g). assumption.
-
-intuition.
-rewrite (edge_eq e'). rewrite H1.
-apply (proj2 (edgemap_to_edgeset_charac (imap_merge e g) _ _ None Hsym)).
-unfold imap_merge.
-unfold map_merge.
-set (s := (VertexSet.union
- (VertexSet.remove (snd_ext e) (adj_set (fst_ext e) (imap g)))
- (VertexSet.remove (fst_ext e) (adj_set (snd_ext e) (imap g))))) in *.
-set (m := imap g) in *.
-set (f := (fun (y : VertexSet.elt) (m' : VertexMap.t VertexSet.t) =>
- VertexMap.add y
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set y m))) m')) in *.
-set (s' := VertexSet.remove (fst_ext e) (adj_set (snd_ext e) m)) in *.
-unfold adj_set.
-rewrite MapFacts.remove_neq_o.
-destruct (Vertex.eq_dec (fst_ext e') (fst_ext e)).
-rewrite MapFacts.add_eq_o.
-unfold s.
-apply VertexSet.union_2.
-apply VertexSet.remove_2. intuition.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-assumption.
-intuition.
-
-rewrite MapFacts.add_neq_o.
-rewrite VertexSet.fold_1.
-set (f' := fun a e => f e a).
-(*
-generalize VertexSet.elements_1. intro HH.
-generalize (HH s' (fst_ext e')). clear HH. intro HH.
-*)
-induction (VertexSet.elements s'). simpl. assumption.
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H2 (fst_ext e')). clear H2. intro H2. simpl. inversion H2;clear H2.
-set (tmp := fold_left f' l m) in *.
-unfold f' in H5. unfold f in H5.
-destruct (Vertex.eq_dec (fst_ext e') a).
-rewrite MapFacts.add_eq_o in H5. congruence. intuition.
-rewrite MapFacts.add_neq_o in H5. rewrite <-H5 in IHl.
-apply IHl. auto.
-
-set (tmp := fold_left f' l m) in *.
-unfold f' in H4. unfold f in H4.
-destruct (Vertex.eq_dec (fst_ext e') a).
-rewrite MapFacts.add_eq_o in H4.
-rewrite H5. inversion H4; subst; clear H4.
-apply VertexSet.add_2. apply VertexSet.remove_2. intuition.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)). assumption.
-intuition.
-
-rewrite MapFacts.add_neq_o in H4.
-rewrite <-H4 in IHl.
-rewrite H5. apply IHl.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x y).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-apply VertexSet.eq_refl. intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x y).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H2. auto. auto.
-
-auto.
-intuition.
-Qed.
-
-Lemma merge_4 : forall e e' g p q,
-In_graph_edge e' (merge e g p q) ->
-exists a, In_graph_edge a g /\ weak_eq e' (redirect (snd_ext e) (fst_ext e) a)
- /\ same_type a e'.
-
-Proof.
-intros e e' g p q H0. generalize I. intro H.
-generalize H0. intro Hin.
-unfold merge in H0. destruct H0.
-generalize (AE_weights _ _ H0). intro Hw.
-unfold AE in H0. simpl in H0.
-rewrite (edge_eq e') in H0. rewrite Hw in H0.
-generalize (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap_merge_map _ _ q p)) H0).
-clear H0. intro H0.
-generalize (pmap_merge_sub _ _ _ _ H0). clear H0. intro H0.
-unfold map_merge in H0.
-set (s := (VertexSet.union
- (VertexSet.remove (snd_ext e) (adj_set (fst_ext e) (pmap g)))
- (VertexSet.remove (fst_ext e) (adj_set (snd_ext e) (pmap g))))) in *.
-set (m := pmap g) in *.
-set (f := (fun (y : VertexSet.elt) (m' : VertexMap.t VertexSet.t) =>
- VertexMap.add y
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set y m))) m')) in *.
-set (s' := VertexSet.remove (fst_ext e) (adj_set (snd_ext e) m)) in *.
-unfold adj_set in H0.
-destruct (Vertex.eq_dec (fst_ext e') (snd_ext e)).
-rewrite MapFacts.remove_eq_o in H0.
-elim (VertexSet.empty_1 H0). intuition.
-rewrite MapFacts.remove_neq_o in H0.
-destruct (Vertex.eq_dec (fst_ext e') (fst_ext e)).
-rewrite MapFacts.add_eq_o in H0.
-unfold s in H0.
-destruct (VertexSet.union_1 H0).
-generalize (VertexSet.remove_3 H1). clear H1. intro H1.
-exists (fst_ext e', snd_ext e', Some N0). split.
-left. unfold AE.
-apply (proj2 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))).
-unfold adj_set. rewrite (MapFacts.find_o _ e0). assumption.
-unfold redirect. change_rewrite.
-destruct (OTFacts.eq_dec (fst_ext e') (snd_ext e)).
-elim (n r).
-destruct (OTFacts.eq_dec (snd_ext e') (snd_ext e)).
-elim (merge_1 e g p q).
-rewrite <-r. apply (proj2 (In_graph_edge_in_ext _ _ Hin)).
-split.
-unfold weak_eq. change_rewrite.
-left. split; auto.
-unfold same_type. left. split. exists N0. auto. exists N0. auto.
-unfold s' in H1.
-generalize (VertexSet.remove_3 H1). intro H2.
-exists (snd_ext e', snd_ext e, Some N0).
-split.
-left. unfold AE.
-apply (proj2 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))).
-apply (sym_pmap g). assumption.
-unfold redirect. change_rewrite.
-destruct (OTFacts.eq_dec (snd_ext e') (snd_ext e)).
-unfold weak_eq. change_rewrite.
-split.
-left. split; auto.
-unfold same_type. left. split; exists N0; auto.
-destruct (OTFacts.eq_dec (snd_ext e) (snd_ext e)).
-unfold weak_eq. change_rewrite.
-split.
-right. split; auto.
-unfold same_type. left. split; exists N0; auto.
-elim n1. intuition. intuition.
-rewrite MapFacts.add_neq_o in H0.
-
-rewrite VertexSet.fold_1 in H0.
-set (f' := fun a e => f e a) in *.
-generalize VertexSet.elements_2. intro HH.
-generalize (HH s'). clear HH. intro HH.
-induction (VertexSet.elements s'). simpl in H0.
-case_eq (VertexMap.find (fst_ext e') m); intros. rewrite H1 in H0.
-exists (fst_ext e', snd_ext e', Some N0).
-split.
-left. apply (proj2 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))).
-unfold adj_set. fold m. rewrite H1. assumption.
-unfold redirect. change_rewrite.
-destruct (OTFacts.eq_dec (fst_ext e') (snd_ext e)).
-elim (n r).
-destruct (OTFacts.eq_dec (snd_ext e') (snd_ext e)).
-elim (merge_1 e g p q).
-rewrite <-r. apply (proj2 (In_graph_edge_in_ext _ _ Hin)).
-unfold weak_eq. change_rewrite.
-split.
-left. split ; auto.
-left. split; exists N0; auto.
-rewrite H1 in H0. elim (VertexSet.empty_1 H0).
-simpl in H0.
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H1 (fst_ext e')). clear H1. intro H1. inversion H1; clear H1.
-rewrite <-H3 in *. elim (VertexSet.empty_1 H0).
-set (tmp := fold_left f' l m) in *.
-unfold f' in H3. unfold f in H3.
-destruct (Vertex.eq_dec (fst_ext e') a).
-rewrite MapFacts.add_eq_o in H3. inversion H3; subst; clear H3.
-rewrite <-H2 in H0.
-rewrite H4 in H0. clear H4.
-destruct (proj1 (Props.Dec.F.add_iff _ _ _ ) H0).
-exists (fst_ext e', snd_ext e, Some N0).
-split.
-left. apply (proj2 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))).
-apply (sym_pmap g).
-assert (VertexSet.In (fst_ext e') s').
-apply HH. left. auto.
-unfold s' in H3. apply (VertexSet.remove_3 H3).
-unfold redirect. change_rewrite.
-destruct (OTFacts.eq_dec (fst_ext e') (snd_ext e)).
-unfold weak_eq. change_rewrite.
-split.
-right. split; auto.
-unfold same_type. left. split; exists N0; auto.
-destruct (OTFacts.eq_dec (snd_ext e) (snd_ext e)).
-unfold weak_eq. change_rewrite.
-split.
-left. split; auto.
-left. split; exists N0; auto.
-elim n2. intuition.
-exists (fst_ext e', snd_ext e', Some N0).
-split.
-left.
-apply (proj2 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))).
-generalize (VertexSet.remove_3 H1). clear H1. intro H1.
-unfold adj_set. rewrite (MapFacts.find_o _ e0). assumption.
-unfold redirect. change_rewrite.
-destruct (OTFacts.eq_dec (fst_ext e') (snd_ext e)).
-elim (merge_1 e g p q).
-rewrite <-r. apply (proj1 (In_graph_edge_in_ext _ _ Hin)).
-destruct (OTFacts.eq_dec (snd_ext e') (snd_ext e)).
-elim (merge_1 e g p q).
-rewrite <-r. apply (proj2 (In_graph_edge_in_ext _ _ Hin)).
-unfold weak_eq. change_rewrite.
-split.
-left. split; auto.
-left. split; exists N0; auto.
-intuition.
-auto.
-
-rewrite MapFacts.add_neq_o in H3. rewrite <-H3 in IHl.
-apply IHl. rewrite <-H2 in H0. rewrite H4 in H0. auto.
-intros. apply HH. auto.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x y).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x y).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H1. auto. auto.
-
-auto.
-auto.
-
-generalize (IE_weights _ _ H0). intro Hw.
-unfold IE in H0. simpl in H0.
-rewrite (edge_eq e') in H0. rewrite Hw in H0.
-generalize (proj1 (edgemap_to_edgeset_charac _ _ _ None (sym_imap_merge_map _ _ q p)) H0).
-clear H0. intro H0.
-unfold imap_merge in H0. unfold map_merge in H0.
-set (s := (VertexSet.union
- (VertexSet.remove (snd_ext e) (adj_set (fst_ext e) (imap g)))
- (VertexSet.remove (fst_ext e) (adj_set (snd_ext e) (imap g))))) in *.
-set (m := imap g) in *.
-set (f := (fun (y : VertexSet.elt) (m' : VertexMap.t VertexSet.t) =>
- VertexMap.add y
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set y m))) m')) in *.
-set (s' := VertexSet.remove (fst_ext e) (adj_set (snd_ext e) m)) in *.
-unfold adj_set in H0.
-destruct (Vertex.eq_dec (fst_ext e') (snd_ext e)).
-rewrite MapFacts.remove_eq_o in H0.
-elim (VertexSet.empty_1 H0). intuition.
-rewrite MapFacts.remove_neq_o in H0.
-destruct (Vertex.eq_dec (fst_ext e') (fst_ext e)).
-rewrite MapFacts.add_eq_o in H0.
-unfold s in H0.
-destruct (VertexSet.union_1 H0).
-generalize (VertexSet.remove_3 H1). clear H1. intro H1.
-exists (fst_ext e', snd_ext e', None). split.
-right. unfold IE.
-apply (proj2 (edgemap_to_edgeset_charac _ _ _ None (sym_imap g))).
-unfold adj_set. rewrite (MapFacts.find_o _ e0). assumption.
-unfold redirect. change_rewrite.
-destruct (OTFacts.eq_dec (fst_ext e') (snd_ext e)).
-elim (n r).
-destruct (OTFacts.eq_dec (snd_ext e') (snd_ext e)).
-elim (merge_1 e g p q).
-rewrite <-r. apply (proj2 (In_graph_edge_in_ext _ _ Hin)).
-unfold weak_eq. change_rewrite.
-split. left; split; auto.
-right; split; unfold interf_edge; simpl; auto.
-unfold s' in H1.
-generalize (VertexSet.remove_3 H1). intro H2.
-exists (snd_ext e', snd_ext e, None).
-split.
-right. unfold IE.
-apply (proj2 (edgemap_to_edgeset_charac _ _ _ None (sym_imap g))).
-apply (sym_imap g). assumption.
-unfold redirect. change_rewrite.
-destruct (OTFacts.eq_dec (snd_ext e') (snd_ext e)).
-unfold weak_eq. change_rewrite.
-split.
-left. split; auto.
-right. unfold interf_edge;split; simpl; auto.
-destruct (OTFacts.eq_dec (snd_ext e) (snd_ext e)).
-unfold weak_eq. change_rewrite.
-split.
-right. split; auto.
-right. unfold interf_edge; split; simpl; auto.
-elim n1. intuition.
-intuition.
-rewrite MapFacts.add_neq_o in H0.
-
-rewrite VertexSet.fold_1 in H0.
-set (f' := fun a e => f e a) in *.
-generalize VertexSet.elements_2. intro HH.
-generalize (HH s'). clear HH. intro HH.
-induction (VertexSet.elements s'). simpl in H0.
-case_eq (VertexMap.find (fst_ext e') m); intros. rewrite H1 in H0.
-exists (fst_ext e', snd_ext e', None).
-split.
-right. apply (proj2 (edgemap_to_edgeset_charac _ _ _ None (sym_imap g))).
-unfold adj_set. fold m. rewrite H1. assumption.
-unfold redirect. change_rewrite.
-destruct (OTFacts.eq_dec (fst_ext e') (snd_ext e)).
-elim (n r).
-destruct (OTFacts.eq_dec (snd_ext e') (snd_ext e)).
-elim (merge_1 e g p q).
-rewrite <-r. apply (proj2 (In_graph_edge_in_ext _ _ Hin)).
-unfold weak_eq. change_rewrite.
-split.
-left. split; auto.
-right. unfold interf_edge; split; simpl; auto.
-rewrite H1 in H0. elim (VertexSet.empty_1 H0).
-simpl in H0.
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H1 (fst_ext e')). clear H1. intro H1. inversion H1; clear H1.
-rewrite <-H3 in *. elim (VertexSet.empty_1 H0).
-set (tmp := fold_left f' l m) in *.
-unfold f' in H3. unfold f in H3.
-destruct (Vertex.eq_dec (fst_ext e') a).
-rewrite MapFacts.add_eq_o in H3. inversion H3; subst; clear H3.
-rewrite <-H2 in H0.
-rewrite H4 in H0. clear H4.
-destruct (proj1 (Props.Dec.F.add_iff _ _ _ ) H0).
-exists (fst_ext e', snd_ext e, None).
-split.
-right. apply (proj2 (edgemap_to_edgeset_charac _ _ _ None (sym_imap g))).
-apply (sym_imap g).
-assert (VertexSet.In (fst_ext e') s').
-apply HH. left. auto.
-unfold s' in H3. apply (VertexSet.remove_3 H3).
-unfold redirect. change_rewrite.
-destruct (OTFacts.eq_dec (fst_ext e') (snd_ext e)).
-unfold weak_eq. change_rewrite.
-split.
-right. split; auto.
-right. unfold interf_edge; split; simpl; auto.
-destruct (OTFacts.eq_dec (snd_ext e) (snd_ext e)).
-unfold weak_eq. change_rewrite.
-split.
-left. split; auto.
-right. unfold interf_edge; split; simpl; auto.
-elim n2. intuition.
-exists (fst_ext e', snd_ext e', None).
-split.
-right. apply (proj2 (edgemap_to_edgeset_charac _ _ _ None (sym_imap g))).
-generalize (VertexSet.remove_3 H1). clear H1. intro H1.
-unfold adj_set. rewrite (MapFacts.find_o _ e0). assumption.
-unfold redirect. change_rewrite.
-destruct (OTFacts.eq_dec (fst_ext e') (snd_ext e)).
-elim (merge_1 e g p q).
-rewrite <-r. apply (proj1 (In_graph_edge_in_ext _ _ Hin)).
-destruct (OTFacts.eq_dec (snd_ext e') (snd_ext e)).
-elim (merge_1 e g p q).
-rewrite <-r. apply (proj2 (In_graph_edge_in_ext _ _ Hin)).
-unfold weak_eq. change_rewrite.
-split.
-left. split; auto.
-right. unfold interf_edge; split; simpl; auto.
-intuition.
-
-rewrite MapFacts.add_neq_o in H3. rewrite <-H3 in IHl.
-apply IHl. rewrite <-H2 in H0. rewrite H4 in H0. auto.
-intros. apply HH. auto.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x y).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-apply VertexSet.eq_refl.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x y).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H1. auto. auto.
-
-auto.
-auto.
-Qed.
-
-Lemma resolve_conflicts_map_5 : forall x y e g,
-aff_edge e ->
-In_graph_edge e g ->
-VertexSet.In x (adj_set y (map_merge e (pmap g))) ->
-~VertexSet.In x (adj_set y (imap_merge e g)) ->
-VertexSet.In x (adj_set y (resolve_conflicts (fst_ext e) (map_merge e (pmap g))
- (adj_set (fst_ext e) (map_merge e (pmap g)))
- (adj_set (fst_ext e) (imap_merge e g)))).
-
-Proof.
-intros x y e g p q H H0.
-unfold resolve_conflicts.
-set (f := (fun (x0 : VertexSet.elt) (m : VertexMap.t VertexSet.t) =>
- VertexMap.add x0
- (VertexSet.remove (fst_ext e)
- (adj_set x0 (map_merge e (pmap g)))) m)) in *.
-set (m := map_merge e (pmap g)) in *.
-set (s' := (VertexSet.diff (adj_set (fst_ext e) m)
- (adj_set (fst_ext e) (imap_merge e g)))) in *.
-set (s := (VertexSet.inter (adj_set (fst_ext e) m)
- (adj_set (fst_ext e) (imap_merge e g)))) in *.
-rewrite VertexSet.fold_1.
-set (f' := fun a e => f e a) in *.
-generalize VertexSet.elements_1. intro.
-generalize (H1 s y). clear H1. intro HH.
-generalize VertexSet.elements_2. intro.
-generalize (H1 s y). clear H1. intro HHH.
-induction (VertexSet.elements s). simpl.
-destruct (Vertex.eq_dec y (fst_ext e)).
-unfold adj_set. rewrite (MapFacts.find_o _ e0).
-rewrite MapFacts.add_eq_o.
-apply VertexSet.diff_3.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)). assumption.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)). assumption.
-intuition.
-unfold adj_set. rewrite MapFacts.add_neq_o. assumption.
-auto.
-
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)).
-intro. generalize (H1 y). clear H1. intro H1. simpl. inversion H1; clear H1.
-set (tmp := fold_left f' l m) in *.
-unfold f' in H4. unfold f in H4.
-destruct (Vertex.eq_dec y a).
-rewrite MapFacts.add_eq_o in H4. congruence. intuition.
-destruct (Vertex.eq_dec y (fst_ext e)). unfold adj_set.
-rewrite MapFacts.add_eq_o.
-unfold adj_set in IHl.
-rewrite MapFacts.add_eq_o in IHl.
-apply IHl. intro.
-generalize (HH H1). intro.
-inversion H2; subst.
-elim (n H6).
-auto.
-intro. apply HHH. right. auto.
-intuition.
-intuition.
-
-rewrite MapFacts.add_neq_o in H4.
-unfold adj_set in IHl. rewrite MapFacts.add_neq_o in IHl.
-rewrite <-H4 in IHl.
-assert (VertexSet.In x VertexSet.empty).
-apply IHl. intro.
-generalize (HH H1). intro.
-inversion H2; subst.
-elim (n H6).
-auto.
-intro. apply HHH. right. auto.
-elim (VertexSet.empty_1 H1).
-auto.
-auto.
-auto.
-
-set (tmp := fold_left f' l m) in *.
-unfold f' in H3. unfold f in H3.
-destruct (Vertex.eq_dec y a).
-rewrite MapFacts.add_eq_o in H3.
-unfold adj_set. destruct (Vertex.eq_dec y (fst_ext e)).
-rewrite MapFacts.add_eq_o.
-apply VertexSet.diff_3.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)). assumption.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)). assumption.
-intuition.
-
-rewrite MapFacts.add_neq_o. rewrite <-H2. rewrite H4.
-inversion H3; subst; clear H3.
-apply VertexSet.remove_2.
-
-intro H5.
-assert (VertexSet.In y s).
-apply HHH. left. auto.
-generalize (VertexSet.inter_2 H1). intro.
-unfold adj_set in H3. rewrite (MapFacts.find_o _ H5) in H3.
-generalize (sym_imap_merge_map e g p q _ _ H3). intro.
-elim H0. assumption.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-auto.
-auto.
-intuition.
-
-rewrite MapFacts.add_neq_o in H3.
-destruct (Vertex.eq_dec y (fst_ext e)).
-unfold adj_set in IHl.
-rewrite MapFacts.add_eq_o in IHl.
-unfold adj_set. rewrite MapFacts.add_eq_o.
-apply IHl.
-
-intro. generalize (HH H1). intro.
-inversion H5; subst.
-elim (n H7).
-auto.
-
-intro. apply HHH. right. auto.
-intuition.
-intuition.
-
-unfold adj_set in IHl. rewrite MapFacts.add_neq_o in IHl.
-unfold adj_set. rewrite MapFacts.add_neq_o.
-rewrite <-H2.
-rewrite <-H3 in IHl.
-rewrite H4.
-apply IHl.
-
-intro. generalize (HH H1). intro.
-inversion H5; subst.
-elim (n H7).
-auto.
-
-intro. apply HHH. right. auto.
-auto.
-auto.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x0 z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-apply VertexSet.eq_refl. intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x0 y0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x0 s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x0 a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H1. auto. auto.
-Qed.
-
-Lemma merge_3_aux : forall e e' g,
-aff_edge e ->
-In_graph_edge e g ->
-In_graph_edge e' g ->
-aff_edge e' ->
-~Edge.eq e e' ->
-VertexSet.In (snd_ext (redirect (snd_ext e) (fst_ext e) e'))
- (adj_set (fst_ext (redirect (snd_ext e) (fst_ext e) e')) (map_merge e (pmap g))).
-
-Proof.
-intros e e' g q p H0 H1 Hdiff. generalize I. intro H.
-assert (get_weight e = Some N0) as Hw.
-destruct p. apply (AE_weights _ _ H2).
-generalize (IE_weights _ _ H2). inversion q. congruence.
-assert (get_weight e' = Some N0) as Hw'.
-destruct H0. apply (AE_weights _ _ H0).
-generalize (IE_weights _ _ H0). inversion H1. congruence.
-assert (EdgeSet.In (fst_ext e, snd_ext e, Some N0) (AE g)) as He.
-destruct p. rewrite (edge_eq e) in H2.
-generalize (AE_weights _ _ H2). intro. simpl in H3.
-rewrite H3 in H2. assumption.
-generalize (IE_weights _ _ H2). inversion q. congruence.
-assert (VertexSet.In (snd_ext e) (adj_set (fst_ext e) (pmap g))) as Hee.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))).
-assumption.
-assert (EdgeSet.In (fst_ext e', snd_ext e', Some N0) (AE g)) as He'.
-destruct H0. rewrite (edge_eq e') in H0.
-generalize (AE_weights _ _ H0). intro. simpl in H2.
-rewrite H2 in H0. assumption.
-generalize (IE_weights _ _ H0). intro H2. inversion H1. congruence.
-assert (VertexSet.In (snd_ext e') (adj_set (fst_ext e') (pmap g))) as Hee'.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))).
-assumption.
-assert (forall a b, VertexSet.In a (adj_set b (map_merge e (pmap g))) ->
- VertexSet.In b (adj_set a (map_merge e (pmap g)))) as Hsym.
-intros; apply sym_map_merge_pmap; auto.
-
-unfold redirect.
-destruct (OTFacts.eq_dec (fst_ext e') (snd_ext e)).
-unfold map_merge.
-set (s := (VertexSet.union
- (VertexSet.remove (snd_ext e) (adj_set (fst_ext e) (pmap g)))
- (VertexSet.remove (fst_ext e) (adj_set (snd_ext e) (pmap g))))) in *.
-set (m := pmap g) in *.
-set (f := (fun (y : VertexSet.elt) (m' : VertexMap.t VertexSet.t) =>
- VertexMap.add y
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set y m))) m')) in *.
-set (s' := VertexSet.remove (fst_ext e) (adj_set (snd_ext e) m)) in *.
-unfold adj_set.
-rewrite MapFacts.remove_neq_o.
-rewrite MapFacts.add_eq_o.
-unfold s.
-apply VertexSet.union_3.
-unfold s'.
-apply VertexSet.remove_2.
-intro. change_rewrite.
-elim Hdiff.
-rewrite (edge_eq e). rewrite edge_comm. apply eq_ordered_eq.
-rewrite (edge_eq e'). unfold E.eq; change_rewrite; simpl; intuition.
-rewrite Hw. rewrite Hw'. apply OptionN_as_OT.eq_refl.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym r)).
-fold (adj_set (fst_ext e') m).
-assumption. change_rewrite. intuition.
-change_rewrite.
-apply (In_graph_edge_diff_ext _ _ p).
-
-destruct (OTFacts.eq_dec (snd_ext e') (snd_ext e)); change_rewrite.
-unfold map_merge.
-set (s := (VertexSet.union
- (VertexSet.remove (snd_ext e) (adj_set (fst_ext e) (pmap g)))
- (VertexSet.remove (fst_ext e) (adj_set (snd_ext e) (pmap g))))) in *.
-set (m := pmap g) in *.
-set (f := (fun (y : VertexSet.elt) (m' : VertexMap.t VertexSet.t) =>
- VertexMap.add y
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set y m))) m')) in *.
-set (s' := VertexSet.remove (fst_ext e) (adj_set (snd_ext e) m)) in *.
-unfold adj_set.
-rewrite MapFacts.remove_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite VertexSet.fold_1.
-set (f' := fun a e => f e a).
-generalize VertexSet.elements_1. intro HH.
-generalize (HH s' (fst_ext e')). clear HH. intro HH.
-induction (VertexSet.elements s'). simpl.
-assert (InA Vertex.eq (fst_ext e') nil).
-apply HH.
-unfold s'. apply VertexSet.remove_2.
-intro. elim Hdiff.
-apply eq_ordered_eq.
-rewrite (edge_eq e). rewrite (edge_eq e').
-unfold E.eq; change_rewrite; simpl; intuition.
-rewrite Hw. rewrite Hw'. apply OptionN_as_OT.eq_refl.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym r)).
-apply (sym_pmap g). assumption.
-inversion H2.
-
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H2 (fst_ext e')). clear H2. intro H2. simpl. inversion H2;clear H2.
-set (tmp := fold_left f' l m) in *.
-unfold f' in H5. unfold f in H5.
-destruct (Vertex.eq_dec (fst_ext e') a).
-rewrite MapFacts.add_eq_o in H5. congruence. intuition.
-rewrite MapFacts.add_neq_o in H5. rewrite <-H5 in IHl.
-apply IHl.
-intro. generalize (HH H2). clear HH. intro HH.
-inversion HH; subst.
-elim (n0 H6).
-assumption.
-auto.
-
-set (tmp := fold_left f' l m) in *.
-unfold f' in H4. unfold f in H4.
-destruct (Vertex.eq_dec (fst_ext e') a).
-rewrite MapFacts.add_eq_o in H4.
-rewrite H5. inversion H4; subst; clear H4.
-apply VertexSet.add_1. intuition. intuition.
-rewrite MapFacts.add_neq_o in H4.
-rewrite <-H4 in IHl.
-rewrite H5. apply IHl.
-intro. generalize (HH H2). clear HH. intro HH. inversion HH; subst.
-elim (n0 H7).
-assumption.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x y).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-apply VertexSet.eq_refl. intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x y).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H2. auto. auto.
-
-intro. elim Hdiff.
-apply eq_ordered_eq.
-rewrite (edge_eq e). rewrite (edge_eq e').
-unfold E.eq; change_rewrite; simpl; intuition.
-rewrite Hw. rewrite Hw'. apply OptionN_as_OT.eq_refl.
-
-intuition.
-unfold map_merge.
-set (s := (VertexSet.union
- (VertexSet.remove (snd_ext e) (adj_set (fst_ext e) (pmap g)))
- (VertexSet.remove (fst_ext e) (adj_set (snd_ext e) (pmap g))))) in *.
-set (m := pmap g) in *.
-set (f := (fun (y : VertexSet.elt) (m' : VertexMap.t VertexSet.t) =>
- VertexMap.add y
- (VertexSet.add (fst_ext e)
- (VertexSet.remove (snd_ext e) (adj_set y m))) m')) in *.
-set (s' := VertexSet.remove (fst_ext e) (adj_set (snd_ext e) m)) in *.
-unfold adj_set.
-rewrite MapFacts.remove_neq_o.
-destruct (Vertex.eq_dec (fst_ext e') (fst_ext e)).
-rewrite MapFacts.add_eq_o.
-unfold s.
-apply VertexSet.union_2.
-apply VertexSet.remove_2. intuition.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-assumption.
-intuition.
-
-rewrite MapFacts.add_neq_o.
-rewrite VertexSet.fold_1.
-set (f' := fun a e => f e a).
-(*
-generalize VertexSet.elements_1. intro HH.
-generalize (HH s' (fst_ext e')). clear HH. intro HH.
-*)
-induction (VertexSet.elements s'). simpl. assumption.
-cut (EqualSetMap (fold_left f' (a :: l) m) (f' (fold_left f' l m) a)). intro.
-generalize (H2 (fst_ext e')). clear H2. intro H2. simpl. inversion H2;clear H2.
-set (tmp := fold_left f' l m) in *.
-unfold f' in H5. unfold f in H5.
-destruct (Vertex.eq_dec (fst_ext e') a).
-rewrite MapFacts.add_eq_o in H5. congruence. intuition.
-rewrite MapFacts.add_neq_o in H5. rewrite <-H5 in IHl.
-apply IHl. auto.
-
-set (tmp := fold_left f' l m) in *.
-unfold f' in H4. unfold f in H4.
-destruct (Vertex.eq_dec (fst_ext e') a).
-rewrite MapFacts.add_eq_o in H4.
-rewrite H5. inversion H4; subst; clear H4.
-apply VertexSet.add_2. apply VertexSet.remove_2. intuition.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)). assumption.
-intuition.
-
-rewrite MapFacts.add_neq_o in H4.
-rewrite <-H4 in IHl.
-rewrite H5. apply IHl.
-auto.
-
-apply fold_left_assoc_map.
-unfold EqualSetMap. unfold f'. unfold f.
-intros.
-destruct (Vertex.eq_dec x z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x y).
-rewrite MapFacts.add_eq_o.
-constructor.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e1)).
-rewrite (MapFacts.find_o _ (Vertex.eq_sym e0)).
-apply VertexSet.eq_refl. intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x y).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x s0); constructor; apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec x a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H2. auto. auto.
-
-auto.
-intuition.
-Qed.
-
-Lemma merge_5 : forall e e' g p q,
-In_graph_edge e' g ->
-~Edge.eq e e' ->
-aff_edge e' ->
-~Interfere (fst_ext (redirect (snd_ext e) (fst_ext e) e'))
- (snd_ext (redirect (snd_ext e) (fst_ext e) e'))
- (merge e g p q) ->
-Prefere (fst_ext (redirect (snd_ext e) (fst_ext e) e'))
- (snd_ext (redirect (snd_ext e) (fst_ext e) e'))
- (merge e g p q).
-
-Proof.
-intros e e' g p q H0 H1 H2 H3. generalize I. intro H.
-unfold Prefere. exists N0. left.
-unfold merge. unfold AE. simpl.
-apply (proj2 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap_merge_map e g q p))).
-apply resolve_conflicts_map_5.
-assumption.
-assumption.
-apply merge_3_aux; assumption.
-intro. elim H3. unfold Interfere. right. unfold merge.
-unfold IE. simpl.
-apply (proj2 (edgemap_to_edgeset_charac _ _ _ None (sym_imap_merge_map e g q p))).
-assumption.
-Qed.
-(*
-unfold change.
-destruct (OTFacts.eq_dec (fst_ext e') (snd_ext e)). change_rewrite.
-apply VertexSet.remove_2.
-apply (In_graph_edge_diff_ext e g p).
-apply (proj1 (In_graph_edge_in_ext _ _ p)).
-destruct (OTFacts.eq_dec (snd_ext e') (snd_ext e)). change_rewrite.
-apply VertexSet.remove_2.
-intro. elim (In_graph_edge_diff_ext e' g H0).
-apply Vertex.eq_trans with (y := snd_ext e); auto.
-apply (proj1 (In_graph_edge_in_ext _ _ H0)).
-apply VertexSet.remove_2.
-auto.
-apply (proj1 (In_graph_edge_in_ext _ _ H0)).
-Qed.
-*)
-
-Lemma precolored_merge2 : forall x e g p q,
-(VertexSet.In x (VertexSet.remove (snd_ext e) (precolored g)) <->
- VertexSet.In x (precolored (merge e g p q))).
-
-Proof.
-intros x e g HH q. split; intros.
-unfold merge.
-unfold precolored. simpl. unfold is_precolored. simpl.
-apply VertexSet.filter_3.
-unfold compat_bool;intros.
-rewrite (mreg_ext _ _ H0). auto.
-apply VertexSet.remove_2.
-intro H1. elim (VertexSet.remove_1 H1 H).
-apply (VertexSet.filter_1 (compat_bool_is_precolored _) (VertexSet.remove_3 H)).
-generalize (VertexSet.filter_2 (compat_bool_is_precolored _) (VertexSet.remove_3 H)). intro H0.
-assumption.
-
-unfold precolored, is_precolored in *. unfold merge in H. simpl in H.
-apply VertexSet.remove_2. intro.
-generalize (VertexSet.filter_1 (compat_bool_is_precolored (merge e g HH q)) H). intro.
-elim (VertexSet.remove_1 H0 H1).
-apply VertexSet.filter_3.
-unfold compat_bool. apply mreg_ext.
-generalize (VertexSet.filter_1 (compat_bool_is_precolored (merge e g HH q)) H). intros.
-apply (VertexSet.remove_3 H0).
-apply (VertexSet.filter_2 (compat_bool_is_precolored (merge e g HH q)) H).
-Qed.
-
-(* spec of delete_preference_edges *)
-Lemma delete_preference_edges_prec : forall r g Hin,
-VertexSet.Equal (precolored (delete_preference_edges r g Hin)) (precolored g).
-
-Proof.
-intros.
-unfold delete_preference_edges.
-unfold precolored. simpl.
-unfold is_precolored. simpl.
-apply VertexSet.eq_refl.
-Qed.
-
-Lemma delete_preference_edges_1 : forall e r g Hin,
-In_graph_edge e (delete_preference_edges r g Hin) -> In_graph_edge e g.
-
-Proof.
-intros.
-unfold delete_preference_edges in H.
-destruct H;[left; generalize (AE_weights _ _ H); unfold AE in *|
- right; generalize (IE_weights _ _ H); unfold IE in *]; simpl in H; intros.
-rewrite (edge_eq e) in H.
-rewrite H0 in H. generalize (proj1 (edgemap_to_edgeset_charac _ _ _ _(sym_pmap_delete_preferences r g)) H). intro.
-rewrite (edge_eq e).
-rewrite H0. apply (proj2 (edgemap_to_edgeset_charac _ _ _ _ (sym_pmap g))).
-apply (delete_preference_sub _ _ _ _ H1).
-assumption.
-Qed.
-
-Lemma IE_delete_preference_eq : forall x g H,
-EdgeSet.Equal (IE g) (IE (delete_preference_edges x g H)).
-
-Proof.
-intros.
-unfold delete_preference_edges.
-destruct (In_graph_dec x g).
-unfold IE. simpl. apply EdgeSet.eq_refl.
-apply EdgeSet.eq_refl.
-Qed.
-
-Lemma delete_preference_edges_2 : forall e r g Hin,
-In_graph_edge e g ->
-~incident e r ->
-In_graph_edge e (delete_preference_edges r g Hin).
-
-Proof.
-intros.
-destruct H;[left|right].
-generalize (AE_weights _ _ H). intro Hw.
-unfold AE in *.
-rewrite (edge_eq e). rewrite Hw.
-unfold delete_preference_edges.
-apply (proj2 (edgemap_to_edgeset_charac _ _ _ _ (sym_pmap_delete_preferences r g))).
-unfold pmap_delete_preferences.
-rewrite VertexSet.fold_1.
-induction (VertexSet.elements (adj_set r (pmap g))). simpl.
-unfold adj_set. rewrite InterfFacts.add_neq_o.
-rewrite (edge_eq e) in H. rewrite Hw in H.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ _ (sym_pmap g)) H).
-intro H1. elim H0. left. auto.
-
-cut (EqualSetMap
- (fold_left
- (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove r (adj_set e (pmap g))) a) (a :: l)
- (VertexMap.add r VertexSet.empty (pmap g)))
- (VertexMap.add a
- (VertexSet.remove r
- (adj_set a (pmap g)))
- (fold_left
- (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove r (adj_set e (pmap g))) a) l
- (VertexMap.add r VertexSet.empty (pmap g))))). intro.
-unfold EqualSetMap in H1. generalize (H1 (fst_ext e)). clear H1. intro H1.
-inversion H1. simpl. unfold adj_set in *. rewrite <-H3.
-destruct (Vertex.eq_dec (fst_ext e) a).
-rewrite InterfFacts.add_eq_o in H4. inversion H4.
-intuition.
-rewrite InterfFacts.add_neq_o in H4. rewrite <-H4 in *.
-elim (VertexSet.empty_1 IHl).
-auto.
-simpl. unfold adj_set in *. rewrite <-H2.
-rewrite H4. clear H1. clear H2. clear H4.
-destruct (Vertex.eq_dec (fst_ext e) a).
-rewrite InterfFacts.add_eq_o in H3.
-inversion H3. clear H2.
-apply VertexSet.remove_2.
-intro. elim H0. right. auto.
-clear H3.
-rewrite (edge_eq e) in H. rewrite Hw in H.
-rewrite (InterfFacts.find_o _ (Vertex.eq_sym e0)).
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ _(sym_pmap g)) H).
-intuition.
-rewrite (InterfFacts.add_neq_o) in H3.
-case_eq (VertexMap.find (elt:=VertexSet.t) (fst_ext e)
- (fold_left
- (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e
- (VertexSet.remove r
- match VertexMap.find (elt:=VertexSet.t) e (pmap g) with
- | Some x => x
- | None => VertexSet.empty
- end) a) l (VertexMap.add r VertexSet.empty (pmap g))));
-intros; rewrite H1 in *.
-inversion H3. assumption.
-inversion H3.
-auto.
-
-apply fold_left_assoc_map.
-intros.
-unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x z).
-rewrite InterfFacts.add_eq_o.
-destruct (Vertex.eq_dec x y).
-rewrite InterfFacts.add_eq_o.
-constructor.
-generalize (Vertex.eq_trans (Vertex.eq_sym e0) e1). intro HHH.
-unfold adj_set.
-rewrite (InterfFacts.find_o _ HHH). apply VertexSet.eq_refl.
-intuition.
-
-rewrite InterfFacts.add_neq_o.
-rewrite InterfFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-
-rewrite InterfFacts.add_neq_o.
-destruct (Vertex.eq_dec x y).
-rewrite InterfFacts.add_eq_o.
-rewrite InterfFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-
-intros.
-unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x y).
-rewrite InterfFacts.add_eq_o.
-rewrite InterfFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite InterfFacts.add_neq_o.
-rewrite InterfFacts.add_neq_o.
-rewrite InterfFacts.add_neq_o.
-apply EqualSetMap_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x a0).
-rewrite InterfFacts.add_eq_o.
-rewrite InterfFacts.add_eq_o.
-constructor. apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite InterfFacts.add_neq_o.
-rewrite InterfFacts.add_neq_o.
-apply (H1 x).
-auto.
-auto.
-
-rewrite <-IE_delete_preference_eq. auto.
-Qed.
-
-Lemma V_delete_preference_eq : forall x g Hin,
-VertexSet.Equal (V g) (V (delete_preference_edges x g Hin)).
-
-Proof.
-intros.
-unfold delete_preference_edges.
-destruct (In_graph_dec x g); simpl; apply VertexSet.eq_refl.
-Qed.
-
-Lemma in_delete_preference_not_incident : forall e r g Hdep,
-EdgeSet.In e (AE (delete_preference_edges r g Hdep)) -> ~incident e r.
-
-Proof.
-intros.
-generalize (AE_weights _ _ H). intro Hw.
-generalize (proj1 (In_graph_aff_edge_in_AE _ _) H). intro Hin.
-unfold AE in H.
-rewrite (edge_eq e) in H. rewrite Hw in H.
-unfold delete_preference_edges in H.
-generalize (proj1 (edgemap_to_edgeset_charac _ _ _ _(sym_pmap_delete_preferences r g)) H). clear H. intro H.
-unfold pmap_delete_preferences in H.
-rewrite VertexSet.fold_1 in H.
-generalize VertexSet.elements_1. intro HH.
-generalize (HH (adj_set r (pmap g)) (fst_ext e)). clear HH. intro HH.
-generalize VertexSet.elements_2. intro HH1.
-generalize (HH1 (adj_set r (pmap g))). clear HH1. intro HH1.
-
-assert (forall z, In z (VertexSet.elements (adj_set r (pmap g))) -> ~Vertex.eq r z) as Hneq.
-clear H HH Hin Hw Hdep.
-intros. intro H0.
-induction (VertexSet.elements (adj_set r (pmap g))). inversion H.
-simpl in H. destruct H. subst.
-assert (VertexSet.In r (adj_set r (pmap g))).
-apply HH1. left. auto.
-elim (not_eq_extremities g r r).
-right. assumption.
-auto.
-apply IHl.
-intros. apply HH1. auto.
-assumption.
-
-induction (VertexSet.elements (adj_set r (pmap g))). simpl in H.
-unfold adj_set in H.
-destruct (Vertex.eq_dec (fst_ext e) r).
-rewrite InterfFacts.add_eq_o in H.
-elim (VertexSet.empty_1 H). intuition.
-rewrite InterfFacts.add_neq_o in H.
-destruct (Vertex.eq_dec (snd_ext e) r).
-assert (InA Vertex.eq (fst_ext e) nil).
-apply HH.
-apply (proj1 (edgemap_to_edgeset_charac (pmap g) r (fst_ext e) (Some N0) (sym_pmap g))).
-assert (eq (r,fst_ext e, Some N0) e).
-rewrite edge_comm.
-apply eq_ordered_eq.
-unfold E.eq; simpl; intuition. apply Regs.eq_refl.
-rewrite <-Hw. apply OptionN_as_OT.eq_refl.
-rewrite H0.
-destruct Hin.
-generalize (delete_preference_edges_1 e r g Hdep H2). clear H2. intro H2.
-destruct H2.
-unfold AE in H2. assumption.
-generalize (IE_weights _ _ H2). intro Hw'. rewrite Hw' in Hw. inversion Hw.
-inversion H0.
-intro H0. destruct H0.
-elim n. auto.
-elim n0. auto.
-auto.
-
-set (f := (fun (a : VertexMap.t VertexSet.t) (e : VertexSet.elt) =>
- VertexMap.add e (VertexSet.remove r (adj_set e (pmap g))) a)) in *.
-set (s := VertexMap.add r VertexSet.empty (pmap g)) in *.
-
-assert (EqualSetMap (fold_left f (a :: l) s) (f (fold_left f l s) a)).
-apply fold_left_assoc_map.
-
-unfold f. unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x z).
-rewrite MapFacts.add_eq_o.
-destruct (Vertex.eq_dec x y).
-rewrite MapFacts.add_eq_o.
-constructor.
-apply Props.Equal_remove.
-unfold adj_set.
-rewrite (MapFacts.find_o _ (Vertex.eq_trans (Vertex.eq_sym e0) e1)).
-apply VertexSet.eq_refl. intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-auto.
-intuition.
-rewrite MapFacts.add_neq_o.
-destruct (Vertex.eq_dec x y).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-destruct (VertexMap.find x s0); constructor.
-apply VertexSet.eq_refl.
-auto.
-auto.
-auto.
-auto.
-
-unfold f. unfold EqualSetMap. intros.
-destruct (Vertex.eq_dec x a0).
-rewrite MapFacts.add_eq_o.
-rewrite MapFacts.add_eq_o.
-constructor.
-apply VertexSet.eq_refl.
-intuition.
-intuition.
-rewrite MapFacts.add_neq_o.
-rewrite MapFacts.add_neq_o.
-apply H0.
-auto.
-auto.
-
-generalize (H0 (fst_ext e)). clear H0. intro H0.
-simpl in H. unfold adj_set in H.
-inversion H0. subst.
-rewrite <-H2 in H.
-elim (VertexSet.empty_1 H).
-rewrite <-H1 in H.
-set (tmp := fold_left f l s) in *.
-unfold f in H2.
-destruct (Vertex.eq_dec (fst_ext e) a).
-rewrite MapFacts.add_eq_o in H2.
-intro.
-inversion H2. subst. clear H2.
-rewrite H3 in H.
-destruct H4.
-
-elim (Hneq a).
-left. auto.
-apply (Vertex.eq_trans H2 e0).
-elim (VertexSet.remove_1 H2 H).
-intuition.
-
-rewrite MapFacts.add_neq_o in H2.
-inversion H2. subst. clear H2.
-apply IHl.
-clear IHl.
-unfold adj_set. rewrite <-H5.
-rewrite <-H3. assumption.
-intro.
-assert (InA Vertex.eq (fst_ext e) (a :: l)).
-apply HH. assumption.
-inversion H4; subst.
-elim (n H7).
-assumption.
-intros. apply HH1. auto.
-intros. apply Hneq. right. auto.
-auto.
-Qed.
-
-Add Morphism In_graph_edge : In_graph_edge_m.
-
-Proof.
-unfold In_graph_edge;intros x y H g.
-fold (eq x y) in H.
-split;intro H0;[rewrite <-H|rewrite H];assumption.
-Qed.
-
-(* There cannot exist both an interference and
- a preference between two vertices *)
-Lemma interf_pref_conflict : forall x y g,
-Prefere x y g /\ Interfere x y g -> False.
-
-Proof.
-intros.
-unfold Prefere in H. unfold Interfere in H.
-destruct H.
-apply (simple_graph g x y).
-split.
-destruct H0.
-generalize (proj1 (In_graph_aff_edge_in_AE _ _) H0). intro H1.
-destruct H1 as [H1 _].
-unfold aff_edge in H1.
-destruct H1. inversion H1.
-unfold IE in H0.
-rewrite edge_comm in H0. apply (proj1 (edgemap_to_edgeset_charac _ _ _ _ (sym_imap g)) H0).
-destruct H. destruct H. generalize (AE_weights _ _ H). simpl. intro.
-rewrite H1 in H.
-rewrite edge_comm in H. unfold AE in H. apply (proj1 (edgemap_to_edgeset_charac _ _ _ _(sym_pmap g)) H).
-generalize (proj1 (In_graph_interf_edge_in_IE _ _) H). intro H1.
-destruct H1 as [H1 _].
-unfold interf_edge in H1. inversion H1.
-Qed.
-
-Lemma is_simple_graph : forall e e' g,
-In_graph_edge e g ->
-In_graph_edge e' g ->
-weak_eq e e' ->
-eq e e'.
-
-Proof.
-intros.
-unfold weak_eq in H1.
-destruct H; destruct H0.
-generalize (AE_weights _ _ H); intros.
-generalize (AE_weights _ _ H0); intros.
-destruct H1; destruct H1.
-rewrite (edge_eq e). rewrite (edge_eq e'). rewrite H2. rewrite H3. Eq_eq.
-rewrite (edge_eq e). rewrite (edge_eq e'). rewrite H2. rewrite H3. Eq_comm_eq.
-elim (interf_pref_conflict (fst_ext e') (snd_ext e') g).
-unfold Prefere, Interfere; split.
-destruct H1; destruct H1. exists N0.
-rewrite <-(AE_weights _ _ H).
-assert (eq (fst_ext e', snd_ext e', get_weight e) (fst_ext e, snd_ext e, get_weight e)) by Eq_eq.
-rewrite H3. rewrite <-(edge_eq e). rewrite In_graph_aff_edge_in_AE in H. destruct H. intuition.
-exists N0. rewrite <-(AE_weights _ _ H).
-assert (eq (fst_ext e', snd_ext e', get_weight e) (fst_ext e, snd_ext e, get_weight e)) by Eq_comm_eq.
-rewrite H3. rewrite <-(edge_eq e). rewrite In_graph_aff_edge_in_AE in H. destruct H. intuition.
-rewrite <-(IE_weights _ _ H0). rewrite In_graph_interf_edge_in_IE in H0. destruct H0. rewrite (edge_eq e') in H2. intuition.
-elim (interf_pref_conflict (fst_ext e') (snd_ext e') g).
-unfold Prefere, Interfere; split.
-exists N0. rewrite <-(AE_weights _ _ H0).
-rewrite (edge_eq e') in H0. rewrite In_graph_aff_edge_in_AE in H0. destruct H0. auto.
-rewrite <-(IE_weights _ _ H).
-destruct H1; destruct H1.
-assert (eq (fst_ext e', snd_ext e', get_weight e) (fst_ext e, snd_ext e, get_weight e)) by Eq_eq.
-rewrite H3. rewrite <-(edge_eq e). rewrite In_graph_interf_edge_in_IE in H. destruct H. auto.
-assert (eq (fst_ext e', snd_ext e', get_weight e) (fst_ext e, snd_ext e, get_weight e)) by Eq_comm_eq.
-rewrite H3. rewrite <-(edge_eq e). rewrite In_graph_interf_edge_in_IE in H. destruct H. auto.
-generalize (IE_weights _ _ H); intros.
-generalize (IE_weights _ _ H0); intros.
-destruct H1; destruct H1.
-rewrite (edge_eq e). rewrite (edge_eq e'). rewrite H2. rewrite H3. Eq_eq.
-rewrite (edge_eq e). rewrite (edge_eq e'). rewrite H2. rewrite H3. Eq_comm_eq.
-Qed.
-
-Lemma is_precolored_ext : forall x y g,
-Vertex.eq x y ->
-is_precolored x g = is_precolored y g.
-
-Proof.
-intros. apply compat_bool_is_precolored. assumption.
-Qed.
-
-(* This module respects the interface *)
-
-(* A vertex x is in (remove_vertex r g) iff it is in g
- and it is different from r*)
-Lemma In_remove_vertex : forall x r g,
-In_graph x (remove_vertex r g) <-> (In_graph x g /\ ~Vertex.eq x r).
-
-Proof.
-split; intros.
-split. apply in_remove_in with (r:=r). auto.
-intro. rewrite H0 in H. elim (not_in_remove r g H).
-destruct H. apply In_remove; auto.
-Qed.
-
-(* The precolored vertices of (remove_vertex r g) are
- the precolored vertices of g, minus r *)
-Lemma precolored_remove_vertex : forall r g,
-VertexSet.Equal (precolored (remove_vertex r g))
- (VertexSet.remove r (precolored g)).
-
-Proof.
-split; intros.
-rewrite precolored_remove_vertex2; auto.
-rewrite <-precolored_remove_vertex2; auto.
-Qed.
-
-(* An edge e is in (remove_vertex r g) iff it is in g
- and is not incident to r *)
-Lemma In_remove_edge : forall e r g,
-In_graph_edge e (remove_vertex r g) <-> (In_graph_edge e g /\ ~incident e r).
-
-Proof.
-split; intros.
-split. apply in_remove_in_edge with (r:=r). auto.
-intro. elim (not_in_remove_edge _ _ _ H0 H).
-destruct H. apply In_remove_edge_; auto.
-Qed.
-
-(* Specification of merge *)
-
-(* A vertex is in (merge e g p q) iff x is in g and
- x is not equal to the second endpoint of g *)
-Lemma In_merge_vertex : forall g e x p q,
-In_graph x (merge e g p q) <-> (In_graph x g /\ ~Vertex.eq x (snd_ext e)).
-
-Proof.
-split; intros.
-split. apply (In_merge_in g e x p q H).
-intro. rewrite H0 in H. elim (merge_1 e g p q H).
-destruct H. apply merge_2; auto.
-Qed.
-
-(* If an interference edge e' is in the graph g then
- its redirection from the second endpoint of e
- to the first endpoint of e is in (merge e g p q) *)
-Lemma In_merge_interf_edge : forall e e' g p q,
-In_graph_edge e' g ->
-interf_edge e' ->
-In_graph_edge (redirect (snd_ext e) (fst_ext e) e') (merge e g p q).
-
-Proof.
-intros. apply merge_3; auto.
-Qed.
-
-(* If a preference edge e' different from e is in the graph g,
- and iff the endpoints of its redirection from the second
- endpoint of e to the first endpoint of e do not interfere,
- then these endpoints are linked with an affinity edge, whose
- weight may be different from the one of e' *)
-Lemma In_merge_pref_edge : forall e e' g p q,
-In_graph_edge e' g ->
-~Edge.eq e e' ->
-aff_edge e' ->
-~Interfere (fst_ext (redirect (snd_ext e) (fst_ext e) e'))
- (snd_ext (redirect (snd_ext e) (fst_ext e) e'))
- (merge e g p q) ->
- Prefere (fst_ext (redirect (snd_ext e) (fst_ext e) e'))
- (snd_ext (redirect (snd_ext e) (fst_ext e) e'))
- (merge e g p q).
-
-Proof.
-intros. apply merge_5; auto.
-Qed.
-
-(* Inversely, if e' is an edge of (merge e g p q) then there exists
- an edge a of g, such that e' is weakly equal to the redirection
- of a from the second endpoint of e to the first endpoint of e *)
-Lemma In_merge_edge_inv : forall e e' g p q,
-In_graph_edge e' (merge e g p q) ->
-exists a, In_graph_edge a g /\ weak_eq e' (redirect (snd_ext e) (fst_ext e) a) /\
- same_type a e'.
-
-Proof.
-intros. apply (merge_4 e e' g p q); auto.
-Qed.
-
-(* The precolored vertices of (merge e g p q) are the ones of g,
- minus the second endpoint of e *)
-Lemma precolored_merge : forall e g p q,
-VertexSet.Equal (precolored (merge e g p q))
- (VertexSet.remove (snd_ext e) (precolored g)).
-
-Proof.
-split; intros.
-rewrite <-precolored_merge2 in H. auto.
-rewrite <-precolored_merge2. auto.
-Qed.
-
-(* Specification of delete_preference_edges *)
-
-(* A vertex is in (delete_preference_edges r g p) iff it is in g *)
-Lemma In_delete_preference_edges_vertex : forall x r g p,
-In_graph x (delete_preference_edges r g p) <-> In_graph x g.
-
-Proof.
-unfold In_graph. split; intros.
-rewrite <-V_delete_preference_eq in H. auto.
-rewrite <-V_delete_preference_eq. auto.
-Qed.
-
-(* The precolored vertices of (delete_preference_edges r g p)
- iff it is precolored in g *)
-Lemma precolored_delete_preference_edges : forall r g p,
-VertexSet.Equal (precolored (delete_preference_edges r g p))
- (precolored g).
-
-Proof.
-intros. apply delete_preference_edges_prec.
-Qed.
-
-(* An edge e is in (delete_preference_edges r g p) iff
- if is in g and it is not an affinity edge incident to r *)
-Lemma In_delete_preference_edges_edge : forall e r g p,
-In_graph_edge e (delete_preference_edges r g p) <->
-(In_graph_edge e g /\ ~(aff_edge e /\ incident e r)).
-
-Proof.
-split; intros.
-split. apply (delete_preference_edges_1 _ _ _ _ H).
-intro. destruct H0.
-assert (~incident e r).
-apply (in_delete_preference_not_incident e r g p).
-rewrite In_graph_aff_edge_in_AE. split; auto.
-elim (H2 H1).
-destruct H. destruct H.
-rewrite In_graph_aff_edge_in_AE in H. destruct H.
-apply delete_preference_edges_2; auto.
-right. rewrite <-IE_delete_preference_eq. auto.
-Qed.
-
-Definition interference_adj v g :=
-adj_set v (imap g).
-
-Definition preference_adj v g :=
-adj_set v (pmap g).
-
-(* Definition of the interference and preference degrees *)
-Definition interf_degree g v := VertexSet.cardinal (interference_adj v g).
-Definition pref_degree g v := VertexSet.cardinal (preference_adj v g).
-
-(* Definition of the low-degree function,
- returns true iff the interference degree of v in g is strictly lower than K *)
-Definition has_low_degree g K v :=
-if le_lt_dec K (interf_degree g v) then false else true.
-
-(* Definition of the move-related function,
- returns true iff the vertex is move-related *)
-Definition move_related g x := negb (VertexSet.is_empty (preference_adj x g)).
-
-Lemma in_pref_pref : forall x y g,
-VertexSet.In x (preference_adj y g) ->
-exists w, In_graph_edge (x,y,Some w) g.
-
-Proof.
-intros.
-unfold preference_adj in H.
-exists N0.
-left. unfold AE.
-rewrite edge_comm. apply (proj2 (edgemap_to_edgeset_charac _ _ _ _ (sym_pmap g))). assumption.
-Qed.
-
-Lemma pref_in_pref : forall x y g w,
-In_graph_edge (x,y,Some w) g ->
-VertexSet.In x (preference_adj y g).
-
-Proof.
-intros.
-unfold preference_adj.
-destruct H.
-generalize (AE_weights _ _ H). intro.
-unfold AE in H. simpl in H0. rewrite H0 in H.
-rewrite edge_comm in H. apply (proj1 (edgemap_to_edgeset_charac _ _ _ _(sym_pmap g)) H).
-generalize (proj1 (In_graph_interf_edge_in_IE _ _) H). intro.
-destruct H0.
-unfold interf_edge in H0. inversion H0.
-Qed.
-
-Lemma in_interf_interf : forall x y g,
-VertexSet.In x (interference_adj y g) ->
-In_graph_edge (x,y,None) g.
-
-Proof.
-intros.
-unfold preference_adj in H.
-right. unfold IE.
-rewrite edge_comm. apply (proj2 (edgemap_to_edgeset_charac _ _ _ _ (sym_imap g))). assumption.
-Qed.
-
-Lemma interf_in_interf : forall x y g,
-In_graph_edge (x,y,None) g ->
-VertexSet.In x (interference_adj y g).
-
-Proof.
-intros.
-unfold interference_adj.
-destruct H.
-generalize (AE_weights _ _ H). intro. inversion H0.
-rewrite edge_comm in H. apply (proj1 (edgemap_to_edgeset_charac _ _ _ _(sym_imap g)) H).
-Qed.
-
-Lemma compat_interference_adj : forall x y g,
-Vertex.eq x y ->
-interference_adj x g = interference_adj y g.
-
-Proof.
-intros.
-unfold interference_adj.
-unfold adj_set.
-rewrite (InterfFacts.find_o _ H). reflexivity.
-Qed.
-
-Lemma compat_preference_adj : forall x y g,
-Vertex.eq x y ->
-preference_adj x g = preference_adj y g.
-
-Proof.
-intros.
-unfold preference_adj.
-unfold adj_set.
-rewrite (InterfFacts.find_o _ H). reflexivity.
-Qed.
-
-Lemma compat_bool_move : forall g,
-compat_bool Vertex.eq (move_related g).
-
-Proof.
-intros.
-unfold compat_bool.
-intros.
-unfold move_related.
-rewrite (compat_preference_adj _ _ _ H).
-reflexivity.
-Qed.
-
-(* characterisation of move relation *)
-
-Lemma move_related_charac : forall x g,
-move_related g x = true ->
-exists e, aff_edge e /\ In_graph_edge e g /\ incident e x.
-
-Proof.
-intros.
-unfold move_related in H.
-case_eq (VertexSet.is_empty (preference_adj x g)); intros.
-rewrite H0 in H. inversion H. generalize H0. clear H H0. intro H.
-case_eq (VertexSet.choose (preference_adj x g)); intros.
-exists (x,e,Some N0).
-split.
-exists N0. auto.
-generalize (VertexSet.choose_1 H0). clear H0. intro H0.
-split.
-left. unfold AE. apply (proj2 (edgemap_to_edgeset_charac _ _ _ _(sym_pmap g))).
-assumption.
-left. auto.
-generalize (VertexSet.choose_2 H0). clear H0. intro H0.
-rewrite (VertexSet.is_empty_1 H0) in H. inversion H.
-Qed.
-
-(* the inversion characterisation of move related *)
-
-Lemma move_related_charac2 : forall x g e,
-aff_edge e ->
-In_graph_edge e g ->
-incident e x ->
-move_related g x = true.
-
-Proof.
-intros.
-unfold move_related.
-case_eq (VertexSet.is_empty (preference_adj x g)); intros.
-generalize (VertexSet.is_empty_2 H2). clear H2. intro H2.
-destruct H1.
-elim (H2 (snd_ext e)).
-apply pref_in_pref with (w:=N0).
-rewrite edge_comm.
-assert (eq (x,snd_ext e, Some N0) e).
-apply eq_ordered_eq.
-unfold E.eq; simpl; intuition. apply Regs.eq_refl.
-destruct H0. generalize (AE_weights _ _ H0). intro.
-rewrite <-H3. apply OptionN_as_OT.eq_refl.
-generalize (proj1 (In_graph_interf_edge_in_IE _ _) H0). intros.
-destruct H3.
-unfold aff_edge in H. rewrite H3 in H. destruct H. inversion H.
-rewrite H3. assumption.
-
-elim (H2 (fst_ext e)).
-apply pref_in_pref with (w:=N0).
-assert (eq (fst_ext e, x, Some N0) e).
-apply eq_ordered_eq.
-unfold E.eq; simpl; intuition. apply Regs.eq_refl.
-destruct H0. generalize (AE_weights _ _ H0). intro.
-rewrite <-H3. apply OptionN_as_OT.eq_refl.
-generalize (proj1 (In_graph_interf_edge_in_IE _ _) H0). intros.
-destruct H3.
-unfold aff_edge in H. rewrite H3 in H. destruct H. inversion H.
-rewrite H3. assumption.
-auto.
-Qed.
-Definition WS := (VertexSet.t*VertexSet.t*VertexSet.t*EdgeSet.t)%type.
-
-Definition get_spillWL (w : WS) := fst (fst (fst w)).
-Definition get_freezeWL (w : WS) := snd (fst (fst w)).
-Definition get_simplifyWL (w : WS) := snd (fst w).
-Definition get_movesWL (w : WS) := snd w.
-
-Lemma compat_bool_low : forall g palette,
-compat_bool Vertex.eq (has_low_degree g palette).
-
-Proof.
-unfold compat_bool. intros.
-unfold has_low_degree, interf_degree.
-rewrite (compat_interference_adj _ _ _ H).
-reflexivity.
-Qed.
-
-Definition WS_properties g K (WL : WS) : Prop :=
-(forall x, VertexSet.In x (get_spillWL WL) <-> has_low_degree g K x = false /\ In_graph x g /\ ~VertexSet.In x (precolored g)) /\
-(forall x, VertexSet.In x (get_freezeWL WL) <-> has_low_degree g K x = true /\ (move_related g) x = true /\ ~VertexSet.In x (precolored g)) /\
-(forall x, VertexSet.In x (get_simplifyWL WL) <-> has_low_degree g K x = true /\ (move_related g) x = false /\ In_graph x g /\ ~VertexSet.In x (precolored g)) /\
-(forall e, EdgeSet.In e (get_movesWL WL) <-> aff_edge e /\ In_graph_edge e g).
-
-Definition get_WL g palette :=
-let not_pre := VertexSet.diff (V g) (precolored g) in
-let (low, spill) := VertexSet.partition (has_low_degree g palette) not_pre in
-let (free, simp) := VertexSet.partition (move_related g) low in
-(spill, free, simp, AE g).
-
-Module Import RegOTFacts := MyOTFacts Vertex.
-
-Lemma move_related_in : forall g x,
-move_related g x = true ->
-In_graph x g.
-
-Proof.
-intros.
-generalize (move_related_charac _ _ H). clear H. intro H.
-destruct H as [e H]. destruct H. destruct H0.
-apply (proj1 (extremities_pmap g x)).
-destruct H0.
-generalize (AE_weights _ _ H0). intro Hw.
-unfold AE in *.
-destruct H1.
-rewrite (edge_eq e) in H0.
-simpl in Hw. rewrite Hw in H0.
-generalize (proj1 (edgemap_to_edgeset_charac _ _ _ _(sym_pmap g)) H0). intro H2.
-apply (proj2 (InterfFacts.in_find_iff _ _)).
-unfold adj_set in H2.
-case_eq (VertexMap.find (fst_ext e) (pmap g)); intros; rewrite H3 in H2.
-intro Helim.
-rewrite (InterfFacts.find_o _ H1) in Helim.
-rewrite H3 in Helim. inversion Helim.
-elim (VertexSet.empty_1 H2).
-
-rewrite (edge_eq e) in H0. rewrite edge_comm in H0.
-simpl in Hw. rewrite Hw in H0.
-generalize (proj1 (edgemap_to_edgeset_charac _ _ _ _(sym_pmap g)) H0). intro H2.
-apply (proj2 (InterfFacts.in_find_iff _ _)).
-unfold adj_set in H2.
-case_eq (VertexMap.find (snd_ext e) (pmap g)); intros; rewrite H3 in H2.
-intro Helim.
-rewrite (InterfFacts.find_o _ H1) in Helim.
-rewrite H3 in Helim. inversion Helim.
-elim (VertexSet.empty_1 H2).
-
-generalize (proj1 (In_graph_interf_edge_in_IE _ _) H0). intros.
-destruct H2. unfold aff_edge in H. rewrite H2 in H. inversion H. inversion H4.
-Qed.
-
-Lemma WS_prop_get : forall g palette,
-WS_properties g palette (get_WL g palette).
-
-Proof.
-intros.
-unfold get_WL.
-set (not_pre := VertexSet.diff (V g) (precolored g)) in *.
-case_eq (VertexSet.partition (has_low_degree g palette) not_pre).
-intros low spill H.
-case_eq (VertexSet.partition (move_related g) low).
-intros free simp H0.
-unfold WS_properties.
-unfold get_spillWL. unfold get_simplifyWL. unfold get_freezeWL. unfold get_movesWL. simpl.
-assert (VertexSet.Equal low (VertexSet.filter (has_low_degree g palette) not_pre)).
-assert (low = fst (VertexSet.partition (has_low_degree g palette) not_pre)).
-rewrite H. auto.
-rewrite H1. apply VertexSet.partition_1. apply compat_bool_low.
-assert (VertexSet.Equal spill (VertexSet.filter (fun x => negb (has_low_degree g palette x)) not_pre)).
-assert (spill = snd (VertexSet.partition (has_low_degree g palette) not_pre)).
-rewrite H. auto.
-rewrite H2. apply VertexSet.partition_2. apply compat_bool_low.
-assert (VertexSet.Equal free (VertexSet.filter (move_related g) low)).
-assert (free = fst (VertexSet.partition (move_related g) low)).
-rewrite H0. auto.
-rewrite H3. apply VertexSet.partition_1. apply compat_bool_move.
-assert (VertexSet.Equal simp (VertexSet.filter (fun x => negb (move_related g x)) low)).
-assert (simp = snd (VertexSet.partition (move_related g) low)).
-rewrite H0. auto.
-rewrite H4. apply VertexSet.partition_2. apply compat_bool_move.
-split; intros.
-split; intros.
-rewrite H2 in H5.
-split.
-generalize (VertexSet.filter_2 (compat_not_compat (compat_bool_low _ _)) H5).
-destruct (has_low_degree g palette x); intuition.
-split.
-generalize (VertexSet.filter_1 (compat_not_compat (compat_bool_low _ _)) H5). intro.
-apply (VertexSet.diff_1 H6).
-generalize (VertexSet.filter_1 (compat_not_compat (compat_bool_low _ _)) H5). intro.
-apply (VertexSet.diff_2 H6).
-rewrite H2.
-apply VertexSet.filter_3.
-apply compat_not_compat. apply compat_bool_low.
-apply VertexSet.diff_3; intuition.
-destruct H5. rewrite H5. auto.
-
-split; intros.
-split; intros.
-rewrite H3 in H5.
-generalize (VertexSet.filter_1 (compat_bool_move _) H5). intro H6.
-generalize (VertexSet.filter_2 (compat_bool_move _) H5). clear H5. intro H5.
-rewrite H1 in H6.
-generalize (VertexSet.filter_1 (compat_bool_low _ _) H6). intro H7.
-generalize (VertexSet.filter_2 (compat_bool_low _ _) H6). clear H6. intro H6.
-generalize (VertexSet.diff_2 H7). intuition.
-
-rewrite H3. apply VertexSet.filter_3.
-apply compat_bool_move.
-rewrite H1.
-apply VertexSet.filter_3.
-apply compat_bool_low.
-apply VertexSet.diff_3.
-apply move_related_in. intuition.
-intuition.
-intuition.
-intuition.
-
-split;intros.
-split;intros.
-rewrite H4 in H5.
-generalize (VertexSet.filter_1 (compat_not_compat (compat_bool_move _)) H5). intro H6.
-generalize (VertexSet.filter_2 (compat_not_compat (compat_bool_move _)) H5). clear H5. intro H5.
-rewrite H1 in H6.
-generalize (VertexSet.filter_1 (compat_bool_low _ _) H6). intro H7.
-generalize (VertexSet.filter_2 (compat_bool_low _ _) H6). clear H6. intro H6.
-generalize (VertexSet.diff_2 H7). intuition.
-destruct (move_related g x); intuition.
-apply (VertexSet.diff_1 H7).
-
-rewrite H4.
-apply VertexSet.filter_3.
-apply compat_not_compat. apply compat_bool_move.
-rewrite H1. apply VertexSet.filter_3.
-apply compat_bool_low.
-apply VertexSet.diff_3.
-intuition.
-intuition.
-intuition.
-destruct (move_related g x); intuition.
-exact (In_graph_aff_edge_in_AE _ _).
-Qed.
-
-Definition not_incident_edges x s g :=
-VertexSet.fold (fun y s' => EdgeSet.remove (x,y,Some N0) s')
- (adj_set x (pmap g))
- s.
-
-Lemma not_incident_edges_1 : forall x e s g,
-(forall y, EdgeSet.In y s -> aff_edge y /\ In_graph_edge y g) ->
-(EdgeSet.In e (not_incident_edges x s g) <->
- EdgeSet.In e s /\ ~incident e x).
-
-Proof.
-split; intros.
-unfold not_incident_edges in H0.
-rewrite VertexSet.fold_1 in H0.
-assert (EdgeSet.In e s) as Hin.
-induction (VertexSet.elements (adj_set x (pmap g))). simpl in H0.
-assumption.
-rewrite MEdgeFacts.fold_left_assoc in H0.
-apply IHl.
-apply (EdgeSet.remove_3 H0).
-
-intros.
-split; intros.
-apply EdgeSet.remove_2. intro.
-generalize (EdgeSet.remove_3 H1). intro.
-elim (EdgeSet.remove_1 H2 H3).
-apply EdgeSet.remove_2. intro.
-elim (EdgeSet.remove_1 H2 H1).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H1)).
-apply EdgeSet.remove_2. intro.
-generalize (EdgeSet.remove_3 H1). intro.
-elim (EdgeSet.remove_1 H2 H3).
-apply EdgeSet.remove_2. intro.
-elim (EdgeSet.remove_1 H2 H1).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H1)).
-intros. apply RegRegProps.Equal_remove. assumption.
-
-split.
-assumption.
-
-generalize VertexSet.elements_1. intro HH.
-intro Helim. destruct Helim.
-generalize (HH (adj_set x (pmap g)) (snd_ext e)). clear HH. intro HH.
-induction (VertexSet.elements (adj_set x (pmap g))). simpl in H0.
-
-assert (VertexSet.In (snd_ext e) (adj_set x (pmap g))).
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))).
-assert (eq e (x, snd_ext e, Some N0)).
-assert (get_weight e = Some N0).
-
-generalize (H _ H0). intro.
-destruct H2. unfold In_graph_edge in H3.
-destruct H3.
-apply (AE_weights g). assumption.
-generalize (IE_weights g _ H3). intro.
-destruct H2. congruence.
-rewrite <-H2. Eq_eq. apply Regs.eq_refl.
-rewrite <-H2.
-
-generalize (H _ H0). intro.
-destruct H3. destruct H4.
-assumption.
-generalize (IE_weights g _ H4). intro.
-destruct H3. congruence.
-
-generalize (HH H2). intro. inversion H3.
-
-rewrite MEdgeFacts.fold_left_assoc in H0.
-apply IHl.
-apply (EdgeSet.remove_3 H0).
-
-intro. generalize (HH H2). clear HH H2. intro H2.
-inversion H2; subst.
-assert (eq e (x, a, Some N0)).
-rewrite (edge_eq e).
-apply eq_ordered_eq.
-constructor. simpl. split; intuition.
-simpl.
-
-generalize (H _ Hin). intro H5.
-destruct H5.
-destruct H5.
-rewrite (AE_weights g _ H5). apply OptionN_as_OT.eq_refl.
-generalize (IE_weights g _ H5). intro. destruct H3. congruence.
-elim (EdgeSet.remove_1 (eq_sym H3) H0).
-assumption.
-
-intros.
-split; intros.
-apply EdgeSet.remove_2. intro.
-generalize (EdgeSet.remove_3 H2). intro.
-elim (EdgeSet.remove_1 H3 H4).
-apply EdgeSet.remove_2. intro.
-elim (EdgeSet.remove_1 H3 H2).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H2)).
-apply EdgeSet.remove_2. intro.
-generalize (EdgeSet.remove_3 H2). intro.
-elim (EdgeSet.remove_1 H3 H4).
-apply EdgeSet.remove_2. intro.
-elim (EdgeSet.remove_1 H3 H2).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H2)).
-intros. apply RegRegProps.Equal_remove. assumption.
-
-generalize (HH (adj_set x (pmap g)) (fst_ext e)). clear HH. intro HH.
-induction (VertexSet.elements (adj_set x (pmap g))). simpl in H0.
-
-assert (VertexSet.In (fst_ext e) (adj_set x (pmap g))).
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))).
-assert (eq e (x, fst_ext e, Some N0)).
-assert (get_weight e = Some N0).
-
-generalize (H _ H0). intro.
-destruct H2. unfold In_graph_edge in H3.
-destruct H3.
-apply (AE_weights g). assumption.
-generalize (IE_weights g _ H3). intro.
-destruct H2. congruence.
-rewrite <-H2. Eq_comm_eq. apply Regs.eq_refl.
-rewrite <-H2.
-
-generalize (H _ H0). intro.
-destruct H3. destruct H4.
-assumption.
-generalize (IE_weights g _ H4). intro.
-destruct H3. congruence.
-
-generalize (HH H2). intro. inversion H3.
-
-rewrite MEdgeFacts.fold_left_assoc in H0.
-apply IHl.
-apply (EdgeSet.remove_3 H0).
-
-intro. generalize (HH H2). clear HH H2. intro H2.
-inversion H2; subst.
-assert (eq e (x, a, Some N0)).
-rewrite (edge_eq e).
-rewrite edge_comm. apply eq_ordered_eq.
-constructor. simpl. split; intuition.
-simpl.
-
-generalize (H _ Hin). intro H5.
-destruct H5.
-destruct H5.
-rewrite (AE_weights g _ H5). apply OptionN_as_OT.eq_refl.
-generalize (IE_weights g _ H5). intro. destruct H3. congruence.
-elim (EdgeSet.remove_1 (eq_sym H3) H0).
-assumption.
-
-intros.
-split; intros.
-apply EdgeSet.remove_2. intro.
-generalize (EdgeSet.remove_3 H2). intro.
-elim (EdgeSet.remove_1 H3 H4).
-apply EdgeSet.remove_2. intro.
-elim (EdgeSet.remove_1 H3 H2).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H2)).
-apply EdgeSet.remove_2. intro.
-generalize (EdgeSet.remove_3 H2). intro.
-elim (EdgeSet.remove_1 H3 H4).
-apply EdgeSet.remove_2. intro.
-elim (EdgeSet.remove_1 H3 H2).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H2)).
-intros. apply RegRegProps.Equal_remove. assumption.
-
-unfold not_incident_edges.
-rewrite VertexSet.fold_1.
-induction (VertexSet.elements (adj_set x (pmap g))). simpl.
-intuition.
-rewrite MEdgeFacts.fold_left_assoc.
-apply EdgeSet.remove_2.
-destruct H0.
-intro H2. elim H1.
-destruct (eq_charac _ _ H2); destruct H3; change_rewrite.
-left. auto.
-right. auto.
-assumption.
-
-intros.
-split; intros.
-apply EdgeSet.remove_2. intro.
-generalize (EdgeSet.remove_3 H1). intro.
-elim (EdgeSet.remove_1 H2 H3).
-apply EdgeSet.remove_2. intro.
-elim (EdgeSet.remove_1 H2 H1).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H1)).
-apply EdgeSet.remove_2. intro.
-generalize (EdgeSet.remove_3 H1). intro.
-elim (EdgeSet.remove_1 H2 H3).
-apply EdgeSet.remove_2. intro.
-elim (EdgeSet.remove_1 H2 H1).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H1)).
-intros. apply RegRegProps.Equal_remove. assumption.
-Qed.
-
-Definition not_incident_merge x s es :=
-VertexSet.fold (fun y s' => EdgeSet.remove (x,y,Some N0) s')
- es s.
-
-Lemma not_incident_merge_1 : forall x s es e,
-EdgeSet.In e (not_incident_merge x es s) ->
-EdgeSet.In e es.
-
-Proof.
-unfold not_incident_merge; intros.
-set (f := (fun (y : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.remove (x, y, Some 0%N) s')) in *.
-rewrite VertexSet.fold_1 in H.
-set (f' := fun a e => f e a) in *.
-induction (VertexSet.elements s). simpl in H. assumption.
-rewrite MEdgeFacts.fold_left_assoc in H.
-set (tmp := fold_left f' l es) in H.
-unfold f' in H. unfold f in H.
-apply (IHl (EdgeSet.remove_3 H)).
-
-unfold f'. unfold f. intros.
-split; intros.
-apply EdgeSet.remove_2.
-intro H1. elim (EdgeSet.remove_1 H1 (EdgeSet.remove_3 H0)).
-apply EdgeSet.remove_2.
-intro H1. elim (EdgeSet.remove_1 H1 H0).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H0)).
-apply EdgeSet.remove_2.
-intro H1. elim (EdgeSet.remove_1 H1 (EdgeSet.remove_3 H0)).
-apply EdgeSet.remove_2.
-intro H1. elim (EdgeSet.remove_1 H1 H0).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H0)).
-
-intros.
-unfold f'. unfold f.
-apply RegRegProps.Equal_remove. auto.
-Qed.
-
-
-Definition AE_merge_up newadj adj adjsnd e es :=
-let diff1 := VertexSet.diff adj newadj in
-let diff2 := VertexSet.diff newadj adj in
-let new_es := not_incident_merge (snd_ext e)
- (not_incident_merge (fst_ext e) es diff1)
- adjsnd in
-VertexSet.fold (fun y s'' => EdgeSet.add (fst_ext e,y,Some N0) s'')
- diff2 new_es.
-
-Lemma not_incident_merge_2 : forall x y s s',
-EdgeSet.In (x,y,Some N0) (not_incident_merge x s s') ->
-~VertexSet.In y s'.
-
-Proof.
-intros.
-unfold not_incident_merge in H.
-set (f := (fun (y : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.remove (x, y, Some 0%N) s')) in *.
-rewrite VertexSet.fold_1 in H.
-set (f' := fun a e => f e a) in *.
-generalize VertexSet.elements_1. intro HH.
-generalize (HH s' y). clear HH. intro HH.
-induction (VertexSet.elements s'). simpl in H.
-intro. generalize (HH H0). intro H1. inversion H1.
-rewrite MEdgeFacts.fold_left_assoc in H.
-set (tmp := fold_left f' l s) in *.
-unfold f' in H. unfold f in H.
-destruct (Vertex.eq_dec y a).
-cut (eq (x,y,Some N0) (x,a, Some N0)). intro H0.
-elim (EdgeSet.remove_1 (Edge.eq_sym H0) H).
-apply eq_ordered_eq. constructor;simpl; try split; intuition.
-apply OptionN_as_OT.eq_refl.
-apply IHl. apply (EdgeSet.remove_3 H).
-intro. generalize (HH H0). intro H1.
-inversion H1; subst.
-elim (n H3).
-auto.
-
-unfold f'. unfold f. intros.
-split; intros.
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 (EdgeSet.remove_3 H0)).
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 H0).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H0)).
-
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 (EdgeSet.remove_3 H0)).
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 H0).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H0)).
-
-unfold f'. unfold f. intros.
-apply RegRegProps.Equal_remove. auto.
-Qed.
-
-Lemma AE_merge_wl_1 : forall x y e g,
-aff_edge e ->
-In_graph_edge e g ->
-(VertexSet.In x (adj_set y (pmap_merge e g (imap_merge e g))) <->
-(VertexSet.In x (adj_set y (map_merge e (pmap g))) /\
-~VertexSet.In x (adj_set y (imap_merge e g)))).
-
-Proof.
-intros x y e g p q. split; intros.
-split.
-apply pmap_merge_sub. assumption.
-intro. apply (simple_graph (merge e g q p) x y). intuition.
-destruct H.
-unfold merge. simpl. apply resolve_conflicts_map_5; auto.
-Qed.
-
-Lemma not_in_diff_equiv : forall x s s',
-~VertexSet.In x (VertexSet.diff s s') ->
-VertexSet.In x s' \/ ~VertexSet.In x s.
-
-Proof.
-intros. destruct (Props.In_dec x s).
- destruct (Props.In_dec x s').
-left. auto.
-elim H. apply VertexSet.diff_3; auto.
-right. auto.
-Qed.
-
-Lemma AE_aux_2 : forall e g s p q,
-(forall a, EdgeSet.In a s <-> aff_edge a /\ In_graph_edge a g) ->
-(forall b, EdgeSet.In b (AE_merge_up (preference_adj (fst_ext e) (merge e g p q))
- (preference_adj (fst_ext e) g)
- (preference_adj (snd_ext e) g)
- e s)
- <->
- (~incident b (snd_ext e) /\
- ((EdgeSet.In b s /\ ~Interfere (fst_ext b) (snd_ext b) (merge e g p q)) \/
- EdgeSet.In b (VertexSet.fold
- (fun y s' => EdgeSet.add (fst_ext e, y, Some N0) s')
- (preference_adj (fst_ext e) (merge e g p q))
- EdgeSet.empty)))).
-
-Proof.
-intros e g s p q; split; intros.
-unfold AE_merge_up in H0.
-set (f := (fun (y : VertexSet.elt) (s'' : EdgeSet.t) =>
- EdgeSet.add (fst_ext e, y, Some 0%N) s'')) in *.
-set (diff1 := (VertexSet.diff (preference_adj (fst_ext e) (merge e g p q))
- (preference_adj (fst_ext e) g))) in *.
-set (diff2 := (VertexSet.diff (preference_adj (fst_ext e) g)
- (preference_adj (fst_ext e) (merge e g p q)))) in *.
-cut (get_weight b = Some N0). intro Hw.
-cut (~incident b (snd_ext e)). intro Hcut.
-split.
-assumption.
-rewrite VertexSet.fold_1 in H0.
-set (f' := fun a e => f e a) in *.
-generalize VertexSet.elements_2. intro HH.
-generalize (HH diff1). clear HH. intro HH.
-induction (VertexSet.elements diff1). simpl in H0.
-left. split.
-apply (not_incident_merge_1 _ _ _ _ (not_incident_merge_1 _ _ _ _ H0)).
-intro H1. unfold Interfere in H1.
-generalize (merge_4 e (fst_ext b, snd_ext b, None) _ p q H1). intro H2.
-destruct H2. destruct H2.
-unfold redirect in H3.
-destruct (OTFacts.eq_dec (fst_ext x) (snd_ext e)). destruct H3.
-assert (eq (fst_ext b, snd_ext b, None) (fst_ext e, snd_ext x, get_weight x)).
-unfold weak_eq in H3. change_rewrite. destruct H3.
-apply eq_ordered_eq; split; simpl; auto.
-unfold same_type in H4. destruct H4.
-destruct H4. destruct H5. simpl in H5. inversion H5.
-destruct H4. rewrite <-H4. apply OptionN_as_OT.eq_refl.
-destruct H3.
-unfold same_type in H4. destruct H4.
-destruct H4. destruct H6. simpl in H6. inversion H6.
-destruct H4. rewrite <-H4. rewrite edge_comm. apply eq_ordered_eq.
-split; auto. simpl. apply OptionN_as_OT.eq_refl.
-generalize H5. clear H3 H4 H5. intro H3.
-destruct (eq_charac _ _ H3); destruct H4; change_rewrite.
-generalize (not_incident_merge_1 _ _ _ _ H0). intro H6.
-cut (eq b (fst_ext e, snd_ext x, Some N0)). intro H7.
-rewrite H7 in H6. clear H7.
-generalize (not_incident_merge_2 _ _ _ _ H6). intro H7.
-unfold diff2 in H7.
-generalize (not_in_diff_equiv _ _ _ H7). clear H7. intro H7. destruct H7.
-rewrite <-H5 in H7. generalize (sym_pmap_merge_map e g q p _ _ H7). intro H8.
-rewrite <-H4 in H8. generalize (sym_pmap_merge_map e g q p _ _ H8). intro H9.
-elim (simple_graph (merge e g p q) (snd_ext b) (fst_ext b)). split.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ None (sym_imap_merge_map e g q p))).
-destruct H1.
-generalize (AE_weights _ _ H1). simpl. congruence.
-assumption.
-assumption.
-rewrite <-H5 in H7.
-elim H7. apply (sym_pmap g).
-rewrite <-H4.
-cut (In_graph_edge b g).
-intro H8.
-destruct H8.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))).
-cut (eq b (snd_ext b, fst_ext b, Some N0)). intro H9.
-rewrite <-H9. assumption.
-rewrite edge_comm. rewrite (edge_eq b). change_rewrite.
-rewrite Hw. apply eq_refl.
-generalize (IE_weights _ _ H8). congruence.
-generalize (proj1 (H _) (not_incident_merge_1 _ _ _ _ (not_incident_merge_1 _ _ _ _ H0))).
-intuition.
-apply eq_ordered_eq.
-constructor; simpl. split. auto. auto.
-fold (get_weight b). rewrite Hw. apply OptionN_as_OT.eq_refl.
-
-generalize (not_incident_merge_1 _ _ _ _ H0). intro H6.
-cut (eq b (fst_ext e, snd_ext x, Some N0)). intro H7.
-rewrite H7 in H6. clear H7.
-generalize (not_incident_merge_2 _ _ _ _ H6). intro H7.
-unfold diff2 in H7.
-generalize (not_in_diff_equiv _ _ _ H7). clear H7. intro H7.
-destruct H7.
-rewrite <-H4 in H7. generalize (sym_pmap_merge_map e g q p _ _ H7). intro H8.
-rewrite <-H5 in H8. generalize (sym_pmap_merge_map e g q p _ _ H8). intro H9.
-elim (simple_graph (merge e g p q) (snd_ext b) (fst_ext b)). split.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ None (sym_imap_merge_map e g q p))).
-destruct H1.
-generalize (AE_weights _ _ H1). simpl. congruence.
-assumption.
-assumption.
-rewrite <-H4 in H7.
-elim H7. apply (sym_pmap g).
-rewrite <-H5.
-cut (In_graph_edge b g).
-intro H8.
-destruct H8.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))).
-cut (eq b (snd_ext b, fst_ext b, Some N0)). intro H9.
-rewrite edge_comm. rewrite <-H9. assumption.
-rewrite edge_comm. rewrite (edge_eq b). change_rewrite.
-rewrite Hw. apply eq_refl.
-generalize (IE_weights _ _ H8). congruence.
-generalize (proj1 (H _) (not_incident_merge_1 _ _ _ _ (not_incident_merge_1 _ _ _ _ H0))).
-intuition.
-rewrite edge_comm. apply eq_ordered_eq.
-constructor; simpl. split. auto. auto.
-fold (get_weight b). rewrite Hw. apply OptionN_as_OT.eq_refl.
-
-destruct (OTFacts.eq_dec (snd_ext x) (snd_ext e)).
-assert (eq (fst_ext b, snd_ext b, None) (fst_ext x, fst_ext e, get_weight x)).
-destruct H3. unfold same_type in H4. destruct H4; destruct H4.
-destruct H5. simpl in H5. inversion H5. rewrite <-H4.
-unfold weak_eq in H3. change_rewrite.
-destruct H3; destruct H3.
-apply eq_ordered_eq. split; auto. simpl. apply OptionN_as_OT.eq_refl.
-rewrite edge_comm. apply eq_ordered_eq. split; auto. simpl. apply OptionN_as_OT.eq_refl.
-generalize H4. clear H3 H4. intro H3.
-destruct (eq_charac _ _ H3); change_rewrite. destruct H4.
-generalize (not_incident_merge_1 _ _ _ _ H0). intro H6.
-cut (eq b (fst_ext e, fst_ext x, Some N0)). intro H7.
-rewrite H7 in H6. clear H7.
-generalize (not_incident_merge_2 _ _ _ _ H6). intro H7.
-unfold diff2 in H7.
-generalize (not_in_diff_equiv _ _ _ H7). clear H7. intro H7.
-destruct H7.
-rewrite <-H4 in H7. generalize (sym_pmap_merge_map e g q p _ _ H7). intro H8.
-rewrite <-H5 in H8. generalize (sym_pmap_merge_map e g q p _ _ H8). intro H9.
-elim (simple_graph (merge e g p q) (snd_ext b) (fst_ext b)). split.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ None (sym_imap_merge_map e g q p))).
-destruct H1.
-generalize (AE_weights _ _ H1). simpl. congruence.
-assumption.
-assumption.
-rewrite <-H4 in H7.
-elim H7. apply (sym_pmap g).
-rewrite <-H5.
-cut (In_graph_edge b g).
-intro H8.
-destruct H8.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))).
-cut (eq b (fst_ext b, snd_ext b, Some N0)). intro H9.
-rewrite <-H9. assumption.
-rewrite (edge_eq b). change_rewrite.
-rewrite Hw. apply eq_refl.
-generalize (IE_weights _ _ H8). congruence.
-generalize (proj1 (H _) (not_incident_merge_1 _ _ _ _ (not_incident_merge_1 _ _ _ _ H0))).
-intuition.
-rewrite edge_comm. apply eq_ordered_eq.
-constructor; simpl. split. auto. auto.
-fold (get_weight b). rewrite Hw. apply OptionN_as_OT.eq_refl.
-
-destruct H4.
-generalize (not_incident_merge_1 _ _ _ _ H0). intro H6.
-cut (eq b (fst_ext e, fst_ext x, Some N0)). intro H7.
-rewrite H7 in H6. clear H7.
-generalize (not_incident_merge_2 _ _ _ _ H6). intro H7.
-unfold diff2 in H7.
-generalize (not_in_diff_equiv _ _ _ H7). clear H7. intro H7.
-destruct H7.
-rewrite <-H5 in H7. generalize (sym_pmap_merge_map e g q p _ _ H7). intro H8.
-rewrite <-H4 in H8. generalize (sym_pmap_merge_map e g q p _ _ H8). intro H9.
-elim (simple_graph (merge e g p q) (snd_ext b) (fst_ext b)). split.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ None (sym_imap_merge_map e g q p))).
-destruct H1.
-generalize (AE_weights _ _ H1). simpl. congruence.
-assumption.
-assumption.
-rewrite <-H5 in H7.
-elim H7. apply (sym_pmap g).
-rewrite <-H4.
-cut (In_graph_edge b g).
-intro H8.
-destruct H8.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))).
-cut (eq b (fst_ext b, snd_ext b, Some N0)). intro H9.
-rewrite edge_comm. rewrite <-H9. assumption.
-rewrite (edge_eq b). change_rewrite.
-rewrite Hw. apply eq_refl.
-generalize (IE_weights _ _ H8). congruence.
-generalize (proj1 (H _) (not_incident_merge_1 _ _ _ _ (not_incident_merge_1 _ _ _ _ H0))).
-intuition.
-apply eq_ordered_eq.
-constructor; simpl. split. auto. auto.
-fold (get_weight b). rewrite Hw. apply OptionN_as_OT.eq_refl.
-
-assert (eq (fst_ext b, snd_ext b, None) x).
-destruct H3. unfold same_type in H4. destruct H4; destruct H4.
-destruct H5. simpl in H5. inversion H5.
-rewrite <-H4.
-unfold weak_eq in H3; change_rewrite. destruct H3; destruct H3.
-apply eq_ordered_eq; split; auto. apply OptionN_as_OT.eq_refl.
-rewrite edge_comm. apply eq_ordered_eq; split; auto. apply OptionN_as_OT.eq_refl.
-generalize H4. clear H3 H4. intro H3.
-elim (simple_graph g (fst_ext b) (snd_ext b)).
-split.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ None (sym_imap g))).
-rewrite edge_comm. rewrite H3.
-destruct H2.
-rewrite <-H3 in H2. generalize (AE_weights _ _ H2). simpl. congruence.
-assumption.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))).
-assert (In_graph_edge b g).
-generalize (proj1 (H _) (not_incident_merge_1 _ _ _ _ (not_incident_merge_1 _ _ _ _ H0))).
-intuition.
-destruct H4.
-assert (eq b (fst_ext b, snd_ext b, Some N0)).
-rewrite (edge_eq b). change_rewrite.
-rewrite Hw. apply eq_refl.
-rewrite edge_comm. rewrite <-H5. assumption.
-generalize (IE_weights _ _ H4). congruence.
-rewrite MEdgeFacts.fold_left_assoc in H0.
-set (set := (not_incident_merge (snd_ext e)
- (not_incident_merge (fst_ext e) s diff2)
- (preference_adj (snd_ext e) g))) in *.
-set (tmp := fold_left f' l set) in *.
-unfold f' in H0. unfold f in H0.
-destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H0).
-fold (eq (fst_ext e, a, Some N0) b) in H1.
-right.
-rewrite <-H1.
-rewrite VertexSet.fold_1.
-fold f'.
-set (s' := preference_adj (fst_ext e) (merge e g p q)) in *.
-generalize VertexSet.elements_1. intro HHH.
-generalize (HHH s' a). clear HHH. intro HHH.
-induction (VertexSet.elements s'). simpl.
-assert (InA Vertex.eq a nil).
-apply HHH.
-unfold s'.
-assert (VertexSet.In a diff1).
-apply HH. left. intuition.
-apply (VertexSet.diff_1 H2). inversion H2.
-rewrite MEdgeFacts.fold_left_assoc.
-set (tmp' := fold_left f' l0 EdgeSet.empty) in *.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec a a0).
-apply EdgeSet.add_1.
-apply eq_ordered_eq. constructor;simpl.
-split; intuition.
-apply OptionN_as_OT.eq_refl.
-apply EdgeSet.add_2.
-apply IHl0. intros.
-generalize (HHH H2). intro.
-inversion H3; subst.
-elim (n H5).
-auto.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.add_add.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.Dec.F.add_m. apply eq_refl. auto.
-
-apply IHl.
-assumption.
-intros.
-apply HH.
-right. auto.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.add_add.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.Dec.F.add_m. apply eq_refl. auto.
-
-rewrite VertexSet.fold_1 in H0.
-set (f' := fun a e => f e a) in *.
-generalize VertexSet.elements_2. intro HH.
-generalize (HH diff1). clear HH. intro HH.
-induction (VertexSet.elements diff1). simpl in H0.
-intro Hinc. destruct Hinc.
-assert (eq b (snd_ext e, snd_ext b, Some N0)).
-rewrite (edge_eq b). change_rewrite. rewrite Hw.
-apply eq_ordered_eq.
-constructor;simpl. split;intuition.
-apply OptionN_as_OT.eq_refl.
-
-rewrite H2 in H0.
-generalize (not_incident_merge_2 _ _ _ _ H0). intro H3.
-elim H3.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))). rewrite <-H2.
-assert (In_graph_edge b g).
-generalize (proj1 (H _) (not_incident_merge_1 _ _ _ _ (not_incident_merge_1 _ _ _ _ H0))).
-intro. destruct H4. rewrite <-H2 in H5. assumption.
-destruct H4.
-assumption.
-generalize (IE_weights _ _ H4). congruence.
-
-assert (eq b (fst_ext b, snd_ext e, Some N0)).
-rewrite (edge_eq b). change_rewrite. rewrite Hw.
-apply eq_ordered_eq.
-constructor;simpl. split; intuition.
-apply OptionN_as_OT.eq_refl.
-
-rewrite H2 in H0. rewrite edge_comm in H0.
-generalize (not_incident_merge_2 _ _ _ _ H0). intro H3.
-elim H3.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))). rewrite edge_comm. rewrite <-H2.
-assert (In_graph_edge b g).
-generalize (proj1 (H _) (not_incident_merge_1 _ _ _ _ (not_incident_merge_1 _ _ _ _ H0))).
-intro. destruct H4. rewrite edge_comm in H2. rewrite <-H2 in H5. assumption.
-destruct H4.
-assumption.
-generalize (IE_weights _ _ H4). congruence.
-
-rewrite MEdgeFacts.fold_left_assoc in H0.
-set (set := (not_incident_merge (snd_ext e)
- (not_incident_merge (fst_ext e) s diff2)
- (preference_adj (snd_ext e) g))) in *.
-set (tmp := fold_left f' l set) in *.
-unfold f' in H0. unfold f in H0.
-destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H0).
-fold (eq (fst_ext e, a, Some N0) b) in H1.
-intro. destruct H2.
-destruct (eq_charac _ _ H1); change_rewrite. destruct H3.
-elim (In_graph_edge_diff_ext _ _ p).
-apply Vertex.eq_trans with (y := fst_ext b); auto.
-destruct H3.
-assert (VertexSet.In a diff1). apply HH.
-left. intuition.
-unfold diff1 in H5. generalize (VertexSet.diff_2 H5). clear H5. intro H5.
-elim H5.
-rewrite H4. rewrite <-H2.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))).
-generalize p. intro Hin.
-destruct Hin.
-assert (eq (fst_ext e, snd_ext e, Some N0) e).
-apply eq_ordered_eq.
-constructor. simpl. split; apply Regs.eq_refl.
-simpl. fold (get_weight e). rewrite (AE_weights _ _ H6).
-apply OptionN_as_OT.eq_refl.
-rewrite H7. assumption.
-generalize (IE_weights _ _ H6). generalize q. intro Haff. destruct Haff. congruence.
-
-destruct (eq_charac _ _ H1); change_rewrite. destruct H3.
-assert (VertexSet.In a diff1). apply HH.
-left. intuition.
-unfold diff1 in H5. generalize (VertexSet.diff_2 H5). clear H5. intro H5.
-elim H5.
-rewrite H4. rewrite <-H2.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))).
-generalize p. intro Hin.
-destruct Hin.
-assert (eq (fst_ext e, snd_ext e, Some N0) e).
-apply eq_ordered_eq.
-constructor. simpl. split; apply Regs.eq_refl.
-simpl. fold (get_weight e). rewrite (AE_weights _ _ H6).
-apply OptionN_as_OT.eq_refl.
-rewrite H7. assumption.
-generalize (IE_weights _ _ H6). generalize q. intro Haff. destruct Haff. congruence.
-elim (In_graph_edge_diff_ext _ _ p).
-apply Vertex.eq_trans with (y := snd_ext b); auto.
-destruct H3. auto.
-apply IHl. auto.
-intros. apply HH. right. auto.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.add_add.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.Dec.F.add_m. apply eq_refl. auto.
-
-rewrite VertexSet.fold_1 in H0.
-set (f' := fun a e => f e a) in *.
-induction (VertexSet.elements diff1). simpl in H0.
-assert (aff_edge b /\ In_graph_edge b g).
-rewrite <-H.
-apply (not_incident_merge_1 _ _ _ _ (not_incident_merge_1 _ _ _ _ H0)).
-destruct H1.
-destruct H2.
-apply (AE_weights _ _ H2).
-destruct H1. generalize (IE_weights _ _ H2). congruence.
-
-rewrite MEdgeFacts.fold_left_assoc in H0.
-set (set := (not_incident_merge (snd_ext e)
- (not_incident_merge (fst_ext e) s diff2)
- (preference_adj (snd_ext e) g))) in *.
-set (tmp := fold_left f' l set) in *.
-unfold f' in H0. unfold f in H0.
-destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H0).
-fold (eq (fst_ext e, a, Some N0) b) in H1.
-rewrite <-H1. auto.
-apply IHl. auto.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.add_add.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.Dec.F.add_m. apply eq_refl. auto.
-
-destruct H0.
-destruct H1.
-destruct H1.
-unfold AE_merge_up.
-set (f := (fun (y : VertexSet.elt) (s'' : EdgeSet.t) =>
- EdgeSet.add (fst_ext e, y, Some 0%N) s'')) in *.
-set (diff1 := (VertexSet.diff (preference_adj (fst_ext e) (merge e g p q))
- (preference_adj (fst_ext e) g))) in *.
-set (diff2 := (VertexSet.diff (preference_adj (fst_ext e) g)
- (preference_adj (fst_ext e) (merge e g p q)))) in *.
-cut (EdgeSet.In b (not_incident_merge (snd_ext e)
- (not_incident_merge (fst_ext e) s diff2)
- (preference_adj (snd_ext e) g))). intro H3.
-rewrite VertexSet.fold_1.
-set (f' := fun a e => f e a) in *.
-induction (VertexSet.elements diff1). simpl. assumption.
-rewrite MEdgeFacts.fold_left_assoc.
-set (set := (fold_left f' l
- (not_incident_merge (snd_ext e)
- (not_incident_merge (fst_ext e) s diff2)
- (preference_adj (snd_ext e) g)))) in *.
-unfold f'. unfold f.
-apply EdgeSet.add_2. assumption.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.add_add.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.Dec.F.add_m. apply eq_refl. auto.
-
-cut (EdgeSet.In b (not_incident_merge (fst_ext e) s diff2)). intro.
-set (set := (not_incident_merge (fst_ext e) s diff2)) in *.
-unfold not_incident_merge.
-set (h := (fun (y : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.remove (snd_ext e, y, Some 0%N) s')) in *.
-set (adjsnd := preference_adj (snd_ext e) g) in *.
-rewrite VertexSet.fold_1.
-set (h' := fun a e => h e a) in *.
-induction (VertexSet.elements adjsnd). simpl. assumption.
-rewrite MEdgeFacts.fold_left_assoc.
-set (tmp := fold_left h' l set) in *.
-unfold h'. unfold h.
-apply EdgeSet.remove_2.
-intro. elim H0.
-destruct (eq_charac _ _ H4); change_rewrite; destruct H5.
-left. auto.
-right. auto. assumption.
-
-unfold h'. unfold h. intros.
-split; intros.
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 (EdgeSet.remove_3 H4)).
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 H4).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H4)).
-
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 (EdgeSet.remove_3 H4)).
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 H4).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H4)).
-
-unfold h'. unfold h. intros.
-apply RegRegProps.Equal_remove. auto.
-
-unfold not_incident_merge.
-set (h := (fun (y : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.remove (fst_ext e, y, Some 0%N) s')) in *.
-rewrite VertexSet.fold_1.
-set (h' := fun a e => h e a) in *.
-generalize VertexSet.elements_2. intro.
-generalize (H3 diff2). clear H3. intro HH.
-induction (VertexSet.elements diff2). simpl. assumption.
-rewrite MEdgeFacts.fold_left_assoc.
-set (tmp := fold_left h' l s) in *.
-unfold h'. unfold h.
-apply EdgeSet.remove_2.
-intro.
-assert (VertexSet.In a diff2).
-apply HH. left. intuition.
-unfold diff2 in H4.
-elim (VertexSet.diff_2 H4). clear H4.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap_merge_map e g q p))).
-assert (eq (fst_ext e, a, Some N0) b). auto. generalize H4. clear H3 H4. intro H3.
-rewrite H3.
-cut (eq b (fst_ext b, snd_ext b, Some N0)). intro.
-rewrite H4.
-cut (In_graph_edge (fst_ext b, snd_ext b, Some N0) (merge e g p q)). intro.
-destruct H5. assumption.
-generalize (IE_weights _ _ H5). simpl. congruence.
-rewrite <-H4.
-cut (eq b (redirect (snd_ext e) (fst_ext e) b)). intro.
-rewrite H5. rewrite (edge_eq _).
-cut (get_weight (redirect (snd_ext e) (fst_ext e) b) = Some N0). intro.
-rewrite H6.
-assert (exists w, In_graph_edge
- (fst_ext (redirect (snd_ext e) (fst_ext e) b),
- snd_ext (redirect (snd_ext e) (fst_ext e) b), Some w) (merge e g p q)).
-apply merge_5.
-
-rewrite H in H1. intuition.
-intro.
-elim H0.
-destruct (eq_charac _ _ H7);change_rewrite; destruct H8.
-right. auto.
-left. auto.
-unfold aff_edge. exists N0. rewrite <-H3. auto.
-
-cut (eq (fst_ext (redirect (snd_ext e) (fst_ext e) b),
- snd_ext (redirect (snd_ext e) (fst_ext e) b),
- None) (fst_ext b, snd_ext b, None)). intro.
-unfold Interfere. rewrite H7. assumption.
-
-unfold redirect. destruct (OTFacts.eq_dec (fst_ext b) (snd_ext e)).
-elim H0. left. auto.
-destruct (OTFacts.eq_dec (snd_ext b) (snd_ext e)).
-elim H0. right. auto.
-apply eq_refl.
-
-destruct H7.
-destruct H7. generalize (AE_weights _ _ H7). simpl. intro.
-rewrite H8 in H7. left. auto.
-generalize (IE_weights _ _ H7). simpl. congruence.
-
-rewrite <-H5. rewrite H4. auto.
-
-unfold redirect. destruct (OTFacts.eq_dec (fst_ext b) (snd_ext e)).
-elim H0. left. auto.
-destruct (OTFacts.eq_dec (snd_ext b) (snd_ext e)).
-elim H0. right. auto.
-apply eq_refl.
-
-apply eq_ordered_eq. constructor; simpl; try split.
-apply Regs.eq_refl.
-apply Regs.eq_refl.
-fold (get_weight b). rewrite <-H3. simpl. apply OptionN_as_OT.eq_refl.
-
-apply IHl. intros. apply HH. right. auto.
-
-unfold h'. unfold h. intros.
-split; intros.
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 (EdgeSet.remove_3 H3)).
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 H3).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H3)).
-
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 (EdgeSet.remove_3 H3)).
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 H3).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H3)).
-
-unfold h'. unfold h. intros.
-apply RegRegProps.Equal_remove. auto.
-
-(* last part !!!!!!! *)
-
-unfold AE_merge_up.
-set (f := (fun (y : VertexSet.elt) (s'' : EdgeSet.t) =>
- EdgeSet.add (fst_ext e, y, Some 0%N) s'')) in *.
-set (diff1 := (VertexSet.diff (preference_adj (fst_ext e) (merge e g p q))
- (preference_adj (fst_ext e) g))) in *.
-set (diff2 := (VertexSet.diff (preference_adj (fst_ext e) g)
- (preference_adj (fst_ext e) (merge e g p q)))) in *.
-
-set (pref := preference_adj (fst_ext e) (merge e g p q)) in *.
-rewrite VertexSet.fold_1 in H1.
-generalize VertexSet.elements_2. intro HH.
-generalize (HH pref). clear HH. intro HH.
-set (f' := fun a e => f e a) in *. induction (VertexSet.elements pref).
-simpl in H1. elim (EdgeSet.empty_1 H1).
-
-set (set := (not_incident_merge (snd_ext e)
- (not_incident_merge (fst_ext e) s diff2)
- (preference_adj (snd_ext e) g))) in *.
-rewrite MEdgeFacts.fold_left_assoc in H1.
-set (tmp := fold_left f' l EdgeSet.empty) in *.
-unfold f' in H1. unfold f in H1.
-destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H1).
-fold (eq (fst_ext e, a, Some N0) b) in H2.
-rewrite <-H2.
-destruct (Props.In_dec a (preference_adj (fst_ext e) g)).
-cut (EdgeSet.In b set). intro Hcut.
-rewrite VertexSet.fold_1. fold f'.
-assert (~InA Vertex.eq a (VertexSet.elements diff1)).
-intro. generalize (VertexSet.elements_2 H3). intro H4.
-unfold diff1 in H4. elim (VertexSet.diff_2 H4 i).
-induction (VertexSet.elements diff1). simpl.
-rewrite H2. assumption.
-rewrite MEdgeFacts.fold_left_assoc.
-set (tmp' := fold_left f' l0 set) in *.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec a a0).
-apply EdgeSet.add_1. apply eq_ordered_eq. constructor; simpl. split; intuition.
-apply OptionN_as_OT.eq_refl.
-apply EdgeSet.add_2.
-apply IHl0. intro. elim H3. right. auto.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.add_add.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.Dec.F.add_m. apply eq_refl. auto.
-
-unfold set. cut (EdgeSet.In b (not_incident_merge (fst_ext e) s diff2)). intro.
-set (set' := (not_incident_merge (fst_ext e) s diff2)) in *.
-unfold not_incident_merge.
-set (h := (fun (y : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.remove (snd_ext e, y, Some 0%N) s')) in *.
-set (adjsnd := preference_adj (snd_ext e) g) in *.
-rewrite VertexSet.fold_1.
-set (h' := fun a e => h e a) in *.
-induction (VertexSet.elements adjsnd). simpl. assumption.
-rewrite MEdgeFacts.fold_left_assoc.
-set (tmp' := fold_left h' l set') in *.
-unfold h'. unfold h.
-apply EdgeSet.remove_2.
-intro. elim H0.
-destruct (eq_charac _ _ H4); change_rewrite; destruct H5.
-left. auto.
-right. auto. assumption.
-
-unfold h'. unfold h. intros.
-split; intros.
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 (EdgeSet.remove_3 H4)).
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 H4).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H4)).
-
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 (EdgeSet.remove_3 H4)).
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 H4).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H4)).
-
-unfold h'. unfold h. intros.
-apply RegRegProps.Equal_remove. auto.
-
-unfold not_incident_merge.
-set (h := (fun (y : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.remove (fst_ext e, y, Some 0%N) s')) in *.
-rewrite VertexSet.fold_1.
-set (h' := fun a e => h e a) in *.
-generalize VertexSet.elements_2. intro.
-generalize (H3 diff2). clear H3. intro HHH.
-induction (VertexSet.elements diff2). simpl.
-rewrite H. split.
-unfold aff_edge. exists N0. rewrite <-H2. auto.
-left. rewrite <-H2.
-apply (proj2 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap g))). assumption.
-rewrite MEdgeFacts.fold_left_assoc.
-set (tmp' := fold_left h' l0 s) in *.
-unfold h'. unfold h.
-apply EdgeSet.remove_2.
-intro.
-assert (Vertex.eq a a0).
-destruct (Vertex.eq_dec a a0). intuition.
-assert (eq (fst_ext e, a0, Some N0) b) by auto. generalize H4. clear H3 H4. intro H3.
-rewrite <-H3 in H2. destruct (eq_charac _ _ H2); change_rewrite; destruct H4.
-auto.
-apply Vertex.eq_trans with (y := fst_ext e); auto.
-assert (~VertexSet.In a diff2).
-intro. unfold diff2 in H5. elim (VertexSet.diff_2 H5).
-apply HH. left. intuition.
-elim H5.
-rewrite H4. apply HHH. left. intuition.
-apply IHl0.
-intros. apply HHH. right. auto.
-
-unfold h'. unfold h. intros.
-split; intros.
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 (EdgeSet.remove_3 H3)).
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 H3).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H3)).
-
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 (EdgeSet.remove_3 H3)).
-apply EdgeSet.remove_2.
-intro H5. elim (EdgeSet.remove_1 H5 H3).
-apply (EdgeSet.remove_3 (EdgeSet.remove_3 H3)).
-
-unfold h'. unfold h. intros.
-apply RegRegProps.Equal_remove. auto.
-
-rewrite VertexSet.fold_1.
-fold f'.
-generalize VertexSet.elements_1. intro HHH.
-generalize (HHH diff1 a). clear HHH. intro HHH.
-assert (VertexSet.In a diff1). apply VertexSet.diff_3. apply HH. left. intuition.
-assumption.
-induction (VertexSet.elements diff1). simpl.
-generalize (HHH H3). intro H4. inversion H4.
-rewrite MEdgeFacts.fold_left_assoc.
-set (tmp' := fold_left f' l0 set) in *.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec a a0).
-apply EdgeSet.add_1.
-apply eq_ordered_eq. constructor; simpl; try split; intuition.
-apply OptionN_as_OT.eq_refl.
-apply EdgeSet.add_2. apply IHl0. intro.
-generalize (HHH H4). intro H5. inversion H5; subst.
-elim (n0 H7).
-assumption.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.add_add.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.Dec.F.add_m. apply eq_refl. auto.
-
-apply IHl.
-assumption.
-intros. apply HH. right. auto.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.add_add.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.Dec.F.add_m. apply eq_refl. auto.
-Qed.
-
-Lemma AE_aux_3 : forall e g s p q,
-(forall a, EdgeSet.In a s <-> aff_edge a /\ In_graph_edge a g) ->
-(forall b, EdgeSet.In b (AE (merge e g p q))
- <->
- (~incident b (snd_ext e) /\
- ((EdgeSet.In b s /\ ~Interfere (fst_ext b) (snd_ext b) (merge e g p q)) \/
- EdgeSet.In b (VertexSet.fold
- (fun y s' => EdgeSet.add (fst_ext e, y, Some N0) s')
- (preference_adj (fst_ext e) (merge e g p q))
- EdgeSet.empty)))).
-
-Proof.
-intros e g s p q. generalize I. intro H.
-split; intros.
-generalize (proj1 (In_graph_aff_edge_in_AE _ _) H1). intro H3.
-destruct H3 as [H3 H4].
-assert (~incident b (snd_ext e)) as Hinc.
-intro. destruct H2; elim (merge_1 e g p q); auto.
-unfold In_graph. rewrite H2. apply (proj1 (In_graph_edge_in_ext _ _ H4)).
-unfold In_graph. rewrite H2. apply (proj2 (In_graph_edge_in_ext _ _ H4)).
-
-split.
-assumption.
-
-assert (get_weight b = Some N0) as Hw.
-apply AE_weights with (g := merge e g p q). assumption.
-
-clear H1.
-generalize (merge_4 e _ g p q H4). intro H1.
-destruct H1. destruct H1 as [H1 H2]. destruct H2 as [H2 HH2].
-assert (aff_edge x) as Haffb.
-unfold same_type in HH2. destruct HH2; destruct H5;[auto|congruence].
-
-unfold redirect in H2.
-destruct (OTFacts.eq_dec (fst_ext x) (snd_ext e)).
-right.
-unfold weak_eq in H2. change_rewrite. destruct H2; destruct H2.
-
-set (f := (fun (y : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.add (fst_ext e, y, Some 0%N) s')) in *.
-set (set := preference_adj (fst_ext e) (merge e g p q)) in *.
-rewrite VertexSet.fold_1. set (f' := fun a e => f e a) in *.
-generalize VertexSet.elements_1. intro HH.
-generalize (HH set (snd_ext x)). clear HH. intro HH.
-induction (VertexSet.elements set). simpl.
-assert (InA Vertex.eq (snd_ext x) nil).
-apply HH.
-unfold set. rewrite <-H5. rewrite (compat_preference_adj _ _ _ (Vertex.eq_sym H2)).
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap_merge_map e g q p))).
-cut (eq b (fst_ext b, snd_ext b, Some N0)). intro Heq.
-rewrite <-Heq. destruct H4. assumption.
-generalize (IE_weights _ _ H4). congruence.
-rewrite (edge_eq b); change_rewrite.
-assert (get_weight b = Some N0).
-apply AE_weights with (g:= merge e g p q). rewrite In_graph_aff_edge_in_AE.
-split; auto.
-rewrite H6. apply eq_refl.
-inversion H6.
-
-rewrite MEdgeFacts.fold_left_assoc.
-set (tmp := fold_left f' l EdgeSet.empty) in *.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec (snd_ext x) a).
-apply EdgeSet.add_1.
-apply eq_ordered_eq.
-rewrite (edge_eq b).
-constructor; simpl. split; intuition.
-rewrite <-e0. intuition.
-assert (get_weight b = Some N0).
-apply AE_weights with (g:= merge e g p q). rewrite In_graph_aff_edge_in_AE.
-split; intuition.
-rewrite H6. apply OptionN_as_OT.eq_refl.
-apply EdgeSet.add_2.
-apply IHl. intro. generalize (HH H6). intro H7.
-inversion H7; subst.
-elim (n H9).
-auto.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.add_add.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.Dec.F.add_m. apply eq_refl. auto.
-
-set (f := (fun (y : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.add (fst_ext e, y, Some 0%N) s')) in *.
-set (set := preference_adj (fst_ext e) (merge e g p q)) in *.
-rewrite VertexSet.fold_1. set (f' := fun a e => f e a) in *.
-generalize VertexSet.elements_1. intro HH.
-generalize (HH set (snd_ext x)). clear HH. intro HH.
-induction (VertexSet.elements set). simpl.
-assert (InA Vertex.eq (snd_ext x) nil).
-apply HH.
-unfold set. rewrite <-H2. rewrite (compat_preference_adj _ _ _ (Vertex.eq_sym H5)).
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap_merge_map e g q p))).
-cut (eq b (snd_ext b, fst_ext b, Some N0)). intro Heq.
-rewrite <-Heq. destruct H4. assumption.
-generalize (IE_weights _ _ H4). congruence.
-rewrite (edge_eq b); change_rewrite.
-assert (get_weight b = Some N0).
-apply AE_weights with (g:= merge e g p q). rewrite In_graph_aff_edge_in_AE.
-split; auto.
-rewrite H6. apply edge_comm.
-inversion H6.
-
-rewrite MEdgeFacts.fold_left_assoc.
-set (tmp := fold_left f' l EdgeSet.empty) in *.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec (snd_ext x) a).
-apply EdgeSet.add_1.
-fold (eq (fst_ext e, a, Some N0) b).
-rewrite edge_comm. apply eq_ordered_eq.
-rewrite (edge_eq b).
-constructor; simpl. split; intuition.
-rewrite <-e0. intuition.
-assert (get_weight b = Some N0).
-apply AE_weights with (g:= merge e g p q). rewrite In_graph_aff_edge_in_AE.
-split; auto.
-rewrite H6. apply OptionN_as_OT.eq_refl.
-apply EdgeSet.add_2.
-apply IHl. intro. generalize (HH H6). intro H7.
-inversion H7; subst.
-elim (n H9).
-auto.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.add_add.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.Dec.F.add_m. apply eq_refl. auto.
-
-destruct (OTFacts.eq_dec (snd_ext x) (snd_ext e)).
-
-right.
-unfold weak_eq in H2. change_rewrite. destruct H2; destruct H2.
-assert (get_weight x = Some N0).
-apply AE_weights with (g:=g). apply (proj2 (In_graph_aff_edge_in_AE _ _)).
-split; auto.
-
-set (f := (fun (y : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.add (fst_ext e, y, Some 0%N) s')) in *.
-set (set := preference_adj (fst_ext e) (merge e g p q)) in *.
-rewrite VertexSet.fold_1. set (f' := fun a e => f e a) in *.
-generalize VertexSet.elements_1. intro HH.
-generalize (HH set (fst_ext x)). clear HH. intro HH.
-induction (VertexSet.elements set). simpl.
-assert (InA Vertex.eq (fst_ext x) nil).
-apply HH.
-unfold set. rewrite <-H2. rewrite (compat_preference_adj _ _ _ (Vertex.eq_sym H5)).
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap_merge_map e g q p))).
-cut (eq b (snd_ext b, fst_ext b, Some N0)). intro Heq.
-rewrite <-Heq. destruct H4. assumption.
-generalize (IE_weights _ _ H4). congruence.
-rewrite (edge_eq b); change_rewrite.
-assert (get_weight b = Some N0).
-apply AE_weights with (g:= merge e g p q). rewrite In_graph_aff_edge_in_AE.
-split; auto.
-rewrite H7. apply edge_comm.
-inversion H7.
-
-rewrite MEdgeFacts.fold_left_assoc.
-set (tmp := fold_left f' l EdgeSet.empty) in *.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec (fst_ext x) a).
-apply EdgeSet.add_1.
-fold (eq (fst_ext e, a, Some N0) b).
-rewrite edge_comm. apply eq_ordered_eq.
-rewrite (edge_eq b).
-constructor; simpl. split; intuition.
-rewrite <-e0. intuition.
-rewrite Hw. auto. apply OptionN_as_OT.eq_refl.
-apply EdgeSet.add_2.
-apply IHl. intro. generalize (HH H7). intro H8.
-inversion H8; subst.
-elim (n0 H10).
-auto.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.add_add.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.Dec.F.add_m. apply eq_refl. auto.
-
-set (f := (fun (y : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.add (fst_ext e, y, Some 0%N) s')) in *.
-set (set := preference_adj (fst_ext e) (merge e g p q)) in *.
-rewrite VertexSet.fold_1. set (f' := fun a e => f e a) in *.
-generalize VertexSet.elements_1. intro HH.
-generalize (HH set (fst_ext x)). clear HH. intro HH.
-induction (VertexSet.elements set). simpl.
-assert (InA Vertex.eq (fst_ext x) nil).
-apply HH.
-unfold set. rewrite <-H5. rewrite (compat_preference_adj _ _ _ (Vertex.eq_sym H2)).
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap_merge_map e g q p))).
-cut (eq b (fst_ext b, snd_ext b, Some N0)). intro Heq.
-rewrite <-Heq. destruct H4. assumption.
-generalize (IE_weights _ _ H4). congruence.
-rewrite (edge_eq b); change_rewrite.
-assert (get_weight b = Some N0).
-apply AE_weights with (g:= merge e g p q). rewrite In_graph_aff_edge_in_AE.
-split; auto.
-rewrite H6. apply eq_refl.
-inversion H6.
-
-rewrite MEdgeFacts.fold_left_assoc.
-set (tmp := fold_left f' l EdgeSet.empty) in *.
-unfold f'. unfold f.
-destruct (Vertex.eq_dec (fst_ext x) a).
-apply EdgeSet.add_1.
-apply eq_ordered_eq.
-rewrite (edge_eq b).
-constructor; simpl. split; intuition.
-rewrite H5. intuition.
-rewrite Hw. apply OptionN_as_OT.eq_refl.
-apply EdgeSet.add_2.
-apply IHl. intro. generalize (HH H6). intro H7.
-inversion H7; subst.
-elim (n0 H9).
-auto.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.add_add.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.Dec.F.add_m. apply eq_refl. auto.
-
-assert (eq b x) as Heq.
-unfold weak_eq in H2. destruct H2; destruct H2.
-apply eq_ordered_eq. constructor; simpl.
-inversion H2; auto.
-fold (get_weight b). fold (get_weight x).
-rewrite Hw.
-assert (get_weight x = Some N0).
-apply AE_weights with (g:=g).
-rewrite In_graph_aff_edge_in_AE.
-split; auto.
-rewrite H6. apply OptionN_as_OT.eq_refl.
-rewrite (edge_eq b). rewrite (edge_eq x).
-rewrite edge_comm. apply eq_ordered_eq. constructor; simpl.
-inversion H2; simpl in *; intuition.
-rewrite H6. rewrite H7. auto.
-rewrite H6. rewrite H7. auto.
-assert (get_weight x = Some N0).
-apply AE_weights with (g:=g).
-rewrite In_graph_aff_edge_in_AE.
-split; intuition.
-rewrite H6. rewrite Hw. apply OptionN_as_OT.eq_refl.
-left. split.
-rewrite Heq.
-rewrite (H0 x). split.
-exists N0. rewrite <-Heq. auto. auto.
-intro. elim (simple_graph (merge e g p q) (fst_ext b) (snd_ext b)).
-split.
-unfold Interfere in H5.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ None (sym_imap_merge_map e g q p))).
-rewrite edge_comm.
-destruct H5.
-generalize (AE_weights _ _ H5). simpl. congruence.
-assumption.
-apply (proj1 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap_merge_map e g q p))).
-rewrite edge_comm.
-cut (eq (fst_ext b, snd_ext b, Some N0) b). intro Heq2.
-rewrite Heq2.
-destruct H4.
-assumption.
-generalize (IE_weights _ _ H4). congruence.
-rewrite (edge_eq b). change_rewrite. rewrite Hw. apply eq_refl.
-
-(* second part !!! *)
-
-destruct H1.
-cut (get_weight b = Some N0). intro Hw.
-assert (eq b (fst_ext b, snd_ext b, Some N0)).
-rewrite (edge_eq b); change_rewrite.
-apply eq_ordered_eq. constructor; simpl.
-split; intuition.
-rewrite Hw. apply OptionN_as_OT.eq_refl.
-
-destruct H2.
-rewrite H3.
-rewrite In_graph_aff_edge_in_AE. split.
-exists N0; simpl; auto.
-cut (eq b (redirect (snd_ext e) (fst_ext e) b)). intro Hcut.
-rewrite <-H3. rewrite Hcut. rewrite (edge_eq _).
-cut (get_weight (redirect (snd_ext e) (fst_ext e) b) = Some N0). intro Hw'.
-cut (Prefere (fst_ext (redirect (snd_ext e) (fst_ext e) b))
- (snd_ext (redirect (snd_ext e) (fst_ext e) b))
- (merge e g p q)). intro.
-unfold Prefere in H4. destruct H4.
-assert (get_weight ((fst_ext (redirect (snd_ext e) (fst_ext e) b),
- snd_ext (redirect (snd_ext e) (fst_ext e) b), Some x)) = Some N0).
-apply (AE_weights) with (g:=merge e g p q).
-rewrite In_graph_aff_edge_in_AE. split.
-exists x. auto. auto.
-rewrite Hw'. rewrite <-H5. simpl. auto.
-destruct H2. apply merge_5.
-apply (proj1 (H0 _) H2).
-intro. elim H1.
-destruct (eq_charac _ _ H5). right; intuition. left; intuition.
-exists N0; simpl; auto.
-intro. unfold Interfere in H5.
-cut (eq (fst_ext (redirect (snd_ext e) (fst_ext e) b),
- snd_ext (redirect (snd_ext e) (fst_ext e) b),
- None)
- (fst_ext b, snd_ext b, None)). intro H6.
-rewrite H6 in H5.
-elim H4. unfold Interfere. assumption.
-unfold redirect; change_rewrite.
-destruct (OTFacts.eq_dec (fst_ext b) (snd_ext e)).
-elim H1. left. auto.
-destruct (OTFacts.eq_dec (snd_ext b) (snd_ext e)).
-elim H1. right. auto.
-apply eq_refl.
-rewrite <-Hcut. assumption.
-unfold redirect; change_rewrite.
-destruct (OTFacts.eq_dec (fst_ext b) (snd_ext e)).
-elim H1. left. auto.
-destruct (OTFacts.eq_dec (snd_ext b) (snd_ext e)).
-elim H1. right. auto.
-apply eq_refl.
-
-rewrite H3.
-apply (proj2 (edgemap_to_edgeset_charac _ _ _ (Some N0) (sym_pmap_merge_map e g q p))).
-set (f := (fun (y : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.add (fst_ext e, y, Some 0%N) s')) in *.
-set (s' := preference_adj (fst_ext e) (merge e g p q)) in *.
-rewrite VertexSet.fold_1 in H2.
-generalize VertexSet.elements_2. intro HH.
-generalize (HH s'). clear HH. intro HH.
-induction (VertexSet.elements s'). simpl in H2.
-elim (EdgeSet.empty_1 H2).
-set (f' := fun a e => f e a) in *.
-rewrite MEdgeFacts.fold_left_assoc in H2.
-set (tmp := fold_left f' l EdgeSet.empty) in *.
-unfold f' in H2. unfold f in H2.
-destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H2).
-fold (eq (fst_ext e, a, Some N0) b) in H4.
-rewrite (edge_eq b) in H4.
-destruct (eq_charac _ _ H4); change_rewrite.
-destruct H5.
-assert (VertexSet.In (snd_ext b) s').
-apply HH. left. intuition.
-unfold s' in H7.
-unfold adj_set. rewrite (MapFacts.find_o _ (Vertex.eq_sym H5)).
-assumption.
-destruct H5.
-assert (VertexSet.In (fst_ext b) s').
-apply HH. left. intuition.
-unfold s' in H7.
-unfold preference_adj in H7. unfold adj_set in H7. rewrite (MapFacts.find_o _ H5) in H7.
-apply (sym_pmap_merge_map e g q p). assumption.
-apply IHl.
-assumption.
-intros. apply HH. right. auto.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.add_add.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.Dec.F.add_m. apply eq_refl. auto.
-
-destruct H2.
-rewrite AE_weights with (g:=g). auto.
-rewrite (In_graph_aff_edge_in_AE). rewrite <-H0. intuition.
-set (f := (fun (y : VertexSet.elt) (s' : EdgeSet.t) =>
- EdgeSet.add (fst_ext e, y, Some 0%N) s')) in *.
-set (s' := (preference_adj (fst_ext e) (merge e g p q))) in *.
-rewrite VertexSet.fold_1 in H2.
-set (f' := fun a e => f e a) in *.
-induction (VertexSet.elements s'). simpl in H2.
-elim (EdgeSet.empty_1 H2).
-rewrite MEdgeFacts.fold_left_assoc in H2.
-set (tmp := fold_left f' l EdgeSet.empty) in *.
-unfold f' in H2. unfold f in H2.
-destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H2).
-fold (eq (fst_ext e, a, Some N0) b) in H3. rewrite <-H3.
-auto.
-apply IHl. assumption.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.add_add.
-
-unfold f'. unfold f. intros.
-apply RegRegProps.Dec.F.add_m. apply eq_refl. auto.
-Qed.
-
-Lemma AE_merge_wl_aux : forall e g s p q,
-(forall a, EdgeSet.In a s <-> aff_edge a /\ In_graph_edge a g) ->
-(EdgeSet.Equal (AE_merge_up (preference_adj (fst_ext e) (merge e g p q))
- (preference_adj (fst_ext e) g)
- (preference_adj (snd_ext e) g)
- e s)
- (AE (merge e g p q))).
-
-Proof.
-intros.
-unfold EdgeSet.Equal. intro. rewrite (AE_aux_2 e g s p q H).
- rewrite (AE_aux_3 e g s p q H).
-reflexivity.
-Qed.
-
-Lemma AE_merge_wl : forall e g s p q,
-(forall a, EdgeSet.In a s <-> aff_edge a /\ In_graph_edge a g) ->
-(forall b, EdgeSet.In b (AE_merge_up (preference_adj (fst_ext e) (merge e g p q))
- (preference_adj (fst_ext e) g)
- (preference_adj (snd_ext e) g)
- e s)
- <->
- aff_edge b /\ In_graph_edge b (merge e g p q)).
-
-Proof.
-intros.
-rewrite <-(In_graph_aff_edge_in_AE).
-apply AE_merge_wl_aux; assumption.
-Qed.
-
-(* It implements the interface *)
-
-(* Specification of the interference neighborhood *)
-Lemma in_interf : forall x y g,
-VertexSet.In x (interference_adj y g) <-> In_graph_edge (x,y,None) g.
-
-Proof.
-split; intros.
-apply in_interf_interf. auto.
-apply interf_in_interf. auto.
-Qed.
-
-(* Specification of the preference neighborhood *)
-Lemma in_pref : forall x y g,
-VertexSet.In x (preference_adj y g) <-> exists w, In_graph_edge (x,y,Some w) g.
-
-Proof.
-split; intros.
-apply in_pref_pref. auto.
-destruct H. apply pref_in_pref with (w:=x0). auto.
-Qed. \ No newline at end of file