Esta vez les comparto una maquina de turing sencilla de una sola cinta hecha en java con una interfaz grafica muy sencilla.
Se que es muy notable que no use los conceptos de POO pero la verdad es que solo elegi java por algunas funciones que me facilitaron el trabajo.
Si tienen dudas sobre algunas cosas solo dejen un comentario, y tambien si tienen criticas son bien aceptadas,Saludos!!.
He comentado algunos println, estos nos imprime en consola lo que esta sucediendo mientras vemos la interfaz, si quieren pueden descomentarlo para ver lo que sucede.
import java.io.*;
import java.util.*;
import java.lang.Thread.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class turing{
//me baso en esta variable para saber el lugar donde deje el elemento
int movido;
//Regresa si el caracter esta en el lenguaje(primera linea en el archivo)
public boolean is(String caracter,String lenguaje){
int i=0;
String cmp;
while(i<lenguaje.length()){
cmp=""+lenguaje.charAt(i);
i++;
if(caracter.equals(cmp))
return true;
}
return false;
}
//Regresta true o false si pertenece o no
public boolean pertenece(String cadena ,File archivo){
int est=1;
FileReader fr = null;
BufferedReader br = null;
String lenguaje; //Lee linea por linea
String caracter;
try {
fr = new FileReader (archivo);
br = new BufferedReader(fr);
lenguaje=br.readLine(); //primera linea(lenguaje)
int i=0;
while(i<cadena.length()){
caracter=""+cadena.charAt(i);
i++;
if(is(caracter,lenguaje)){
continue;}
else{
// System.out.println("El simbolo '"+caracter+"' en la posicion "+i+" no pertenece al lenguaje");
JOptionPane.showMessageDialog(null,"El simbolo '"+caracter+"' en la posicion "+i+" no pertenece al lenguaje","Error",JOptionPane.PLAIN_MESSAGE);
est=0;
return false; }
}
}
catch(Exception e){
e.printStackTrace();
}finally{
try{
if( null != fr )
{
fr.close();
}
}catch (Exception e2)
{
e2.printStackTrace();
}
}
//if(est==1)
//System.out.println("Pertenece");
return true;
}
//Regresa si el estado de aceptacion esta en la cadena mandada
public boolean aceptado(String cadenar,String estadoaceptacion){
int i=0;
String caracter;
String estadoencontrado="";
caracter=""+cadenar.charAt(i);
while(!(caracter.equals("q"))){
i++;
caracter=""+cadenar.charAt(i);
}
estadoencontrado+=caracter; //q
i++;
estadoencontrado+=""+cadenar.charAt(i);//(
i++;
estadoencontrado+=""+cadenar.charAt(i); //n
i++;
estadoencontrado+=""+cadenar.charAt(i); //)
if(estadoaceptacion.equals(estadoencontrado))
return true;
else
return false;
}
//deja un elemento en la posicion dada de la cadena
public String dejar(String cadenarec,String posicion,String edejado){
String cadena=cadenarec;
String nvocadena="";
Scanner leercadena= new Scanner(cadena);
String caracter;
char imp;
caracter=leercadena.next();
int i=0;
while(i<cadena.length()){
if(caracter.charAt(i)==posicion.charAt(0) && caracter.charAt(i+1)=='('){
nvocadena+=edejado;
movido=i;
i++; //(
i++;//n
i++;//)
}
else
nvocadena+=caracter.charAt(i);
i++;
}
return nvocadena;
}
//se mueve a la der o izq del elemento en int movido
public String mover(String cadenarec,String edejado,String qdejar,String moveID){
String cadena=cadenarec;
String nvocadena="";
Scanner leercadena= new Scanner(cadena);
String caracter;
char imp;
caracter=leercadena.next();
int i=0;
if(moveID.equals("D")){
while(i<cadena.length()){
if(movido==i){
nvocadena+=caracter.charAt(i);
nvocadena+=qdejar.charAt(0); //DEJA q
nvocadena+=qdejar.charAt(1); //DEJA (
nvocadena+=qdejar.charAt(2); //DEJA n
nvocadena+=qdejar.charAt(3); //DEJA )
i++;
}
else
nvocadena+=caracter.charAt(i);
i++;
}
}
else if(moveID.equals("I")){
while(i<cadena.length()){
if(movido==i+1){
nvocadena+=qdejar.charAt(0); //DEJA q
nvocadena+=qdejar.charAt(1); //DEJA (
nvocadena+=qdejar.charAt(2); //DEJA n
nvocadena+=qdejar.charAt(3); //DEJA )
nvocadena+=caracter.charAt(i);
i++;
nvocadena+=edejado;
i++;
}
else
nvocadena+=caracter.charAt(i);
i++;
}
}
return nvocadena;
}
//regresa la regla adecuada para aplicar
public String BuscaRegla(String cadenar,String estado,String leido,File archivo){
FileReader fr = null;
BufferedReader br = null;
String linea; //Lee linea por linea
String palabra=""; //Lee palabra por palabra
try {
fr = new FileReader (archivo);
br = new BufferedReader(fr);
int i=0;
linea=br.readLine(); //primera linea(cabecera)
String cabecera=linea;
while(linea!=null){ //Se mueve linea por linea
i++;
Scanner leer = new Scanner(linea);
Scanner leercab=new Scanner(cabecera);
palabra = leer.next();
String cabrecorrida=leercab.next();
if(estado.equals(palabra)){ //encuentra la linea del estado
int j=0;
while(!(cabrecorrida.equals(leido))){ //se mueve en la cabecera y la linea de estado hasta el elemento leido
cabrecorrida=leercab.next();
palabra = leer.next();
}
break;
}else
linea=br.readLine();
}
}
catch(Exception e){
e.printStackTrace();
}finally{
try{
if( null != fr )
{
fr.close();
}
}catch (Exception e2)
{
e2.printStackTrace();
}
}
return palabra;
}
//aplica una regla ya obtenida con la funcion de arriba
public String AplicaRegla(String cadenar,String regla){
String estado="";
String sigelem;
String nvocadena;
String edejar;
String qdejar;
String ID;
//cadena recibida
int i=0;
String leercadena=cadenar;
String recorrecadena=""+leercadena.charAt(i);
while(!(recorrecadena.equals("q"))){
i++;
recorrecadena=""+leercadena.charAt(i);
}
estado+=""+cadenar.charAt(i);
estado+=""+cadenar.charAt(i+1);
estado+=""+cadenar.charAt(i+2);
estado+=""+cadenar.charAt(i+3);
sigelem=""+cadenar.charAt(i+4);
//regla
//dejar
int j=0;
String leerregla=regla;
String recorreregla=""+leerregla.charAt(j);
while(!(recorreregla.equals(",") && leerregla.charAt(j+2)==',')){
j++;
recorreregla=""+leerregla.charAt(j);
}
edejar=""+leerregla.charAt(j+1);
//estado a dejar
int k=0;
leerregla=regla;
recorreregla=""+leerregla.charAt(k);
while(!(recorreregla.equals("q"))){
k++;
recorreregla=""+leerregla.charAt(k);
}
qdejar=recorreregla;
qdejar+=""+leerregla.charAt(k+1); //(
qdejar+=""+leerregla.charAt(k+2); //n
qdejar+=""+leerregla.charAt(k+3); //)
//Izq Der
int l=0;
leerregla=regla;
recorreregla=""+leerregla.charAt(l);
while(!(recorreregla.equals("I") || recorreregla.equals("D"))){
l++;
recorreregla=""+leerregla.charAt(l);
}
ID=recorreregla;
String lado="";
nvocadena=dejar(cadenar,estado,edejar);
//System.out.println("'"+edejar+"' Dejado en "+estado+"\n\t Nueva Cadena: "+nvocadena);
nvocadena=mover(nvocadena,edejar,qdejar,ID);
if(ID.equals("D"))
lado="Derecha";
else if(ID.equals("I"))
lado="Izquierda";
//System.out.println(qdejar+" Movido a la "+lado+" de "+edejar+" dejada\n\t Nueva Cadena: "+nvocadena);
return nvocadena;
}
JPanel panel;
JLabel reglar, cadenar,titleLabel,reglau,progreso,aceptada;
JTextField cadenaf,reglaf;
String space=" ";
JPanel totalGUI;
JFrame fa1;
int comenzar=0;
//crea el entorno grafico y realiza operaciones
public turing(String cadenauser,String reglasfile){
fa1 = new JFrame("Turing");
fa1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE );
totalGUI = new JPanel();
totalGUI.setLayout(null);
titleLabel = new JLabel("<html>"+"<h1>Maquina de turing</h1>"+"</html>");
titleLabel.setLocation(0,0);
titleLabel.setSize(290, 30);
titleLabel.setHorizontalAlignment(0);
totalGUI.add(titleLabel);
panel = new JPanel();
panel.setLayout(null);
panel.setLocation(10, 35);
panel.setSize(640, 540);
//cadena
cadenar = new JLabel("<html>"+"<H2>Cadena Inicial</H2>" +cadenauser+"</html>");
cadenar .setLocation(200, 5);
cadenar .setSize(300, 60);
panel.add(cadenar);
//Regla a usar
reglau = new JLabel("");
reglau .setLocation(10, 100);
reglau .setSize(500, 120);
panel.add(reglau);
//progreso
progreso = new JLabel("");
progreso.setLocation(200, 165);
progreso.setSize(300, 255);
panel.add(progreso);
//aceptada
aceptada = new JLabel("<html>"+"<H1></H1>"+"</html>");
aceptada.setLocation(150, 320);
aceptada.setSize(300, 90);
panel.add(aceptada);
File archivo = null;
archivo = new File (reglasfile);
FileReader fr=null;
String estadoinicial="";
String estadoaceptacion="";
//Obtiene estado inicial y de aceptacion
try {
fr = new FileReader (archivo);
BufferedReader br = new BufferedReader(fr);
String linea=br.readLine(); //primera linea(cabecera)
String cabecera=linea;
String palabra;
Scanner leer;
while(linea!=null){ //Se mueve linea por linea
leer = new Scanner(linea);
palabra = leer.next();
if(palabra.equals("Inicial:")){ //encuentra la linea de Inicial
palabra = leer.next();
estadoinicial=palabra;
linea=br.readLine();
}
else if(palabra.equals("Aceptacion:")){ //encuentra la linea de Inicial
palabra = leer.next();
estadoaceptacion=palabra;
break;
}
else
linea=br.readLine();
}
}
catch(Exception ex){
ex.printStackTrace();
}finally{
try{
if( null != fr )
{
fr.close();
}
}catch (Exception e2)
{
e2.printStackTrace();
}
}
totalGUI.add(panel);
totalGUI.setOpaque(true);
fa1.add(totalGUI);
fa1.pack();
fa1.setSize(640,550);
fa1.setVisible(true);
try{
Thread.sleep(3000);
}
catch(Exception ex){
}
String estado="";
String cadena=estadoinicial+cadenauser+"B";
String leyendo="";
String regla;
String cadenv;
String leercadena;
String recorrecadena;
int i=1;
//Si el alfabeto de la cadena pertenece al lenguaje entonces continua
if(pertenece(cadenauser,archivo)){
while(!(aceptado(cadena,estadoaceptacion))){
//System.out.println("\nmovimiento :"+(i+1));
i++;
//obtiene el estado y la posicion que se esta leyendo
int k=0;
leercadena=cadena;
recorrecadena=""+leercadena.charAt(k);
String cadtemp;
while(!(recorrecadena.equals("q"))){
k++;
recorrecadena=""+leercadena.charAt(k);
}
estado=recorrecadena;
estado+=""+leercadena.charAt(k+1); //(
estado+=""+leercadena.charAt(k+2); //n
estado+=""+leercadena.charAt(k+3); //)
leyendo=""+leercadena.charAt(k+4); // siguiente leyendp
regla =BuscaRegla(cadena,estado,leyendo,archivo);
cadtemp=cadena;
reglau.setText("<html>"+"<H2>Cadena: "+space+cadtemp+"</H2><H2>Regla a usar: "+space+regla+"</H2></html>");
// System.out.println("Cadena: "+cadena+"\nRegla a aplicar"+regla);
if(regla.equals("-"))
break;
cadena=AplicaRegla(cadena,regla);
progreso.setText("<html>"+"<H1>Progreso:</H1><H2>"+cadena+"</H2></html>");
panel.repaint();
try{
Thread.sleep(3000);
}
catch(Exception ex){
}
}
if(aceptado(cadena,estadoaceptacion)){
// System.out.println("Cadena aceptada");
aceptada.setText("<html>"+"<H1>Cadena aceptada</H1>"+"</html>");
}
else{
// System.out.println("Cadena NO aceptada");
aceptada.setText("<html>"+"<H1>Cadena NO aceptada</H1>"+"</html>");
}
}//<---- if pertenece
}
public static void main(String []args){
int x=1;
//menu
while(x==1){
String ops = JOptionPane.showInputDialog("Que desea hacer?\n1.- Usar maquina de turing\n2.- Salir");
int op = Integer.parseInt(ops);
switch(op){
case 1:
String reglas = JOptionPane.showInputDialog("Inserta el nombre del archivo que contiene las reglas");
String cadena = JOptionPane.showInputDialog("Inserta la cadena a evaluar");
turing T =new turing(cadena,reglas+".txt");
break;
case 2:
JOptionPane.showMessageDialog(null, "Hasta pronto","Adios",JOptionPane.PLAIN_MESSAGE);
x=0;
break;
default:
JOptionPane.showMessageDialog(null, "Opcion no valida","Error",JOptionPane.PLAIN_MESSAGE);
x=1;
break;
}
}
}
}
Aqui les dejo unas impresiones de pantalla:
AAqui insertamos el nombre del archivo.txt que contiene las reglas, debe estar en la misma carpeta.
Aqui insertamos la cadena que vamos a evaluar
Finalmente el programa comenzara a mostrar cambio a cambio al ir leyendo las reglas y aplicarlas para al final decir si es o no aceptada
Aqui dejo la estructura de las reglas, estas reglas aceptan cadenas que cumplan 0^n1^n
Donde (a,b,c)
a: es el siguiente estado
b: el simbolo que se dejara al moverse
c: a que posicion se movera Izquierda/Derecha
reglas0n1n.txt
# 0 1 X Y B * q(0) (q(1),X,D) - - (q(3),Y,D) - * q(1) (q(1),0,D) (q(2),Y,I) - (q(1),Y,D) - * q(2) (q(2),0,I) - (q(0),X,D) (q(2),Y,I) - * q(3) - - - (q(3),Y,D) (q(4),B,D) * q(4) - - - - - * -> Inicial: q(0) Aceptacion: q(4)




BUENO AMIGO E MIRADO TU PROGRAMA Y PUES
ME VOTA VARIOS ERRORES LO COMPILE EN NETBEANS
AMIGO ME PODRIA AYUDAR A SOLUCIONAR
ESTEPROBLEMA
hola amigo, oye me podrias pasar el ejemplo que te mando el amigo, es que no mq corre nada
si gustas te lo puedo mandar al correo con el que has comentado
si gustas te lo mando a tu correo listo para compilar
pocrias hacerme el favor ejcr001@hotmail.com
A mi tambien me lo puedes manda me urge, gracias...
alexturner37@gmail.com
te lo agradesco mi hermano
entiendo toda tu logica, pero no se como ingresas las reglas, me las podrias explicar por favor o pasarme un ejemplo de como lo haces...
acabo de actulizar el post, y eh puesto las reglas para 0^n1^n es decir acepta 000111, el archivo que contiene las reglas debe ser un .txt y debe tener la forma que ya deje, si tienes alguna duda solo comenta, saludos
hola me prodrias mandar el archivo para compilar x favor sk al extraer asi el kodigo me marka errores
me podrias mandar el codigo por favor zlvztr@gmail.com
Hola amigo, por favor enviame todo el codigo y tb el archivo de reglas...te agradecere mucho amigo, me urge... erwin_koji@hotmail.com
Hola me podrías mandar el código por favor bro?? fakeinterlude@gmail.com
me podrias mandar el condigo te lo agredeceria mucho
d_ani_dgs@hotmail.com
Hola, muy buen programa, pero aun no puedo comprender como es que ingresas las reglas en el .txt, al tiempo de ejecución me marca errores, si detecta el .txt, pero no me dice lo demás, si me pudieras ayudar por favor, gracias.
las reglas solo las metes en un txt y en el cuadro de dialogo inserta el nombre del archivo sin incluir el ".txt", solo el nombre, y yap =P
solo una duda en que parte se hace el recorrido para ver si va a la derecha o a la izquierda en que apartado y como es que aumenta o disminuye en el arreglo
eso de la izquierda y la derecha lo defines en las reglas =P
Hola amigo necesito saber si me puedes ayudar, me gusta el trabajo que hiciste pero cuando quiero compilar el programa me tira error en la linea 465
turing T =new turing(cadena,reglas+".txt");
y el netbeans da consejos de hacerle un constructor pero si lo hago si bien se va el error el programa no trabajo, osea me pide el archivo y la cadena y luego me devuelve a la opciones del menu principal de salir o usar la MT, me esta volviendo loco me podrias ayudar?
debe ser por que no tienes el archivo de las reglas en la misma carpeta, en el post menciono que las reglas de la máquina de turing estan en un txt y pongo unos ejemplos de como están formados, puedes usar esos, mete las reglas en un txt y en la misma carpeta que el class y nadamas =P
Hola que tal me gusto como manejas el programacion orientada a objetos quisiera ver si me podrias pasar tu codigo te dejo mi mail te lo agradeceria mucho ya que quiero aprender un poco mas sobre este tipo de programacion y el tu programa me seria muy util. gracias buen trabajo
e-mail:17gusanito@gmail.com
Hola amigo serias tan amable de enviarme el archivo java del codigo de la maquina por favor te lo agradeceria de antemano........buen aporte gracias
mi correo es krapu1@hotmail.com por favor lo necesito urgente...
hola buenas podias ponerte en contacto conmigo ya k tengo k hacer una maquina de turing y tengo varios problemas muchas gracias
Hola me compilo y corre bien necesito una regla que complete 1900 espacios con 1
si me puedes ayudar me seria de gran utilidad muchas gracias