Definition partition_ss e ss :=
  SS.partition (fun s => S.mem e s) ss.Definition fst_ss (pair : SS.t * SS.t) :=
 match pair with
    |(a,b) => a
  end.Definition snd_ss (pair : SS.t * SS.t) :=
 match pair with
    |(a,b) => b
  end.Definition subst_in_set p1 p2 s := S.add p1 (S.remove p2 s).Definition subst_in_ss_aux p1 p2 := (fun s ss => SS.add (subst_in_set p1 p2 s) ss).Definition subst_in_ss p1 p2 ss :=
  let pair := partition_ss p2 ss in
  let fss := fst_ss(pair) in
  let sss := snd_ss(pair) in
  let newfss := SS.fold (subst_in_ss_aux p1 p2) fss SS.empty in
  SS.union newfss sss.

(* Specifications: *)
Lemma subst_ss_ok : forall (A B : COLTpoint) (H : A = B) pa pb ss (interp : positive -> COLTpoint), interp pa = A -> interp pb = B -> ss_ok ss interp -> ss_ok (subst_in_ss pa pb ss) interp.