let unify_substs ~(recompute: bool) ?(p_preserving: bool = false)
  (first: subst) (second: subst) : subst =

  if not recompute && p_preserving then
    UnificationPPreserving.unify_substs first second

  else if not recompute && not p_preserving then
    Unification_Preserving.unify_substs first second

  else if recompute && p_preserving then
    UnificationRPPreserving.unify_substs first second

  else (*if recompute && not p_preserving then*)
    Unification_RPreserving.unify_substs first second