public new MachineNonDetermined RenameToNormalNames(string startsWith = null)
        {
            startsWith ??= "q";

            var renameDict = new Dictionary <State, State>();

            var buffer = new List <State> {
                InitialState
            };

            var n = 1;

            while (buffer.Any())
            {
                var currentNode = buffer[0];

                var nextStops = Transitions.Where(tr => Equals(tr.StartState, currentNode) && !buffer.Contains(tr.EndState) && !renameDict.Keys.Contains(tr.EndState)).Select(tr => tr.EndState).Distinct(new StatesComparer()).ToList();

                if (nextStops.Any())
                {
                    buffer.AddRange(nextStops);
                }

                buffer.Remove(currentNode);
                renameDict.Add(currentNode, new State($"{startsWith}{n}", currentNode.IsFinal));
                n++;
            }

            var renamedMachine = new MachineNonDetermined();

            renamedMachine.AddStateRange(renameDict.Values);
            renamedMachine.AddTransitionRange(Transitions.Select(transition => transition.ChangeStartState(renameDict[transition.StartState]).ChangeEndState(renameDict[transition.EndState])));
            renamedMachine.Init(renameDict[InitialState].Id);

            return(renamedMachine);
        }