aboutsummaryrefslogtreecommitdiffstats
path: root/backend/Edges.v
diff options
context:
space:
mode:
Diffstat (limited to 'backend/Edges.v')
-rwxr-xr-xbackend/Edges.v411
1 files changed, 411 insertions, 0 deletions
diff --git a/backend/Edges.v b/backend/Edges.v
new file mode 100755
index 00000000..1b570454
--- /dev/null
+++ b/backend/Edges.v
@@ -0,0 +1,411 @@
+Require Import FSets.
+Require Import OrderedOption.
+Require Import ZArith.
+Require Import MyRegisters.
+
+(* Module of edges in a simple graph : there is never more
+ than one edge between two vertices *)
+
+Module Edge.
+
+Module Import Vertex := Regs.
+
+(* Definition of pair of vertices, to represent edges *)
+Module VertexPair := PairOrderedType Vertex Vertex.
+
+(* N_as_OT is the OrderedType with t := N,
+ to describe weights of edges *)
+Module OptionN_as_OT := OrderedOpt N_as_OT.
+
+(* An edge is finally a pair of endpoints and a weight *)
+Module E := PairOrderedType VertexPair OptionN_as_OT.
+
+(* Useful modules imports *)
+Module Import OTFacts := OrderedTypeFacts Vertex.
+Module OTPairFacts := OrderedTypeFacts VertexPair.
+Module OTEFacts := OrderedTypeFacts E.
+
+(* t is simply E.t *)
+Definition t := E.t.
+
+(* accessors to the edges, their endpoints and their weight *)
+Definition get_edge : t -> (Vertex.t*Vertex.t) := fun x => fst x.
+Definition fst_ext : t -> Vertex.t := fun x => fst (get_edge x).
+Definition snd_ext : t -> Vertex.t := fun x => snd (get_edge x).
+Definition get_weight : t -> option N := fun x => snd x.
+
+(* get_edge e is only the extremities of e *)
+Lemma get_edge_ext : forall e,
+get_edge e = (fst_ext e,snd_ext e).
+
+Proof.
+unfold fst_ext. unfold snd_ext. unfold get_edge.
+simpl. intro e. destruct (fst e);auto.
+Qed.
+
+(* An edge is the pair of vertices and a weight *)
+Lemma edge_edge_weight : forall e,
+e = (get_edge e, get_weight e).
+
+Proof.
+unfold get_edge. unfold get_weight.
+simpl. intro e. destruct e;auto.
+Qed.
+
+(* Expansion of an edge *)
+Lemma edge_eq : forall e,
+e = (fst_ext e, snd_ext e, get_weight e).
+
+Proof.
+intro e. unfold get_weight.
+destruct e. unfold fst_ext. unfold snd_ext. unfold get_edge. simpl.
+destruct p. auto.
+Qed.
+
+(* Equality does not depend on the order of endpoints, e.g
+ (x,y,w) is equal to (y,x,w) so we need to define ordered edges *)
+Definition ordered_edge e :=
+match (lt_dec (snd_ext e) (fst_ext e)) with
+|left _ => (snd_ext e, fst_ext e, get_weight e)
+|right _ => e
+end.
+
+(* Commutativity of ordered_edge*)
+Lemma ordered_edge_comm : forall x y o,
+E.eq (ordered_edge (x,y,o)) (ordered_edge (y,x,o)).
+
+Proof.
+unfold ordered_edge, snd_ext, fst_ext, get_edge. intros x y o. simpl.
+destruct (lt_dec y x);destruct (lt_dec x y).
+elim (lt_not_gt r r0).
+apply E.eq_refl.
+apply E.eq_refl.
+destruct (Vertex.compare x y).
+elim (n0 l).
+unfold E.eq. simpl. repeat split; auto.
+apply Vertex.eq_sym. auto.
+apply OptionN_as_OT.eq_refl.
+elim (n l).
+Qed.
+
+(* Definition of equality as equality of s *)
+Definition eq x y := E.eq (ordered_edge x) (ordered_edge y).
+
+(* The weak equality is the equality of their type (interference or preference)
+ and of their extremities, but not necessarily of their weight *)
+Definition weak_eq x y :=
+(Vertex.eq (fst_ext x) (fst_ext y) /\ Vertex.eq (snd_ext x) (snd_ext y)) \/
+(Vertex.eq (fst_ext x) (snd_ext y) /\ Vertex.eq (snd_ext x) (fst_ext y)).
+
+(* Two edges having equal extremities (in the right order) and equal weights
+ are equal *)
+Lemma eq_ordered_eq : forall x y,
+E.eq x y -> eq x y.
+
+Proof.
+unfold eq;unfold E.eq;intros x y H.
+unfold ordered_edge;unfold fst_ext;unfold snd_ext;unfold get_edge;simpl.
+destruct x as [x wx];destruct x as [x1 x2];
+destruct y as [y wy];destruct y as [y1 y2];simpl in *.
+destruct (lt_dec x2 x1); destruct (lt_dec y2 y1);simpl in *.
+intuition.
+destruct H as [H HH];destruct H as [H H0].
+elim n. apply eq_lt with (y := x2).
+ apply Vertex.eq_sym;assumption.
+ apply lt_eq with (y := x1);assumption.
+destruct H as [H HH];destruct H as [H H0].
+elim n. apply eq_lt with (y := y2).
+ assumption.
+ apply lt_eq with (y := y1); auto. apply Regs.eq_sym. auto.
+assumption.
+Qed.
+
+(* Definition of lt as the lexicographic order on endpoints
+ of the edges, after ordering *)
+Definition lt x y := VertexPair.lt (get_edge (ordered_edge x)) (get_edge (ordered_edge y)) \/
+ (VertexPair.eq (get_edge (ordered_edge x)) (get_edge (ordered_edge y)) /\
+ OptionN_as_OT.lt (get_weight x) (get_weight y)).
+
+Lemma eq_refl : forall x, eq x x.
+
+Proof.
+unfold eq;unfold E.eq.
+repeat split;[apply Vertex.eq_refl|apply Vertex.eq_refl|apply OptionN_as_OT.eq_refl].
+Qed.
+
+Lemma eq_sym : forall x y, eq x y -> eq y x.
+
+Proof.
+unfold eq;unfold E.eq;intros x y H. intuition.
+apply Regs.eq_sym. auto.
+apply Regs.eq_sym. auto.
+apply OptionN_as_OT.eq_sym;assumption.
+Qed.
+
+Lemma eq_trans : forall x y z, eq x y -> eq y z -> eq x z.
+
+Proof.
+unfold eq;intros x y z H H0.
+apply (E.eq_trans _ _ _ H H0).
+Qed.
+
+Lemma lt_trans : forall x y z, lt x y -> lt y z -> lt x z.
+
+Proof.
+unfold lt;unfold get_edge;unfold ordered_edge;intros x y z H H0.
+destruct (lt_dec (snd_ext x) (fst_ext x));simpl in *.
+destruct (lt_dec (snd_ext y) (fst_ext y));simpl in *.
+destruct (lt_dec (snd_ext z) (fst_ext z));simpl in *.
+destruct H;destruct H0.
+left;apply (VertexPair.lt_trans _ _ _ H H0).
+left;apply OTPairFacts.lt_eq with (y := (snd_ext y, fst_ext y));simpl.
+unfold VertexPair.lt in H;simpl in H;assumption.
+destruct H0 as [H0 HH0].
+unfold VertexPair.eq in H0;assumption.
+left;apply OTPairFacts.eq_lt with (y := (snd_ext y, fst_ext y));simpl.
+destruct H as [H HH].
+unfold VertexPair.eq in H;unfold VertexPair.lt in H0;
+simpl in H0;assumption.
+unfold VertexPair.lt in H0;simpl in H0;assumption.
+right;destruct H as [H HH];destruct H0 as [H0 HH0];split.
+apply (VertexPair.eq_trans _ _ _ H H0).
+apply (OptionN_as_OT.lt_trans _ _ _ HH HH0).
+destruct H;destruct H0.
+left;apply (VertexPair.lt_trans _ _ _ H H0).
+left;apply OTPairFacts.lt_eq with (y := (snd_ext y, fst_ext y));simpl.
+unfold VertexPair.lt in H;simpl in H;assumption.
+destruct H0 as [H0 HH0].
+unfold VertexPair.eq in H0;assumption.
+left;apply OTPairFacts.eq_lt with (y := (snd_ext y, fst_ext y));simpl.
+destruct H as [H HH].
+unfold VertexPair.eq in H;unfold VertexPair.lt in H0;
+simpl in H0;assumption.
+unfold VertexPair.lt in H0;simpl in H0;assumption.
+right;destruct H as [H HH];destruct H0 as [H0 HH0];split.
+apply (VertexPair.eq_trans _ _ _ H H0).
+apply (OptionN_as_OT.lt_trans _ _ _ HH HH0).
+destruct (lt_dec (snd_ext y) (fst_ext y));simpl in *.
+elim (n r0).
+destruct (lt_dec (snd_ext z) (fst_ext z));simpl in *.
+destruct H;destruct H0.
+left;apply (VertexPair.lt_trans _ _ _ H H0).
+left;apply OTPairFacts.lt_eq with (y := (fst y));simpl.
+unfold VertexPair.lt in H;simpl in H;assumption.
+destruct H0 as [H0 HH0].
+unfold VertexPair.eq in H0;assumption.
+left;apply OTPairFacts.eq_lt with (y := (fst y));simpl.
+destruct H as [H HH].
+unfold VertexPair.eq in H;unfold VertexPair.lt in H0;
+simpl in H0;assumption.
+unfold VertexPair.lt in H0;simpl in H0;assumption.
+right;destruct H as [H HH];destruct H0 as [H0 HH0];split.
+apply (VertexPair.eq_trans _ _ _ H H0).
+apply (OptionN_as_OT.lt_trans _ _ _ HH HH0).
+destruct H;destruct H0.
+left;apply (VertexPair.lt_trans _ _ _ H H0).
+left;apply OTPairFacts.lt_eq with (y := (fst y));simpl.
+unfold VertexPair.lt in H;simpl in H;assumption.
+destruct H0 as [H0 HH0].
+unfold VertexPair.eq in H0;assumption.
+left;apply OTPairFacts.eq_lt with (y := (fst y));simpl.
+destruct H as [H HH].
+unfold VertexPair.eq in H;unfold VertexPair.lt in H0;
+simpl in H0;assumption.
+unfold VertexPair.lt in H0;simpl in H0;assumption.
+right;destruct H as [H HH];destruct H0 as [H0 HH0];split.
+apply (VertexPair.eq_trans _ _ _ H H0).
+apply (OptionN_as_OT.lt_trans _ _ _ HH HH0).
+destruct (lt_dec (snd_ext y) (fst_ext y));simpl in *.
+destruct (lt_dec (snd_ext z) (fst_ext z));simpl in *.
+destruct H;destruct H0.
+left;apply (VertexPair.lt_trans _ _ _ H H0).
+left;apply OTPairFacts.lt_eq with (y := (snd_ext y, fst_ext y));simpl.
+unfold VertexPair.lt in H;simpl in H;assumption.
+destruct H0 as [H0 HH0].
+unfold VertexPair.eq in H0;assumption.
+left;apply OTPairFacts.eq_lt with (y := (snd_ext y,fst_ext y));simpl.
+destruct H as [H HH].
+unfold VertexPair.eq in H;unfold VertexPair.lt in H0;
+simpl in H0;assumption.
+unfold VertexPair.lt in H0;simpl in H0;assumption.
+right;destruct H as [H HH];destruct H0 as [H0 HH0];split.
+apply (VertexPair.eq_trans _ _ _ H H0).
+apply (OptionN_as_OT.lt_trans _ _ _ HH HH0).
+destruct H;destruct H0.
+left;apply (VertexPair.lt_trans _ _ _ H H0).
+left;apply OTPairFacts.lt_eq with (y := (snd_ext y,fst_ext y));simpl.
+unfold VertexPair.lt in H;simpl in H;assumption.
+destruct H0 as [H0 HH0].
+unfold VertexPair.eq in H0;assumption.
+left;apply OTPairFacts.eq_lt with (y := (snd_ext y, fst_ext y));simpl.
+destruct H as [H HH].
+unfold VertexPair.eq in H;unfold VertexPair.lt in H0;
+simpl in H0;assumption.
+unfold VertexPair.lt in H0;simpl in H0;assumption.
+right;destruct H as [H HH];destruct H0 as [H0 HH0];split.
+apply (VertexPair.eq_trans _ _ _ H H0).
+apply (OptionN_as_OT.lt_trans _ _ _ HH HH0).
+destruct (lt_dec (snd_ext y) (fst_ext y));simpl in *.
+elim (n0 r).
+destruct (lt_dec (snd_ext z) (fst_ext z));simpl in *.
+destruct H;destruct H0.
+left;apply (VertexPair.lt_trans _ _ _ H H0).
+left;apply OTPairFacts.lt_eq with (y := (fst y));simpl.
+unfold VertexPair.lt in H;simpl in H;assumption.
+destruct H0 as [H0 HH0].
+unfold VertexPair.eq in H0;assumption.
+left;apply OTPairFacts.eq_lt with (y := (fst y));simpl.
+destruct H as [H HH].
+unfold VertexPair.eq in H;unfold VertexPair.lt in H0;
+simpl in H0;assumption.
+unfold VertexPair.lt in H0;simpl in H0;assumption.
+right;destruct H as [H HH];destruct H0 as [H0 HH0];split.
+apply (VertexPair.eq_trans _ _ _ H H0).
+apply (OptionN_as_OT.lt_trans _ _ _ HH HH0).
+destruct H;destruct H0.
+left;apply (VertexPair.lt_trans _ _ _ H H0).
+left;apply OTPairFacts.lt_eq with (y := (fst y));simpl.
+unfold VertexPair.lt in H;simpl in H;assumption.
+destruct H0 as [H0 HH0].
+unfold VertexPair.eq in H0;assumption.
+left;apply OTPairFacts.eq_lt with (y := (fst y));simpl.
+destruct H as [H HH].
+unfold VertexPair.eq in H;unfold VertexPair.lt in H0;
+simpl in H0;assumption.
+unfold VertexPair.lt in H0;simpl in H0;assumption.
+right;destruct H as [H HH];destruct H0 as [H0 HH0];split.
+apply (VertexPair.eq_trans _ _ _ H H0).
+apply (OptionN_as_OT.lt_trans _ _ _ HH HH0).
+Qed.
+
+Lemma weight_ordered_weight : forall x,
+get_weight x = get_weight (ordered_edge x).
+
+Proof.
+intro x;unfold ordered_edge;unfold get_weight;simpl.
+destruct (lt_dec (snd_ext x) (fst_ext x));simpl;reflexivity.
+Qed.
+
+Lemma lt_not_eq : forall x y, lt x y -> ~eq x y.
+
+Proof.
+unfold lt;unfold eq;unfold E.eq;intros x y H.
+destruct H.
+generalize (VertexPair.lt_not_eq _ _ H);intro H0.
+unfold VertexPair.eq in H0.
+intro H1; elim H0.
+destruct H1 as [H1 H2].
+unfold get_edge;assumption.
+destruct H as [H H0].
+unfold VertexPair.eq in H.
+unfold get_edge in H.
+intro H1.
+destruct H1 as [H1 HH1].
+elim (OptionN_as_OT.lt_not_eq _ _ H0).
+rewrite (weight_ordered_weight x).
+rewrite (weight_ordered_weight y).
+unfold get_weight;assumption.
+Qed.
+
+Lemma compare : forall x y, Compare lt eq x y.
+
+Proof.
+intros x y.
+destruct (OTEFacts.lt_dec (ordered_edge x) (ordered_edge y)).
+apply LT.
+unfold lt;unfold get_edge;unfold VertexPair.lt;
+unfold VertexPair.eq.
+rewrite (weight_ordered_weight x).
+rewrite (weight_ordered_weight y).
+unfold get_weight.
+destruct (ordered_edge x) as [ex wx];destruct ex as [ex1 ex2];
+destruct (ordered_edge y) as [ey wy];destruct ey as [ey1 ey2];simpl in *.
+assumption.
+destruct (OTEFacts.eq_dec (ordered_edge x) (ordered_edge y)).
+apply EQ.
+unfold eq.
+destruct (ordered_edge x) as [ex wx];destruct ex as [ex1 ex2];
+destruct (ordered_edge y) as [ey wy];destruct ey as [ey1 ey2];simpl in *.
+destruct a as [H H0];destruct H as [H H1].
+unfold E.eq;auto.
+apply GT.
+generalize (OTEFacts.le_neq n n0);intro H.
+unfold lt;unfold get_edge;unfold VertexPair.lt;
+unfold VertexPair.eq.
+rewrite (weight_ordered_weight x).
+rewrite (weight_ordered_weight y).
+unfold get_weight.
+destruct (ordered_edge x) as [ex wx];destruct ex as [ex1 ex2];
+destruct (ordered_edge y) as [ey wy];destruct ey as [ey1 ey2];simpl in *.
+assumption.
+Qed.
+
+(* Edges commutativity *)
+Lemma edge_comm : forall x y o, eq (x,y,o) (y,x,o).
+
+Proof.
+unfold eq;apply ordered_edge_comm.
+Qed.
+
+(* Definition of affinity edges *)
+Definition aff_edge x := exists w, get_weight x = Some w.
+
+(* Definition of interference edges *)
+Definition interf_edge x := get_weight x = None.
+
+(* An edge is incident to a vertex iff this vertex is an endpoint of the edge *)
+Definition incident e x := Vertex.eq x (fst_ext e) \/ Vertex.eq x (snd_ext e).
+
+(* An edge is incident to a vertex, or is not *)
+Lemma incident_dec : forall e x,
+incident e x \/ ~incident e x.
+
+Proof.
+intros e x.
+destruct (eq_dec x (fst_ext e)).
+left;unfold incident;left;assumption.
+destruct (eq_dec x (snd_ext e)).
+left;unfold incident;right;assumption.
+right;unfold incident;intro Heq.
+destruct Heq;[elim (n H)|elim (n0 H)].
+Qed.
+
+(* Definition redirect : redirect x y e replaces the extremity x of the edge e
+ with y, if e is incident to x *)
+Definition redirect x y e :=
+match eq_dec (fst_ext e) x with
+|left _ => (y, snd_ext e, get_weight e)
+|right _ => match eq_dec (snd_ext e) x with
+ | left _ => (fst_ext e, y, get_weight e)
+ | right _ => e
+ end
+end.
+
+(* Decidable equality over edges *)
+Lemma eq_dec : forall x y, {eq x y}+{~eq x y}.
+
+Proof.
+intros x y.
+destruct (compare x y).
+right. apply lt_not_eq. assumption.
+left. assumption.
+right. intro H. generalize (eq_sym _ _ H). intro H0. elim (lt_not_eq _ _ l H0).
+Qed.
+
+(* Equality of edges implies constraints of their endpoints *)
+Lemma eq_charac : forall x y,
+eq x y -> (Vertex.eq (fst_ext x) (fst_ext y) /\ Vertex.eq (snd_ext x) (snd_ext y)) \/
+ (Vertex.eq (fst_ext x) (snd_ext y) /\ Vertex.eq (snd_ext x) (fst_ext y)).
+
+Proof.
+intros x y H;unfold eq in H;unfold ordered_edge in H;
+unfold get_edge in H.
+destruct (lt_dec (snd_ext x) (fst_ext x));
+destruct (lt_dec (snd_ext y) (fst_ext y));
+unfold E.eq in H;simpl in H;intuition.
+Qed.
+
+Definition same_type e e' := (aff_edge e /\ aff_edge e') \/
+ (interf_edge e /\ interf_edge e').
+
+End Edge. \ No newline at end of file