public override string ToString()
        {
            long enumTimeout = 1500L;
            #region feedback components
            PDLEnumerator pdlEnumerator = new PDLEnumerator();
            PDLPred symmPhi = null;
            PDLPred underPhi = null;
            string posWitness = null;
            string negWitness = null;
            //If hint or solution try computing the description of the symmdiff
            if (level == FeedbackLevel.Hint || level == FeedbackLevel.Solution)
            {
                //Avoid formulas that are too complex
                var maxSize = 7;
                foreach (var phi1 in pdlEnumerator.SynthesizePDL(alphabet, symmetricDifference, solver, new StringBuilder(), enumTimeout))
                {
                    var sizePhi1 = phi1.GetFormulaSize();
                    if (sizePhi1 < maxSize && !phi1.IsComplex())
                    {
                        maxSize = sizePhi1;
                        symmPhi = phi1;
                    }
                }
            }
            //Avoid empty string case and particular string
            if (symmPhi is PDLEmptyString || symmPhi is PDLIsString)
                symmPhi = null;

            //If not minimal try computing and underapprox of symmdiff
            if (symmPhi == null && level != FeedbackLevel.Minimal)
            {
                //Avoid formulas that are too complex
                var minSize = 9;
                foreach (var phi2 in pdlEnumerator.SynthesizeUnderapproximationPDL(alphabet, symmetricDifference, solver, new StringBuilder(), enumTimeout))
                {
                    var formula = phi2.First;
                    var sizeForm = formula.GetFormulaSize();
                    if (sizeForm < minSize && !formula.IsComplex())
                    {
                        minSize = sizeForm;
                        underPhi = formula;
                    }

                    break;
                }
            }
            //Avoid empty string case and particular string
            if (underPhi is PDLEmptyString || underPhi is PDLIsString)
                underPhi = null;

            if (!positiveDifference.IsEmpty)
                posWitness = DFAUtilities.GenerateShortTerm(positiveDifference, solver);
            else
                negWitness = DFAUtilities.GenerateShortTerm(negativeDifference, solver);           
            #endregion

            string result = ""; //string.Format("U: {0}%. ", utility);
            if (symmPhi != null)
            {
                if (symmPhi is PDLEmptyString)
                    result += "Your solution does not behave correctly on the empty string";                
                else
                    result += string.Format("Your solution is not correct on this set of strings: <br /> <div align='center'>{0}</div>", PDLUtil.ToEnglishString(symmPhi));               
            }
            else
                if (underPhi != null)
                {
                    if (underPhi is PDLEmptyString)
                        result += "Your solution does not behave correctly on the empty string";         
                    else
                        result += string.Format("Your solution is not correct on this set of strings: <br /> <div align='center'>{0}</div>",
                                        PDLUtil.ToEnglishString(underPhi));                    
                }
                else
                {
                    if (posWitness != null)
                        result += string.Format("Your solution does not accept the {0} while the correct solution does.",
                                    posWitness != "" ? "string '<i>" + posWitness + "</i>'" : "empty string");
                    else
                        result += string.Format("Your solution accepts the {0} while the correct solution doesn't.",
                                    negWitness != "" ? "string '<i>" + negWitness + "</i>'" : "empty string");
                }
            return result;
        }
        //
        private void runUnderapproxTest(string testName)
        {
            PDLEnumerator pdlEnumerator = new PDLEnumerator();
            int printLimit = 10;

            CharSetSolver solver = new CharSetSolver(BitWidth.BV64);
            var dfa_al = ReadDFA(testName, solver);
            //PrintDFA(dfa_al.Second, "A", dfa_al.First);

            StringBuilder sb = new StringBuilder();

            int i = 0;
            foreach (var pair in pdlEnumerator.SynthesizeUnderapproximationPDL(dfa_al.First, dfa_al.Second, solver, sb, timeout))
            {
                i++;
                pair.First.ToString(sb);
                sb.AppendLine(" ### +"+pair.Second.ToString()+" ### +"+pair.First.GetFormulaSize());
                sb.AppendLine();
                if (i == printLimit)
                    break;
            }

            System.Console.WriteLine(sb);
        }