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; }