Local Open Scope IPC_scope.
Module RelationDef.
Section RelationDef.
Context {A: Type}.
Section Intersection.
Variables R1 R2: relation A.
Definition intersection x y := R1 x y /\ R2 x y.
End Intersection.
Arguments union {A} R1 R2 x y /.
Arguments intersection R1 R2 x y /.
Variables R eqA: relation A.
Class Total: Prop :=
totality: forall x y, R x y \/ R y x.
Class StrictTotal: Prop :=
strict_totality: forall x y, R x y \/ x = y \/ R y x.
Class StrictTotalViaEquiv: Prop :=
strict_totality_via_equiv: forall x y, R x y \/ eqA x y \/ R y x.
Class Antisymmetric: Prop :=
antisymmetry: forall x y, R x y -> R y x -> x = y.
Class AntisymViaEquiv: Prop :=
antisymmetry_via_equiv: forall x y, R x y -> R y x -> eqA x y.
Class IrreflViaEquiv: Prop :=
irreflexivity_via_equiv: forall x y, eqA x y -> R x y -> False.
Class WeakTotalOrder: Prop := {
WeakTotalOrder_Reflexive: Reflexive R;
WeakTotalOrder_Transitive: Transitive R;
WeakTotalOrder_Total: Total
}.
Class TotalOrder: Prop := {
TotalOrder_Reflexive: Reflexive R;
TotalOrder_Antisymmetric: Antisymmetric;
TotalOrder_Transitive: Transitive R;
TotalOrder_Total: Total
}.
Class StrictTotalOrder: Prop := {
StrictTotalOrder_Irreflexive: Irreflexive R;
StrictTotalOrder_Transitive: Transitive R;
StrictTotalOrder_StrictTotal: StrictTotal
}.
Class StrictTotalOrderViaEquiv: Prop := {
StrictTotalOrderViaEquiv_EqIsEquiv: Equivalence eqA;
StrictTotalOrderViaEquiv_IrreflViaEquiv: IrreflViaEquiv;
StrictTotalOrderViaEquiv_Transitive: Transitive R;
StrictTotalOrderViaEquiv_StrictTotal: StrictTotalViaEquiv
}.
Class StrictWellOrder: Prop := {
StrictWellOrder_StrictTotalOrder: StrictTotalOrder;
StrictWellOrder_WellFounded: well_founded R
}.
End RelationDef.

Lemma Irreflexive_is_IrreflViaEquiv:
forall {A} (R: relation A),
Irreflexive R <-> IrreflViaEquiv R eq.