Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Lenguajes Automatas
Armando Ramos Barajas
1
Índice
1 INTRODUCCION. .................................................................................................................................... 3
2 OBJETIVO PARTICULAR. ......................................................................................................................... 4
2.1 Objetivos general. ......................................................................................................................... 4
3 MARCO TEORICO. .................................................................................................................................. 4
4 DIAGRAMA DE ESTADOS. ...................................................................................................................... 8
4.1 Máquina Turing (diagrama JFLAP). ................................................................................................ 8
5 DESARROLLO. ........................................................................................................................................ 9
5.1 Código............................................................................................................................................ 9
6 Caja Blanca. ......................................................................................................................................... 18
7 Caja Negra. .......................................................................................................................................... 20
8 Bibliografías. ........................................................................................................................................ 20
2
1 INTRODUCCION.
Una máquina de Turing es un dispositivo de cálculo lógico que utiliza un input en una o
varias cintas que se van moviendo en función de la instrucción que tenga el estado de
un autómata, para finalmente obtener un output mediante la reescritura de los datos en
la misma cinta. La máquina tiene un cabezal de lectura y este lee el dato que se
encuentra en la posición de la cinta. Por buscar una similitud lo más parecido sería un
casette de música, que se rebobina o se adelanta según la canción que nos interese,
en la cual podremos borrar o grabar otra canción donde queramos. En el caso de una
máquina de Turing de una cinta se define dicha máquina como una 7-tupla de la
siguiente manera:
donde:
Símbolo Descripción
3
Y se interpreta de la siguiente manera:
2 Lee un
2 OBJETIVO PARTICULAR.
Construir autómatas con pila que reconozcan un lenguaje que pueda ser generado a
partir de una gramática independiente del contexto y viceversa. Construir Máquinas de
Turing reconocedores de lenguajes. Reconocer el alcance de las funciones recursivas.
Resolver aplicaciones prácticas y ejercicios con los modelos teóricos anteriores.
3 MARCO TEORICO.
4
Según parece, el temprano interés por la ciencia que demostró no tenía ninguna raíz en
su familia, sino que se trató de un caso de “generación espontánea”. De hecho se afirma
que este interés preocupaba a su madre, que veía peligrar su entrada en la Escuela
Pública Inglesa, poco interesada en fomentar la expresividad, originalidad y el
descubrimiento. Aún así consiguió ingresar en el internado de Sherborne, en Dorset
(cerca de Southampton).
Desde 1933 se había interesado por las teorías de Russell, Whitehead y Gödel acerca
de la formalización de las matemáticas en términos de la lógica de proposiciones. Este
interés fue el que llevó a Turing a dar con el conocido como Problema de la
decisión o Entscheidungsproblem, planteado por David Hilbert y Wilhem Ackermann en
1928, y para el que aún no se había encontrado respuesta: ¿Podría existir, al menos en
5
principio, un método definido o proceso a través del cual pudiera decidirse si una
afirmación matemática es demostrable? o dicho de otro modo, ¿es posible encontrar una
forma de saber a ciencia cierta si una afirmación determinada, dentro del contexto de las
matemáticas, es cierta o falsa, o por el contrario existen afirmaciones cuya naturaleza no
podemos determinar?
El logro de Turing fue no sólo el dar respuesta a esa pregunta, sino también la precisa y
contundente definición de método que se vio obligado a construir para ello. Utilizando su
revolucionaria capacidad para mezclar lo físico con la formalidad y el rigor matemático,
Turing ideó una máquina teórica que se ajustaba perfectamente a esta definición: la
Máquina de Turing, y demostró que dicha máquina era capaz de implementar (leer y
ejecutar) cualquier problema matemático que pudiera representarse por medio de un
algoritmo, es decir, que pudiera describirse en un número determinado de pasos
concretos. Turing había descubierto el métodocapaz de procesar cualquier afirmación
matemática, y por tanto le bastó con comprobar que existen problemas que se podían
implementar, pero para los que no se podía saber si la máquina llegaría a una solución o
no, para demostrar, en su memorable estudio de 1936 “Sobre los números computables
con una aplicación al Entscheidungsproblem”, que la respuesta al Problema de la
decisión es no. Todo esto, que puede parecer un simple entretenimiento de científicos
locos, constituye el fundamento teórico sobre el cual se basa la Computación, base
teórica de la Informática, y es que una máquina de Turing no es más que una
computadora expresada de la forma más sencilla posible.
Durante los años siguientes Alan Turing desarrolló sus trabajos sobre computación en la
universidad norteamericana de Princeton, donde se encontraba uno de los más
importantes centros de estudio de lógica formal del mundo, bajo la dirección de Alonzo
Church, quien había sido capaz de llegar a las mismas conclusiones de Turing pero
utilizando métodos más formales desde el punto de vista del rigor matemático. Aunque
Church publicó antes que Turing su descubrimiento, la explicación de Turing ha tenido
mayor transcendencia debido en gran medida a la conexión que encontró entre lo
real y lo formal por medio de una máquina que, aunque con limitaciones, puede
construirse y funcionar fuera de la mente de un matemático.
6
En 1939 retornó a Inglaterra y se involucró en una tarea que iba a ser clave para el
desarrollo de la recién comenzada IIª Guerra Mundial: el descubrimiento del código de la
máquina Enigma, utililizada por el ejército alemán para codificar mensajes. La
descodificación de la Enigma, además de ser cosiderada una verdadera hazaña desde
el punto de vista científico, aportó al bando aliado importantes ventajas estratégicas,
principalmente la posibilidad de que los convoyes que abastecían a las islas británicas
evitaran las emboscadas de los submarinos alemanes. Es una idea comunmente
aceptada que en este incomesurable esfuerzo estuvo una de las claves de la derrota
alemana.
A partir de 1945, una vez terminada la guerra, dedicó sus esfuerzos en el desarrollo de
los primeros computadores en la Universidad de Manchester y en el estudio, más teórico,
de la Inteligencia Artificial. Fue en 1950 cuando desarrolló su famoso “Test de Turing”,
una prueba destinada corroborar la existencia de inteligencia en una máquina. Turing
defendía la viabilidad de construir una máquina con una capacidad de razonamiento tal
que su propio test no fuera capaz de distinguirla de un ser humano, postulado que es el
centro de uno de los debates científicos y filosóficos más interesantes de la actualidad y
que tiene como uno de sus principales detractores al Premio Nobel de Física Roger
Penrose. Como curiosidad, el Test Voight-Kampf que se utiliza para identificar replicantes
en la película Blade Runner es una versión ficticia del test de Turing.
7
más probable, no faltaron las especulaciones ni las teorías conspiratorias al respecto. Así
acabó, prematura y trágicamente, la vida de uno de los científicos más importantes del
siglo XX, cuyas ideas fueron transcendentales para la revolución tecnológica que
sobrevino años después, y que aún hoy alimentan debates de gran impotancia para
nuestro futuro.
4 DIAGRAMA DE ESTADOS.
8
5 DESARROLLO.
5.1 Código.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
/* Longitud maxima + 1. */
#define MAX_LONG 256
9
/* Concateno la cadena w con un blanco por la izquierda. */
w[i] = '_';
}
void salidaTrue() {
printf("\n\nCadena aceptada!!");
}
void salidaFalse() {
printf("\n\nError... %s\n\n", funcion);
}
void printLog(char *w, char *ea, int i, char x, char m, char *e) {
printf(
"\nLa cadena es: \"%s\". ( %s,\"%c\") --> ( \"%c\", %c ,
%s).",
w, ea, w[i], x, m, e);
}
// Si leo 0
if (w[i] == '0') {
// lo cambio por X
w[i] = 'X';
// Si leo Y
} else if (w[i] == 'Y') {
10
// dejo Y sin cambiar, me muevo a la derecha (R) y me voy al
estado q3.
estado_q12(w, i += 1);
if (w[i] == '_') {
printLog(w, estadoActual, i, '_', 'R', "q5");
estado_q5(w, i += 1);
}
}
if (w[i] == '_') {
printLog(w, estadoActual, i, '1', 'L', "q4");
w[i] = '1';
estado_q4(w, i -= 1);
11
}else if (w[i] == '1') {
}
}
if (w[i] == '_') {
printLog(w, estadoActual, i, '_', 'R', "q5");
estado_q5(w, i += 1);
}
}
if (w[i] == '_') {
printLog(w, estadoActual, i, '_', 'L', "q6");
estado_q6(w, i -= 1);
if (w[i] == '0') {
printLog(w, estadoActual, i, '1', 'L', "q7");
w[i] = '1';
estado_q7(w, i -= 1);
}
}
12
if (w[i] == '_') {
printLog(w, estadoActual, i, '_', 'R', "STOP");
stop(true);
printf("\n\nFuncion 2x + 1\n\n");
if (w[i] == '1') {
printLog(w, estadoActual, i, '0', 'L', "q8");
w[i] = '0';
estado_q8(w, i -= 1);
}
}
if(w[i] == 'V') {
// Si leo 0
if (w[i] == '0') {
// Si leo 1
} else if (w[i] == '1') {
13
// lo cambio por Y
w[i] = 'Y';
// Si leo Y
} else if (w[i] == 'Y') {
// Si leo 0
if (w[i] == '0') {
// Si leo X
} else if (w[i] == 'X') {
// Si leo Y
} else if (w[i] == 'Y') {
14
estado_q11(w, i -= 1);
}
}
// Si leo 0, 1 o X
if (w[i] == '0' || w[i] == '1' || w[i] == 'X') {
// Si leo Y
} else if (w[i] == 'Y') {
if(w[i] == 'A') {
if(w[i] == 'N') {
15
if(w[i] == 'M') {
if(w[i] == 'O') {
if(w[i] == 'N') {
if(w[i] == 'T') {
if(w[i] == 'E') {
if(w[i] == 'S') {
16
printLog(w, estadoActual, i, '9', 'R', "q22");
w[i] = '9';
estado_q22(w, i += 1);
}
}
if (w[i] == '_') {
printLog(w, estadoActual, i, '_', 'R', "STOP");
stop(true);
printf("\n\nCumple lectura de cadena!!\n\n");
}
}
int linea(int s) {
fprintf(stdout,"+");
for (i = 0; i <= s; i++) {
fprintf(stdout,"-");
}
fprintf(stdout,"+\n");
return 0;
}
17
* por el caracter w[1] en el estado q0 */
estado_q0(w, 1);
return 0;
}
6 Caja Blanca.
Se hizo la compilación introduciendo las cadenas correspondientes que le dimos al diagrama de estado
para que las acepte como se muestran en las siguientes imágenes.
18
19
7 Caja Negra.
Se muestra en las siguientes imágenes que no acepta la cadena porque es incorrecta y porque no la
declaramos en el diagrama de estados.
8 Bibliografías.
https://elmaquinadeturing.wordpress.com/alan-turing/
20