Maquinas de Turing

39
LOGICA COMPUTACIONAL MAQUINAS DE TURING Presentado por EDGAR JULIAN TORRES NEIDER VASQUEZ RAMIREZ Presentado a: Profesor ALVARO IVAN JIMENEZ ALZATE

Transcript of Maquinas de Turing

Page 1: Maquinas de Turing

LOGICA COMPUTACIONAL

MAQUINAS DE TURING

Presentado porEDGAR JULIAN TORRES

NEIDER VASQUEZ RAMIREZ

Presentado a:Profesor ALVARO IVAN JIMENEZ ALZATE

Universidad Santiago de Cali, Junio de 2012

Page 2: Maquinas de Turing

CONTENIDO

1. ALAN MATHISON TURING

1.1. Análisis criptográfico (ruptura de códigos)1.2. El Test de Turing (o Prueba de Turing)

2. MÁQUINA DE TURING

2.1. HISTORIA2.2. Definición formal2.3. Funcionamiento2.4. Representación como diagrama de estados2.5. Descripción instantánea2.6. Ejemplo

3. CODIGO JAVA

3.1. Correr.java3.2. MaquinaTuring.java3.3. Maquinas.java3.4. SevenTupla.java3.5. Tarea.java3.6. Transaccion.java

4. BIBLIOGRAFIA

Page 3: Maquinas de Turing

ALAN MATHISON TURINGOBE (23 de junio de 1912 en Maida Vale, Londres - 7 de junio de 1954 en Wilmslow, Cheshire) fue un matemático, lógico, científico de la computación, criptógrafo y filósofo inglés.

Es considerado uno de los padres de la Ciencia de la computación siendo el precursor de la informática moderna. Proporcionó una influyente formalización de los conceptos de algoritmo y computación: la máquina de Turing. Formuló su propia versión de la hoy ampliamente aceptada Tesis de Church-Turing, la cual postula que cualquier modelo computacional existente tiene las mismas capacidades algorítmicas, o un subconjunto, de las que tiene una máquina de Turing. Durante la Segunda Guerra Mundial, trabajó en descifrar los códigos nazis, particularmente los de la máquina Enigma; durante un tiempo fue el director de la sección Naval Enigma del Bletchley Park. Tras la guerra diseñó uno de los primeros computadores electrónicos programables digitales en el Laboratorio Nacional de Física del Reino Unido y poco tiempo después construyó otra de las primeras máquinas en la Universidad de Mánchester. Entre otras muchas cosas, también contribuyó de forma particular e incluso provocativa al enigma de si las máquinas pueden pensar, es decir a la Inteligencia Artificial.La carrera de Turing terminó súbitamente cuando fue procesado por ser homosexual. No se defendió de los cargos y se le dio a escoger entre la castración química o ir a la cárcel. Eligió lo primero y sufrió importantes consecuencias físicas, entre ellas la impotencia. Dos años después del juicio, en 1954, cometió suicidio tras ingerir cianuro.

Análisis criptográfico (ruptura de códigos)

El Bombe replicaba la acción de varias máquinas Enigma.

Durante la Segunda Guerra Mundial fue uno de los principales artífices de los trabajos del Bletchley Park para descifrar los códigos secretos nazis. Sus perspicaces observaciones matemáticas contribuyeron a romper los códigos de la máquina Enigma y de los codificadores de teletipos FISH (máquinas de teletipos codificados que fabricaron conjuntamente Lorenz Electric y Siemens&Halske). Sus estudios del sistema Fish ayudarían al desarrollo posterior de la primera computadora programable electrónica digital llamada Colossus, la cual fue diseñada por Max

Page 4: Maquinas de Turing

Newman y su equipo, y construida en la Estación de Investigaciones Postales de Dollis Hill por un equipo dirigido por Thomas Flowers en 1943. Dicha computadora se utilizó para descifrar los códigos Fish (en concreto las transmisiones de la máquina Lorenz).

Para romper los códigos de la máquina Enigma y permitir a los aliados anticipar los ataques y movimientos militares Nazis, Turing diseñó la bombe, una máquina electromecánica —llamada así en reconocimiento de la diseñada por los polacos bomba kryptologiczna— que se utilizaba para eliminar una gran cantidad de claves enigma candidatas. Para cada combinación posible se implementaba eléctricamente una cadena de deducciones lógicas. Era posible detectar cuándo ocurría una contradicción y desechar la combinación. La bombe de Turing, con una mejora añadida que sugirió el matemático Gordon Welchman, era la herramienta principal que usaban los criptógrafos aliados para leer las transmisiones Enigma.Los trabajos de ruptura de códigos de Turing han sido secretos hasta los años 1970; ni siquiera sus amigos más íntimos llegaron a tener constancia.

El Test de Turing (o Prueba de Turing)

La prueba de Turing.Es una prueba propuesta por Alan Turing para demostrar la existencia de inteligencia en una máquina. Fue expuesto en 1950 en un artículo (Computing machinery and intelligence) para la revista Mind, y sigue siendo uno de los mejores métodos para los defensores de la Inteligencia Artificial. Se fundamenta en la hipótesis positivista de que, si una máquina se comporta en todos los aspectos como inteligente, entonces debe ser inteligente.

La prueba consiste en un desafío. Se supone un juez situado en una habitación, y una máquina y un ser humano en otras. El juez debe descubrir cuál es el ser humano y cuál es la máquina, estándoles a los dos permitido mentir al contestar por escrito las preguntas que el juez les hiciera. La tesis de Turing es que si ambos jugadores eran suficientemente hábiles, el juez no podría distinguir quién era el ser humano y quién la máquina. Todavía ninguna máquina puede pasar este examen en una experiencia con método científico.

Page 5: Maquinas de Turing

En 1990 se inició un concurso, el Premio Loebner, una competición de carácter anual entre programas de ordenador que sigue el estándar establecido en la prueba de Turing. Un juez humano se enfrenta a dos pantallas de ordenador, una de ellas que se encuentra bajo el control de un ordenador, y la otra bajo el control de un humano. El juez plantea preguntas a las dos pantallas y recibe respuestas. El premio está dotado con 100.000 dólares estadounidenses para el programa que pase el test, y un premio de consolación para el mejor programa anual. Todavía no ha sido otorgado el premio principal.

MÁQUINA DE TURING

Una máquina de Turing (MT) 1 es un modelo computacional que realiza una lectura/escritura de manera automática sobre una entrada llamada cinta, generando una salida en esta misma.Este modelo está formado por un alfabeto de entrada y uno de salida, un símbolo especial llamado blanco (normalmente b, Δ o 0), un conjunto de estados finitos y un conjunto de transiciones entre dichos estados. Su funcionamiento se basa en una función de transición, que recibe un estado inicial y una cadena de caracteres (la cinta, la cual puede ser infinita) pertenecientes al alfabeto de entrada. La máquina va leyendo una celda de la cinta en cada paso, borrando el símbolo en el que se encuentra posicionado su cabezal y escribiendo un nuevo símbolo perteneciente al alfabeto de salida, para luego desplazar el cabezal a la izquierda o a la derecha (solo una celda a la vez). Esto se repite según se indique en la función de transición, para finalmente detenerse en un estado final o de aceptación, representando así la salida.

Page 6: Maquinas de Turing

HISTORIA

Representación artística de una máquina de Turing.

Alan Turing introdujo el concepto de máquina de Turing en el trabajo On computable numbers, with an application to the Entscheidungsproblem, publicado por la Sociedad Matemática de Londres en 1936, en el que se estudiaba la cuestión planteada por David Hilbert sobre si las matemáticas son decidibles, es decir, si hay un método definido que pueda aplicarse a cualquier sentencia matemática y que nos diga si esa sentencia es cierta o no. Turing ideó un modelo formal de computador, la máquina de Turing, y demostró que existían problemas que una máquina no podía resolver.Con este aparato extremadamente sencillo es posible realizar cualquier cómputo que un computador digital sea capaz de realizar.Mediante este modelo teórico y el análisis de la complejidad de los algoritmos, fue posible la categorización de problemas computacionales de acuerdo a su comportamiento, apareciendo así, el conjunto de problemas denominados P y NP, cuyas soluciones pueden encontrarse en tiempo polinómico por máquinas de Turing deterministas y no deterministas, respectivamente.Precisamente, la tesis de Church-Turing formulada por Alan Turing y Alonzo Church, de forma independiente a mediados del siglo XX caracteriza la noción informal de computabilidad con la computación mediante una máquina de Turing.2La idea subyacente es el concepto de que una máquina de Turing puede verse como un autómata ejecutando un procedimiento efectivo definido formalmente, donde el espacio de memoria de trabajo es ilimitado, pero en un momento determinado sólo una parte finita es accesible.

Definición formal

Una máquina de Turing con una sola cinta puede definirse como una 7-tupla

Page 7: Maquinas de Turing

Donde:

Es un conjunto finito de estados.

Es un conjunto finito de símbolos distinto del espacio en blanco, denominado alfabeto de máquina o de entrada.

Es un conjunto finito de símbolos de cinta, denominado alfabeto de cinta ( ).

Es el estado inicial.

Es un símbolo denominado blanco, y es el único símbolo que se puede repetir un número infinito de veces.

Es el conjunto de estados finales de aceptación.

Es una función parcial denominada función de transición, donde es un movimiento a la izquierda y R\! es el movimiento a la derecha.

Existen en la literatura un abundante número de definiciones alternativas, pero todas ellas tienen el mismo poder computacional, por ejemplo se puede añadir el símbolo como símbolo de "no movimiento" en un paso de cómputo.

FuncionamientoLa máquina de Turing consta de un cabezal lector/escritor y una cinta infinita en la que el cabezal lee el contenido, borra el contenido anterior y escribe un nuevo valor. Las operaciones que se pueden realizar en esta máquina se limitan a:

Mover el cabezal lector/escritor hacia la derecha. Mover el cabezal lector/escritor hacia la izquierda

Visualización de una máquina de Turing, en la que se ve el cabezal y la cinta que se lee.

El cómputo se determina a partir de una tabla de estados de la forma:(Estado, valor) (Nuevo estado, nuevo valor, dirección)

Page 8: Maquinas de Turing

Esta tabla toma como parámetros el estado actual de la máquina y el carácter leído de la cinta, dando la dirección para mover el cabezal, el nuevo estado de la máquina y el valor a escribir en la cinta.La memoria es la cinta de la máquina que se divide en espacios de trabajo denominados celdas, donde se pueden escribir y leer símbolos. Inicialmente todas las celdas contienen un símbolo especial denominado "blanco". Las instrucciones que determinan el funcionamiento de la máquina tienen la forma, "si estamos en el estado x leyendo la posición y, donde hay escrito el símbolo z, entonces este símbolo debe ser remplazado por este otro símbolo, y pasar a leer la celda siguiente, bien a la izquierda o bien a la derecha".La máquina de Turing puede considerarse como un autómata capaz de reconocer lenguajes formales. En ese sentido, es capaz de reconocer los lenguajes recursivamente enumerables, de acuerdo a la jerarquía de Chomsky. Su potencia es, por tanto, superior a otros tipos de autómatas, como el autómata finito, o el autómata con pila, o igual a otros modelos con la misma potencia computacional.

Representación como diagrama de estadosLas maquinas de Turing pueden representarse mediante grafos particulares, también llamados diagramas de estados finitos, de la siguiente manera:

Esta máquina de Turing está definida sobre el alfabeto , posee el conjunto de estados

, con las transiciones que se pueden ver. Su estado inicial es y el estado final es , el lenguaje de salida

siendo el símbolo denominado "blanco". Esta máquina reconoce la expresión

regular de la forma con .

Descripción instantánea

Es una secuencia de la forma donde y que escribe el estado de una MT. La cinta contiene la cadena seguida de infinitos blancos. El cabezal señala el primer símbolo de .

Page 9: Maquinas de Turing

Por ejemplo, para la máquina de Turing

Con las transiciones

La descripción instantánea para la cinta 1011 es:

EjemploDefinimos una máquina de Turing sobre el alfabeto {0,1}, donde 0 representa el símbolo blanco. La máquina comenzará su proceso situada sobre un símbolo "1" de una serie. La máquina de Turing copiará el número de símbolos "1" que encuentre hasta el primer blanco detrás de dicho símbolo blanco. Es decir, posiciona el cabezal sobre el 1 situado en el extremo izquierdo, doblará el número de símbolos 1, con un 0 en medio. Así, si tenemos la entrada "111" devolverá "1110111", con "1111" devolverá "111101111", y sucesivamente.

El conjunto de estados es {S1, S2, S3, S4, S5} y el estado inicial es S1. La tabla que describe la función de transición es la siguiente:

Page 10: Maquinas de Turing

El funcionamiento de una computación de esta máquina puede mostrarse con el siguiente ejemplo (en negrita se resalta la posición de la cabeza lectora/escritora):

La máquina realiza su proceso por medio de un bucle, en el estado inicial S1, remplaza el primer 1 con un 0, y pasa al estado S2, con el que avanza hacia la derecha, saltando los símbolos 1 hasta un 0 (que debe existir), cuando lo encuentra pasa al estado S3, con este estado avanza saltando los 1 hasta encontrar otro 0 (la primera vez no habrá ningún 1). Una vez en el extremo derecho, añade un 1. Después comienza el proceso de retorno; con S4 vuelve a la izquierda saltando los 1, cuando encuentra un 0 (en el medio de la secuencia), pasa a S5 que continúa a la izquierda saltando los 1 hasta el 0 que se escribió al principio. Se remplaza de nuevo este 0 por 1, y pasa al símbolo siguiente, si es un 1, se pasa a otra iteración del bucle, pasando al estado S1 de nuevo. Si es un símbolo 0, será el símbolo central, con lo que la máquina se detiene al haber finalizado el cómputo.

Page 11: Maquinas de Turing

CODIGO JAVACorrer.javapackage maquinasturing;

import java.awt.BorderLayout;

import javax.swing.DefaultListModel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JFrame;import javax.swing.JList;import javax.swing.JScrollPane;import javax.swing.JButton;import javax.swing.JTextField;import javax.swing.JLabel;import java.awt.GridLayout;

public class Correr extends JFrame {

private JPanel jContentPane = null;private JList jListMaquinas = null;private DefaultListModel listmodel=null;private JPanel jPanel = null;private JPanel jPanel1 = null;private JButton jButtonCargar = null;private JButton Salir = null;private JButton Iniciar = null;private JLabel jLabel = null;private JTextField jTextFieldCadena = null;private JLabel jLabel1 = null;private JTextField jTextFieldPosicion = null;private JLabel Salida = null;private JTextField jTextFieldSalida = null;private MaquinaTuring mt=null;

/** ESte metodo inicializa las maquinas **/ private JList getJListMaquinas() {

if (jListMaquinas == null) {jListMaquinas = new JList(listmodel=new DefaultListModel());

}

Page 12: Maquinas de Turing

return jListMaquinas;}

/** este metodo inicializa el jPanel **/ private JPanel getJPanel() { if (jPanel == null) {

GridLayout gridLayout = new GridLayout();gridLayout.setRows(3);gridLayout.setColumns(2);Salida = new JLabel();Salida.setText("Salida :");jLabel1 = new JLabel();jLabel1.setText("Estado de Inicio :");jLabel = new JLabel();jLabel.setText("Cadena de Entrada :");jPanel = new JPanel();jPanel.setLayout(gridLayout);jPanel.add(jLabel, null);jPanel.add(getJTextFieldCadena(), null);jPanel.add(jLabel1, null);jPanel.add(getJTextFieldPosicion(), null);jPanel.add(Salida, null);jPanel.add(getJTextFieldSalida(), null);

}return jPanel;

}

/** este metodo inicializa jPanel1 **/ private JPanel getJPanel1() {

if (jPanel1 == null) {jPanel1 = new JPanel();jPanel1.add(getJButtonCargar(), null);

jPanel1.add(getSalir(), null); jPanel1.add(getInfo(), null);

}return jPanel1;

Page 13: Maquinas de Turing

}

/** este metodo inicializa jButtonCargar **/private JButton getJButtonCargar() {

if (jButtonCargar == null) {jButtonCargar = new JButton();jButtonCargar.setText("Cargar");jButtonCargar.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent e) {jTextFieldSalida.setText("");switch(jListMaquinas.getSelectedIndex()){

case 0:mt=Maquinas.MaquinaA();break;

case 1:mt=Maquinas.MaquinaB();break;

case 2:mt=Maquinas.MaquinaC();break;

case 3:mt=Maquinas.MaquinaD();break;

case 4:mt=Maquinas.MaquinaE();break;

case 5:mt=Maquinas.MaquinaF();break;

case 6:mt=Maquinas.MaquinaG();break;

case 7:mt=Maquinas.MaquinaH();break;

case 8:mt=Maquinas.MaquinaI();break;

case 9:mt=Maquinas.MaquinaJ();break;

}try {

mt.setCadena(jTextFieldCadena.getText());

mt.addPosicionActual(Integer.parseInt(jTextFieldPosicion.getText()));mt.inicializarEstado();

} catch (Exception ex) {

Page 14: Maquinas de Turing

JOptionPane.showMessageDialog(null,ex.getMessage(),"Error",JOptionPane.ERROR_MESSAGE);}

JOptionPane.showMessageDialog(null,mt.toString());}

});}return jButtonCargar;

}

/**este metodo inicializa Iniciar **/

private JButton getSalir() {if (Salir == null) {

Salir = new JButton();Salir.setText("Salir");Salir.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent e) {System.exit(0);}

});}return Salir;

}

private JButton getInfo() {if (Iniciar == null) {

Iniciar = new JButton();Iniciar.setText("Acerca de...");Iniciar.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent e) {JOptionPane.showMessageDialog(null,"PRESENTADO POR: \n \n -

Edgar Julián Torres \n COD: 1064429582 \n \n - Neider Vasquez Ramirez \n COD: 94520353 ");}

});}return Iniciar;

}

Page 15: Maquinas de Turing

/** * este metodo inicializa jTextFieldCadena * * */private JTextField getJTextFieldCadena() {

if (jTextFieldCadena == null) {jTextFieldCadena = new JTextField();

}return jTextFieldCadena;

}

/** este metodo inicializa jTextFieldPosicion **/ private JTextField getJTextFieldPosicion() {

if (jTextFieldPosicion == null) {jTextFieldPosicion = new JTextField();

}return jTextFieldPosicion;

}

/** este metodo inicializa jTextFieldSalida**/

private JTextField getJTextFieldSalida() {if (jTextFieldSalida == null) {

jTextFieldSalida = new JTextField();}return jTextFieldSalida;

}

public static void main(String[] args) {new Correr();

}

/** This is the default constructor**/ public Correr() {

super();initialize();listmodel.addElement(" Maquina 1");

Page 16: Maquinas de Turing

listmodel.addElement(" Maquina 2");listmodel.addElement(" Maquina 3");listmodel.addElement(" Maquina 4");listmodel.addElement(" Maquina 5");listmodel.addElement(" Maquina 6");listmodel.addElement(" Maquina 7");listmodel.addElement(" Maquina 8");listmodel.addElement(" Maquina 9");listmodel.addElement(" Maquina 10");jListMaquinas.setSelectedIndex(0);

}

/** este metodo inicializa this **/

private void initialize() {this.setSize(406,350);

this.setContentPane(getJContentPane());this.setTitle("MAQUINAS DE TURING ");this.setVisible(true);

}

/** este metodo inicializa jContentPane**/

private JPanel getJContentPane() {if (jContentPane == null) {

jContentPane = new JPanel();jContentPane.setLayout(new BorderLayout());jContentPane.add(new JScrollPane(getJListMaquinas()),

java.awt.BorderLayout.CENTER);jContentPane.add(getJPanel(), java.awt.BorderLayout.NORTH);jContentPane.add(getJPanel1(), java.awt.BorderLayout.SOUTH);

}return jContentPane;

}

}

MaquinaTuring.java

Page 17: Maquinas de Turing

package maquinasturing;

import java.util.LinkedList;

public class MaquinaTuring {

public SevenTupla sevenTupla;

private String nombre;private LinkedList<Character> cinta;

private int posicionActual; private String estadoActual;

public MaquinaTuring() {sevenTupla=new SevenTupla();

cinta=new LinkedList(); posicionActual=0; estadoActual=null; nombre=null;

}

public String getNombre() { return nombre; }

public void setNombre(String nombre) { this.nombre = nombre; }

public void addPosicionActual(int posicion){ posicionActual=posicion; }

public void inicializarEstado(){ estadoActual=sevenTupla.getEstadoInicial(); }

public void setCadena(String cadena) throws Exception { cinta.add(sevenTupla.getSimbiloBlanco()); for(char caracter:cadena.toCharArray()){ Character chCaracter=new Character(caracter);

Page 18: Maquinas de Turing

if(sevenTupla.estaEnAlfabeto(chCaracter)) cinta.add(chCaracter); else{ cinta.clear(); throw new Exception("El caracter "+chCaracter+" no pertence al alfabeto de la cinta"); } } cinta.add(sevenTupla.getSimbiloBlanco()); }

public String toStringCinta(){ String strCinta=""; if(!cinta.isEmpty()){ for(Character caracter:cinta) strCinta=strCinta+caracter; strCinta=strCinta.substring(0,posicionActual)+"["+ strCinta.substring(posicionActual,posicionActual+1)+"]"+strCinta.substring(posicionActual+1); } return strCinta; }

public boolean estaAlFinal(){ return sevenTupla.esEstadoFinal(estadoActual); }

public void EjecutarTransaccion() throws Exception { Transaccion transaccion=sevenTupla.getTransaccion(estadoActual,cinta.get(posicionActual)); if(transaccion==null) throw new Exception("No existe una transici�n para la combinacion"+estadoActual+" "+cinta.get(posicionActual)); else{ cinta.set(posicionActual,transaccion.getCaracter()); if(transaccion.getMovimiento()==Transaccion.derecha){ if(cinta.size()==posicionActual+1) cinta.addLast(sevenTupla.getSimbiloBlanco()); posicionActual++; } else{ if(posicionActual==0) cinta.addFirst(sevenTupla.getSimbiloBlanco()); posicionActual--;

Page 19: Maquinas de Turing

} estadoActual=transaccion.getSgtEstado(); } }

public String toString(){ String str="Maquina de Turin...."+nombre+"\nCinta: "+toStringCinta()+sevenTupla.toString(); return str; }}

Maquinas.java

package maquinasturing;

public class Maquinas {public static MaquinaTuring MaquinaA(){

MaquinaTuring mt=new MaquinaTuring(); try{ mt.setNombre("Maquina 1"); mt.sevenTupla.addEstado("q1"); mt.sevenTupla.addEstado("q2"); mt.sevenTupla.addCaracter(new Character('a')); mt.sevenTupla.addCaracter(new Character('b')); mt.sevenTupla.addEstadoInicial("q1"); mt.sevenTupla.addSimboloBlanco(new Character('*')); mt.sevenTupla.addEstadosFinales("q2"); mt.sevenTupla.addTransaccion("q1",'a',"q1",'a',Transaccion.derecha); mt.sevenTupla.addTransaccion("q1",'b',"q1",'a',Transaccion.derecha); mt.sevenTupla.addTransaccion("q1",'*',"q2",'*',Transaccion.izquierda); }catch(Exception e){ System.out.println(e.getMessage()); }

return mt;}

public static MaquinaTuring MaquinaB(){MaquinaTuring mt=new MaquinaTuring();

try{ mt.setNombre("Maquina 2"); mt.sevenTupla.addEstado("q1"); mt.sevenTupla.addEstado("q2");

Page 20: Maquinas de Turing

mt.sevenTupla.addEstado("q3"); mt.sevenTupla.addCaracter(new Character('a')); mt.sevenTupla.addCaracter(new Character('b')); mt.sevenTupla.addEstadoInicial("q1"); mt.sevenTupla.addSimboloBlanco(new Character('*')); mt.sevenTupla.addEstadosFinales("q3"); mt.sevenTupla.addTransaccion("q1",'a',"q1",'a',Transaccion.izquierda); mt.sevenTupla.addTransaccion("q1",'b',"q1",'b',Transaccion.izquierda); mt.sevenTupla.addTransaccion("q1",'*',"q2",'*',Transaccion.derecha); mt.sevenTupla.addTransaccion("q2",'a',"q3",'a',Transaccion.izquierda); mt.sevenTupla.addTransaccion("q2",'b',"q3",'b',Transaccion.izquierda); mt.sevenTupla.addTransaccion("q2",'*',"q3",'*',Transaccion.izquierda); }catch(Exception e){ System.out.println(e.getMessage()); }

return mt;}

public static MaquinaTuring MaquinaC(){MaquinaTuring mt=new MaquinaTuring();

try{ mt.setNombre("Maquina 3"); mt.sevenTupla.addEstado("q1"); mt.sevenTupla.addEstado("q2"); mt.sevenTupla.addCaracter(new Character('a')); mt.sevenTupla.addCaracter(new Character('b')); mt.sevenTupla.addEstadoInicial("q1"); mt.sevenTupla.addSimboloBlanco(new Character('*')); mt.sevenTupla.addTransaccion("q1",'a',"q1",'a',Transaccion.derecha); mt.sevenTupla.addTransaccion("q1",'b',"q2",'b',Transaccion.derecha); mt.sevenTupla.addTransaccion("q1",'*',"q2",'*',Transaccion.derecha); mt.sevenTupla.addTransaccion("q2",'a',"q1",'a',Transaccion.izquierda); mt.sevenTupla.addTransaccion("q2",'b',"q1",'b',Transaccion.izquierda); mt.sevenTupla.addTransaccion("q2",'*',"q1",'*',Transaccion.izquierda); }catch(Exception e){ System.out.println(e.getMessage()); }

return mt;}

public static MaquinaTuring MaquinaD(){MaquinaTuring mt=new MaquinaTuring();

Page 21: Maquinas de Turing

try{ mt.setNombre("Maquina 4"); mt.sevenTupla.addEstado("q1"); mt.sevenTupla.addEstado("q2"); mt.sevenTupla.addCaracter(new Character('a')); mt.sevenTupla.addEstadoInicial("q1"); mt.sevenTupla.addSimboloBlanco(new Character('*')); mt.sevenTupla.addEstadosFinales("q2"); mt.sevenTupla.addTransaccion("q1",'a',"q1",'a',Transaccion.derecha); mt.sevenTupla.addTransaccion("q1",'*',"q2",'*',Transaccion.derecha); }catch(Exception e){ System.out.println(e.getMessage()); }

return mt;}

public static MaquinaTuring MaquinaE(){MaquinaTuring mt=new MaquinaTuring();

try{ mt.setNombre("Maquina 5"); mt.sevenTupla.addEstado("q1"); mt.sevenTupla.addEstado("q2"); mt.sevenTupla.addEstado("q3"); mt.sevenTupla.addCaracter(new Character('a')); mt.sevenTupla.addCaracter(new Character('b')); mt.sevenTupla.addEstadoInicial("q1"); mt.sevenTupla.addSimboloBlanco(new Character('*')); mt.sevenTupla.addEstadosFinales("q3"); mt.sevenTupla.addTransaccion("q1",'a',"q1",'a',Transaccion.derecha); mt.sevenTupla.addTransaccion("q1",'b',"q2",'b',Transaccion.derecha); mt.sevenTupla.addTransaccion("q1",'*',"q3",'*',Transaccion.derecha); mt.sevenTupla.addTransaccion("q2",'a',"q2",'a',Transaccion.derecha); mt.sevenTupla.addTransaccion("q2",'b',"q2",'b',Transaccion.derecha); mt.sevenTupla.addTransaccion("q2",'*',"q2",'*',Transaccion.derecha); }catch(Exception e){ System.out.println(e.getMessage()); }

return mt;}

public static MaquinaTuring MaquinaF(){MaquinaTuring mt=new MaquinaTuring();

Page 22: Maquinas de Turing

try{ mt.setNombre("Maquina 6 a*b*"); mt.sevenTupla.addEstado("q1"); mt.sevenTupla.addEstado("q2"); mt.sevenTupla.addEstado("q3"); mt.sevenTupla.addCaracter(new Character('a')); mt.sevenTupla.addCaracter(new Character('b')); mt.sevenTupla.addEstadoInicial("q1"); mt.sevenTupla.addSimboloBlanco(new Character('*')); mt.sevenTupla.addEstadosFinales("q3"); mt.sevenTupla.addTransaccion("q1",'a',"q2",'a',Transaccion.derecha); mt.sevenTupla.addTransaccion("q1",'b',"q2",'b',Transaccion.derecha); mt.sevenTupla.addTransaccion("q1",'*',"q3",'*',Transaccion.derecha); mt.sevenTupla.addTransaccion("q2",'a',"q2",'a',Transaccion.derecha); mt.sevenTupla.addTransaccion("q2",'b',"q2",'b',Transaccion.derecha); mt.sevenTupla.addTransaccion("q2",'*',"q3",'*',Transaccion.derecha); }catch(Exception e){ System.out.println(e.getMessage()); }

return mt;}public static MaquinaTuring MaquinaG(){

MaquinaTuring mt=new MaquinaTuring(); try{ mt.setNombre("Maquina 7 a*b"); mt.sevenTupla.addEstado("q1"); mt.sevenTupla.addEstado("q2"); mt.sevenTupla.addEstado("q3"); mt.sevenTupla.addCaracter(new Character('a')); mt.sevenTupla.addCaracter(new Character('b')); mt.sevenTupla.addEstadoInicial("q1"); mt.sevenTupla.addSimboloBlanco(new Character('*')); mt.sevenTupla.addEstadosFinales("q3"); mt.sevenTupla.addTransaccion("q1",'a',"q2",'a',Transaccion.derecha); mt.sevenTupla.addTransaccion("q1",'b',"q3",'b',Transaccion.derecha); mt.sevenTupla.addTransaccion("q2",'a',"q2",'a',Transaccion.derecha); mt.sevenTupla.addTransaccion("q2",'b',"q3",'b',Transaccion.derecha); }catch(Exception e){ System.out.println(e.getMessage()); }

return mt;}

Page 23: Maquinas de Turing

public static MaquinaTuring MaquinaH(){MaquinaTuring mt=new MaquinaTuring();

try{ mt.setNombre("Maquina 8 a|b"); mt.sevenTupla.addEstado("q1"); mt.sevenTupla.addEstado("q2"); mt.sevenTupla.addCaracter(new Character('a')); mt.sevenTupla.addCaracter(new Character('b')); mt.sevenTupla.addEstadoInicial("q1"); mt.sevenTupla.addSimboloBlanco(new Character('*')); mt.sevenTupla.addEstadosFinales("q2"); mt.sevenTupla.addTransaccion("q1",'a',"q2",'a',Transaccion.derecha); mt.sevenTupla.addTransaccion("q1",'b',"q2",'b',Transaccion.derecha); }catch(Exception e){ System.out.println(e.getMessage()); }

return mt;}

public static MaquinaTuring MaquinaI(){MaquinaTuring mt=new MaquinaTuring();

try{ mt.setNombre("Maquina 9 a*|b"); mt.sevenTupla.addEstado("q1"); mt.sevenTupla.addEstado("q2"); mt.sevenTupla.addCaracter(new Character('a')); mt.sevenTupla.addCaracter(new Character('b')); mt.sevenTupla.addEstadoInicial("q1"); mt.sevenTupla.addSimboloBlanco(new Character('*')); mt.sevenTupla.addEstadosFinales("q2"); mt.sevenTupla.addTransaccion("q1",'a',"q1",'a',Transaccion.derecha); mt.sevenTupla.addTransaccion("q1",'b',"q2",'b',Transaccion.derecha); mt.sevenTupla.addTransaccion("q1",'*',"q2",'*',Transaccion.derecha); }catch(Exception e){ System.out.println(e.getMessage()); }

return mt;}

public static MaquinaTuring MaquinaJ(){MaquinaTuring mt=new MaquinaTuring();

Page 24: Maquinas de Turing

try{ mt.setNombre("Maquina 10"); mt.sevenTupla.addEstado("q1"); mt.sevenTupla.addEstado("q2"); mt.sevenTupla.addCaracter(new Character('a')); mt.sevenTupla.addCaracter(new Character('b')); mt.sevenTupla.addEstadoInicial("q1"); mt.sevenTupla.addSimboloBlanco(new Character('*')); mt.sevenTupla.addEstadosFinales("q2"); mt.sevenTupla.addTransaccion("q1",'a',"q1",'a',Transaccion.derecha); mt.sevenTupla.addTransaccion("q1",'b',"q2",'b',Transaccion.derecha); mt.sevenTupla.addTransaccion("q1",'*',"q2",'*',Transaccion.derecha); }catch(Exception e){ System.out.println(e.getMessage()); }

return mt;}

}

SevenTupla.java

package maquinasturing;

import java.util.Set;import java.util.HashSet;import java.util.HashMap;

public class SevenTupla {private Set<String> estados;private Set<Character> alfabetoEntrada;private String estadoInicial;private Character simbiloBlanco;private Set<String> estadosFinales;private HashMap<String,HashMap<Character,Transaccion>> transacciones;

public SevenTupla() {this.estados=new HashSet();this.alfabetoEntrada=new HashSet();this.estadoInicial=null;this.simbiloBlanco=null;this.estadosFinales=new HashSet();

Page 25: Maquinas de Turing

this.transacciones=new HashMap();}

public void addEstado(String nuevoestado) throws Exception{if(estados.contains(nuevoestado))

throw new Exception("El estado "+nuevoestado+" ya existe");else

estados.add(nuevoestado);}

public void addCaracter(Character caracter) throws Exception{if(alfabetoEntrada.contains(caracter))

throw new Exception("El caracter "+caracter+" ya hace parte del alfabeto de entrada");

elsealfabetoEntrada.add(caracter);

}

public void addEstadoInicial(String nuevoEstadoInicial) throws Exception{if(estados.contains(nuevoEstadoInicial))

estadoInicial=nuevoEstadoInicial;else

throw new Exception("El estado "+nuevoEstadoInicial+" no hace parte del conjunto de estados");

}

public void addSimboloBlanco(Character nuevoSimboloBlanco) throws Exception{if(!alfabetoEntrada.contains(nuevoSimboloBlanco))

simbiloBlanco=nuevoSimboloBlanco;else

throw new Exception("El caracter "+nuevoSimboloBlanco+" hace parte del alfabeto de entrada");

}

public void addEstadosFinales(String estado) throws Exception{if(estados.contains(estado))

estadosFinales.add(estado);else

throw new Exception("El estado "+estado+" no hace parte del conjunto de estados");

}

Page 26: Maquinas de Turing

public void addTransaccion(String estado,char caracter,String sgtestado,char car,char movimiento){

if(!transacciones.containsKey(estado))transacciones.put(estado,new HashMap());

transacciones.get(estado).put(new Character(caracter),new Transaccion(new Character(car),sgtestado,movimiento));

}

public Set<Character> getAlfabetoEntrada() {return alfabetoEntrada;

}

public String getEstadoInicial() {return estadoInicial;

}

public Set<String> getEstados() {return estados;

}

public Set<String> getEstadosFinales() {return estadosFinales;

}

public Character getSimbiloBlanco() {return simbiloBlanco;

}

public HashMap<String, HashMap<Character, Transaccion>> getTransacciones() {return transacciones;

}

public boolean esEstadoFinal(String estado){return estadosFinales.contains(estado);

}

public boolean estaEnAlfabeto(Character chCaracter) { if(alfabetoEntrada.contains(chCaracter)||simbiloBlanco.equals(chCaracter)) return true; return false; }

Page 27: Maquinas de Turing

public Transaccion getTransaccion(String estado, Character caracter) { return getTransacciones().get(estado).get(caracter); }

public String toStringEstados(){ String str="["; for(String estado:estados) str=str+estado+","; str=str.substring(0,str.length()-1)+"]"; return str; }

public String toStringAlfabetoDeEntrada(){ String str="["; for(Character caracter:alfabetoEntrada) str=str+caracter+","; str=str.substring(0,str.length()-1)+"]"; return str; }

public String toStringAlfabetoDeCinta(){ String str="["+simbiloBlanco+","; for(Character caracter:alfabetoEntrada) str=str+caracter+","; str=str.substring(0,str.length()-1)+"]"; return str; }

public String toStringEstadosFinales(){ String str="["; for(String estado:estadosFinales) str=str+estado+","; str=str.substring(0,str.length()-1)+"]"; return str; }

public String toStringTransacciones(){ String str=""; Set<String> estadosAct=transacciones.keySet(); for(String estadoAct:estadosAct){

Set<Character> caracteresAct=transacciones.get(estadoAct).keySet();

Page 28: Maquinas de Turing

for(Character caracterAct:caracteresAct){ String tra="- ("+estadoAct+","+caracterAct+"):"+ transacciones.get(estadoAct).get(caracterAct).toString()+"\n"; str=str+tra; } } return str; }

public String toString(){ String string="\n---Seven Tupla---\nEstados: "+toStringEstados()+ "\nAlfabeto de Entrada: "+toStringAlfabetoDeEntrada()+ "\nAlfabeto de la cinta: "+toStringAlfabetoDeCinta()+ "\nEstado Inicial: "+estadoInicial+"\nSimbolo Blanco: "+ simbiloBlanco.toString()+"\nEstados Finales: "+ toStringEstadosFinales()+"\nTransacciones:\n"+toStringTransacciones(); return string; }}

Tarea.java

package maquinasturing;

import javax.swing.JOptionPane;import javax.swing.JTextField;

public class Tarea extends Thread {private MaquinaTuring mt;private JTextField jt;

Tarea(MaquinaTuring m,JTextField j){mt=m;jt=j;

}

public void run(){try {

do{jt.setText(mt.toStringCinta());

Page 29: Maquinas de Turing

mt.EjecutarTransaccion();sleep(300);

}while(!mt.estaAlFinal());jt.setText(mt.toStringCinta());

} catch (Exception ex) {JOptionPane.showMessageDialog(null,ex.getMessage(),"Error Al

Ejecutar",JOptionPane.ERROR_MESSAGE);ex.printStackTrace();

}}

}

Transaccion.java

package maquinasturing;

public class Transaccion {private String sgtEstado;private Character caracter;private char movimiento;public static final char izquierda='<';public static final char derecha='>';

public Transaccion(Character nuevocaracter,String estado,char nuevomovimiento) {this.caracter =nuevocaracter;this.movimiento =nuevomovimiento;this.sgtEstado = estado;

}

public Transaccion() {this.caracter =null;this.movimiento = derecha;this.sgtEstado = null;

}

public Transaccion(Character caracter, char movimiento, String estado) {this.caracter = caracter;this.movimiento = movimiento;this.sgtEstado = estado;

}

public Character getCaracter() {

Page 30: Maquinas de Turing

return caracter;}

public void setCaracter(Character caracter) {this.caracter = caracter;

}

public char getMovimiento() {return movimiento;

}

public void setMovimiento(char movimiento) {this.movimiento = movimiento;

}

public String getSgtEstado() {return sgtEstado;

}

public void setSgtEstado(String sgtEstado) {this.sgtEstado = sgtEstado;

}

public String toString(){ return "("+sgtEstado+","+caracter+","+movimiento+")"; }

}

BIBLIOGRAFIA

http://es.wikipedia.org/wiki/Alan_Turing http://es.wikipedia.org/wiki/Test_de_Turing http://es.wikipedia.org/wiki/M%C3%A1quina_de_Turing http://www.mitecnologico.com/Main/LaMaquinaDeTuring http://www.zator.com/Cpp/E0_1_1.htm http://www.rastersoft.com/articulo/turing.html http://computabilidadycomplejidad.webs.com/Teo3.pdf http://users.dsic.upv.es/asignaturas/eui/alc/MTuring.pdf http://www.youtube.com/watch?v=uU9kG_Wn1H8 http://www.youtube.com/watch?v=AJthR3BW0r8