Maquina de Turing en Java usando archivos

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)

28 pensamientos en “Maquina de Turing en Java usando archivos

  1. BUENO AMIGO E MIRADO TU PROGRAMA Y PUES
    ME VOTA VARIOS ERRORES LO COMPILE EN NETBEANS
    AMIGO ME PODRIA AYUDAR A SOLUCIONAR
    ESTEPROBLEMA

  2. 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

  3. 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.

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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 :D

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>