Module VSM := VSM.Module CCS := CCSound VSM.Local Notation "'inter'" := (@andp _).Definition reflexivity_resolution (d : clause) l0 : list clause :=
  match d with
  | PureClause (Eqv u v :: neg) pos _ _ =>
    if expr_eq u v then mkPureClause neg pos :: l0 else l0
  | _ => l0
  end.Definition ordered_factoring (c : clause) l0 : list clause :=
  match c with
  | PureClause nil (Eqv s t :: Eqv u v :: pos) _ _ =>
    if pure_atom_eq (Eqv s t) (Eqv u v)
    then mkPureClause nil (insert_uniq pure_atom_cmp
              (norm_pure_atom (Eqv s t)) pos)
                     :: l0
    else l0
  | _ => l0
  end.Definition positive_superposition (c d : clause) l0 : list clause :=
  match c, d with
  (* positive (right) superposition *)
  | PureClause neg (Eqv (Var s0 as s) t :: pos) _ _,
           PureClause neg' (Eqv (Var s'0 as s') v :: pos') _ _ =>
    if expr_eq s s' && expr_lt t s && expr_lt v s' &&
       pure_atom_gt1 (Eqv s t) pos && pure_atom_gt1 (Eqv s' v) pos' &&
       pure_atom_gt (Eqv s t) (Eqv s' v) &&
       greater_than_all s0 neg && greater_than_all s'0 neg'
    then mkPureClause
      (merge pure_atom_cmp neg neg')
      (insu_atm (norm_pure_atom (Eqv t v)) (merge pure_atom_cmp pos pos')) :: l0
    else l0
  | _, _ => l0
  end.Definition negative_superposition (c d : clause) l0 : list clause :=
  match c, d with
  (* negative (left) superposition *)
  | PureClause (Eqv s' v :: neg') pos' _ _,
        PureClause neg (Eqv (Var s0 as s) t :: pos) _ _ =>
    if expr_eq s s' && expr_lt t s && expr_lt v s' &&
       pure_atom_gt1 (Eqv s t) pos && greater_than_all s0 neg
    then mkPureClause
      (insu_atm (norm_pure_atom (Eqv t v)) (merge pure_atom_cmp neg neg'))
      (merge pure_atom_cmp pos pos') :: l0
    else l0
  | _, _ => l0
  end.

Lemma demodulate_sound c d s : clause_denote c s -> clause_denote d s -> clause_denote (demodulate c d) s.