code: @Override
      public final IQTree applyDescendingSubstitution(
              ImmutableSubstitution<? extends VariableOrGroundTerm> descendingSubstitution,
              Optional<ImmutableExpression> constraint) {
          try {
              return iqTreeTools.normalizeDescendingSubstitution(this, descendingSubstitution)
                      .map(this::applyDescendingSubstitutionWithoutOptimizing)
                      .orElse(this);
          } catch (IQTreeTools.UnsatisfiableDescendingSubstitutionException e) {
              return iqFactory.createEmptyNode(iqTreeTools.computeNewProjectedVariables(descendingSubstitution, getVariables()));
          }
      }
docs: NB: the constraint is irrelevant here