let diff s1 s2 =
  let empty = copy empty in
  fold
    (fun x (y, rho) acc ->
       match is_equal s2 x y with
         | Some _ -> 
             acc
         | None -> 
             union acc (x, y, rho);
             acc)
    s1 empty