public EstadoAFD cerradura(Estado estadoAFN) { EstadoAFD estadoAFD = new EstadoAFD(contadorEstado); estadoAFD.getEstadosAFN().Add(estadoAFN); if (estadoAFN.isEstAceptacion()) { estadoAFD.setAceptacion(true); } for (int j = 0; j < estadoAFD.getEstadosAFN().Count(); j++) { for (int i = 0; i < estadoAFD.getEstadosAFN()[j].getListTrans().Count(); i++) { if (estadoAFD.getEstadosAFN()[j].getListTrans()[i].getSimbolo().Equals("ep")) { estadoAFD.getEstadosAFN().Add(estadoAFD.getEstadosAFN()[j].getListTrans()[i].getFinal()); if (estadoAFD.getEstadosAFN()[j].getListTrans()[i].getFinal().isEstAceptacion()) { estadoAFD.setAceptacion(true); } } } } Console.WriteLine("cerradura de: "+ estadoAFN.getNumero()); Console.WriteLine("\n"); for (int i = 0; i < estadoAFD.getEstadosAFN().Count(); i++) { Console.Write(estadoAFD.getEstadosAFN()[i].getNumero() + ", "); } Console.WriteLine("\n"); Console.WriteLine("Estado "+ estadoAFD.getNombre()); contadorEstado++; return estadoAFD; }
public List<Estado> mueve(EstadoAFD estadoAFD, String terminal) { List<Estado> estadosAFN = new List<Estado>(); for(int i = 0; i < estadoAFD.getEstadosAFN().Count(); i++) { for(int j = 0; j < estadoAFD.getEstadosAFN()[i].getListTrans().Count(); j++) { if (estadoAFD.getEstadosAFN()[i].getListTrans()[j].getSimbolo().Equals(terminal)) { estadosAFN.Add(estadoAFD.getEstadosAFN()[i].getListTrans()[j].getFinal()); } } } if(estadosAFN.Count() > 0) { TransicionAFD transicion = new TransicionAFD(estadoAFD, null, terminal); transiciones.Add(transicion); } Console.WriteLine("mueve de " + estadoAFD.getNombre() + " con " + terminal); for(int i = 0; i < estadosAFN.Count(); i++) { Console.Write(estadosAFN[i].getNumero() + ", "); } Console.WriteLine(); return estadosAFN; }
public void generarAFD(List<Estado> estados, List<String> terminales) { listaEstadosAFD = new List<EstadoAFD>(); transiciones = new List<TransicionAFD>(); Estado inicial = obtenerEstadoInicial(estados); listaEstadosAFD.Add(cerradura(inicial)); listaEstadosAFD[listaEstadosAFD.Count() - 1].setInicial(true); for(int j = 0; j < listaEstadosAFD.Count(); j++) { for (int i = 0; i < terminales.Count(); i++) { List<Estado> estadosAFN = mueve(listaEstadosAFD[j], terminales[i]); if(estadosAFN.Count() > 0) { EstadoAFD estadoAFD = cerradura(estadosAFN); if (!estadoAFD.isAgregado()) { listaEstadosAFD.Add(estadoAFD); estadoAFD.setAgregado(true); /* for(int t = 0; t<estadoAFD.getEstadosAFN().Count(); t++) { Console.Write(estadoAFD.getEstadosAFN()[t].getNumero()+", "); }*/ } } } } String grafo = generarCodigoGraphviz(); generarImagenGraphviz(grafo, "afd"+contadorImagen); llenarTransicionesPorEstado(); String tabla = generarCodigoGraphvizTT(terminales); generarImagenGraphviz(tabla, "tt" + contadorImagen); contadorImagen++; /* List<Estado> estadosAFN = mueve(estadoAFD, terminales[0]); EstadoAFD estadoAFD2 = cerradura(estadosAFN); List<Estado> estadosAFN = mueve(estadoAFD, terminales[1]); EstadoAFD estadoAFD3 = cerradura(estadosAFN); List<Estado> estadosAFN = mueve(estadoAFD2, terminales[0]); EstadoAFD estadoAFD4 = cerradura(estadosAFN); List<Estado> estadosAFN = mueve(estadoAFD2, terminales[1]); EstadoAFD estadoAFD5 = cerradura(estadosAFN);*/ }
public EstadoAFD cerradura(List<Estado> estadosAFN) { int contador = 0; EstadoAFD estadoAFD = new EstadoAFD(contadorEstado); for(int k = 0; k < estadosAFN.Count(); k++) { estadoAFD.getEstadosAFN().Add(estadosAFN[k]); if (estadosAFN[k].isEstAceptacion()) { estadoAFD.setAceptacion(true); } for(int j = contador; j < estadoAFD.getEstadosAFN().Count(); j=contador) { for(int i = 0; i < estadoAFD.getEstadosAFN()[j].getListTrans().Count(); i++) { if (estadoAFD.getEstadosAFN()[j].getListTrans()[i].getSimbolo().Equals("ep")) { estadoAFD.getEstadosAFN().Add(estadoAFD.getEstadosAFN()[j].getListTrans()[i].getFinal()); if (estadoAFD.getEstadosAFN()[j].getListTrans()[i].getFinal().isEstAceptacion()) { estadoAFD.setAceptacion(true); } } } contador++; } } Console.WriteLine("cerradura de: "); for(int i = 0; i < estadosAFN.Count(); i++) { Console.Write(estadosAFN[i].getNumero() + ", "); } Console.WriteLine("\n"); for(int i = 0; i < estadoAFD.getEstadosAFN().Count(); i++) { Console.Write(estadoAFD.getEstadosAFN()[i].getNumero() + ", "); } Console.WriteLine("\n"); estadoAFD = compararEstadosAFD(estadoAFD); transiciones[transiciones.Count() - 1].setFinal(estadoAFD); Console.WriteLine("Estado " + estadoAFD.getNombre()); contadorEstado++; return estadoAFD; }
public EstadoAFD compararEstadosAFD(EstadoAFD estadoAFD) { Boolean iguales = true; Boolean encontrado = false; for(int i = 0; i < listaEstadosAFD.Count(); i++) { iguales = true; if(listaEstadosAFD[i].getEstadosAFN().Count() == estadoAFD.getEstadosAFN().Count()) { for (int j = 0; j < estadoAFD.getEstadosAFN().Count(); j++) { encontrado = false; for (int k = 0; k < listaEstadosAFD[i].getEstadosAFN().Count(); k++) { if (estadoAFD.getEstadosAFN()[j].getNumero() == listaEstadosAFD[i].getEstadosAFN()[k].getNumero()) { encontrado = true; break; } } if (!encontrado) { iguales = false; break; } } if (iguales) { return listaEstadosAFD[i]; } } } return estadoAFD; }
public void setFinal(EstadoAFD final) { this.final = final; }
public void setInicial(EstadoAFD inicial) { this.inicial = inicial; }
public TransicionAFD(EstadoAFD inicial, EstadoAFD final, String simbolo) { this.inicial = inicial; this.final = final; this.simbolo = simbolo; }