private boolean applyDerivedVariablesEquivalence(@NotNull DfaValue left, @NotNull DfaValue right) {
    return StreamEx.of(left, right).flatCollection(val -> val.getDfType().getDerivedVariables())
      .allMatch(field -> {
        DfaValue leftValue = field.createValue(myFactory, left);
        DfaValue rightValue = field.createValue(myFactory, right);
        DfType leftType = getDfType(leftValue);
        DfType rightType = getDfType(rightValue);
        // Values participated in comparison are incompatible, but could be both null
        if (leftType == DfType.BOTTOM || rightType == DfType.BOTTOM) return true;
        DfType result = leftType.meet(rightType);
        if (!result.hasNonStandardEquivalence() && !applyRelation(leftValue, rightValue, false)) {
          return false;
        }
        return meetDfType(leftValue, result) && meetDfType(rightValue, result);
      });
  }
private boolean applyDerivedVariablesEquivalence(@NotNull DfaValue left, @NotNull DfaValue right)