private List <Pair <PDLPred, long> > SynthTimer(PDLPred phi, HashSet <char> al, StringBuilder sb)
        {
            PDLEnumerator pdlEnumerator = new PDLEnumerator();

            var       solver = new CharSetSolver(BitWidth.BV64);
            Stopwatch sw     = new Stopwatch();
            var       dfa    = phi.GetDFA(al, solver);

            List <Pair <PDLPred, long> > predList = new List <Pair <PDLPred, long> >();
            List <PDLPred> phiList = new List <PDLPred>();

            PDLPred v;
            var     func = new Func <PDLPred>(() =>
            {
                sw.Start();
                foreach (var p in pdlEnumerator.SynthesizePDL(al, dfa, solver, new StringBuilder(), 5000))
                {
                    sw.Stop();
                    predList.Add(new Pair <PDLPred, long>(p, sw.ElapsedMilliseconds));
                    sw.Start();
                }
                return(null);
            });


            var test = TryExecute(func, timeout, out v);

            phi.ToString(sb);
            sb.AppendLine();
            sb.AppendLine("=");
            foreach (var pair in predList)
            {
                sb.AppendLine();
                pair.First.ToString(sb);
                sb.AppendLine();
                sb.AppendLine("Elapsed Time: " + pair.Second + " ms");
            }
            return(predList);
        }
        private List <Pair <int, Pair <PDLPred, long> > > SynthTimer(PDLPred phi, HashSet <char> al, StringBuilder sb)
        {
            PDLEnumerator pdlEnumerator = new PDLEnumerator();
            var           solver        = new CharSetSolver(BitWidth.BV64);
            Stopwatch     sw            = new Stopwatch();
            var           dfa           = DFAUtilities.normalizeDFA(phi.GetDFA(al, solver)).First;

            List <Pair <int, Pair <PDLPred, long> > > predList = new List <Pair <int, Pair <PDLPred, long> > >();
            List <PDLPred> phiList = new List <PDLPred>();

            PDLPred v;
            var     func = new Func <PDLPred>(() =>
            {
                foreach (var state in dfa.States)
                {
                    var dfaSt = Automaton <BDD> .Create(dfa.InitialState, new int[] { state }, dfa.GetMoves());
                    dfaSt     = dfaSt.Determinize(solver).Minimize(solver);
                    sw.Reset();
                    sw.Start();
                    foreach (var p in pdlEnumerator.SynthesizePDL(al, dfaSt, solver, new StringBuilder(), 3000))
                    {
                        sw.Stop();
                        predList.Add(new Pair <int, Pair <PDLPred, long> >(state, new Pair <PDLPred, long>(p, sw.ElapsedMilliseconds)));
                        break;
                    }
                }
                return(null);
            });


            var test = TryExecute(func, timeout, out v);

            sb.Append("Language: ");
            phi.ToString(sb);
            sb.AppendLine();
            //sb.AppendLine("States: "+dfa.StateCount);
            sb.AppendLine();
            sb.AppendLine("---------------------------");
            sb.AppendLine("STATE SUMMARY");
            sb.AppendLine("---------------------------");
            var coveredStates = new HashSet <int>();

            foreach (var pair in predList)
            {
                sb.AppendLine();
                coveredStates.Add(pair.First);
                sb.AppendLine("State " + pair.First + (((dfa.GetFinalStates()).Contains(pair.First))?(" is final"):("")));
                sb.AppendLine("Elapsed Time: " + pair.Second.Second + " ms");
                sb.AppendLine("Formula: ");
                pair.Second.First.ToString(sb);
                sb.AppendLine();
            }
            sb.AppendLine();
            foreach (var state in dfa.States)
            {
                if (!coveredStates.Contains(state))
                {
                    sb.AppendLine(string.Format("description for state {0} not found", state));
                }
            }
            return(predList);
        }