Basic properties of relations


Require Import Vbase List Relations Classical.
Set Implicit Arguments.

Definitions of relations

Definition immediate X (rel : relation X) (a b: X) :=
  rel a b ∧ (∀ c (R1: rel a c) (R2: rel c b), False).

Definition irreflexive X (rel : relation X) := ∀ x, rel x x → False.

Definition acyclic X (rel : relation X) := irreflexive (clos_trans X rel).

Definition is_total X (cond: X → Prop) (rel: relation X) :=
  ∀ a (IWa: cond a)
         b (IWb: cond b) (NEQ: a ≠ b),
    rel a b ∨ rel b a.

Definition restr_subset X (cond: X → Prop) (rel rel': relation X) :=
  ∀ a (IWa: cond a)
         b (IWb: cond b) (REL: rel a b),
    rel' a b.

Definition restr_rel X (cond : X → Prop) (rel : relation X) : relation X :=
  fun a b ⇒ rel a b ∧ cond a ∧ cond b.

Definition restr_eq_rel A B (f : A → B) rel x y :=
  rel x y ∧ f x = f y.

Definition upward_closed (X: Type) (rel: relation X) (P: X → Prop) :=
  ∀ x y (REL: rel x y) (POST: P y), P x.

Definition max_elt (X: Type) (rel: relation X) (a: X) :=
  ∀ b (REL: rel a b), False.

Notation "r 'UNION1' ( a , b )" :=
  (fun x y ⇒ x = a ∧ y = b ∨ r x y) (at level 100).

Notation "a <-→ b" := (same_relation _ a b) (at level 110).

Very basic properties of relations

Lemma clos_trans_mon A (r r' : relation A) a b :
  clos_trans A r a b →
  (∀ a b, r a b → r' a b) →
  clos_trans A r' a b.

Lemma clos_refl_trans_mon A (r r' : relation A) a b :
  clos_refl_trans A r a b →
  (∀ a b, r a b → r' a b) →
  clos_refl_trans A r' a b.

Lemma clos_refl_transE A r a b :
  clos_refl_trans A r a b ↔ a = b ∨ clos_trans A r a b.

Lemma clos_trans_in_rt A r a b :
  clos_trans A r a b → clos_refl_trans A r a b.

Lemma rt_t_trans A r a b c :
  clos_refl_trans A r a b → clos_trans A r b c → clos_trans A r a c.

Lemma t_rt_trans A r a b c :
  clos_trans A r a b → clos_refl_trans A r b c → clos_trans A r a c.

Lemma t_step_rt A R x y :
  clos_trans A R x y ↔ ∃ z, R x z ∧ clos_refl_trans A R z y.

Lemma t_rt_step A R x y :
  clos_trans A R x y ↔ ∃ z, clos_refl_trans A R x z ∧ R z y.

Lemma clos_trans_of_transitive A R (T: transitive A R) x y :
  clos_trans A R x y → R x y.

Lemma clos_trans_eq :
  ∀ X (rel: relation X) Y (f : X → Y)
         (H: ∀ a b (SB: rel a b), f a = f b) a b
         (C: clos_trans _ rel a b),
    f a = f b.

Lemma trans_irr_acyclic :
  ∀ A R, irreflexive R → transitive A R → acyclic R.

Lemma restr_rel_trans :
  ∀ X dom rel, transitive X rel → transitive X (restr_rel dom rel).

Lemma clos_trans_of_clos_trans1 :
  ∀ X rel1 rel2 x y,
    clos_trans X (fun a b ⇒ clos_trans _ rel1 a b ∨ rel2 a b) x y ↔
    clos_trans X (fun a b ⇒ rel1 a b ∨ rel2 a b) x y.

Lemma upward_clos_trans:
  ∀ X (rel: X → X → Prop) P,
    upward_closed rel P → upward_closed (clos_trans _ rel) P.

Lemma max_elt_clos_trans:
  ∀ X rel a b
         (hmax: max_elt rel a)
         (hclos: clos_trans X rel a b),
    False.

Lemma is_total_restr :
  ∀ X (dom : X → Prop) rel,
    is_total dom rel →
    is_total dom (restr_rel dom rel).

Lemma clos_trans_restrD :
  ∀ X rel f x y, clos_trans X (restr_rel f rel) x y → f x ∧ f y.

Lemma clos_trans_restr_eqD :
  ∀ A rel B (f: A → B) x y, clos_trans _ (restr_eq_rel f rel) x y → f x = f y.

Lemma irreflexive_inclusion:
  ∀ X (R1 R2: relation X),
  inclusion X R1 R2 →
  irreflexive R2 →
  irreflexive R1.

Lemma clos_trans_inclusion:
  ∀ X (R: relation X),
  inclusion X R (clos_trans X R).

Lemma clos_trans_inclusion_clos_refl_trans:
  ∀ X (R: relation X),
  inclusion X (clos_trans X R) (clos_refl_trans X R).

Lemma clos_trans_monotonic:
  ∀ X (R1 R2: relation X),
  inclusion X R1 R2 →
  inclusion X (clos_trans X R1) (clos_trans X R2).

Set up setoid rewriting

Require Import Setoid.

Lemma same_relation_refl: ∀ A, reflexive _ (same_relation A).

Lemma same_relation_sym: ∀ A, symmetric _ (same_relation A).

Lemma same_relation_trans: ∀ A, transitive _ (same_relation A).

Add Parametric Relation (X : Type) : (relation X) (same_relation X)
 reflexivity proved by (@same_relation_refl X)
 symmetry proved by (@same_relation_sym X)
 transitivity proved by (@same_relation_trans X)
 as same_rel.

Add Parametric Morphism X : (@union X) with
  signature (@same_relation X) ⇒ (@same_relation X) ⇒ (@same_relation X) as union_mor.

Add Parametric Morphism X P : (@restr_rel X P) with
  signature (@same_relation X) ⇒ (@same_relation X) as restr_rel_mor.

Add Parametric Morphism X : (@clos_trans X) with
  signature (@same_relation X) ⇒ (@same_relation X) as clos_trans_mor.

Add Parametric Morphism X : (@clos_refl_trans X) with
  signature (@same_relation X) ⇒ (@same_relation X) as clos_relf_trans_mor.

Add Parametric Morphism X : (@irreflexive X) with
  signature (@same_relation X) ⇒ iff as irreflexive_mor.

Add Parametric Morphism X : (@acyclic X) with
  signature (@same_relation X) ⇒ iff as acyclic_mor.

Lemma same_relation_restr X (f : X → Prop) rel rel' :
   (∀ x (CONDx: f x) y (CONDy: f y), rel x y ↔ rel' x y) →
   (restr_rel f rel <-→ restr_rel f rel').

Lemma union_restr X f rel rel' :
  union X (restr_rel f rel) (restr_rel f rel')
  <-→ restr_rel f (union _ rel rel').

Lemma clos_trans_restr X f rel (UC: upward_closed rel f) :
  clos_trans X (restr_rel f rel)
  <-→ restr_rel f (clos_trans _ rel).

Lemmas about cycles


Lemma path_decomp_u1 X (rel : relation X) a b c d :
  clos_trans X (rel UNION1 (a, b)) c d →
  clos_trans X rel c d ∨
  clos_refl_trans X rel c a ∧ clos_refl_trans X rel b d.

Lemma cycle_decomp_u1 X (rel : relation X) a b c :
  clos_trans X (rel UNION1 (a, b)) c c →
  clos_trans X rel c c ∨ clos_refl_trans X rel b a.

Lemma path_decomp_u_total :
  ∀ X rel1 dom rel2 (T: is_total dom rel2)
    (D: ∀ a b (REL: rel2 a b), dom a ∧ dom b) x y
    (C: clos_trans X (fun a b ⇒ rel1 a b ∨ rel2 a b) x y),
    clos_trans X rel1 x y ∨
    (∃ m n,
      clos_refl_trans X rel1 x m ∧ clos_trans X rel2 m n ∧ clos_refl_trans X rel1 n y) ∨
    (∃ m n,
      clos_refl_trans X rel1 m n ∧ clos_trans X rel2 n m).

Lemma cycle_decomp_u_total :
  ∀ X rel1 dom rel2 (T: is_total dom rel2)
    (D: ∀ a b (REL: rel2 a b), dom a ∧ dom b) x
    (C: clos_trans X (fun a b ⇒ rel1 a b ∨ rel2 a b) x x),
    clos_trans X rel1 x x ∨
    (∃ m n, clos_refl_trans X rel1 m n ∧ clos_trans X rel2 n m).

Lemma clos_trans_disj_rel :
  ∀ X (rel rel' : relation X)
    (DISJ: ∀ x y (R: rel x y) z (R': rel' y z), False) x y
    (R: clos_trans _ rel x y) z
    (R': clos_trans _ rel' y z),
    False.

Lemma path_decomp_u_1 :
  ∀ X (rel rel' : relation X)
    (DISJ: ∀ x y (R: rel x y) z (R': rel' y z), False) x y
    (T: clos_trans X (union X rel rel') x y),
    clos_trans _ rel x y ∨ clos_trans _ rel' x y
    ∨ ∃ z, clos_trans _ rel' x z ∧ clos_trans _ rel z y.

Lemma cycle_decomp_u_1 :
  ∀ X (rel rel' : relation X)
    (DISJ: ∀ x y (R: rel x y) z (R': rel' y z), False) x
    (T: clos_trans X (union X rel rel') x x),
    clos_trans _ rel x x ∨ clos_trans _ rel' x x.

Lemma cycle_disj :
  ∀ X (rel : relation X)
    (DISJ: ∀ x y (R: rel x y) z (R': rel y z), False) x
    (T: clos_trans X rel x x), False.

Lemma clos_trans_restr_trans_mid :
  ∀ X (rel rel' : relation X) f x y
    (A : clos_trans _ (restr_rel f (fun x y ⇒ rel x y ∨ rel' x y)) x y)
    z (B : rel y z) w
    (C : clos_trans _ (restr_rel f (fun x y ⇒ rel x y ∨ rel' x y)) z w),
    clos_trans _ (restr_rel f (fun x y ⇒ rel x y ∨ rel' x y)) x w.

Lemma clos_trans_restr_trans_cycle :
  ∀ X (rel rel' : relation X) f x y
    (A : clos_trans _ (restr_rel f (fun x y ⇒ rel x y ∨ rel' x y)) x y)
    (B : rel y x),
    clos_trans _ (restr_rel f (fun x y ⇒ rel x y ∨ rel' x y)) x x.

Lemma restr_eq_union :
  ∀ X (rel rel' : relation X) B (f: X → B) x y
         (R: ∀ x y, rel' x y → f x = f y),
   restr_eq_rel f (fun x y ⇒ rel x y ∨ rel' x y) x y ↔
   restr_eq_rel f rel x y ∨ rel' x y.

Lemma clos_trans_restr_eq_union :
  ∀ X (rel rel' : relation X) B (f: X → B)
         (R: ∀ x y, rel' x y → f x = f y),
   clos_trans _ (restr_eq_rel f (fun x y ⇒ rel x y ∨ rel' x y)) <-→
   clos_trans _ (fun x y ⇒ restr_eq_rel f rel x y ∨ rel' x y).

Lemma acyclic_mon X (rel rel' : relation X) :
  acyclic rel → inclusion _ rel' rel → acyclic rel'.

Extension of a partial order to a total order

Section one_extension.

  Variable X : Type.
  Variable elem : X.
  Variable rel : relation X.

  Definition one_ext : relation X :=
    fun x y ⇒
      clos_trans _ rel x y
      ∨ clos_refl_trans _ rel x elem ∧ ¬ clos_refl_trans _ rel y elem.

  Lemma one_ext_extends x y : rel x y → one_ext x y.

  Lemma one_ext_trans : transitive _ one_ext.

  Lemma one_ext_irr : acyclic rel → irreflexive one_ext.

  Lemma one_ext_total_elem :
    ∀ x, x ≠ elem → one_ext elem x ∨ one_ext x elem.

End one_extension.

Fixpoint tot_ext X (dom : list X) (rel : relation X) : relation X :=
  match dom with
    | nil ⇒ clos_trans _ rel
    | x::l ⇒ one_ext x (tot_ext l rel)
  end.

Lemma tot_ext_extends :
  ∀ X dom (rel : relation X) x y, rel x y → tot_ext dom rel x y.

Lemma tot_ext_trans : ∀ X dom rel, transitive X (tot_ext dom rel).

Lemma tot_ext_irr :
  ∀ X (dom : list X) rel, acyclic rel → irreflexive (tot_ext dom rel).

Lemma tot_ext_total :
  ∀ X (dom : list X) rel, is_total (fun x ⇒ In x dom) (tot_ext dom rel).

Lemma tot_ext_inv :
  ∀ X dom rel (x y : X),
    acyclic rel → tot_ext dom rel x y → ¬ rel y x.

Misc properties

Lemma clos_trans_imm :
  ∀ X (R : relation X) (I: irreflexive R)
         (T: transitive _ R) L (ND: NoDup L) a b
         (D: ∀ c, R a c → R c b → In c L)
         (REL: R a b),
    clos_trans _ (immediate R) a b.

Remove duplicate list elements (classical)

Require Import extralib.

Fixpoint undup A dec (l: list A) :=
  match l with nil ⇒ nil
    | x :: l ⇒
      if In_dec dec x l then undup dec l else x :: undup dec l
  end.

Lemma In_undup X dec (x: X) l : In x (undup dec l) ↔ In x l.

Lemma NoDup_undup X dec (l : list X) : NoDup (undup dec l).

Lemma clos_trans_imm2 :
  ∀ X (dec : ∀ x y : X, {x = y} + {x ≠ y})
         (R : relation X) (I: irreflexive R)
         (T: transitive _ R) L a b
         (D: ∀ c, R a c → R c b → In c L)
         (REL: R a b),
    clos_trans _ (immediate R) a b.

Lemma total_immediate_unique:
  ∀ X (eq_X_dec: ∀ (x y: X), {x=y} + {x≠y}) (rel: X → X → Prop) (P: X → Prop)
         (Tot: is_total P rel)
         a b c (pa: P a) (pb: P b) (pc: P c)
         (iac: immediate rel a c)
         (ibc: immediate rel b c),
    a = b.


This page has been generated by coqdoc