Library GraphBasics.Acyclic
Require Export Paths.
Section ACYCLIC.
Inductive Acyclic : V_set → A_set → Set :=
| AC_empty : Acyclic V_empty A_empty
| AC_vertex :
∀ (v : V_set) (a : A_set) (ac : Acyclic v a) (x : Vertex),
¬ v x → Acyclic (V_union (V_single x) v) a
| AC_leaf :
∀ (v : V_set) (a : A_set) (ac : Acyclic v a) (x y : Vertex),
v x →
¬ v y → Acyclic (V_union (V_single y) v) (A_union (E_set x y) a)
| AC_eq :
∀ (v v' : V_set) (a a' : A_set),
v = v' → a = a' → Acyclic v a → Acyclic v' a'.
Lemma Acyclic_Isa_Graph :
∀ (v : V_set) (a : A_set), Acyclic v a → Graph v a.
Proof.
intros a v ac; elim ac; intros.
apply G_empty.
apply G_vertex; trivial.
apply G_edge.
apply G_vertex; trivial.
apply V_in_right; trivial.
apply V_in_left; apply V_in_single.
red in |- *; intros Heq; elim n; rewrite <- Heq; trivial.
red in |- *; intros; elim n; apply (G_ina_inv2 v0 a0 H x y); trivial.
red in |- *; intros; elim n; apply (G_ina_inv1 v0 a0 H y x); trivial.
apply G_eq with (v := v0) (a := a0); trivial.
Defined.
Lemma AC_ina_inv1 :
∀ (v : V_set) (a : A_set) (x y : Vertex),
Acyclic v a → a (A_ends x y) → v x.
Proof.
intros v a x y ac H;
apply (G_ina_inv1 v a (Acyclic_Isa_Graph v a ac) x y);
trivial.
Qed.
Lemma AC_ina_inv2 :
∀ (v : V_set) (a : A_set) (x y : Vertex),
Acyclic v a → a (A_ends x y) → v y.
Proof.
intros v a x y ac H;
apply (G_ina_inv2 v a (Acyclic_Isa_Graph v a ac) x y);
trivial.
Qed.
End ACYCLIC.
Section ACYCLIC_AND_DEGREES.
Remark AC_vertex_isolated :
∀ (v : V_set) (a : A_set) (x : Vertex),
Acyclic v a →
¬ v x →
Acyclic (V_union (V_single x) v) a → ∀ y : Vertex, ¬ a (A_ends x y).
Proof.
intros; red in |- *; intros.
elim H0; apply (AC_ina_inv1 v a x y); trivial.
Qed.
Lemma AC_vertex_degree_zero :
∀ (v : V_set) (a : A_set) (ac : Acyclic v a) (x : Vertex) (Hn : ¬ v x),
degree x (V_union (V_single x) v) a
(Acyclic_Isa_Graph (V_union (V_single x) v) a (AC_vertex v a ac x Hn)) = 0.
Proof.
intros; apply Degree_isolated; unfold isolated in |- ×.
red in |- *; intros; elim Hn.
apply AC_ina_inv1 with (a := a) (y := y); trivial.
Qed.
Remark AC_edge_pendant :
∀ (v : V_set) (a : A_set) (x y : Vertex),
Acyclic v a →
v x →
¬ v y →
Acyclic (V_union (V_single y) v) (A_union (E_set x y) a) →
∀ z : Vertex, A_union (E_set x y) a (A_ends z y) → z = x.
Proof.
intros; inversion H3.
inversion H4; trivial.
absurd (v y).
trivial.
apply (AC_ina_inv2 v a z y); trivial.
Qed.
Lemma AC_edge_degree_one :
∀ (v : V_set) (a : A_set) (ac : Acyclic v a)
(x y : Vertex) (Hp : v x) (Hn : ¬ v y),
degree y (V_union (V_single y) v) (A_union (E_set x y) a)
(Acyclic_Isa_Graph (V_union (V_single y) v) (A_union (E_set x y) a)
(AC_leaf v a ac x y Hp Hn)) = 1.
Proof.
intros; apply Degree_pendant; unfold pendant in |- ×.
split with x.
apply A_in_left; apply E_left.
intros; inversion H.
inversion H0; trivial.
absurd (v y).
trivial.
apply AC_ina_inv1 with (a := a) (y := z); trivial.
Qed.
Remark one_le_one : ∀ n : nat, n = 1 → n ≤ 1.
Proof.
intros; omega.
Qed.
Lemma Acyclic_no_cycle :
∀ (v : V_set) (a : A_set) (Ac : Acyclic v a)
(x y : Vertex) (vl : V_list) (el : E_list) (p : Path v a x y vl el),
Cycle v a x y vl el p → vl = V_nil.
Proof.
intros v a Ac; elim Ac; intros.
inversion p.
trivial.
inversion H2.
case (V_in_dec x (x0 :: vl)); intros.
apply
(Path_degree_zero_nil (V_union (V_single x) v0) a0
(Acyclic_Isa_Graph (V_union (V_single x) v0) a0
(AC_vertex v0 a0 ac x n)) x0 y vl el p).
split with x.
trivial.
apply AC_vertex_degree_zero.
cut (Path v0 a0 x0 y vl el); intros.
apply (H _ _ _ _ H1); intros.
apply H0.
apply Path_supergraph_cons_vertex with (z := x).
trivial.
red in |- *; intros; elim n0; simpl in |- *; auto.
red in |- *; intros; elim n0; simpl in |- *; auto.
case (V_in_dec y (x0 :: vl)); intros.
apply
(Cycle_degree_one_nil (V_union (V_single y) v0)
(A_union (E_set x y) a0)
(Acyclic_Isa_Graph (V_union (V_single y) v0)
(A_union (E_set x y) a0) (AC_leaf v0 a0 ac x y v1 n)) x0 y0 vl
el p H0).
split with y.
trivial.
apply one_le_one.
apply AC_edge_degree_one.
cut (Path v0 a0 x0 y0 vl el); intros.
apply (H _ _ _ _ H1).
apply H0.
apply Path_supergraph_cons_arc with (x' := x) (y' := y).
apply Path_supergraph_cons_vertex with (z := y).
trivial.
red in |- *; intros; elim n0; simpl in |- *; auto.
red in |- *; intros; elim n0; simpl in |- *; auto.
red in |- *; intros; elim n0;
apply (P_inxyel_inyvl _ _ _ _ _ _ p x y);
trivial.
red in |- *; intros; elim n0;
apply (P_inxyel_inxvl _ _ _ _ _ _ p y x);
trivial.
generalize H; rewrite e; rewrite e0; intros.
apply (H1 _ _ _ _ p H0).
Qed.
End ACYCLIC_AND_DEGREES.
