Вы находитесь на странице: 1из 31

LOGICA COMPUTACIONAL

MAQUINAS DE TURING

Presentado por EDGAR JULIAN TORRES NEIDER VASQUEZ RAMIREZ

Presentado a: Profesor ALVARO IVAN JIMENEZ ALZATE

Universidad Santiago de Cali, Junio de 2012

CONTENIDO

1. ALAN MATHISON TURING 1.1. Anlisis criptogrfico (ruptura de cdigos) 1.2. El Test de Turing (o Prueba de Turing) 2. MQUINA DE TURING 2.1. 2.2. 2.3. 2.4. 2.5. 2.6. HISTORIA Definicin formal Funcionamiento Representacin como diagrama de estados Descripcin instantnea Ejemplo

3. CODIGO JAVA 3.1. 3.2. 3.3. 3.4. 3.5. 3.6. Correr.java MaquinaTuring.java Maquinas.java SevenTupla.java Tarea.java Transaccion.java

4. BIBLIOGRAFIA

ALAN MATHISON TURING OBE (23 de junio de 1912 en Maida Vale, Londres - 7 de junio de 1954 en Wilmslow, Cheshire) fue un matemtico, lgico, cientfico de la computacin, criptgrafo y filsofo ingls. Es considerado uno de los padres de la Ciencia de la computacin siendo el precursor de la informtica moderna. Proporcion una influyente formalizacin de los conceptos de algoritmo y computacin: la mquina de Turing. Formul su propia versin de la hoy ampliamente aceptada Tesis de Church-Turing, la cual postula que cualquier modelo computacional existente tiene las mismas capacidades algortmicas, o un subconjunto, de las que tiene una mquina de Turing. Durante la Segunda Guerra Mundial, trabaj en descifrar los cdigos nazis, particularmente los de la mquina Enigma; durante un tiempo fue el director de la seccin Naval Enigma del Bletchley Park. Tras la guerra dise uno de los primeros computadores electrnicos programables digitales en el Laboratorio Nacional de Fsica del Reino Unido y poco tiempo despus construy otra de las primeras mquinas en la Universidad de Mnchester. Entre otras muchas cosas, tambin contribuy de forma particular e incluso provocativa al enigma de si las mquinas pueden pensar, es decir a la Inteligencia Artificial. La carrera de Turing termin sbitamente cuando fue procesado por ser homosexual. No se defendi de los cargos y se le dio a escoger entre la castracin qumica o ir a la crcel. Eligi lo primero y sufri importantes consecuencias fsicas, entre ellas la impotencia. Dos aos despus del juicio, en 1954, cometi suicidio tras ingerir cianuro. Anlisis criptogrfico (ruptura de cdigos)

El Bombe replicaba la accin de varias mquinas Enigma.

Durante la Segunda Guerra Mundial fue uno de los principales artfices de los trabajos del Bletchley Park para descifrar los cdigos secretos nazis. Sus perspicaces observaciones matemticas contribuyeron a romper los cdigos de la mquina Enigma y de los codificadores de teletipos FISH (mquinas de teletipos codificados que fabricaron conjuntamente Lorenz Electric y Siemens&Halske). Sus estudios del sistema Fish ayudaran al desarrollo posterior de la primera computadora programable electrnica digital llamada Colossus, la cual fue diseada por Max

Newman y su equipo, y construida en la Estacin de Investigaciones Postales de Dollis Hill por un equipo dirigido por Thomas Flowers en 1943. Dicha computadora se utiliz para descifrar los cdigos Fish (en concreto las transmisiones de la mquina Lorenz). Para romper los cdigos de la mquina Enigma y permitir a los aliados anticipar los ataques y movimientos militares Nazis, Turing dise la bombe, una mquina electromecnica llamada as en reconocimiento de la diseada por los polacos bomba kryptologiczna que se utilizaba para eliminar una gran cantidad de claves enigma candidatas. Para cada combinacin posible se implementaba elctricamente una cadena de deducciones lgicas. Era posible detectar cundo ocurra una contradiccin y desechar la combinacin. La bombe de Turing, con una mejora aadida que sugiri el matemtico Gordon Welchman, era la herramienta principal que usaban los criptgrafos aliados para leer las transmisiones Enigma. Los trabajos de ruptura de cdigos de Turing han sido secretos hasta los aos 1970; ni siquiera sus amigos ms 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 mquina. Fue expuesto en 1950 en un artculo (Computing machinery and intelligence) para la revista Mind, y sigue siendo uno de los mejores mtodos para los defensores de la Inteligencia Artificial. Se fundamenta en la hiptesis positivista de que, si una mquina se comporta en todos los aspectos como inteligente, entonces debe ser inteligente. La prueba consiste en un desafo. Se supone un juez situado en una habitacin, y una mquina y un ser humano en otras. El juez debe descubrir cul es el ser humano y cul es la mquina, estndoles 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 hbiles, el juez no podra distinguir quin era el ser humano y quin la mquina. Todava ninguna mquina puede pasar este examen en una experiencia con mtodo cientfico.

En 1990 se inici un concurso, el Premio Loebner, una competicin de carcter anual entre programas de ordenador que sigue el estndar 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 dlares estadounidenses para el programa que pase el test, y un premio de consolacin para el mejor programa anual. Todava no ha sido otorgado el premio principal. MQUINA DE TURING

Una mquina de Turing (MT) 1 es un modelo computacional que realiza una lectura/escritura de manera automtica 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 smbolo 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 funcin de transicin, que recibe un estado inicial y una cadena de caracteres (la cinta, la cual puede ser infinita) pertenecientes al alfabeto de entrada. La mquina va leyendo una celda de la cinta en cada paso, borrando el smbolo en el que se encuentra posicionado su cabezal y escribiendo un nuevo smbolo 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 segn se indique en la funcin de transicin, para finalmente detenerse en un estado final o de aceptacin, representando as la salida.

HISTORIA

Representacin artstica de una mquina de Turing.

Alan Turing introdujo el concepto de mquina de Turing en el trabajo On computable numbers, with an application to the Entscheidungsproblem, publicado por la Sociedad Matemtica de Londres en 1936, en el que se estudiaba la cuestin planteada por David Hilbert sobre si las matemticas son decidibles, es decir, si hay un mtodo definido que pueda aplicarse a cualquier sentencia matemtica y que nos diga si esa sentencia es cierta o no. Turing ide un modelo formal de computador, la mquina de Turing, y demostr que existan problemas que una mquina no poda resolver. Con este aparato extremadamente sencillo es posible realizar cualquier cmputo que un computador digital sea capaz de realizar. Mediante este modelo terico y el anlisis de la complejidad de los algoritmos, fue posible la categorizacin de problemas computacionales de acuerdo a su comportamiento, apareciendo as, el conjunto de problemas denominados P y NP, cuyas soluciones pueden encontrarse en tiempo polinmico por mquinas 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 nocin informal de computabilidad con la computacin mediante una mquina de Turing.2 La idea subyacente es el concepto de que una mquina de Turing puede verse como un autmata ejecutando un procedimiento efectivo definido formalmente, donde el espacio de memoria de trabajo es ilimitado, pero en un momento determinado slo una parte finita es accesible. Definicin formal Una mquina de Turing con una sola cinta puede definirse como una 7-tupla

Donde: Es un conjunto finito de estados. Es un conjunto finito de smbolos distinto del espacio en blanco, denominado alfabeto de mquina o de entrada. Es un conjunto finito de smbolos de cinta, denominado alfabeto de cinta ( Es el estado inicial. Es un smbolo denominado blanco, y es el nico smbolo que se puede repetir un nmero infinito de veces. Es el conjunto de estados finales de aceptacin. Es una funcin parcial denominada funcin de transicin, es un movimiento a la izquierda y R\! es el movimiento a la derecha. ).

donde

Existen en la literatura un abundante nmero de definiciones alternativas, pero todas ellas tienen el mismo poder computacional, por ejemplo se puede aadir el smbolo como smbolo de "no movimiento" en un paso de cmputo. Funcionamiento La mquina 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 mquina se limitan a: Mover el cabezal lector/escritor hacia la derecha. Mover el cabezal lector/escritor hacia la izquierda

Visualizacin de una mquina de Turing, en la que se ve el cabezal y la cinta que se lee.

El cmputo se determina a partir de una tabla de estados de la forma: (Estado, valor) (Nuevo estado, nuevo valor, direccin)

Esta tabla toma como parmetros el estado actual de la mquina y el carcter ledo de la cinta, dando la direccin para mover el cabezal, el nuevo estado de la mquina y el valor a escribir en la cinta. La memoria es la cinta de la mquina que se divide en espacios de trabajo denominados celdas, donde se pueden escribir y leer smbolos. Inicialmente todas las celdas contienen un smbolo especial denominado "blanco". Las instrucciones que determinan el funcionamiento de la mquina tienen la forma, "si estamos en el estado x leyendo la posicin y, donde hay escrito el smbolo z, entonces este smbolo debe ser remplazado por este otro smbolo, y pasar a leer la celda siguiente, bien a la izquierda o bien a la derecha". La mquina de Turing puede considerarse como un autmata capaz de reconocer lenguajes formales. En ese sentido, es capaz de reconocer los lenguajes recursivamente enumerables, de acuerdo a la jerarqua de Chomsky. Su potencia es, por tanto, superior a otros tipos de autmatas, como el autmata finito, o el autmata con pila, o igual a otros modelos con la misma potencia computacional. Representacin como diagrama de estados Las maquinas de Turing pueden representarse mediante grafos particulares, tambin llamados diagramas de estados finitos, de la siguiente manera:

Esta mquina de Turing est definida sobre el alfabeto el estado final es siendo , el lenguaje de salida

, posee el conjunto de estados y

, con las transiciones que se pueden ver. Su estado inicial es

el smbolo denominado "blanco". Esta mquina reconoce la expresin con .

regular de la forma

Descripcin instantnea 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 seala el primer smbolo de .

Por ejemplo, para la mquina de Turing

Con las transiciones

La descripcin instantnea para la cinta 1011 es:

Ejemplo Definimos una mquina de Turing sobre el alfabeto {0,1}, donde 0 representa el smbolo blanco. La mquina comenzar su proceso situada sobre un smbolo "1" de una serie. La mquina de Turing copiar el nmero de smbolos "1" que encuentre hasta el primer blanco detrs de dicho smbolo blanco. Es decir, posiciona el cabezal sobre el 1 situado en el extremo izquierdo, doblar el nmero de smbolos 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 funcin de transicin es la siguiente:

El funcionamiento de una computacin de esta mquina puede mostrarse con el siguiente ejemplo (en negrita se resalta la posicin de la cabeza lectora/escritora):

La mquina 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 smbolos 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 ningn 1). Una vez en el extremo derecho, aade un 1. Despus 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 contina 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 smbolo siguiente, si es un 1, se pasa a otra iteracin del bucle, pasando al estado S1 de nuevo. Si es un smbolo 0, ser el smbolo central, con lo que la mquina se detiene al haber finalizado el cmputo.

CODIGO JAVA Correr.java package 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()); }

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;

/** 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) {

JOptionPane.showMessageDialog(null,ex.getMessage(),"Error",JOptionPane.ERROR_MESS AGE); } 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 Julin Torres \n COD: 1064429582 \n \n - Neider Vasquez Ramirez \n COD: 94520353 "); } }); } return Iniciar; }

/** * 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 listmodel.addElement(" Maquina listmodel.addElement(" Maquina listmodel.addElement(" Maquina listmodel.addElement(" Maquina listmodel.addElement(" Maquina listmodel.addElement(" Maquina listmodel.addElement(" Maquina listmodel.addElement(" Maquina listmodel.addElement(" Maquina jListMaquinas.setSelectedIndex(0); } /** este metodo inicializa this **/ private void initialize() { this.setSize(406,350);

1"); 2"); 3"); 4"); 5"); 6"); 7"); 8"); 9"); 10");

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 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); 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 transicin 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--; } 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"); 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(); 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(); 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;

} 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(); 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(); 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"); else alfabetoEntrada.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"); }

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; }

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(); 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()); 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() { 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

Вам также может понравиться