internal override Automaton <BDD> getDFA(List <string> variables, BDD alphabet, CharSetSolver solver)
        {
            var aut1 = left.getDFA(variables, alphabet, solver);
            var aut2 = right.getDFA(variables, alphabet, solver);

            return(aut1.Union(aut2, solver).Determinize(solver).Minimize(solver));
        }
        internal override Automaton <BDD> getDFA(List <string> variables, BDD alphabet, CharSetSolver solver)
        {
            //Create condition that only considerst bv of size |variables|
            var trueBv = solver.MkSetFromRange(0, (uint)(Math.Pow(2, variables.Count + 7) - 1), variables.Count + 7 - 1);
            var moves  = new Move <BDD>[] { new Move <BDD>(0, 0, trueBv) };

            //True automaton and then difference
            var trueAut = Automaton <BDD> .Create(0, new int[] { 0 }, moves);

            var aut = phi.getDFA(variables, alphabet, solver);

            return(trueAut.Minus(aut, solver).Determinize(solver).Minimize(solver));
        }
        internal override Automaton <BDD> getDFA(List <string> variables, BDD alphabet, CharSetSolver solver)
        {
            //Automaton<BDD> for formula
            var varCopy = new List <string>(variables);

            varCopy.Insert(0, variable);
            var autPhi = phi.getDFA(varCopy, alphabet, solver);

            //Remove first bit from each move
            var newMoves = new List <Move <BDD> >();

            foreach (var move in autPhi.GetMoves())
            {
                var newCond = solver.LShiftRight(move.Label);
                newMoves.Add(new Move <BDD>(move.SourceState, move.TargetState, newCond));
            }

            var dfanew = Automaton <BDD> .Create(autPhi.InitialState, autPhi.GetFinalStates(), newMoves).Determinize(solver);

            var dfamin = dfanew.Minimize(solver);

            return(dfamin);
        }