Definition intersection x y := R1 x y /\ R2 x y.Class Total: Prop :=
  totality: forall x y, R x y \/ R y x.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 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 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 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 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 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 WeakTotalOrder: Prop := {
  WeakTotalOrder_Reflexive: Reflexive R;
  WeakTotalOrder_Transitive: Transitive R;
  WeakTotalOrder_Total: Total
}.Class WeakTotalOrder: Prop := {
  WeakTotalOrder_Reflexive: Reflexive R;
  WeakTotalOrder_Transitive: Transitive R;
  WeakTotalOrder_Total: Total
}.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 TotalOrder: Prop := {
  TotalOrder_Reflexive: Reflexive R;
  TotalOrder_Antisymmetric: Antisymmetric;
  TotalOrder_Transitive: Transitive R;
  TotalOrder_Total: Total
}.Class TotalOrder: Prop := {
  TotalOrder_Reflexive: Reflexive R;
  TotalOrder_Antisymmetric: Antisymmetric;
  TotalOrder_Transitive: Transitive R;
  TotalOrder_Total: Total
}.Class TotalOrder: Prop := {
  TotalOrder_Reflexive: Reflexive R;
  TotalOrder_Antisymmetric: Antisymmetric;
  TotalOrder_Transitive: Transitive R;
  TotalOrder_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 StrictTotalOrder: Prop := {
  StrictTotalOrder_Irreflexive: Irreflexive R;
  StrictTotalOrder_Transitive: Transitive R;
  StrictTotalOrder_StrictTotal: StrictTotal
}.Class StrictTotalOrder: Prop := {
  StrictTotalOrder_Irreflexive: Irreflexive R;
  StrictTotalOrder_Transitive: Transitive R;
  StrictTotalOrder_StrictTotal: StrictTotal
}.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 StrictTotalOrderViaEquiv: Prop := {
  StrictTotalOrderViaEquiv_EqIsEquiv: Equivalence eqA;
  StrictTotalOrderViaEquiv_IrreflViaEquiv: IrreflViaEquiv;
  StrictTotalOrderViaEquiv_Transitive: Transitive R;
  StrictTotalOrderViaEquiv_StrictTotal: StrictTotalViaEquiv
}.Class StrictTotalOrderViaEquiv: Prop := {
  StrictTotalOrderViaEquiv_EqIsEquiv: Equivalence eqA;
  StrictTotalOrderViaEquiv_IrreflViaEquiv: IrreflViaEquiv;
  StrictTotalOrderViaEquiv_Transitive: Transitive R;
  StrictTotalOrderViaEquiv_StrictTotal: StrictTotalViaEquiv
}.Class StrictTotalOrderViaEquiv: Prop := {
  StrictTotalOrderViaEquiv_EqIsEquiv: Equivalence eqA;
  StrictTotalOrderViaEquiv_IrreflViaEquiv: IrreflViaEquiv;
  StrictTotalOrderViaEquiv_Transitive: Transitive R;
  StrictTotalOrderViaEquiv_StrictTotal: StrictTotalViaEquiv
}.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
}.Class StrictWellOrder: Prop := {
  StrictWellOrder_StrictTotalOrder: StrictTotalOrder;
  StrictWellOrder_WellFounded: well_founded R
}.Class StrictWellOrder: Prop := {
  StrictWellOrder_StrictTotalOrder: StrictTotalOrder;
  StrictWellOrder_WellFounded: well_founded R
}.

(* Specifications: *)
Lemma Irreflexive_is_IrreflViaEquiv: forall {A} (R: relation A), Irreflexive R <-> IrreflViaEquiv R eq.
Lemma disjointed_3cases: forall x y, (R x y /\ ~ eqA x y /\ ~ R y x) \/ (~ R x y /\ eqA x y /\ ~ R y x) \/ (~ R x y /\ ~ eqA x y /\ R y x).
Lemma LeftProperViaEquiv: forall x x0 y, eqA x x0 -> R x y -> R x0 y.
Lemma RightProperViaEquiv: forall x y y0, eqA y0 y -> R x y -> R x y0.