code: private Formula distribute(final Formula f1, final Formula f2) {
      if (this.handler != null)
        this.proceed = this.handler.performedDistribution();
      if (this.proceed) {
        final FormulaFactory f = f1.factory();
        if (f1.type() == FType.OR || f2.type() == FType.OR) {
          final LinkedHashSet<Formula> nops = new LinkedHashSet<>();
          for (final Formula op : f1.type() == FType.OR ? f1 : f2) {
            final Formula distribute = this.distribute(op, f1.type() == FType.OR ? f2 : f1);
            if (!this.proceed)
              return null;
            nops.add(distribute);
          }
          return f.or(nops);
        }
        final Formula clause = f.and(f1, f2);
        if (this.handler != null)
          proceed = this.handler.createdClause(clause);
        return clause;
      }
      return null;
    }
docs: Computes the distribution (factorization) of two formulas.
  @param f1 the first formula
  @param f2 the second formula
  @return the distribution of the two formulas