public CompoundFormula ToCNF2()
 {
     if (IsSimpleFormula())
         return this;
     if (IsCNF())
         return this;
     if (IsSimpleDisjunction())
     {
         CompoundFormula cfAnd = new CompoundFormula("and");
         cfAnd.AddOperand(this);
         return cfAnd;
     }
     bool bChanged = true;
     CompoundFormula cfRevised = new CompoundFormula(Operator);
     List<CompoundFormula> lSimpleOneOf = new List<CompoundFormula>();
     foreach (Formula f in Operands)
     {
         if (f is CompoundFormula)
         {
             CompoundFormula cf = (CompoundFormula)f;
             if (cf.IsSimpleOneOf())
                 lSimpleOneOf.Add(cf);
             else
                 cfRevised.AddOperand(((CompoundFormula)f).RemoveOneof(out bChanged));
         }
         else
             cfRevised.AddOperand(f);
     }
     cfRevised = (CompoundFormula)cfRevised.Simplify();
     bChanged = true;
     while (bChanged)
     {
         bChanged = false;
         cfRevised = (CompoundFormula)cfRevised.RemoveNestedConjunction(out bChanged);
     }
     /*
     if (cfRevised.Operator != "and")
     {
         CompoundFormula cfAnd = new CompoundFormula("and");
         cfAnd.AddOperand(cfRevised);
         cfRevised = cfAnd;
     }
      */
     foreach (CompoundFormula cf in lSimpleOneOf)
         cfRevised.AddOperand(cf);
     Debug.Assert(cfRevised.IsCNF());
     return cfRevised;
 }