let unify e1 e2 =
    let r1 = repr e1 and r2 = repr e2 in
    if Elem.equal r1 r2 then ()
    else
      (* Start with preference as defined by function [prefer]. *)
      let pref = Elem.prefer r1 r2 in
      let k1 = rank r1 and k2 = rank r2 in
      if pref < 0 then
        begin
          ElemTable.replace table r2 r1;
          if k1 <= k2 then ElemTable.replace ranks r1 (k2 + 1)
        end
      else if pref > 0 then
        begin
          ElemTable.replace table r1 r2;
          if k2 <= k1 then ElemTable.replace ranks r2 (k1 + 1)
        end
      else
        (* If no definite preference, resolve to classical ranking. *)
        if k1 < k2 then
          ElemTable.replace table r1 r2
        else if k2 < k1 then
          ElemTable.replace table r2 r1
        else
          begin
            ElemTable.replace table r1 r2;
            ElemTable.replace ranks r2 (k2 + 1)
          end