code: private Optional<InjectiveVar2VarSubstitution> computeRenamingSubstitution(
              DistinctVariableOnlyDataAtom sourceProjectionAtom,
              DistinctVariableOnlyDataAtom targetProjectionAtom) {
  
          int arity = sourceProjectionAtom.getEffectiveArity();
  
          if (!sourceProjectionAtom.getPredicate().equals(targetProjectionAtom.getPredicate())
                  || (arity != targetProjectionAtom.getEffectiveArity())) {
              return Optional.empty();
          }
          else {
              ImmutableMap<Variable, Variable> newMap = FunctionalTools.zip(
                      sourceProjectionAtom.getArguments(),
                      targetProjectionAtom.getArguments()).stream()
                      .distinct()
                      .filter(e -> !e.getKey().equals(e.getValue()))
                      .collect(ImmutableCollectors.toMap());
  
              return Optional.of(substitutionFactory.getInjectiveVar2VarSubstitution(newMap));
          }
      }
docs: When such substitution DO NOT EXIST, returns an EMPTY OPTIONAL.
  When NO renaming is NEEDED returns an EMPTY SUBSTITUTION.