let match_substs ~(recompute:bool) ?(p_preserving: bool = false)
  (more_general_offset: int) (first: subst) (second: subst) : subst =

  if not recompute && p_preserving then
    UnificationPPreserving.match_substs more_general_offset first second

  else if not recompute && not p_preserving then
    Unification_Preserving.match_substs more_general_offset first second

  else if recompute && p_preserving then
    UnificationRPPreserving.match_substs more_general_offset first second

  else
    Unification_RPreserving.match_substs more_general_offset first second