code: Term combine(final Term other) {
      if (this.bits.length != other.bits.length)
        return null;
      if (this.undefNum != other.undefNum)
        return null;
      int diffPosition = -1;
      for (int i = 0; i < this.bits.length; i++)
        if (this.bits[i] != other.bits[i]) {
          if (diffPosition != -1)
            return null;
          else
            diffPosition = i;
        }
      if (diffPosition == -1)
        return null;
      final Tristate[] newBits = Arrays.copyOf(this.bits, this.bits.length);
      newBits[diffPosition] = Tristate.UNDEF;
      final List<Formula> newMinterms = new ArrayList<>(this.minterms);
      newMinterms.addAll(other.minterms);
      return new Term(newBits, newMinterms);
    }
docs: Combines this term with another term if possible.  This is only possible if their bit vectors
  differ in exactly one position.  In this case a new term with the new bit vector and the
  combined minterms is returned.  If no union is possible, {@code null} is returned.
  @param other the other term
  @return a new combined term or {@code null} if not possible