Library GraphBasics.Sets




Require Export Omega.
Require Export Peano_dec.

Section U_SETS.

Variable U : Set.

Definition U_set := U Prop.

Axiom U_set_eq : E F : U_set, ( x : U, E x F x) E = F.

Lemma U_eq_set : E F : U_set, E = F x : U, E x F x.
Proof.
        intros; rewrite <- H; trivial.
Qed.

Lemma U_set_eq_commut : E F : U_set, E = F F = E.
Proof.
        auto.
Qed.

Lemma U_set_diff_commut : E F : U_set, E F F E.
Proof.
        intros; red in |- *; intros.
        elim H; apply U_set_eq_commut; trivial.
Qed.

Inductive Empty : U_set :=.

Inductive Full : U_set :=
    In_full : x : U, Full x.

Inductive Single (x : U) : U_set :=
    In_single : Single x x.

Lemma Single_equal : x y : U, Single x y x = y.
Proof.
        intros; inversion H; trivial.
Qed.

Lemma Single_equal_single : x y : U, Single x = Single y x = y.
Proof.
        intros; generalize (U_eq_set _ _ H x).
        intros; elim H0.
        trivial.

        apply In_single.
Qed.

Lemma Empty_nothing : x : U, ¬ Empty x.
Proof.
        tauto.
Qed.

Lemma U_set_diff : E F : U_set, ( x : U, E x ¬ F x) E F.
Proof.
        intros; red in |- *; intros.
        elim H; intros.
        elim H1; intros.
        elim H3; rewrite <- H0; auto.
Qed.

        Section INCLUSION.

Definition Included (E F : U_set) : Prop := x : U, E x F x.

Lemma Included_single :
  (E : U_set) (x : U), E x Included (Single x) E.
Proof.
        unfold Included in |- *; intros.
        inversion H0; rewrite <- H1; trivial.
Qed.

        End INCLUSION.

        Section UNION.

Inductive Union (E F : U_set) : U_set :=
  | In_left : x : U, E x Union E F x
  | In_right : x : U, F x Union E F x.

Lemma Union_eq :
  E F E' F' : U_set, E = E' F = F' Union E F = Union E' F'.
Proof.
        intros; elim H.
        elim H0; trivial.
Qed.

Lemma Union_neutral : e : U_set, Union Empty e = e.
Proof.
        intros; apply U_set_eq; split; intros.
        inversion H.
        inversion H0.

        trivial.

        apply In_right; trivial.
Qed.

Lemma Union_commut : e1 e2 : U_set, Union e1 e2 = Union e2 e1.
Proof.
        intros; apply U_set_eq; split; intros.
        inversion H; [ apply In_right | apply In_left ]; trivial.

        inversion H; [ apply In_right | apply In_left ]; trivial.
Qed.

Lemma Union_assoc :
  e1 e2 e3 : U_set, Union (Union e1 e2) e3 = Union e1 (Union e2 e3).
Proof.
        intros; apply U_set_eq; split; intros.
        inversion H.
        inversion H0.
        apply In_left; trivial.

        apply In_right; apply In_left; trivial.

        apply In_right; apply In_right; trivial.

        inversion H.
        apply In_left; apply In_left; trivial.

        inversion H0.
        apply In_left; apply In_right; trivial.

        apply In_right; trivial.
Qed.

Lemma Not_union :
  (E1 E2 : U_set) (x : U), ¬ E1 x ¬ E2 x ¬ Union E1 E2 x.
Proof.
        intros; red in |- *; intros.
        inversion H1.
        elim H; trivial.

        elim H0; trivial.
Qed.

Lemma Union_dec :
  (e1 e2 : U_set) (x : U),
 {e1 x} + {¬ e1 x} {e2 x} + {¬ e2 x} Union e1 e2 x {e1 x} + {e2 x}.
Proof.
        intros; case H.
        left; trivial.

        intros; case H0; intros.
        right; trivial.

        absurd (Union e1 e2 x).
        apply Not_union; trivial.

        trivial.
Qed.

Lemma Included_union : E F : U_set, Included E (Union E F).
Proof.
        unfold Included in |- *; intros.
        apply In_left; trivial.
Qed.

Lemma Union_absorb : E F : U_set, Included E F Union E F = F.
Proof.
        intros; apply U_set_eq; split; intros.
        inversion H0; auto.

        apply In_right; trivial.
Qed.

        End UNION.

        Section INTERSECTION.

Inductive Inter (E F : U_set) : U_set :=
    In_inter : x : U, E x F x Inter E F x.

Lemma Inter_eq :
  E F E' F' : U_set, E = E' F = F' Inter E F = Inter E' F'.
Proof.
        intros; elim H.
        elim H0; trivial.
Qed.

Lemma Inter_neutral : e : U_set, Inter Full e = e.
Proof.
        intros; apply U_set_eq; split; intros.
        inversion H; trivial.

        apply In_inter.
        apply In_full; trivial.

        trivial.
Qed.

Lemma Inter_empty : e : U_set, Inter e Empty = Empty.
Proof.
        intros; apply U_set_eq; split; intros.
        inversion H; trivial.

        inversion H.
Qed.

Lemma Inter_commut : e1 e2 : U_set, Inter e1 e2 = Inter e2 e1.
Proof.
        intros; apply U_set_eq; split; intros.
        inversion H; apply In_inter; trivial.

        inversion H; apply In_inter; trivial.
Qed.

Lemma Inter_assoc :
  e1 e2 e3 : U_set, Inter (Inter e1 e2) e3 = Inter e1 (Inter e2 e3).
Proof.
        intros; apply U_set_eq; split; intros.
        inversion H; inversion H0.
        apply In_inter; trivial.
        apply In_inter; trivial.

        inversion H; inversion H1.
        apply In_inter; trivial.
        apply In_inter; trivial.
Qed.

Lemma Not_inter : (E1 E2 : U_set) (x : U), ¬ E1 x ¬ Inter E1 E2 x.
Proof.
        intros; red in |- *; intros.
        inversion H0.
        elim H; trivial.
Qed.

Lemma Included_inter : E F : U_set, Included (Inter E F) E.
Proof.
        unfold Included in |- *; intros.
        inversion H; trivial.
Qed.

Lemma Inter_absorb : E F : U_set, Included E F Inter E F = E.
Proof.
        intros; apply U_set_eq; split; intros.
        inversion H0; auto.

        apply In_inter; auto.
Qed.

        End INTERSECTION.

        Section DIFFERENCE.

Inductive Differ (E F : U_set) : U_set :=
    In_differ : x : U, E x ¬ F x Differ E F x.

Lemma Differ_E_E : E : U_set, Differ E E = Empty.
Proof.
        intros; apply U_set_eq; split; intros.
        inversion H.
        absurd (E x); trivial.

        inversion H.
Qed.

Lemma Differ_empty : E : U_set, Differ E Empty = E.
Proof.
        intros; apply U_set_eq; split; intros.
        inversion H; trivial.

        apply In_differ.
        trivial.

        tauto.
Qed.

Lemma Union_differ_inter :
  E F : U_set,
 ( x : U, {F x} + {¬ F x}) Union (Differ E F) (Inter E F) = E.
Proof.
        intros; apply U_set_eq; split; intros.
        inversion H0.
        inversion H1; trivial.

        inversion H1; trivial.

        case (H x); intros.
        apply In_right; apply In_inter; trivial.

        apply In_left; apply In_differ; trivial.
Qed.

        End DIFFERENCE.

        Section MIXED_PROPERTIES.

Lemma Distributivity_inter_union :
  E F G : U_set, Inter E (Union F G) = Union (Inter E F) (Inter E G).
Proof.
        intros; apply U_set_eq; split; intros.
        inversion H; inversion H1.
        apply In_left; apply In_inter; auto.

        apply In_right; apply In_inter; auto.

        inversion H; inversion H0.
        apply In_inter.
        trivial.

        apply In_left; trivial.

        apply In_inter.
        trivial.

        apply In_right; trivial.
Qed.

Lemma Distributivity_union_inter :
  E F G : U_set, Union E (Inter F G) = Inter (Union E F) (Union E G).
Proof.
        intros; apply U_set_eq; split; intros.
        inversion H.
        apply In_inter; apply In_left; trivial.

        inversion H0; apply In_inter; apply In_right; trivial.

        inversion H.
        inversion H0.
        apply In_left; trivial.

        inversion H1.
        apply In_left; trivial.

        apply In_right; apply In_inter; trivial.
Qed.

Lemma Union_inversion :
  E F G : U_set,
 Inter E F = Empty Inter E G = Empty Union E F = Union E G F = G.
Proof.
        intros; apply U_set_eq; split; intros.
        generalize (In_right E F x H2).
        rewrite H1; intros.
        inversion H3.
        absurd (Inter E F x).
        rewrite H; tauto.

        apply In_inter; auto.

        trivial.

        generalize (In_right E G x H2).
        rewrite <- H1; intros.
        inversion H3.
        absurd (Inter E G x).
        rewrite H0; tauto.

        apply In_inter; auto.

        trivial.
Qed.

Lemma Union_inversion2 :
  E F G H : U_set,
 Inter E F = Empty
 Inter E G = Empty
 Inter G H = Empty Union E F = Union G H F = Union G (Inter F H).
Proof.
        intros; apply U_set_eq; split; intros.
        generalize (In_right E F x H4).
        rewrite H3; intros.
        inversion H5.
        apply In_left; trivial.

        apply In_right; apply In_inter; trivial.

        inversion H4.
        generalize (In_left G H x H5).
        rewrite <- H3; intros.
        inversion H7.
        absurd (Inter E G x).
        rewrite H1; tauto.

        apply In_inter; trivial.

        trivial.

        inversion H5; trivial.
Qed.

Lemma Single_disjoint :
  (x : U) (E : U_set), ¬ E x Inter (Single x) E = Empty.
Proof.
        intros; apply U_set_eq; split; intros.
        inversion H0.
        inversion H1; absurd (E x).
        trivial.

        rewrite H4; trivial.

        inversion H0.
Qed.

Lemma Single_single_disjoint :
  x y : U, x y Inter (Single x) (Single y) = Empty.
Proof.
        intros; apply Single_disjoint.
        red in |- *; intros H0; elim H; inversion H0; trivial.
Qed.

Lemma Union_single_single :
  (e : U_set) (x y : U),
 x y
 ¬ e y Union (Single x) (Single y) = Union (Single y) e e = Single x.
Proof.
        intros; symmetry in |- *; apply (Union_inversion (Single y)).
        apply Single_single_disjoint; auto.

        apply Single_disjoint; trivial.

        rewrite Union_commut; trivial.
Qed.

        End MIXED_PROPERTIES.

End U_SETS.