aboutsummaryrefslogtreecommitdiffstats
path: root/backend/Graph_translation.v
diff options
context:
space:
mode:
Diffstat (limited to 'backend/Graph_translation.v')
-rw-r--r--backend/Graph_translation.v3552
1 files changed, 3552 insertions, 0 deletions
diff --git a/backend/Graph_translation.v b/backend/Graph_translation.v
new file mode 100644
index 00000000..fb8f6c22
--- /dev/null
+++ b/backend/Graph_translation.v
@@ -0,0 +1,3552 @@
+Require Import InterfGraph.
+Require Import InterfGraphMapImp.
+Require Import MyRegisters.
+Require Import RTLtyping.
+Require Import NArith.
+Require Import List.
+Require Import InterfGraph_Construction.
+Require Import Edges.
+Require Import EqualSetMap.
+
+Import Edge.
+
+Definition new_graph := tt.
+
+Section Translation.
+
+Variable g : graph.
+Variable interfgraph_vertices : VertexSet.t.
+
+Definition IE_reg_reg :=
+SetRegReg.fold (fun e s => EdgeSet.add (Regs.reg_to_Reg (fst e), Regs.reg_to_Reg (snd e), None) s)
+ (interf_reg_reg g) EdgeSet.empty.
+
+Definition IE_reg_mreg :=
+SetRegMreg.fold (fun e s => EdgeSet.add (Regs.reg_to_Reg (fst e), Regs.mreg_to_Reg (snd e), None) s)
+ (interf_reg_mreg g) EdgeSet.empty.
+
+Definition AE_reg_reg :=
+SetRegReg.fold (fun e s => EdgeSet.add (Regs.reg_to_Reg (fst e), Regs.reg_to_Reg (snd e), Some N0) s)
+ (pref_reg_reg g) EdgeSet.empty.
+
+Definition AE_reg_mreg :=
+SetRegMreg.fold (fun e s => EdgeSet.add (Regs.reg_to_Reg (fst e), Regs.mreg_to_Reg (snd e), Some N0) s)
+ (pref_reg_mreg g) EdgeSet.empty.
+
+Definition interfgraph_interference_edges := EdgeSet.union IE_reg_reg IE_reg_mreg.
+
+Definition resolve_conflicts s1 s2 :=
+EdgeSet.fold (fun e s => if EdgeSet.mem (fst_ext e, snd_ext e,None) s2
+ then s else EdgeSet.add e s) s1 EdgeSet.empty.
+
+Definition interfgraph_affinity_edges :=
+resolve_conflicts
+(EdgeSet.union AE_reg_reg AE_reg_mreg)
+interfgraph_interference_edges.
+
+Hypothesis extremities_interf_graph :
+forall e, EdgeSet.In e interfgraph_affinity_edges \/
+ EdgeSet.In e interfgraph_interference_edges ->
+ VertexSet.In (fst_ext e) interfgraph_vertices /\
+ VertexSet.In (snd_ext e) interfgraph_vertices.
+
+Definition new_adj_set x y m :=
+match (VertexMap.find x m) with
+ | None => VertexSet.singleton y
+ | Some s => VertexSet.add y s
+end.
+
+Definition empty_map :=
+VertexSet.fold
+ (fun x m => VertexMap.add x VertexSet.empty m)
+ interfgraph_vertices
+ (VertexMap.empty VertexSet.t).
+
+Definition set2map s map :=
+EdgeSet.fold (fun e m => VertexMap.add (fst_ext e) (new_adj_set (fst_ext e) (snd_ext e) m)
+ (VertexMap.add (snd_ext e) (new_adj_set (snd_ext e) (fst_ext e) m) m))
+ s map.
+
+Definition interf_map := set2map interfgraph_interference_edges empty_map.
+Definition pref_map := set2map interfgraph_affinity_edges empty_map.
+
+Lemma add_simpl : forall l a s s2,
+EdgeSet.Equal
+ (fold_left
+ (fun (a0 : EdgeSet.t) (e0 : EdgeSet.elt) =>
+ if EdgeSet.mem (fst_ext e0, snd_ext e0, None) s2
+ then a0
+ else EdgeSet.add e0 a0) l (EdgeSet.add a s))
+(EdgeSet.add a
+(fold_left
+ (fun (a0 : EdgeSet.t) (e0 : EdgeSet.elt) =>
+ if EdgeSet.mem (fst_ext e0, snd_ext e0, None) s2
+ then a0
+ else EdgeSet.add e0 a0) l s)).
+
+Proof.
+induction l;simpl;intros.
+intuition.
+case_eq (EdgeSet.mem (fst_ext a,snd_ext a,None) s2);intro H.
+apply IHl.
+do 3 rewrite IHl.
+apply RegRegProps.add_add.
+Qed.
+
+
+Lemma resolve_conflicts_2 : forall e s1 s2,
+EdgeSet.In e (resolve_conflicts s1 s2) ->
+EdgeSet.In e s1 /\ ~EdgeSet.In (fst_ext e,snd_ext e, None) s2.
+
+Proof.
+intros e s1 s2 H.
+unfold resolve_conflicts in H.
+rewrite EdgeSet.fold_1 in H.
+split.
+generalize (EdgeSet.elements_2);intro H0;generalize (H0 s1);clear H0;intro H0.
+induction (EdgeSet.elements s1);simpl in *.
+elim (EdgeSet.empty_1 H).
+destruct (eq_dec a e).
+apply H0.
+fold (eq a e) in e0.
+generalize (Edge.eq_sym e0);clear e0;intro e0.
+intuition.
+case_eq (EdgeSet.mem (fst_ext a, snd_ext a,None) s2);intro H1;rewrite H1 in H.
+apply IHl.
+apply H.
+intuition.
+apply IHl.
+
+rewrite add_simpl in H.
+apply (EdgeSet.add_3 n H).
+intuition.
+induction (EdgeSet.elements s1);simpl in *.
+elim (EdgeSet.empty_1 H).
+case_eq (EdgeSet.mem (fst_ext a,snd_ext a,None) s2);intro H0;rewrite H0 in H.
+apply IHl;assumption.
+destruct (eq_dec a e).
+intro H1.
+destruct (eq_charac _ _ e0).
+destruct H2 as [H2 HH2].
+assert (eq (fst_ext a,snd_ext a,None) (fst_ext e,snd_ext e,None)) by Eq_eq.
+rewrite (RegRegProps.Dec.F.mem_b s2 H3) in H0.
+generalize (EdgeSet.mem_1 H1);clear H1;intro H1.
+rewrite H0 in H1;inversion H1.
+destruct H2 as [H2 HH2].
+assert (eq (fst_ext a,snd_ext a,None) (fst_ext e,snd_ext e,None)) by Eq_comm_eq.
+rewrite (RegRegProps.Dec.F.mem_b s2 H3) in H0.
+generalize (EdgeSet.mem_1 H1);clear H1;intro H1.
+rewrite H0 in H1;inversion H1.
+apply IHl.
+rewrite add_simpl in H.
+apply (EdgeSet.add_3 n H).
+Qed.
+
+(*
+intros g e H.
+unfold interfgraph_vertices.
+destruct H.
+unfold interfgraph_affinity_edges in H.
+generalize (proj1 (resolve_conflicts_2 _ _ _ H)). clear H. intro H.
+destruct (EdgeSet.union_1 H).
+cut (VertexSet.In (fst_ext e) (V_pref_reg_reg g) /\
+ VertexSet.In (snd_ext e) (V_pref_reg_reg g)).
+intro H1. destruct H1 as [H1 H2]. split;
+(do 2 apply VertexSet.union_3;
+apply VertexSet.union_2; assumption).
+unfold V_pref_reg_reg.
+unfold AE_reg_reg in H0.
+rewrite SetRegReg.fold_1 in *.
+induction (SetRegReg.elements (pref_reg_reg g)).
+simpl in H0. elim (EdgeSet.empty_1 H0).
+rewrite MEdgeFacts.fold_left_assoc in H0.
+destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H0).
+fold (eq (Regs.reg_to_Reg (fst a), Regs.reg_to_Reg (snd a), Some N0) e) in H1.
+rewrite RegFacts.fold_left_assoc.
+destruct (eq_charac _ _ H1); destruct H2 as [H2 H3].
+change_rewrite. split.
+apply VertexSet.add_1. assumption.
+apply VertexSet.add_2. apply VertexSet.add_1. assumption.
+change_rewrite. split.
+apply VertexSet.add_2. apply VertexSet.add_1. assumption.
+apply VertexSet.add_1. assumption.
+intros y z s.
+rewrite (Props.add_add (VertexSet.add (Regs.reg_to_Reg (snd y)) s)
+ (Regs.reg_to_Reg (snd z))
+ (Regs.reg_to_Reg (fst y))).
+rewrite (Props.add_add s
+ (Regs.reg_to_Reg (snd z))
+ (Regs.reg_to_Reg (snd y))).
+set (s' := VertexSet.add (Regs.reg_to_Reg (snd z) ) s).
+rewrite (Props.add_add s'
+ (Regs.reg_to_Reg (snd y))
+ (Regs.reg_to_Reg (fst z))).
+apply Props.add_add.
+intros. apply Props.Dec.F.add_m.
+apply Regs.eq_refl.
+apply Props.Dec.F.add_m;[apply Regs.eq_refl|assumption].
+rewrite RegFacts.fold_left_assoc.
+split; do 2 apply VertexSet.add_2.
+apply (proj1 (IHl H1)).
+apply (proj2 (IHl H1)).
+intros y z s.
+rewrite (Props.add_add (VertexSet.add (Regs.reg_to_Reg (snd y)) s)
+ (Regs.reg_to_Reg (snd z))
+ (Regs.reg_to_Reg (fst y))).
+rewrite (Props.add_add s
+ (Regs.reg_to_Reg (snd z))
+ (Regs.reg_to_Reg (snd y))).
+set (s' := VertexSet.add (Regs.reg_to_Reg (snd z) ) s).
+rewrite (Props.add_add s'
+ (Regs.reg_to_Reg (snd y))
+ (Regs.reg_to_Reg (fst z))).
+apply Props.add_add.
+intros. apply Props.Dec.F.add_m.
+apply Regs.eq_refl.
+apply Props.Dec.F.add_m;[apply Regs.eq_refl|assumption].
+intros;apply RegRegProps.add_add.
+intros;apply RegRegProps.Dec.F.add_m;[apply eq_refl|assumption].
+
+cut (VertexSet.In (fst_ext e) (V_pref_reg_mreg g) /\
+ VertexSet.In (snd_ext e) (V_pref_reg_mreg g)).
+intro H1. destruct H1 as [H1 H2]. split;
+(do 3 apply VertexSet.union_3; assumption).
+unfold V_pref_reg_mreg.
+unfold AE_reg_mreg in H0.
+rewrite SetRegMreg.fold_1 in *.
+induction (SetRegMreg.elements (pref_reg_mreg g)).
+simpl in H0. elim (EdgeSet.empty_1 H0).
+rewrite MEdgeFacts.fold_left_assoc in H0.
+destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H0).
+fold (eq (Regs.reg_to_Reg (fst a), Regs.mreg_to_Reg (snd a), Some N0) e) in H1.
+rewrite RegFacts.fold_left_assoc.
+destruct (eq_charac _ _ H1); destruct H2 as [H2 H3].
+change_rewrite. split.
+apply VertexSet.add_1. assumption.
+apply VertexSet.add_2. apply VertexSet.add_1. assumption.
+change_rewrite. split.
+apply VertexSet.add_2. apply VertexSet.add_1. assumption.
+apply VertexSet.add_1. assumption.
+intros y z s.
+rewrite (Props.add_add (VertexSet.add (Regs.mreg_to_Reg (snd y)) s)
+ (Regs.mreg_to_Reg (snd z))
+ (Regs.reg_to_Reg (fst y))).
+rewrite (Props.add_add s
+ (Regs.mreg_to_Reg (snd z))
+ (Regs.mreg_to_Reg (snd y))).
+set (s' := VertexSet.add (Regs.mreg_to_Reg (snd z) ) s).
+rewrite (Props.add_add s'
+ (Regs.mreg_to_Reg (snd y))
+ (Regs.reg_to_Reg (fst z))).
+apply Props.add_add.
+intros. apply Props.Dec.F.add_m.
+apply Regs.eq_refl.
+apply Props.Dec.F.add_m;[apply Regs.eq_refl|assumption].
+rewrite RegFacts.fold_left_assoc.
+split; do 2 apply VertexSet.add_2.
+apply (proj1 (IHl H1)).
+apply (proj2 (IHl H1)).
+intros y z s.
+rewrite (Props.add_add (VertexSet.add (Regs.mreg_to_Reg (snd y)) s)
+ (Regs.mreg_to_Reg (snd z))
+ (Regs.reg_to_Reg (fst y))).
+rewrite (Props.add_add s
+ (Regs.mreg_to_Reg (snd z))
+ (Regs.mreg_to_Reg (snd y))).
+set (s' := VertexSet.add (Regs.mreg_to_Reg (snd z) ) s).
+rewrite (Props.add_add s'
+ (Regs.mreg_to_Reg (snd y))
+ (Regs.reg_to_Reg (fst z))).
+apply Props.add_add.
+intros. apply Props.Dec.F.add_m.
+apply Regs.eq_refl.
+apply Props.Dec.F.add_m;[apply Regs.eq_refl|assumption].
+intros;apply RegRegProps.add_add.
+intros;apply RegRegProps.Dec.F.add_m;[apply eq_refl|assumption].
+
+unfold interfgraph_interference_edges in H.
+destruct (EdgeSet.union_1 H).
+cut (VertexSet.In (fst_ext e) (V_interf_reg_reg g) /\
+ VertexSet.In (snd_ext e) (V_interf_reg_reg g)).
+intro H1. destruct H1 as [H1 H2]. split;
+(apply VertexSet.union_2; assumption).
+unfold V_interf_reg_reg.
+unfold IE_reg_reg in H0.
+rewrite SetRegReg.fold_1 in *.
+induction (SetRegReg.elements (interf_reg_reg g)).
+simpl in H0. elim (EdgeSet.empty_1 H0).
+rewrite MEdgeFacts.fold_left_assoc in H0.
+destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H0).
+fold (eq (Regs.reg_to_Reg (fst a), Regs.reg_to_Reg (snd a), Some N0) e) in H1.
+rewrite RegFacts.fold_left_assoc.
+destruct (eq_charac _ _ H1); destruct H2 as [H2 H3].
+change_rewrite. split.
+apply VertexSet.add_1. assumption.
+apply VertexSet.add_2. apply VertexSet.add_1. assumption.
+change_rewrite. split.
+apply VertexSet.add_2. apply VertexSet.add_1. assumption.
+apply VertexSet.add_1. assumption.
+intros y z s.
+rewrite (Props.add_add (VertexSet.add (Regs.reg_to_Reg (snd y)) s)
+ (Regs.reg_to_Reg (snd z))
+ (Regs.reg_to_Reg (fst y))).
+rewrite (Props.add_add s
+ (Regs.reg_to_Reg (snd z))
+ (Regs.reg_to_Reg (snd y))).
+set (s' := VertexSet.add (Regs.reg_to_Reg (snd z) ) s).
+rewrite (Props.add_add s'
+ (Regs.reg_to_Reg (snd y))
+ (Regs.reg_to_Reg (fst z))).
+apply Props.add_add.
+intros. apply Props.Dec.F.add_m.
+apply Regs.eq_refl.
+apply Props.Dec.F.add_m;[apply Regs.eq_refl|assumption].
+rewrite RegFacts.fold_left_assoc.
+split; do 2 apply VertexSet.add_2.
+apply (proj1 (IHl H1)).
+apply (proj2 (IHl H1)).
+intros y z s.
+rewrite (Props.add_add (VertexSet.add (Regs.reg_to_Reg (snd y)) s)
+ (Regs.reg_to_Reg (snd z))
+ (Regs.reg_to_Reg (fst y))).
+rewrite (Props.add_add s
+ (Regs.reg_to_Reg (snd z))
+ (Regs.reg_to_Reg (snd y))).
+set (s' := VertexSet.add (Regs.reg_to_Reg (snd z) ) s).
+rewrite (Props.add_add s'
+ (Regs.reg_to_Reg (snd y))
+ (Regs.reg_to_Reg (fst z))).
+apply Props.add_add.
+intros. apply Props.Dec.F.add_m.
+apply Regs.eq_refl.
+apply Props.Dec.F.add_m;[apply Regs.eq_refl|assumption].
+intros;apply RegRegProps.add_add.
+intros;apply RegRegProps.Dec.F.add_m;[apply eq_refl|assumption].
+
+cut (VertexSet.In (fst_ext e) (V_interf_reg_mreg g) /\
+ VertexSet.In (snd_ext e) (V_interf_reg_mreg g)).
+intro H1. destruct H1 as [H1 H2]. split;
+(apply VertexSet.union_3; apply VertexSet.union_2; assumption).
+unfold V_interf_reg_mreg.
+unfold IE_reg_mreg in H0.
+rewrite SetRegMreg.fold_1 in *.
+induction (SetRegMreg.elements (interf_reg_mreg g)).
+simpl in H0. elim (EdgeSet.empty_1 H0).
+rewrite MEdgeFacts.fold_left_assoc in H0.
+destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H0).
+fold (eq (Regs.reg_to_Reg (fst a), Regs.mreg_to_Reg (snd a), Some N0) e) in H1.
+rewrite RegFacts.fold_left_assoc.
+destruct (eq_charac _ _ H1); destruct H2 as [H2 H3].
+change_rewrite. split.
+apply VertexSet.add_1. assumption.
+apply VertexSet.add_2. apply VertexSet.add_1. assumption.
+change_rewrite. split.
+apply VertexSet.add_2. apply VertexSet.add_1. assumption.
+apply VertexSet.add_1. assumption.
+intros y z s.
+rewrite (Props.add_add (VertexSet.add (Regs.mreg_to_Reg (snd y)) s)
+ (Regs.mreg_to_Reg (snd z))
+ (Regs.reg_to_Reg (fst y))).
+rewrite (Props.add_add s
+ (Regs.mreg_to_Reg (snd z))
+ (Regs.mreg_to_Reg (snd y))).
+set (s' := VertexSet.add (Regs.mreg_to_Reg (snd z) ) s).
+rewrite (Props.add_add s'
+ (Regs.mreg_to_Reg (snd y))
+ (Regs.reg_to_Reg (fst z))).
+apply Props.add_add.
+intros. apply Props.Dec.F.add_m.
+apply Regs.eq_refl.
+apply Props.Dec.F.add_m;[apply Regs.eq_refl|assumption].
+rewrite RegFacts.fold_left_assoc.
+split; do 2 apply VertexSet.add_2.
+apply (proj1 (IHl H1)).
+apply (proj2 (IHl H1)).
+intros y z s.
+rewrite (Props.add_add (VertexSet.add (Regs.mreg_to_Reg (snd y)) s)
+ (Regs.mreg_to_Reg (snd z))
+ (Regs.reg_to_Reg (fst y))).
+rewrite (Props.add_add s
+ (Regs.mreg_to_Reg (snd z))
+ (Regs.mreg_to_Reg (snd y))).
+set (s' := VertexSet.add (Regs.mreg_to_Reg (snd z) ) s).
+rewrite (Props.add_add s'
+ (Regs.mreg_to_Reg (snd y))
+ (Regs.reg_to_Reg (fst z))).
+apply Props.add_add.
+intros. apply Props.Dec.F.add_m.
+apply Regs.eq_refl.
+apply Props.Dec.F.add_m;[apply Regs.eq_refl|assumption].
+intros;apply RegRegProps.add_add.
+intros;apply RegRegProps.Dec.F.add_m;[apply eq_refl|assumption].
+Qed.
+*)
+
+Lemma vertices_empty_map : forall x,
+VertexMap.In x empty_map <->
+VertexSet.In x interfgraph_vertices.
+
+Proof.
+unfold empty_map. split; intros.
+set (f := (fun (x : VertexSet.elt) (m : VertexMap.t VertexSet.t) =>
+ VertexMap.add x VertexSet.empty m)) in *.
+rewrite VertexSet.fold_1 in *.
+set (f' := fun a e => f e a) in *.
+generalize VertexSet.elements_2. intro HH.
+generalize (HH interfgraph_vertices). clear HH. intro HH.
+induction (VertexSet.elements interfgraph_vertices). simpl in H.
+rewrite MapFacts.empty_in_iff in H. inversion H.
+cut (EqualSetMap (fold_left f' (a :: l) (VertexMap.empty VertexSet.t))
+ (f' (fold_left f' l (VertexMap.empty VertexSet.t)) a)). intro.
+generalize (H0 x). clear H0. intro H0. inversion H0. subst.
+simpl in H. rewrite MapFacts.in_find_iff in H. rewrite <-H2 in H.
+elim H. auto.
+set (tmp := fold_left f' l (VertexMap.empty VertexSet.t)) in *.
+unfold f', f in H2.
+destruct (Vertex.eq_dec x a).
+rewrite e. apply HH. left. apply Regs.eq_refl.
+apply IHl.
+rewrite MapFacts.add_neq_o in H2.
+rewrite MapFacts.in_find_iff. rewrite <-H2. congruence.
+auto.
+
+intros. apply HH. right. auto.
+
+apply fold_left_assoc_map.
+intros.
+unfold f'. unfold f.
+unfold EqualSetMap. intro.
+destruct (Vertex.eq_dec x0 z).
+rewrite MapFacts.add_eq_o.
+destruct (Vertex.eq_dec x0 y).
+rewrite MapFacts.add_eq_o.
+constructor. 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.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Regs.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 s).
+constructor. apply VertexSet.eq_refl.
+constructor.
+auto.
+auto.
+auto.
+auto.
+
+unfold EqualSetMap. intros.
+unfold f', 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.
+auto.
+auto.
+auto.
+
+set (f := (fun (x : VertexSet.elt) (m : VertexMap.t VertexSet.t) =>
+ VertexMap.add x VertexSet.empty m)) in *.
+rewrite VertexSet.fold_1.
+set (f' := fun a e => f e a) in *.
+generalize VertexSet.elements_1. intro HH.
+generalize (HH _ _ H). clear HH. intro HH.
+induction (VertexSet.elements interfgraph_vertices).
+inversion HH.
+cut (EqualSetMap (fold_left f' (a :: l) (VertexMap.empty VertexSet.t))
+ (f' (fold_left f' l (VertexMap.empty VertexSet.t)) a)). intro.
+generalize (H0 x). clear H0. intro H0. inversion H0. subst.
+set (tmp := fold_left f' l (VertexMap.empty VertexSet.t)) in *.
+unfold f', f in H3.
+destruct (Vertex.eq_dec x a).
+simpl. rewrite MapFacts.in_find_iff.
+rewrite MapFacts.add_eq_o in H3. congruence.
+apply Regs.eq_sym. auto.
+inversion HH; subst.
+elim (n H4).
+rewrite MapFacts.add_neq_o in H3.
+rewrite MapFacts.in_find_iff in IHl. rewrite <-H3 in IHl.
+elim (IHl H4 (refl_equal _)).
+auto.
+simpl. rewrite MapFacts.in_find_iff. rewrite <-H1. congruence.
+
+apply fold_left_assoc_map.
+intros.
+unfold f'. unfold f.
+unfold EqualSetMap. intro.
+destruct (Vertex.eq_dec x0 z).
+rewrite MapFacts.add_eq_o.
+destruct (Vertex.eq_dec x0 y).
+rewrite MapFacts.add_eq_o.
+constructor. 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.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Regs.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 s).
+constructor. apply VertexSet.eq_refl.
+constructor.
+auto.
+auto.
+auto.
+auto.
+
+unfold EqualSetMap. intros.
+unfold f', 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.
+auto.
+auto.
+auto.
+Qed.
+
+
+Lemma extremities_imap : forall x,
+VertexMap.In x interf_map <->
+VertexSet.In x interfgraph_vertices.
+
+Proof.
+split; intros.
+unfold interf_map in H.
+unfold set2map in H.
+set (f := (fun (e : EdgeSet.elt) (m : VertexMap.t VertexSet.t) =>
+ VertexMap.add (fst_ext e) (new_adj_set (fst_ext e) (snd_ext e) m)
+ (VertexMap.add (snd_ext e)
+ (new_adj_set (snd_ext e) (fst_ext e) m) m))) in *.
+rewrite EdgeSet.fold_1 in H.
+set (f' := fun a e => f e a) in *.
+cut (forall e, EdgeSet.In e interfgraph_interference_edges ->
+ VertexSet.In (fst_ext e) interfgraph_vertices
+ /\ VertexSet.In (snd_ext e) interfgraph_vertices). intro.
+
+generalize EdgeSet.elements_2. intro HH.
+generalize (HH interfgraph_interference_edges). clear HH. intro HH.
+
+induction (EdgeSet.elements interfgraph_interference_edges). simpl in H.
+apply (proj1 (vertices_empty_map x)). auto.
+
+cut (EqualSetMap (fold_left f' (a :: l) empty_map)
+ (f' (fold_left f' l empty_map ) a)). intro.
+generalize (H1 x). clear H1. intro H1. inversion H1. subst.
+simpl in H. rewrite MapFacts.in_find_iff in H. rewrite <-H3 in H.
+elim H. auto.
+
+set (tmp := fold_left f' l empty_map) in *.
+unfold f' in H3. unfold f in H3.
+destruct (Vertex.eq_dec x (fst_ext a)).
+rewrite e. apply (H0 a).
+apply HH. left. apply E.eq_refl.
+destruct (Regs.eq_dec x (snd_ext a)).
+rewrite e. apply (H0 a).
+apply HH. left. apply E.eq_refl.
+apply IHl.
+do 2 rewrite MapFacts.add_neq_o in H3.
+rewrite MapFacts.in_find_iff. rewrite <-H3. congruence.
+auto.
+auto.
+auto.
+
+intros. apply HH. right. auto.
+
+apply fold_left_assoc_map.
+intros.
+unfold f'. unfold f.
+unfold EqualSetMap. intro.
+destruct (Vertex.eq_dec x0 (fst_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+intro. elim n. rewrite e. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite e. auto.
+intro. elim n. rewrite e. auto.
+apply (Regs.eq_sym e).
+intro. elim n0. auto.
+intro. elim n. auto.
+apply (Regs.eq_sym e).
+rewrite MapFacts.add_neq_o.
+destruct (Regs.eq_dec x0 (snd_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Regs.eq_dec x0 (fst_ext y)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n0. rewrite H1. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n1. rewrite H1. auto.
+intro. elim n0. rewrite H1. auto.
+apply Regs.eq_sym. auto.
+auto.
+auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H1. auto.
+intro. elim n. rewrite H1. auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+constructor.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H1. auto.
+intro. elim n. rewrite H1. auto.
+apply Regs.eq_sym. auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+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.
+constructor.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+
+intros.
+unfold f'. unfold f. unfold EqualSetMap. intros.
+destruct (Regs.eq_dec x0 (fst_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H1 (fst_ext a0)). intro.
+inversion H2.
+apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m. apply Regs.eq_refl. auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Regs.eq_dec x0 (snd_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H1 (snd_ext a0)). intro.
+inversion H2.
+apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m. apply Regs.eq_refl. auto.
+apply Regs.eq_sym. auto.
+intro. elim n. rewrite H2. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+auto.
+intro. elim n0. rewrite H2. auto.
+intro. elim n. rewrite H2. auto.
+auto.
+auto.
+
+intros. apply extremities_interf_graph. right. auto.
+
+rewrite <-vertices_empty_map in H.
+unfold interf_map. unfold set2map.
+set (f := (fun (e : EdgeSet.elt) (m : VertexMap.t VertexSet.t) =>
+ VertexMap.add (fst_ext e) (new_adj_set (fst_ext e) (snd_ext e) m)
+ (VertexMap.add (snd_ext e) (new_adj_set (snd_ext e) (fst_ext e) m) m))) in *.
+rewrite EdgeSet.fold_1.
+set (f' := fun e a => f a e) in *.
+induction (EdgeSet.elements interfgraph_interference_edges). simpl. auto.
+cut (EqualSetMap (fold_left f' (a :: l) empty_map)
+ (f' (fold_left f' l empty_map) a)). intro.
+generalize (H0 x). clear H0. intro H0. inversion H0. subst.
+set (tmp := fold_left f' l empty_map) in *.
+unfold f' in H3. unfold f in H3.
+destruct (Vertex.eq_dec x (fst_ext a)).
+rewrite MapFacts.add_eq_o in H3. congruence.
+apply (Regs.eq_sym e).
+destruct (Vertex.eq_dec x (snd_ext a)).
+rewrite MapFacts.add_neq_o in H3.
+rewrite MapFacts.add_eq_o in H3.
+congruence.
+apply (Regs.eq_sym e).
+auto.
+rewrite MapFacts.add_neq_o in H3.
+rewrite MapFacts.add_neq_o in H3.
+rewrite MapFacts.in_find_iff in IHl. rewrite <-H3 in IHl.
+congruence.
+auto.
+auto.
+
+simpl. rewrite MapFacts.in_find_iff. rewrite <-H1. congruence.
+apply fold_left_assoc_map.
+intros.
+unfold f'. unfold f.
+unfold EqualSetMap. intro.
+destruct (Vertex.eq_dec x0 (fst_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+intro. elim n. rewrite e. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite e. auto.
+intro. elim n. rewrite e. auto.
+apply (Regs.eq_sym e).
+intro. elim n0. auto.
+intro. elim n. auto.
+apply (Regs.eq_sym e).
+rewrite MapFacts.add_neq_o.
+destruct (Regs.eq_dec x0 (snd_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Regs.eq_dec x0 (fst_ext y)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n0. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n1. rewrite H0. auto.
+intro. elim n0. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+auto.
+auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H0. auto.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+constructor.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H0. auto.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+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.
+constructor.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+
+intros.
+unfold f'. unfold f. unfold EqualSetMap. intros.
+destruct (Regs.eq_dec x0 (fst_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H0 (fst_ext a0)). intro.
+inversion H1.
+apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m. apply Regs.eq_refl. auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Regs.eq_dec x0 (snd_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H0 (snd_ext a0)). intro.
+inversion H1.
+apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m. apply Regs.eq_refl. auto.
+apply Regs.eq_sym. auto.
+intro. elim n. rewrite H1. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+auto.
+intro. elim n0. rewrite H1. auto.
+intro. elim n. rewrite H1. auto.
+auto.
+auto.
+Qed.
+
+Lemma extremities_pmap : forall x,
+VertexMap.In x pref_map <->
+VertexSet.In x interfgraph_vertices.
+
+Proof.
+split; intros.
+unfold pref_map in H.
+unfold set2map in H.
+set (f := (fun (e : EdgeSet.elt) (m : VertexMap.t VertexSet.t) =>
+ VertexMap.add (fst_ext e) (new_adj_set (fst_ext e) (snd_ext e) m)
+ (VertexMap.add (snd_ext e)
+ (new_adj_set (snd_ext e) (fst_ext e) m) m))) in *.
+rewrite EdgeSet.fold_1 in H.
+set (f' := fun a e => f e a) in *.
+cut (forall e, EdgeSet.In e interfgraph_affinity_edges ->
+ VertexSet.In (fst_ext e) interfgraph_vertices
+ /\ VertexSet.In (snd_ext e) interfgraph_vertices). intro.
+
+generalize EdgeSet.elements_2. intro HH.
+generalize (HH interfgraph_affinity_edges). clear HH. intro HH.
+
+induction (EdgeSet.elements interfgraph_affinity_edges). simpl in H.
+apply (proj1 (vertices_empty_map x)). auto.
+
+cut (EqualSetMap (fold_left f' (a :: l) empty_map)
+ (f' (fold_left f' l empty_map) a)). intro.
+generalize (H1 x). clear H1. intro H1. inversion H1. subst.
+simpl in H. rewrite MapFacts.in_find_iff in H. rewrite <-H3 in H.
+elim H. auto.
+
+set (tmp := fold_left f' l empty_map) in *.
+unfold f' in H3. unfold f in H3.
+destruct (Vertex.eq_dec x (fst_ext a)).
+rewrite e. apply (H0 a).
+apply HH. left. apply E.eq_refl.
+destruct (Regs.eq_dec x (snd_ext a)).
+rewrite e. apply (H0 a).
+apply HH. left. apply E.eq_refl.
+apply IHl.
+do 2 rewrite MapFacts.add_neq_o in H3.
+rewrite MapFacts.in_find_iff. rewrite <-H3. congruence.
+auto.
+auto.
+auto.
+
+intros. apply HH. right. auto.
+
+apply fold_left_assoc_map.
+intros.
+unfold f'. unfold f.
+unfold EqualSetMap. intro.
+destruct (Vertex.eq_dec x0 (fst_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+intro. elim n. rewrite e. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite e. auto.
+intro. elim n. rewrite e. auto.
+apply (Regs.eq_sym e).
+intro. elim n0. auto.
+intro. elim n. auto.
+apply (Regs.eq_sym e).
+rewrite MapFacts.add_neq_o.
+destruct (Regs.eq_dec x0 (snd_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Regs.eq_dec x0 (fst_ext y)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n0. rewrite H1. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n1. rewrite H1. auto.
+intro. elim n0. rewrite H1. auto.
+apply Regs.eq_sym. auto.
+auto.
+auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H1. auto.
+intro. elim n. rewrite H1. auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+constructor.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H1. auto.
+intro. elim n. rewrite H1. auto.
+apply Regs.eq_sym. auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+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.
+constructor.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+
+intros.
+unfold f'. unfold f. unfold EqualSetMap. intros.
+destruct (Regs.eq_dec x0 (fst_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H1 (fst_ext a0)). intro.
+inversion H2.
+apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m. apply Regs.eq_refl. auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Regs.eq_dec x0 (snd_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H1 (snd_ext a0)). intro.
+inversion H2.
+apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m. apply Regs.eq_refl. auto.
+apply Regs.eq_sym. auto.
+intro. elim n. rewrite H2. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+auto.
+intro. elim n0. rewrite H2. auto.
+intro. elim n. rewrite H2. auto.
+auto.
+auto.
+
+intros. apply extremities_interf_graph. left. auto.
+
+rewrite <-vertices_empty_map in H.
+unfold pref_map. unfold set2map.
+set (f := (fun (e : EdgeSet.elt) (m : VertexMap.t VertexSet.t) =>
+ VertexMap.add (fst_ext e) (new_adj_set (fst_ext e) (snd_ext e) m)
+ (VertexMap.add (snd_ext e) (new_adj_set (snd_ext e) (fst_ext e) m) m))) in *.
+rewrite EdgeSet.fold_1.
+set (f' := fun e a => f a e) in *.
+induction (EdgeSet.elements interfgraph_affinity_edges). simpl. auto.
+cut (EqualSetMap (fold_left f' (a :: l) empty_map)
+ (f' (fold_left f' l empty_map) a)). intro.
+generalize (H0 x). clear H0. intro H0. inversion H0. subst.
+set (tmp := fold_left f' l empty_map) in *.
+unfold f' in H3. unfold f in H3.
+destruct (Vertex.eq_dec x (fst_ext a)).
+rewrite MapFacts.add_eq_o in H3. congruence.
+apply (Regs.eq_sym e).
+destruct (Vertex.eq_dec x (snd_ext a)).
+rewrite MapFacts.add_neq_o in H3.
+rewrite MapFacts.add_eq_o in H3.
+congruence.
+apply (Regs.eq_sym e).
+auto.
+rewrite MapFacts.add_neq_o in H3.
+rewrite MapFacts.add_neq_o in H3.
+rewrite MapFacts.in_find_iff in IHl. rewrite <-H3 in IHl.
+congruence.
+auto.
+auto.
+
+simpl. rewrite MapFacts.in_find_iff. rewrite <-H1. congruence.
+apply fold_left_assoc_map.
+intros.
+unfold f'. unfold f.
+unfold EqualSetMap. intro.
+destruct (Vertex.eq_dec x0 (fst_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+intro. elim n. rewrite e. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite e. auto.
+intro. elim n. rewrite e. auto.
+apply (Regs.eq_sym e).
+intro. elim n0. auto.
+intro. elim n. auto.
+apply (Regs.eq_sym e).
+rewrite MapFacts.add_neq_o.
+destruct (Regs.eq_dec x0 (snd_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Regs.eq_dec x0 (fst_ext y)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n0. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n1. rewrite H0. auto.
+intro. elim n0. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+auto.
+auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H0. auto.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+constructor.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H0. auto.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+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.
+constructor.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+
+intros.
+unfold f'. unfold f. unfold EqualSetMap. intros.
+destruct (Regs.eq_dec x0 (fst_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H0 (fst_ext a0)). intro.
+inversion H1.
+apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m. apply Regs.eq_refl. auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Regs.eq_dec x0 (snd_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H0 (snd_ext a0)). intro.
+inversion H1.
+apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m. apply Regs.eq_refl. auto.
+apply Regs.eq_sym. auto.
+intro. elim n. rewrite H1. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+auto.
+intro. elim n0. rewrite H1. auto.
+intro. elim n. rewrite H1. auto.
+auto.
+auto.
+Qed.
+
+Lemma set2map_charac : forall x y s m,
+VertexSet.In x (adj_set y (set2map s m)) ->
+(exists w, EdgeSet.In (x,y,w) s) \/ VertexSet.In x (adj_set y m).
+
+Proof.
+intros.
+unfold set2map in H.
+set (f := (fun (e : EdgeSet.elt) (m : VertexMap.t VertexSet.t) =>
+ VertexMap.add (fst_ext e)
+ (new_adj_set (fst_ext e) (snd_ext e) m)
+ (VertexMap.add (snd_ext e)
+ (new_adj_set (snd_ext e) (fst_ext e) m) m))) in *.
+rewrite EdgeSet.fold_1 in H.
+set (f' := fun a e => f e a) in *.
+generalize EdgeSet.elements_2. intro HH.
+generalize (HH s). clear HH. intro HH.
+induction (EdgeSet.elements s). simpl in H. right. auto.
+cut (EqualSetMap (fold_left f' (a :: l) m)
+ (f' (fold_left f' l m) a)). intro.
+generalize (H0 y). clear H0. intro H0. inversion H0. subst.
+set (tmp := fold_left f' l m) in *.
+unfold f', f in H3.
+destruct (Vertex.eq_dec y (fst_ext a)).
+rewrite MapFacts.add_eq_o in H3.
+congruence.
+apply Regs.eq_sym. auto.
+destruct (Vertex.eq_dec y (snd_ext a)).
+rewrite MapFacts.add_neq_o in H3.
+rewrite MapFacts.add_eq_o in H3.
+congruence.
+apply Regs.eq_sym. auto.
+auto.
+rewrite MapFacts.add_neq_o in H3.
+rewrite MapFacts.add_neq_o in H3.
+simpl in H. unfold adj_set in H. rewrite <-H2 in H.
+elim (VertexSet.empty_1 H).
+auto.
+auto.
+simpl in H. unfold adj_set in H. rewrite <-H1 in H.
+rewrite H3 in H.
+set (tmp := fold_left f' l m) in *.
+unfold f', f in H2.
+destruct (Vertex.eq_dec y (fst_ext a)).
+rewrite MapFacts.add_eq_o in H2. inversion H2.
+rewrite H5 in H.
+unfold new_adj_set in H.
+case_eq (VertexMap.find (fst_ext a) tmp); intros.
+rewrite H4 in H.
+destruct (Regs.eq_dec (snd_ext a) x).
+left. exists (get_weight a).
+apply HH. left.
+fold (eq (x,y,get_weight a) a).
+rewrite edge_comm. Eq_eq.
+generalize (VertexSet.add_3 n H). intro.
+apply IHl.
+unfold adj_set. rewrite (MapFacts.find_o _ e).
+rewrite H4. auto.
+intros. apply HH. right. auto.
+rewrite H4 in H.
+left. exists (get_weight a).
+apply HH. left.
+fold (eq (x,y,get_weight a) a).
+rewrite edge_comm. Eq_eq.
+apply Regs.eq_sym. apply VertexSet.singleton_1. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o in H2.
+destruct (Vertex.eq_dec y (snd_ext a)).
+rewrite MapFacts.add_eq_o in H2.
+inversion H2. subst. clear H2.
+unfold new_adj_set in H.
+case_eq (VertexMap.find (snd_ext a) tmp); intros.
+rewrite H2 in H.
+destruct (Vertex.eq_dec (fst_ext a) x).
+left. exists (get_weight a).
+apply HH. left.
+fold (eq (x,y,get_weight a) a). Eq_eq.
+apply IHl.
+generalize (VertexSet.add_3 n0 H). intro.
+unfold new_adj_set in H3. rewrite H2 in H3.
+unfold adj_set. rewrite (MapFacts.find_o _ e). rewrite H2.
+auto.
+intros. apply HH. right. auto.
+rewrite H2 in H.
+left. exists (get_weight a).
+apply HH. left.
+fold (eq (x,y,get_weight a) a). Eq_eq.
+apply Regs.eq_sym. apply VertexSet.singleton_1. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o in H2.
+apply IHl.
+unfold adj_set. rewrite <-H2. auto.
+intros. apply HH. right. auto.
+auto.
+auto.
+
+apply fold_left_assoc_map.
+unfold f', f, EqualSetMap. intros.
+destruct (Vertex.eq_dec x0 (fst_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite <-(MapFacts.find_o _ e).
+rewrite <-(MapFacts.find_o _ e0).
+destruct (VertexMap.find x0 s0).
+apply Props.add_add.
+rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite <-(MapFacts.find_o _ e).
+rewrite <-(MapFacts.find_o _ e0).
+destruct (VertexMap.find x0 s0).
+apply Props.add_add.
+rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H0. auto.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite <-(MapFacts.find_o _ e).
+rewrite <-(MapFacts.find_o _ e0).
+destruct (VertexMap.find x0 s0). apply Props.add_add.
+rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n. rewrite H0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite <-(MapFacts.find_o _ e).
+rewrite <-(MapFacts.find_o _ e0).
+destruct (VertexMap.find x0 s0).
+apply Props.add_add.
+rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n. rewrite H0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n0. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n1. rewrite H0. auto.
+intro. elim n0. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+auto.
+auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H0. auto.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H0. auto.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+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.
+auto.
+auto.
+auto.
+auto.
+
+intros.
+unfold EqualSetMap, f', f. intros.
+destruct (Vertex.eq_dec x0 (fst_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H0 (fst_ext a0)). intro.
+inversion H1. apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m.
+apply Regs.eq_refl.
+auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H0 (snd_ext a0)). intro.
+inversion H1.
+apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m.
+apply Regs.eq_refl.
+auto.
+apply Regs.eq_sym. auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+auto.
+auto.
+auto.
+auto.
+auto.
+Qed.
+
+Lemma adj_set_empty : forall x,
+VertexSet.Equal (adj_set x empty_map) VertexSet.empty.
+
+Proof.
+intros.
+unfold empty_map.
+set (f := (fun (x0 : VertexSet.elt) (m : VertexMap.t VertexSet.t) =>
+ VertexMap.add x0 VertexSet.empty m)) in *.
+rewrite VertexSet.fold_1.
+set (f' := fun a e => f e a) in *.
+induction (VertexSet.elements interfgraph_vertices).
+simpl. unfold adj_set. simpl. reflexivity.
+cut (EqualSetMap (fold_left f' (a :: l) (VertexMap.empty VertexSet.t))
+ (f' (fold_left f' l (VertexMap.empty VertexSet.t)) a)). intro.
+generalize (H x). clear H. intro H. inversion H. subst.
+set (tmp := fold_left f' l (VertexMap.empty VertexSet.t)) in *.
+unfold f', f in H2.
+destruct (Regs.eq_dec x a). rewrite MapFacts.add_eq_o in H2. congruence.
+apply Regs.eq_sym. auto.
+simpl. unfold adj_set. rewrite <-H1. apply VertexSet.eq_refl.
+set (tmp := fold_left f' l (VertexMap.empty VertexSet.t)) in *.
+unfold f', f in H1.
+destruct (Regs.eq_dec x a). rewrite MapFacts.add_eq_o in H1.
+unfold adj_set. simpl. rewrite <-H0. inversion H1.
+rewrite H4 in H2. auto.
+apply Regs.eq_sym. auto.
+simpl. unfold adj_set. rewrite <-H0.
+rewrite MapFacts.add_neq_o in H1.
+unfold adj_set in IHl. rewrite <-H1 in IHl.
+rewrite H2. auto.
+auto.
+
+apply fold_left_assoc_map.
+intros.
+unfold f'. unfold f.
+unfold EqualSetMap. intro.
+destruct (Vertex.eq_dec x0 z).
+rewrite MapFacts.add_eq_o.
+destruct (Vertex.eq_dec x0 y).
+rewrite MapFacts.add_eq_o.
+constructor. 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.
+intro. elim n. rewrite H. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Regs.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 s).
+constructor. apply VertexSet.eq_refl.
+constructor.
+auto.
+auto.
+auto.
+auto.
+
+unfold EqualSetMap. intros.
+unfold f', 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.
+auto.
+auto.
+auto.
+Qed.
+
+Lemma affinity_weights_interf_graph :
+forall e, EdgeSet.In e interfgraph_affinity_edges ->
+get_weight e = Some N0.
+
+Proof.
+intros e H.
+unfold interfgraph_affinity_edges in H.
+generalize (proj1 (resolve_conflicts_2 _ _ _ H)). clear H. intro H.
+destruct (EdgeSet.union_1 H).
+unfold AE_reg_reg in H0.
+rewrite SetRegReg.fold_1 in H0.
+induction (SetRegReg.elements (pref_reg_reg g)).
+simpl in H0. elim (EdgeSet.empty_1 H0).
+rewrite MEdgeFacts.fold_left_assoc in H0.
+destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H0).
+fold (eq (Regs.reg_to_Reg (fst a), Regs.reg_to_Reg (snd a), Some N0) e) in H1.
+rewrite <-(get_weight_m _ _ H1). auto.
+apply IHl. assumption.
+intros;apply RegRegProps.add_add.
+intros;apply RegRegProps.Dec.F.add_m;[apply eq_refl|assumption].
+unfold AE_reg_mreg in H0.
+rewrite SetRegMreg.fold_1 in H0.
+induction (SetRegMreg.elements (pref_reg_mreg g)).
+simpl in H0. elim (EdgeSet.empty_1 H0).
+rewrite MEdgeFacts.fold_left_assoc in H0.
+destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H0).
+fold (eq (Regs.reg_to_Reg (fst a), Regs.mreg_to_Reg (snd a), Some N0) e) in H1.
+rewrite <-(get_weight_m _ _ H1). auto.
+apply IHl. assumption.
+intros;apply RegRegProps.add_add.
+intros;apply RegRegProps.Dec.F.add_m;[apply eq_refl|assumption].
+Qed.
+
+Lemma interference_weights_interf_graph :
+forall e, EdgeSet.In e interfgraph_interference_edges ->
+get_weight e = None.
+
+Proof.
+intros e H.
+unfold interfgraph_affinity_edges in H.
+destruct (EdgeSet.union_1 H).
+unfold IE_reg_reg in H0.
+rewrite SetRegReg.fold_1 in H0.
+induction (SetRegReg.elements (interf_reg_reg g)).
+simpl in H0. elim (EdgeSet.empty_1 H0).
+rewrite MEdgeFacts.fold_left_assoc in H0.
+destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H0).
+fold (eq (Regs.reg_to_Reg (fst a), Regs.reg_to_Reg (snd a), Some N0) e) in H1.
+rewrite <-(get_weight_m _ _ H1). auto.
+apply IHl. assumption.
+intros;apply RegRegProps.add_add.
+intros;apply RegRegProps.Dec.F.add_m;[apply eq_refl|assumption].
+unfold IE_reg_mreg in H0.
+rewrite SetRegMreg.fold_1 in H0.
+induction (SetRegMreg.elements (interf_reg_mreg g)).
+simpl in H0. elim (EdgeSet.empty_1 H0).
+rewrite MEdgeFacts.fold_left_assoc in H0.
+destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H0).
+fold (eq (Regs.reg_to_Reg (fst a), Regs.mreg_to_Reg (snd a), Some N0) e) in H1.
+rewrite <-(get_weight_m _ _ H1). auto.
+apply IHl. assumption.
+intros;apply RegRegProps.add_add.
+intros;apply RegRegProps.Dec.F.add_m;[apply eq_refl|assumption].
+Qed.
+
+Lemma simple_graph : forall x y,
+ VertexSet.In x (adj_set y interf_map ) /\
+ VertexSet.In x (adj_set y pref_map ) -> False.
+
+Proof.
+intros. destruct H.
+unfold interf_map in H.
+generalize (set2map_charac x y interfgraph_interference_edges empty_map H).
+clear H. intro H. destruct H. destruct H.
+unfold pref_map in H0.
+generalize (set2map_charac x y interfgraph_affinity_edges empty_map H0).
+clear H0. intro H0. destruct H0. destruct H0.
+generalize (resolve_conflicts_2 (x,y,x1) _ _ H0). intro.
+destruct H1. elim H2.
+change_rewrite.
+generalize (interference_weights_interf_graph (x,y,x0) H). simpl. intro.
+rewrite H3 in H. assumption.
+rewrite adj_set_empty in H0. elim (VertexSet.empty_1 H0).
+rewrite adj_set_empty in H. elim (VertexSet.empty_1 H).
+Qed.
+
+Lemma sym_imap : forall x y,
+ VertexSet.In x (adj_set y interf_map ) ->
+ VertexSet.In y (adj_set x interf_map).
+
+Proof.
+intros.
+unfold interf_map, set2map in *.
+set (f := (fun (e : EdgeSet.elt) (m : VertexMap.t VertexSet.t) =>
+ VertexMap.add (fst_ext e) (new_adj_set (fst_ext e) (snd_ext e) m)
+ (VertexMap.add (snd_ext e) (new_adj_set (snd_ext e) (fst_ext e) m)
+ m))) in *.
+rewrite EdgeSet.fold_1. rewrite EdgeSet.fold_1 in H.
+set (f' := fun a e => f e a) in *.
+induction (EdgeSet.elements interfgraph_interference_edges).
+simpl in H.
+rewrite adj_set_empty in H. elim (VertexSet.empty_1 H).
+cut (EqualSetMap (fold_left f' (a :: l) empty_map)
+ (f' (fold_left f' l empty_map) a)). intro.
+generalize (H0 y). intro. inversion H1. simpl in *.
+unfold adj_set in H. rewrite <-H3 in H.
+elim (VertexSet.empty_1 H).
+set (tmp := fold_left f' l empty_map) in *.
+unfold f', f in H3.
+destruct (Vertex.eq_dec y (fst_ext a)).
+rewrite MapFacts.add_eq_o in H3.
+unfold adj_set in H. simpl in H. rewrite <-H2 in H.
+inversion H3. subst. clear H3.
+rewrite H4 in H.
+unfold new_adj_set in H.
+generalize (H0 x). intro. inversion H3. subst.
+unfold f', f in H7.
+destruct (Vertex.eq_dec x (fst_ext a)).
+rewrite MapFacts.add_eq_o in H7. congruence.
+apply Regs.eq_sym. auto.
+destruct (Vertex.eq_dec (snd_ext a) x).
+rewrite MapFacts.add_neq_o in H7. rewrite MapFacts.add_eq_o in H7.
+congruence.
+apply Regs.eq_sym. auto.
+auto.
+rewrite MapFacts.add_neq_o in H7.
+rewrite MapFacts.add_neq_o in H7.
+case_eq (VertexMap.find (fst_ext a) tmp); intros; rewrite H5 in H.
+generalize (VertexSet.add_3 n0 H). clear H. intro H.
+assert (VertexSet.In y (adj_set x tmp)).
+apply IHl. unfold adj_set. rewrite (MapFacts.find_o _ e).
+rewrite H5. auto.
+unfold adj_set in H8. rewrite <-H7 in H8. elim (VertexSet.empty_1 H8).
+elim (n0 (VertexSet.singleton_1 H)).
+auto.
+auto.
+
+simpl. unfold adj_set. rewrite <-H5.
+rewrite H7.
+unfold f', f in H6.
+destruct (Vertex.eq_dec x (fst_ext a)).
+rewrite MapFacts.add_eq_o in H6.
+inversion H6. subst. clear H6.
+unfold new_adj_set. case_eq (VertexMap.find (fst_ext a) tmp); intros.
+rewrite H6 in H.
+destruct (Vertex.eq_dec y (snd_ext a)).
+apply VertexSet.add_1. apply Regs.eq_sym. auto.
+apply VertexSet.add_2.
+assert (VertexSet.In y (adj_set x tmp)).
+apply IHl. unfold adj_set.
+rewrite (MapFacts.find_o _ e).
+rewrite H6.
+destruct (Vertex.eq_dec (snd_ext a) x).
+elim n. rewrite e. rewrite <-e0. apply Regs.eq_sym. auto.
+apply (VertexSet.add_3 n0 H).
+unfold adj_set in H8.
+rewrite (MapFacts.find_o _ e0) in H8. rewrite H6 in H8. auto.
+rewrite H6 in H.
+rewrite e. rewrite <-e0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o in H6.
+destruct (Vertex.eq_dec (snd_ext a) x).
+rewrite MapFacts.add_eq_o in H6.
+inversion H6. subst. clear H6.
+unfold new_adj_set.
+destruct (VertexMap.find (snd_ext a) tmp).
+apply VertexSet.add_1.
+apply Regs.eq_sym. auto.
+apply VertexSet.singleton_2. apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o in H6.
+clear H0 H1.
+assert (VertexSet.In y (adj_set x tmp)).
+apply IHl.
+unfold adj_set. rewrite (MapFacts.find_o _ e).
+case_eq (VertexMap.find (fst_ext a) tmp); intros.
+rewrite H0 in H.
+apply (VertexSet.add_3 n0 H).
+rewrite H0 in H. elim (n0 (VertexSet.singleton_1 H)).
+unfold adj_set in H0. rewrite <-H6 in H0. auto.
+auto.
+auto.
+apply Regs.eq_sym. auto.
+
+rewrite MapFacts.add_neq_o in H3.
+destruct (Vertex.eq_dec y (snd_ext a)).
+rewrite MapFacts.add_eq_o in H3.
+unfold adj_set in H. simpl in H. rewrite <-H2 in H.
+rewrite H4 in H.
+inversion H3. subst. clear H3.
+unfold new_adj_set in H.
+case_eq (VertexMap.find (snd_ext a) tmp); intros.
+rewrite H3 in H.
+destruct (Vertex.eq_dec (fst_ext a) x).
+unfold adj_set. simpl.
+generalize (H0 x). clear H0. intro. inversion H0.
+unfold f',f in H7.
+rewrite MapFacts.add_eq_o in H7.
+congruence.
+apply Regs.eq_sym. auto.
+unfold f', f in H6.
+rewrite MapFacts.add_eq_o in H6. inversion H6. subst. clear H6.
+rewrite H7.
+unfold new_adj_set in H4. rewrite H3 in H4.
+unfold new_adj_set.
+destruct (VertexMap.find (fst_ext a) tmp).
+apply VertexSet.add_1. apply Regs.eq_sym. auto.
+apply VertexSet.singleton_2. apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+unfold adj_set. simpl.
+generalize (H0 x). clear H0. intro. inversion H0.
+unfold f',f in H7.
+rewrite MapFacts.add_neq_o in H7.
+destruct (Vertex.eq_dec (snd_ext a) x).
+rewrite MapFacts.add_eq_o in H7. congruence. auto.
+rewrite MapFacts.add_neq_o in H7.
+unfold adj_set in IHl. rewrite <-H7 in IHl. apply IHl.
+rewrite (MapFacts.find_o _ e). rewrite H3.
+apply (VertexSet.add_3 n0 H).
+auto.
+auto.
+unfold f', f in H6.
+rewrite MapFacts.add_neq_o in H6.
+destruct (Vertex.eq_dec x (snd_ext a)).
+rewrite MapFacts.add_eq_o in H6. inversion H6. subst. clear H6.
+rewrite H7.
+unfold new_adj_set. rewrite H3.
+apply VertexSet.add_2.
+unfold adj_set in IHl. rewrite <-(MapFacts.find_o _ e0) in H3.
+rewrite H3 in IHl. apply IHl.
+rewrite (MapFacts.find_o _ e). rewrite <-(MapFacts.find_o _ e0).
+rewrite H3.
+apply (VertexSet.add_3 n0 H).
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o in H6.
+rewrite H7.
+unfold adj_set in IHl. rewrite <-H6 in IHl.
+apply IHl. rewrite (MapFacts.find_o _ e).
+rewrite H3.
+apply (VertexSet.add_3 n0 H).
+auto.
+auto.
+rewrite H3 in H.
+generalize (H0 x). intro. inversion H5. subst.
+unfold f',f in H8.
+rewrite MapFacts.add_eq_o in H8.
+congruence.
+apply VertexSet.singleton_1. auto.
+unfold f', f in H7.
+rewrite MapFacts.add_eq_o in H7.
+inversion H7. subst. clear H7.
+simpl. unfold adj_set. rewrite <-H6.
+rewrite H8. unfold new_adj_set.
+destruct (VertexMap.find (fst_ext a) tmp).
+apply VertexSet.add_1. apply Regs.eq_sym. auto.
+apply VertexSet.singleton_2. apply Regs.eq_sym. auto.
+apply (VertexSet.singleton_1 H).
+apply Regs.eq_sym. auto.
+
+rewrite MapFacts.add_neq_o in H3.
+generalize (H0 x). intro. inversion H5. subst.
+unfold f', f in H8.
+destruct (Vertex.eq_dec x (fst_ext a)).
+rewrite MapFacts.add_eq_o in H8.
+congruence.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o in H8.
+destruct (Vertex.eq_dec x (snd_ext a)).
+rewrite MapFacts.add_eq_o in H8.
+congruence.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o in H8.
+simpl in H. unfold adj_set in H. rewrite <-H2 in H.
+unfold adj_set in IHl.
+assert (VertexSet.In y VertexSet.empty).
+rewrite <-H8 in IHl. apply IHl.
+rewrite <-H3. rewrite <-H4. auto.
+elim (VertexSet.empty_1 H6).
+auto.
+auto.
+unfold f',f in H7.
+destruct (Vertex.eq_dec (fst_ext a) x).
+rewrite MapFacts.add_eq_o in H7.
+inversion H7. subst. clear H7.
+unfold adj_set. simpl. rewrite <-H6.
+rewrite H8.
+unfold new_adj_set.
+simpl in H. unfold adj_set in H. rewrite <-H2 in H.
+case_eq (VertexMap.find (fst_ext a) tmp); intros.
+unfold adj_set in IHl.
+rewrite <-(MapFacts.find_o _ e) in IHl.
+rewrite H7 in IHl.
+apply VertexSet.add_2. apply IHl.
+rewrite <-H3. rewrite <-H4. auto.
+assert (VertexSet.In y VertexSet.empty).
+unfold adj_set in IHl. rewrite (MapFacts.find_o _ e) in H7.
+rewrite H7 in IHl. apply IHl.
+rewrite <-H3. rewrite <-H4. auto.
+elim (VertexSet.empty_1 H9).
+auto.
+rewrite MapFacts.add_neq_o in H7.
+destruct (Vertex.eq_dec (snd_ext a) x).
+rewrite MapFacts.add_eq_o in H7.
+inversion H7. subst. clear H7.
+simpl. unfold adj_set. rewrite <-H6.
+rewrite H8. unfold new_adj_set.
+simpl in H. unfold adj_set in H. rewrite <-H2 in H.
+rewrite (MapFacts.find_o _ e).
+unfold adj_set in IHl.
+case_eq (VertexMap.find x tmp); intros.
+rewrite H7 in IHl.
+apply VertexSet.add_2.
+apply IHl.
+rewrite <-H3. rewrite <-H4. auto.
+assert (VertexSet.In y VertexSet.empty).
+unfold adj_set in IHl. rewrite H7 in IHl.
+apply IHl. rewrite <-H3. rewrite <-H4. auto.
+elim (VertexSet.empty_1 H9).
+auto.
+rewrite MapFacts.add_neq_o in H7.
+simpl. unfold adj_set. rewrite <-H6.
+rewrite H8.
+unfold adj_set in IHl. rewrite <-H7 in IHl. rewrite <-H3 in IHl.
+apply IHl. rewrite <-H4. simpl in H. unfold adj_set in H. rewrite <-H2 in H. auto.
+auto.
+auto.
+auto.
+auto.
+
+apply fold_left_assoc_map.
+intros.
+unfold f'. unfold f.
+unfold EqualSetMap. intro.
+destruct (Vertex.eq_dec x0 (fst_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+intro. elim n. rewrite e. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite e. auto.
+intro. elim n. rewrite e. auto.
+apply (Regs.eq_sym e).
+intro. elim n0. auto.
+intro. elim n. auto.
+apply (Regs.eq_sym e).
+rewrite MapFacts.add_neq_o.
+destruct (Regs.eq_dec x0 (snd_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Regs.eq_dec x0 (fst_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n0. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n1. rewrite H0. auto.
+intro. elim n0. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+auto.
+auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H0. auto.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+constructor.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H0. auto.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+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.
+constructor.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+
+intros.
+unfold f'. unfold f. unfold EqualSetMap. intros.
+destruct (Regs.eq_dec x0 (fst_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H0 (fst_ext a0)). intro.
+inversion H1.
+apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m. apply Regs.eq_refl. auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Regs.eq_dec x0 (snd_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H0 (snd_ext a0)). intro.
+inversion H1.
+apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m. apply Regs.eq_refl. auto.
+apply Regs.eq_sym. auto.
+intro. elim n. rewrite H1. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+auto.
+intro. elim n0. rewrite H1. auto.
+intro. elim n. rewrite H1. auto.
+auto.
+auto.
+Qed.
+
+Lemma sym_pmap : forall x y,
+ VertexSet.In x (adj_set y pref_map) ->
+ VertexSet.In y (adj_set x pref_map).
+
+Proof.
+intros.
+unfold pref_map, set2map in *.
+set (f := (fun (e : EdgeSet.elt) (m : VertexMap.t VertexSet.t) =>
+ VertexMap.add (fst_ext e) (new_adj_set (fst_ext e) (snd_ext e) m)
+ (VertexMap.add (snd_ext e) (new_adj_set (snd_ext e) (fst_ext e) m)
+ m))) in *.
+rewrite EdgeSet.fold_1. rewrite EdgeSet.fold_1 in H.
+set (f' := fun a e => f e a) in *.
+induction (EdgeSet.elements interfgraph_affinity_edges).
+simpl in H.
+rewrite adj_set_empty in H. elim (VertexSet.empty_1 H).
+cut (EqualSetMap (fold_left f' (a :: l) empty_map)
+ (f' (fold_left f' l empty_map) a)). intro.
+generalize (H0 y). intro. inversion H1. simpl in *.
+unfold adj_set in H. rewrite <-H3 in H.
+elim (VertexSet.empty_1 H).
+set (tmp := fold_left f' l empty_map) in *.
+unfold f', f in H3.
+destruct (Vertex.eq_dec y (fst_ext a)).
+rewrite MapFacts.add_eq_o in H3.
+unfold adj_set in H. simpl in H. rewrite <-H2 in H.
+inversion H3. subst. clear H3.
+rewrite H4 in H.
+unfold new_adj_set in H.
+generalize (H0 x). intro. inversion H3. subst.
+unfold f', f in H7.
+destruct (Vertex.eq_dec x (fst_ext a)).
+rewrite MapFacts.add_eq_o in H7. congruence.
+apply Regs.eq_sym. auto.
+destruct (Vertex.eq_dec (snd_ext a) x).
+rewrite MapFacts.add_neq_o in H7. rewrite MapFacts.add_eq_o in H7.
+congruence.
+apply Regs.eq_sym. auto.
+auto.
+rewrite MapFacts.add_neq_o in H7.
+rewrite MapFacts.add_neq_o in H7.
+case_eq (VertexMap.find (fst_ext a) tmp); intros; rewrite H5 in H.
+generalize (VertexSet.add_3 n0 H). clear H. intro H.
+assert (VertexSet.In y (adj_set x tmp)).
+apply IHl. unfold adj_set. rewrite (MapFacts.find_o _ e).
+rewrite H5. auto.
+unfold adj_set in H8. rewrite <-H7 in H8. elim (VertexSet.empty_1 H8).
+elim (n0 (VertexSet.singleton_1 H)).
+auto.
+auto.
+
+simpl. unfold adj_set. rewrite <-H5.
+rewrite H7.
+unfold f', f in H6.
+destruct (Vertex.eq_dec x (fst_ext a)).
+rewrite MapFacts.add_eq_o in H6.
+inversion H6. subst. clear H6.
+unfold new_adj_set. case_eq (VertexMap.find (fst_ext a) tmp); intros.
+rewrite H6 in H.
+destruct (Vertex.eq_dec y (snd_ext a)).
+apply VertexSet.add_1. apply Regs.eq_sym. auto.
+apply VertexSet.add_2.
+assert (VertexSet.In y (adj_set x tmp)).
+apply IHl. unfold adj_set.
+rewrite (MapFacts.find_o _ e).
+rewrite H6.
+destruct (Vertex.eq_dec (snd_ext a) x).
+elim n. rewrite e. rewrite <-e0. apply Regs.eq_sym. auto.
+apply (VertexSet.add_3 n0 H).
+unfold adj_set in H8.
+rewrite (MapFacts.find_o _ e0) in H8. rewrite H6 in H8. auto.
+rewrite H6 in H.
+rewrite e. rewrite <-e0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o in H6.
+destruct (Vertex.eq_dec (snd_ext a) x).
+rewrite MapFacts.add_eq_o in H6.
+inversion H6. subst. clear H6.
+unfold new_adj_set.
+destruct (VertexMap.find (snd_ext a) tmp).
+apply VertexSet.add_1.
+apply Regs.eq_sym. auto.
+apply VertexSet.singleton_2. apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o in H6.
+clear H0 H1.
+assert (VertexSet.In y (adj_set x tmp)).
+apply IHl.
+unfold adj_set. rewrite (MapFacts.find_o _ e).
+case_eq (VertexMap.find (fst_ext a) tmp); intros.
+rewrite H0 in H.
+apply (VertexSet.add_3 n0 H).
+rewrite H0 in H. elim (n0 (VertexSet.singleton_1 H)).
+unfold adj_set in H0. rewrite <-H6 in H0. auto.
+auto.
+auto.
+apply Regs.eq_sym. auto.
+
+rewrite MapFacts.add_neq_o in H3.
+destruct (Vertex.eq_dec y (snd_ext a)).
+rewrite MapFacts.add_eq_o in H3.
+unfold adj_set in H. simpl in H. rewrite <-H2 in H.
+rewrite H4 in H.
+inversion H3. subst. clear H3.
+unfold new_adj_set in H.
+case_eq (VertexMap.find (snd_ext a) tmp); intros.
+rewrite H3 in H.
+destruct (Vertex.eq_dec (fst_ext a) x).
+unfold adj_set. simpl.
+generalize (H0 x). clear H0. intro. inversion H0.
+unfold f',f in H7.
+rewrite MapFacts.add_eq_o in H7.
+congruence.
+apply Regs.eq_sym. auto.
+unfold f', f in H6.
+rewrite MapFacts.add_eq_o in H6. inversion H6. subst. clear H6.
+rewrite H7.
+unfold new_adj_set in H4. rewrite H3 in H4.
+unfold new_adj_set.
+destruct (VertexMap.find (fst_ext a) tmp).
+apply VertexSet.add_1. apply Regs.eq_sym. auto.
+apply VertexSet.singleton_2. apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+unfold adj_set. simpl.
+generalize (H0 x). clear H0. intro. inversion H0.
+unfold f',f in H7.
+rewrite MapFacts.add_neq_o in H7.
+destruct (Vertex.eq_dec (snd_ext a) x).
+rewrite MapFacts.add_eq_o in H7. congruence. auto.
+rewrite MapFacts.add_neq_o in H7.
+unfold adj_set in IHl. rewrite <-H7 in IHl. apply IHl.
+rewrite (MapFacts.find_o _ e). rewrite H3.
+apply (VertexSet.add_3 n0 H).
+auto.
+auto.
+unfold f', f in H6.
+rewrite MapFacts.add_neq_o in H6.
+destruct (Vertex.eq_dec x (snd_ext a)).
+rewrite MapFacts.add_eq_o in H6. inversion H6. subst. clear H6.
+rewrite H7.
+unfold new_adj_set. rewrite H3.
+apply VertexSet.add_2.
+unfold adj_set in IHl. rewrite <-(MapFacts.find_o _ e0) in H3.
+rewrite H3 in IHl. apply IHl.
+rewrite (MapFacts.find_o _ e). rewrite <-(MapFacts.find_o _ e0).
+rewrite H3.
+apply (VertexSet.add_3 n0 H).
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o in H6.
+rewrite H7.
+unfold adj_set in IHl. rewrite <-H6 in IHl.
+apply IHl. rewrite (MapFacts.find_o _ e).
+rewrite H3.
+apply (VertexSet.add_3 n0 H).
+auto.
+auto.
+rewrite H3 in H.
+generalize (H0 x). intro. inversion H5. subst.
+unfold f',f in H8.
+rewrite MapFacts.add_eq_o in H8.
+congruence.
+apply VertexSet.singleton_1. auto.
+unfold f', f in H7.
+rewrite MapFacts.add_eq_o in H7.
+inversion H7. subst. clear H7.
+simpl. unfold adj_set. rewrite <-H6.
+rewrite H8. unfold new_adj_set.
+destruct (VertexMap.find (fst_ext a) tmp).
+apply VertexSet.add_1. apply Regs.eq_sym. auto.
+apply VertexSet.singleton_2. apply Regs.eq_sym. auto.
+apply (VertexSet.singleton_1 H).
+apply Regs.eq_sym. auto.
+
+rewrite MapFacts.add_neq_o in H3.
+generalize (H0 x). intro. inversion H5. subst.
+unfold f', f in H8.
+destruct (Vertex.eq_dec x (fst_ext a)).
+rewrite MapFacts.add_eq_o in H8.
+congruence.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o in H8.
+destruct (Vertex.eq_dec x (snd_ext a)).
+rewrite MapFacts.add_eq_o in H8.
+congruence.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o in H8.
+simpl in H. unfold adj_set in H. rewrite <-H2 in H.
+unfold adj_set in IHl.
+assert (VertexSet.In y VertexSet.empty).
+rewrite <-H8 in IHl. apply IHl.
+rewrite <-H3. rewrite <-H4. auto.
+elim (VertexSet.empty_1 H6).
+auto.
+auto.
+unfold f',f in H7.
+destruct (Vertex.eq_dec (fst_ext a) x).
+rewrite MapFacts.add_eq_o in H7.
+inversion H7. subst. clear H7.
+unfold adj_set. simpl. rewrite <-H6.
+rewrite H8.
+unfold new_adj_set.
+simpl in H. unfold adj_set in H. rewrite <-H2 in H.
+case_eq (VertexMap.find (fst_ext a) tmp); intros.
+unfold adj_set in IHl.
+rewrite <-(MapFacts.find_o _ e) in IHl.
+rewrite H7 in IHl.
+apply VertexSet.add_2. apply IHl.
+rewrite <-H3. rewrite <-H4. auto.
+assert (VertexSet.In y VertexSet.empty).
+unfold adj_set in IHl. rewrite (MapFacts.find_o _ e) in H7.
+rewrite H7 in IHl. apply IHl.
+rewrite <-H3. rewrite <-H4. auto.
+elim (VertexSet.empty_1 H9).
+auto.
+rewrite MapFacts.add_neq_o in H7.
+destruct (Vertex.eq_dec (snd_ext a) x).
+rewrite MapFacts.add_eq_o in H7.
+inversion H7. subst. clear H7.
+simpl. unfold adj_set. rewrite <-H6.
+rewrite H8. unfold new_adj_set.
+simpl in H. unfold adj_set in H. rewrite <-H2 in H.
+rewrite (MapFacts.find_o _ e).
+unfold adj_set in IHl.
+case_eq (VertexMap.find x tmp); intros.
+rewrite H7 in IHl.
+apply VertexSet.add_2.
+apply IHl.
+rewrite <-H3. rewrite <-H4. auto.
+assert (VertexSet.In y VertexSet.empty).
+unfold adj_set in IHl. rewrite H7 in IHl.
+apply IHl. rewrite <-H3. rewrite <-H4. auto.
+elim (VertexSet.empty_1 H9).
+auto.
+rewrite MapFacts.add_neq_o in H7.
+simpl. unfold adj_set. rewrite <-H6.
+rewrite H8.
+unfold adj_set in IHl. rewrite <-H7 in IHl. rewrite <-H3 in IHl.
+apply IHl. rewrite <-H4. simpl in H. unfold adj_set in H. rewrite <-H2 in H. auto.
+auto.
+auto.
+auto.
+auto.
+
+apply fold_left_assoc_map.
+intros.
+unfold f'. unfold f.
+unfold EqualSetMap. intro.
+destruct (Vertex.eq_dec x0 (fst_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+intro. elim n. rewrite e. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite e. auto.
+intro. elim n. rewrite e. auto.
+apply (Regs.eq_sym e).
+intro. elim n0. auto.
+intro. elim n. auto.
+apply (Regs.eq_sym e).
+rewrite MapFacts.add_neq_o.
+destruct (Regs.eq_dec x0 (snd_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Regs.eq_dec x0 (fst_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite (MapFacts.find_o _ (Regs.eq_sym e)).
+rewrite (MapFacts.find_o _ (Regs.eq_sym e0)).
+destruct (VertexMap.find x0 s).
+apply Props.add_add.
+do 2 rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. auto.
+rewrite <-e0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n0. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n1. rewrite H0. auto.
+intro. elim n0. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+auto.
+auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H0. auto.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+constructor.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H0. auto.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+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.
+constructor.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+
+intros.
+unfold f'. unfold f. unfold EqualSetMap. intros.
+destruct (Regs.eq_dec x0 (fst_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H0 (fst_ext a0)). intro.
+inversion H1.
+apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m. apply Regs.eq_refl. auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Regs.eq_dec x0 (snd_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H0 (snd_ext a0)). intro.
+inversion H1.
+apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m. apply Regs.eq_refl. auto.
+apply Regs.eq_sym. auto.
+intro. elim n. rewrite H1. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+auto.
+intro. elim n0. rewrite H1. auto.
+intro. elim n. rewrite H1. auto.
+auto.
+auto.
+Qed.
+
+Lemma set_reg_reg_diff_ext : forall x g,
+SetRegReg.In x (interf_reg_reg g) \/
+SetRegReg.In x (pref_reg_reg g) -> fst x <> snd x.
+
+Proof.
+Admitted.
+
+Lemma IE_reg_reg_diff : forall x y w,
+EdgeSet.In (x,y,w) IE_reg_reg -> ~Vertex.eq x y.
+
+Proof.
+intros.
+unfold IE_reg_reg in H.
+set (f := (fun (e : SetRegReg.elt) (s : EdgeSet.t) =>
+ EdgeSet.add
+ (Regs.reg_to_Reg (fst e), Regs.reg_to_Reg (snd e), None) s)) in *.
+rewrite SetRegReg.fold_1 in H.
+set (f' := fun a e => f e a) in *.
+generalize SetRegReg.elements_2. intro HH.
+generalize (HH (interf_reg_reg g)). clear HH. intro HH.
+induction (SetRegReg.elements (interf_reg_reg g)). simpl in H.
+elim (EdgeSet.empty_1 H).
+rewrite MEdgeFacts.fold_left_assoc in H.
+set (tmp := fold_left f' l EdgeSet.empty) in *.
+unfold f', f in H.
+destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H).
+fold (eq (Regs.reg_to_Reg (fst a), Regs.reg_to_Reg (snd a), None) (x,y,w)) in H0.
+destruct (eq_charac _ _ H0); change_rewrite; destruct H1.
+assert (fst a <> snd a).
+apply set_reg_reg_diff_ext with (g:=g).
+left. apply HH.
+left. auto.
+intro. rewrite <-H1 in H4. rewrite <-H2 in H4.
+inversion H4. subst. elim (H3 H7).
+assert (fst a <> snd a).
+apply set_reg_reg_diff_ext with (g:=g).
+left. apply HH.
+left. auto.
+intro. rewrite <-H1 in H4. rewrite <-H2 in H4.
+inversion H4. subst. elim H3. auto.
+apply IHl. auto.
+
+intros. apply HH. right. auto.
+
+unfold f', f. intros.
+apply RegRegProps.add_add.
+
+unfold f', f. intros.
+apply RegRegProps.Dec.F.add_m. apply E.eq_refl. auto.
+Qed.
+
+Lemma IE_reg_mreg_diff : forall x y w,
+EdgeSet.In (x,y,w) IE_reg_mreg -> ~Vertex.eq x y.
+
+Proof.
+intros.
+unfold IE_reg_mreg in H.
+set (f := (fun (e : SetRegMreg.elt) (s : EdgeSet.t) =>
+ EdgeSet.add
+ (Regs.reg_to_Reg (fst e), Regs.mreg_to_Reg (snd e), None) s)) in *.
+rewrite SetRegMreg.fold_1 in H.
+set (f' := fun a e => f e a) in *.
+generalize SetRegMreg.elements_2. intro HH.
+generalize (HH (interf_reg_mreg g)). clear HH. intro HH.
+induction (SetRegMreg.elements (interf_reg_mreg g)). simpl in H.
+elim (EdgeSet.empty_1 H).
+rewrite MEdgeFacts.fold_left_assoc in H.
+set (tmp := fold_left f' l EdgeSet.empty) in *.
+unfold f', f in H.
+destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H).
+fold (eq (Regs.reg_to_Reg (fst a), Regs.mreg_to_Reg (snd a), None) (x,y,w)) in H0.
+destruct (eq_charac _ _ H0); change_rewrite; destruct H1.
+intro. rewrite <-H1 in H3. rewrite <-H2 in H3. inversion H3.
+intro. rewrite <-H1 in H3. rewrite <-H2 in H3. inversion H3.
+apply IHl. auto.
+
+intros. apply HH. right. auto.
+
+unfold f', f. intros.
+apply RegRegProps.add_add.
+
+unfold f', f. intros.
+apply RegRegProps.Dec.F.add_m. apply E.eq_refl. auto.
+Qed.
+
+Lemma AE_reg_reg_diff : forall x y w,
+EdgeSet.In (x,y,w) AE_reg_reg -> ~Vertex.eq x y.
+
+Proof.
+intros.
+unfold AE_reg_reg in H.
+set (f := (fun (e : SetRegReg.elt) (s : EdgeSet.t) =>
+ EdgeSet.add
+ (Regs.reg_to_Reg (fst e), Regs.reg_to_Reg (snd e), Some N0) s)) in *.
+rewrite SetRegReg.fold_1 in H.
+set (f' := fun a e => f e a) in *.
+generalize SetRegReg.elements_2. intro HH.
+generalize (HH (pref_reg_reg g)). clear HH. intro HH.
+induction (SetRegReg.elements (pref_reg_reg g)). simpl in H.
+elim (EdgeSet.empty_1 H).
+rewrite MEdgeFacts.fold_left_assoc in H.
+set (tmp := fold_left f' l EdgeSet.empty) in *.
+unfold f', f in H.
+destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H).
+fold (eq (Regs.reg_to_Reg (fst a), Regs.reg_to_Reg (snd a), None) (x,y,w)) in H0.
+destruct (eq_charac _ _ H0); change_rewrite; destruct H1.
+assert (fst a <> snd a).
+apply set_reg_reg_diff_ext with (g:=g).
+right. apply HH.
+left. auto.
+intro. rewrite <-H1 in H4. rewrite <-H2 in H4.
+inversion H4. subst. elim (H3 H7).
+assert (fst a <> snd a).
+apply set_reg_reg_diff_ext with (g:=g).
+right. apply HH.
+left. auto.
+intro. rewrite <-H1 in H4. rewrite <-H2 in H4.
+inversion H4. subst. elim H3. auto.
+apply IHl. auto.
+
+intros. apply HH. right. auto.
+
+unfold f', f. intros.
+apply RegRegProps.add_add.
+
+unfold f', f. intros.
+apply RegRegProps.Dec.F.add_m. apply E.eq_refl. auto.
+Qed.
+
+Lemma AE_reg_mreg_diff : forall x y w,
+EdgeSet.In (x,y,w) AE_reg_mreg -> ~Vertex.eq x y.
+
+Proof.
+intros.
+unfold AE_reg_mreg in H.
+set (f := (fun (e : SetRegMreg.elt) (s : EdgeSet.t) =>
+ EdgeSet.add
+ (Regs.reg_to_Reg (fst e), Regs.mreg_to_Reg (snd e), Some N0) s)) in *.
+rewrite SetRegMreg.fold_1 in H.
+set (f' := fun a e => f e a) in *.
+generalize SetRegMreg.elements_2. intro HH.
+generalize (HH (pref_reg_mreg g)). clear HH. intro HH.
+induction (SetRegMreg.elements (pref_reg_mreg g)). simpl in H.
+elim (EdgeSet.empty_1 H).
+rewrite MEdgeFacts.fold_left_assoc in H.
+set (tmp := fold_left f' l EdgeSet.empty) in *.
+unfold f', f in H.
+destruct (proj1 (RegRegProps.Dec.F.add_iff _ _ _) H).
+fold (eq (Regs.reg_to_Reg (fst a), Regs.mreg_to_Reg (snd a), None) (x,y,w)) in H0.
+destruct (eq_charac _ _ H0); change_rewrite; destruct H1.
+intro. rewrite <-H1 in H3. rewrite <-H2 in H3. inversion H3.
+intro. rewrite <-H1 in H3. rewrite <-H2 in H3. inversion H3.
+apply IHl. auto.
+
+intros. apply HH. right. auto.
+
+unfold f', f. intros.
+apply RegRegProps.add_add.
+
+unfold f', f. intros.
+apply RegRegProps.Dec.F.add_m. apply E.eq_refl. auto.
+Qed.
+
+Lemma not_eq_extremities : forall x y,
+VertexSet.In x (adj_set y interf_map) \/ VertexSet.In x (adj_set y pref_map) ->
+~Vertex.eq x y.
+
+Proof.
+intros.
+destruct H.
+generalize (set2map_charac _ _ _ _ H). intro.
+destruct H0. destruct H0.
+unfold interfgraph_interference_edges in H0.
+destruct (EdgeSet.union_1 H0).
+apply (IE_reg_reg_diff x y x0 H1).
+apply (IE_reg_mreg_diff x y x0 H1).
+rewrite adj_set_empty in H0. elim (VertexSet.empty_1 H0).
+generalize (set2map_charac _ _ _ _ H). intro.
+destruct H0. destruct H0.
+unfold interfgraph_affinity_edges in H0.
+generalize (resolve_conflicts_2 _ _ _ H0). intro.
+clear H0. destruct H1 as [H0 _].
+destruct (EdgeSet.union_1 H0).
+apply (AE_reg_reg_diff x y x0 H1).
+apply (AE_reg_mreg_diff x y x0 H1).
+rewrite adj_set_empty in H0. elim (VertexSet.empty_1 H0).
+Qed.
+
+Definition graph_translation : new_graph :=
+let vert := interfgraph_vertices in
+let iedges := interfgraph_interference_edges in
+let aedges := resolve_conflicts (EdgeSet.union AE_reg_reg AE_reg_mreg) iedges in
+let emp := VertexSet.fold
+ (fun x m => VertexMap.add x VertexSet.empty m)
+ vert
+ (VertexMap.empty VertexSet.t) in
+let im := set2map iedges emp in
+let pm := set2map aedges emp in
+Make_Graph
+ vert im pm
+ extremities_imap
+ extremities_pmap
+ simple_graph
+ sym_imap
+ sym_pmap
+ not_eq_extremities.
+
+Lemma set2map_charac_2 : forall x y s m,
+(exists w, EdgeSet.In (x,y,w) s) \/ VertexSet.In x (adj_set y m) ->
+VertexSet.In x (adj_set y (set2map s m)).
+
+Proof.
+intros.
+unfold set2map.
+set (f := (fun (e : EdgeSet.elt) (m : VertexMap.t VertexSet.t) =>
+ VertexMap.add (fst_ext e)
+ (new_adj_set (fst_ext e) (snd_ext e) m)
+ (VertexMap.add (snd_ext e)
+ (new_adj_set (snd_ext e) (fst_ext e) m) m))) in *.
+rewrite EdgeSet.fold_1.
+set (f' := fun a e => f e a) in *.
+destruct H. destruct H.
+generalize EdgeSet.elements_1. intro HH.
+generalize (HH s (x,y,x0) H). clear HH. intro HH.
+induction (EdgeSet.elements s).
+inversion HH.
+cut (EqualSetMap (fold_left f' (a :: l) m)
+ (f' (fold_left f' l m) a)). intro.
+generalize (H0 y). clear H0. intro H0. inversion H0. subst.
+set (tmp := fold_left f' l m) in *.
+unfold f', f in H3.
+destruct (Vertex.eq_dec y (fst_ext a)).
+rewrite MapFacts.add_eq_o in H3.
+congruence.
+apply Regs.eq_sym. auto.
+destruct (Vertex.eq_dec y (snd_ext a)).
+rewrite MapFacts.add_neq_o in H3.
+rewrite MapFacts.add_eq_o in H3.
+congruence.
+apply Regs.eq_sym. auto.
+auto.
+rewrite MapFacts.add_neq_o in H3.
+rewrite MapFacts.add_neq_o in H3.
+inversion HH; subst.
+destruct (eq_charac _ _ H4); change_rewrite; destruct H4; destruct H1.
+elim (n0 H6).
+elim (n H6).
+unfold adj_set in IHl. rewrite <-H3 in IHl.
+elim (VertexSet.empty_1 (IHl H4)).
+auto.
+auto.
+
+set (tmp := fold_left f' l m) in *.
+unfold adj_set. simpl. rewrite <-H1. rewrite H3.
+unfold f',f in H2.
+inversion HH; subst.
+destruct (eq_charac _ _ H5); change_rewrite; destruct H4.
+destruct (Vertex.eq_dec y (fst_ext a)).
+rewrite MapFacts.add_eq_o in H2.
+inversion H2. subst. clear H2.
+unfold new_adj_set.
+destruct (VertexMap.find (fst_ext a) tmp).
+apply VertexSet.add_1. rewrite H4. rewrite <-H6. rewrite <-e. apply Regs.eq_refl.
+apply VertexSet.singleton_2. rewrite H4. rewrite <-H6. rewrite <-e. apply Regs.eq_refl.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o in H2.
+rewrite MapFacts.add_eq_o in H2.
+inversion H2. subst. clear H2.
+unfold new_adj_set. destruct (VertexMap.find (snd_ext a) tmp).
+apply VertexSet.add_1. apply Regs.eq_sym. auto.
+apply VertexSet.singleton_2. apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+auto.
+rewrite MapFacts.add_eq_o in H2.
+inversion H2. subst. clear H2.
+unfold new_adj_set. destruct (VertexMap.find (fst_ext a) tmp).
+apply VertexSet.add_1. apply Regs.eq_sym. auto.
+apply VertexSet.singleton_2. apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+destruct (Vertex.eq_dec y (fst_ext a)).
+rewrite MapFacts.add_eq_o in H2.
+inversion H2. subst. clear H2.
+unfold new_adj_set.
+rewrite <-(MapFacts.find_o _ e).
+case_eq (VertexMap.find y tmp); intros.
+apply VertexSet.add_2.
+unfold adj_set in IHl. rewrite H2 in IHl.
+apply IHl. auto.
+assert (VertexSet.In x VertexSet.empty).
+unfold adj_set in IHl. rewrite H2 in IHl. apply IHl. auto.
+elim (VertexSet.empty_1 H4).
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o in H2.
+destruct (Vertex.eq_dec y (snd_ext a)).
+rewrite MapFacts.add_eq_o in H2.
+inversion H2. subst. clear H2.
+unfold new_adj_set.
+rewrite <-(MapFacts.find_o _ e).
+case_eq (VertexMap.find y tmp); intros.
+apply VertexSet.add_2.
+unfold adj_set in IHl. rewrite H2 in IHl. apply IHl. auto.
+assert (VertexSet.In x VertexSet.empty).
+unfold adj_set in IHl. rewrite H2 in IHl. apply IHl. auto.
+elim (VertexSet.empty_1 H4).
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o in H2.
+unfold adj_set in IHl. rewrite <-H2 in IHl. apply IHl. auto.
+auto.
+auto.
+
+apply fold_left_assoc_map.
+unfold f', f, EqualSetMap. intros.
+destruct (Vertex.eq_dec x1 (fst_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Vertex.eq_dec x1 (fst_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite <-(MapFacts.find_o _ e).
+rewrite <-(MapFacts.find_o _ e0).
+destruct (VertexMap.find x1 s0).
+apply Props.add_add.
+rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x1 (snd_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite <-(MapFacts.find_o _ e).
+rewrite <-(MapFacts.find_o _ e0).
+destruct (VertexMap.find x1 s0).
+apply Props.add_add.
+rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H0. auto.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x1 (snd_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Vertex.eq_dec x1 (fst_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite <-(MapFacts.find_o _ e).
+rewrite <-(MapFacts.find_o _ e0).
+destruct (VertexMap.find x1 s0). apply Props.add_add.
+rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n. rewrite H0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x1 (snd_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite <-(MapFacts.find_o _ e).
+rewrite <-(MapFacts.find_o _ e0).
+destruct (VertexMap.find x1 s0).
+apply Props.add_add.
+rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n. rewrite H0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n0. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n1. rewrite H0. auto.
+intro. elim n0. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+auto.
+auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x1 (fst_ext y0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H0. auto.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x1 (snd_ext y0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H0. auto.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+destruct (VertexMap.find x1 s0); constructor.
+apply VertexSet.eq_refl.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+auto.
+
+intros.
+unfold EqualSetMap, f', f. intros.
+destruct (Vertex.eq_dec x1 (fst_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H0 (fst_ext a0)). intro.
+inversion H1. apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m.
+apply Regs.eq_refl.
+auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x1 (snd_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H0 (snd_ext a0)). intro.
+inversion H1.
+apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m.
+apply Regs.eq_refl.
+auto.
+apply Regs.eq_sym. auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+auto.
+auto.
+auto.
+auto.
+auto.
+
+induction (EdgeSet.elements s). simpl. auto.
+cut (EqualSetMap (fold_left f' (a :: l) m)
+ (f' (fold_left f' l m) a)). intro.
+generalize (H0 y). clear H0. intro H0. inversion H0. subst.
+set (tmp := fold_left f' l m) in *.
+unfold f', f in H3.
+destruct (Vertex.eq_dec y (fst_ext a)).
+rewrite MapFacts.add_eq_o in H3.
+congruence.
+apply Regs.eq_sym. auto.
+destruct (Vertex.eq_dec y (snd_ext a)).
+rewrite MapFacts.add_neq_o in H3.
+rewrite MapFacts.add_eq_o in H3.
+congruence.
+apply Regs.eq_sym. auto.
+auto.
+rewrite MapFacts.add_neq_o in H3.
+rewrite MapFacts.add_neq_o in H3.
+unfold adj_set in IHl. rewrite <-H3 in IHl. elim (VertexSet.empty_1 IHl).
+auto.
+auto.
+
+unfold adj_set. simpl. rewrite <-H1.
+rewrite H3.
+set (tmp := fold_left f' l m) in *.
+unfold f', f in H2.
+destruct (Vertex.eq_dec y (fst_ext a)).
+rewrite MapFacts.add_eq_o in H2.
+inversion H2. subst. clear H2.
+unfold new_adj_set.
+rewrite <-(MapFacts.find_o _ e).
+case_eq (VertexMap.find y tmp); intros.
+apply VertexSet.add_2.
+unfold adj_set in IHl. rewrite H2 in IHl. apply IHl.
+unfold adj_set in IHl. rewrite H2 in IHl. inversion IHl.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o in H2.
+destruct (Vertex.eq_dec y (snd_ext a)).
+rewrite MapFacts.add_eq_o in H2.
+inversion H2. subst. clear H2.
+unfold new_adj_set.
+rewrite <-(MapFacts.find_o _ e).
+case_eq (VertexMap.find y tmp); intros.
+apply VertexSet.add_2.
+unfold adj_set in IHl. rewrite H2 in IHl. apply IHl.
+unfold adj_set in IHl. rewrite H2 in IHl. inversion IHl.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o in H2.
+unfold adj_set in IHl. rewrite <-H2 in IHl. apply IHl.
+auto.
+auto.
+
+apply fold_left_assoc_map.
+unfold f', f, EqualSetMap. intros.
+destruct (Vertex.eq_dec x0 (fst_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite <-(MapFacts.find_o _ e).
+rewrite <-(MapFacts.find_o _ e0).
+destruct (VertexMap.find x0 s0).
+apply Props.add_add.
+rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+rewrite <-(MapFacts.find_o _ e).
+rewrite <-(MapFacts.find_o _ e0).
+destruct (VertexMap.find x0 s0).
+apply Props.add_add.
+rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H0. auto.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext z)).
+rewrite MapFacts.add_eq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite <-(MapFacts.find_o _ e).
+rewrite <-(MapFacts.find_o _ e0).
+destruct (VertexMap.find x0 s0). apply Props.add_add.
+rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n. rewrite H0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y0)).
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+rewrite <-(MapFacts.find_o _ e).
+rewrite <-(MapFacts.find_o _ e0).
+destruct (VertexMap.find x0 s0).
+apply Props.add_add.
+rewrite Props.singleton_equal_add. apply Props.add_add.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n. rewrite H0. auto.
+rewrite <-e. rewrite <-e0. apply Regs.eq_refl.
+intro. elim n0. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n1. rewrite H0. auto.
+intro. elim n0. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+auto.
+auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (fst_ext y0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H0. auto.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext y0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+apply VertexSet.eq_refl.
+intro. elim n0. rewrite H0. auto.
+intro. elim n. rewrite H0. auto.
+apply Regs.eq_sym. auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+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.
+auto.
+auto.
+auto.
+auto.
+
+intros.
+unfold EqualSetMap, f', f. intros.
+destruct (Vertex.eq_dec x0 (fst_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H0 (fst_ext a0)). intro.
+inversion H1. apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m.
+apply Regs.eq_refl.
+auto.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+destruct (Vertex.eq_dec x0 (snd_ext a0)).
+rewrite MapFacts.add_eq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_eq_o.
+constructor.
+unfold new_adj_set.
+generalize (H0 (snd_ext a0)). intro.
+inversion H1.
+apply VertexSet.eq_refl.
+apply Props.Dec.F.add_m.
+apply Regs.eq_refl.
+auto.
+apply Regs.eq_sym. auto.
+auto.
+apply Regs.eq_sym. auto.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+rewrite MapFacts.add_neq_o.
+auto.
+auto.
+auto.
+auto.
+auto.
+Qed.
+
+Lemma regreg_IE : forall x y,
+SetRegReg.In (x,y) (interf_reg_reg g) ->
+EdgeSet.In (Regs.reg_to_Reg x,Regs.reg_to_Reg y,None) IE_reg_reg.
+
+Proof.
+intros.
+unfold IE_reg_reg.
+set (f := (fun (e : SetRegReg.elt) (s : EdgeSet.t) =>
+ EdgeSet.add (Regs.reg_to_Reg (fst e), Regs.reg_to_Reg (snd e), None) s)) in *.
+rewrite SetRegReg.fold_1.
+set (f' := fun a e => f e a) in *.
+generalize SetRegReg.elements_1. intro HH.
+generalize (HH (interf_reg_reg g) (x,y) H). clear HH. intro HH.
+induction (SetRegReg.elements (interf_reg_reg g)). simpl.
+inversion HH.
+rewrite MEdgeFacts.fold_left_assoc.
+set (tmp := fold_left f' l EdgeSet.empty) in *.
+unfold f', f.
+inversion HH; subst.
+apply EdgeSet.add_1. destruct H1. simpl in *. subst. apply Edge.eq_refl.
+apply EdgeSet.add_2. apply IHl. auto.
+unfold f', f. intros.
+apply RegRegProps.add_add.
+
+unfold f', f. intros.
+apply RegRegProps.Dec.F.add_m. apply E.eq_refl. auto.
+Qed.
+
+Lemma regmreg_IE : forall x y,
+SetRegMreg.In (x,y) (interf_reg_mreg g) ->
+EdgeSet.In (Regs.reg_to_Reg x,Regs.mreg_to_Reg y,None) IE_reg_mreg.
+
+Proof.
+intros.
+unfold IE_reg_mreg.
+set (f := (fun (e : SetRegMreg.elt) (s : EdgeSet.t) =>
+ EdgeSet.add (Regs.reg_to_Reg (fst e), Regs.mreg_to_Reg (snd e), None) s)) in *.
+rewrite SetRegMreg.fold_1.
+set (f' := fun a e => f e a) in *.
+generalize SetRegMreg.elements_1. intro HH.
+generalize (HH (interf_reg_mreg g) (x,y) H). clear HH. intro HH.
+induction (SetRegMreg.elements (interf_reg_mreg g)). simpl.
+inversion HH.
+rewrite MEdgeFacts.fold_left_assoc.
+set (tmp := fold_left f' l EdgeSet.empty) in *.
+unfold f', f.
+inversion HH; subst.
+apply EdgeSet.add_1. destruct H1. simpl in *. subst. apply Edge.eq_refl.
+apply EdgeSet.add_2. apply IHl. auto.
+unfold f', f. intros.
+apply RegRegProps.add_add.
+
+unfold f', f. intros.
+apply RegRegProps.Dec.F.add_m. apply E.eq_refl. auto.
+Qed.
+
+Lemma regreg_IE_translation : forall x y,
+SetRegReg.In (x,y) (interf_reg_reg g) ->
+EdgeSet.In (Regs.P x,Regs.P y,None) (IE graph_translation).
+
+Proof.
+intros.
+unfold graph_translation. unfold IE. simpl.
+rewrite (edgemap_to_edgeset_charac _ _ _ _ sym_imap).
+apply set2map_charac_2.
+left. exists None.
+unfold interfgraph_interference_edges. apply EdgeSet.union_2.
+rewrite edge_comm. apply regreg_IE. auto.
+Qed.
+
+Lemma regmreg_IE_translation : forall x y,
+SetRegMreg.In (x,y) (interf_reg_mreg g) ->
+EdgeSet.In (Regs.P x,Regs.M y,None) (IE graph_translation).
+
+Proof.
+intros.
+unfold graph_translation. unfold IE. simpl.
+rewrite (edgemap_to_edgeset_charac _ _ _ _ sym_imap).
+apply set2map_charac_2.
+left. exists None.
+unfold interfgraph_interference_edges. apply EdgeSet.union_3.
+rewrite edge_comm. apply regmreg_IE. auto.
+Qed.
+
+End Translation. \ No newline at end of file