/// <summary> /// Gera o fecho transitivo de um determinado estado. Realiza as inserções no hash. /// </summary> /// <param name="state">Estado do fecho transitivo</param> /// <param name="transictionList">Lista dos possíveis valores para a transição de estados</param> /// <param name="nullSymbol">Símbolo representando do nulo/vazio dos automatos</param> /// <param name="hash">Hash dos fechos já criados</param> /// <returns>Fecho transitivo do estado</returns> private static PowerSet <T, E> GeneratePowerSet(State <T, E> state, List <E> transictionList, E nullSymbol, Dictionary <State <T, E>, PowerSet <T, E> > hash) { PowerSet <T, E> powerSet = new PowerSet <T, E>(state); //List<State<T, E>> reachableState = state.ReachableStatesBy(nullSymbol); hash.Add(state, powerSet); //Itera sobre a lista de terminais foreach (E value in transictionList) { //Verifica se não é o valor nulo if (!value.Equals(nullSymbol)) { //Busca o estado que é alcançável a partir do terminal value List <State <T, E> > reachable = state.ReachableStatesBy(value, nullSymbol); if (reachable != null) { if (reachable.Count > 1) { //Adiciona transições de estados com recursão if (!reachable[0].StateValue.Equals(reachable[1].StateValue)) { powerSet.AddTransictionToPowerSet(value, reachable[0]); powerSet.AddTransictionToPowerSet(value, reachable[1]); } } else { //Adiciona transição no valor para o estaddo powerSet.AddTransictionToPowerSet(value, reachable[0]); } } } } //Itera sobre os estados que não contém fecho e os gera foreach (StateTransiction <T, E> transiction in powerSet.Transictions) { State <T, E> nextState = transiction.NextState; if (!hash.ContainsKey(nextState)) { GeneratePowerSet(nextState, transictionList, nullSymbol, hash); } } return(powerSet); }