(* Here we specialize the termination proof to the redundancy relation used in, e.g., Nieuwenhuis and Rubio, "Paramodulation-based theorem proving". *)
Section Ordered.
Variable clause: finType.
(* The entailment relation should satisfy the following two properties. *)
Variable entails: {set clause} -> clause -> bool.
(* entails is closed under set union *)
Variable entailsU:
forall c s1 s2,
entails s1 c -> entails (s1 :|: s2) c.
(* entails satisfies a sort of "cut" property *)
Variable entailsT:
forall c d s1 s2,
entails s2 d -> entails (d |: s1) c -> entails (s1 :|: s2) c.
Notation clauseset := ({set clause}).
(* define an ord instance for the clause type *)
Definition clause_ordMixin := [fin_ordMixin of clause].
Canonical Structure clause_ordType := OrdType clause clause_ordMixin.
Definition smaller_than (s: clauseset) (c: clause) := [set d in s | ord d c].
(* c is redundant in S when {d in S | d < c} |= c *)
Definition redund (s: clauseset) (c: clause) := entails (smaller_than s c) c.

(* Specifications: *)
Lemma redundU c s1 s2 : redund s1 c -> redund (s1 :|: s2) c.
Lemma redundU2 c s : redund (c |: s) c -> redund s c.
Lemma redundD c c2 s : redund s c -> redund s c2 -> redund (s :\ c2) c.
Definition Trans := TRANS.Make entailsU redundU redundU2 redundD.