/** Returns an APMonom representing the formula rooted at this node. Formula has to be in DNF. */
  public APMonom toMonom(APSet apset) throws PrismException {
    APMonom result = new APMonom(true);

    switch (kind) {
      case AND:
        {
          APMonom l = left.toMonom(apset);
          APMonom r = right.toMonom(apset);

          result = l.and(r);
          return result;
        }
      case NOT:
        switch (left.kind) {
          case AP:
            result.setValue(apset.indexOf(left.ap), false);
            return result;
          case FALSE:
            return new APMonom(true);
          case TRUE:
            return new APMonom(false);
          default:
            throw new PrismException("Formula not in DNF!");
        }
      case AP:
        result.setValue(apset.indexOf(ap), true);
        return result;
      case FALSE:
        return new APMonom(false);
      case TRUE:
        return new APMonom(true);
      default:
        throw new PrismException("Formula not in DNF!");
    }
  }