code: private LiftingStepResults convertIntoLiftingStepResults(
              ImmutableList<IQTree> liftedChildren, IQTree selectedGrandChild, int selectedChildPosition,
              Optional<ImmutableExpression> newCondition, ImmutableSubstitution<ImmutableTerm> ascendingSubstitution,
              ImmutableSubstitution<? extends VariableOrGroundTerm> descendingSubstitution) {
          ImmutableList<IQTree> newChildren = IntStream.range(0, liftedChildren.size())
                  .boxed()
                  .map(i -> i == selectedChildPosition
                          ? selectedGrandChild.applyDescendingSubstitution(descendingSubstitution, newCondition)
                          : liftedChildren.get(i).applyDescendingSubstitution(descendingSubstitution, newCondition))
                  .collect(ImmutableCollectors.toList());
  
          return new LiftingStepResults(ascendingSubstitution, newChildren, newCondition, false);
      }
docs: TODO: should we try to preserve the children order?