code: public Formula implication(final Formula left, final Formula right) {
      if (left.type() == FALSE || right.type() == TRUE)
        return this.verum();
      if (left.type() == TRUE)
        return right;
      if (right.type() == FALSE)
        return this.not(left);
      if (left.equals(right))
        return this.verum();
      final Pair<Formula, Formula> key = new Pair<>(left, right);
      Implication implication = this.implications.get(key);
      if (implication == null) {
        implication = new Implication(left, right, this);
        this.implications.put(key, implication);
      }
      return implication;
    }
docs: Creates a new implication.
  @param left  the left-hand side operand
  @param right the right-hand side operand
  @return a new implication