UNIDAD I “LENGUAJES Y GRAMATICAS” 1.1.- TERMINOLOGÍA, NOTACIÓN Y CONCEPTOS ELEMENTALES, ALFABETO, SÍMBOLOS, CADENA VACÍA, LENGUAJE, GRAMÁTICA. Alfabeto: Un alfabeto es un conjunto de símbolos finito y no vacío. Convencionalmente, utilizamos el símbolo para designar un alfabeto. Entre los alfabetos más comunes se incluyen los siguientes: 1. = {0,1}, el alfabeto binario 2. = {a, b, ……z}, el conjunto de todas las letras minúsculas. 3. El conjunto de todos los caracteres ASCII o el conjunto de todos los ASCII imprimibles. Símbolos: Un símbolo es una representación tangible de algo abstracto, por lo tanto, es perceptible por medio de algunos de los sentidos, por ejemplo, una letra es un símbolo gráfico que representa un sonido concreto, un dígito es la representación de un valor numérico; los símbolos también pueden representar un concepto o una idea, como los que se emplean en arquitectura, electricidad y matemáticas. Cadena vacía: Es aquella cadena que presenta cero apariciones de símbolos. Esta cadena designada por , es una cadena que puede construirse en cualquier alfabeto. Lenguaje: Es simplemente un conjunto de cadenas que incluyen símbolos de un alfabeto. Esta definición incluye lenguajes familiares, como los lenguajes naturales y los de programación de alto nivel, así como conjuntos de cadenas no relacionados. Gramática: que define los usos correctos de una lengua mediante preceptos. 1.2.- LENGUAJES: PROPIEDADES DE UN ALFABETO CERRADO DE KLEENE, CERRADURA POSITIVA Y SU RELACIÓN CON EL LENGUAJE. CERRADURA DE KLEENE Sea L un lenguaje sobre el alfabeto , se define a L* como la cerradura de Kleene o cerradura estrella como la unión infinita de todas las potencias de L, incluyendo la potencia cero. Ejemplo: Sea L1= {0,1}, entonces L1* = L10 L11 L12 …. = { } {0,1} {00,01,10,11} {000,001,010,011,…} = { ,0,1,00,01,10,11,000,001,010,011,…} Los lenguajes L1 = { } y L2 = , son los únicos cuya cerradura de Kleene es finita, y dado 0 que = { }, se cumple que * = { }, y por tanto, para ambos se tiene que: L1* = L2* = { }. También es interesante observar que aunque tengamos la igualdad de las cerraduras L1* = L2*, esto no significa que L1 y L2 tengan que ser iguales. CERRADURA POSITIVA De manera similar, se define la cerradura positiva de L, como la unión infinita de todas las potencias de L a partir de uno. Ejemplo: Sea L= {ab}, entonces L+ = {ab, abab, ababab, ababababab, ……}, mientras que L*= { , ab, abab, ababab, ababababab, ……}. PROPIEDADES DE LAS CERRADURAS Para cualquier lenguaje L, se cumplen las siguientes propiedades: L* = { } L+ L+ = L. L* = L* . L = L* . L+ = L+ . L* (L+)+ = L+ (L*)* = (L+)* = (L*)+ = L* Si L, entonces se sigue necesariamente que: L+ = L*, mientras que si cumple forzosamente que: L+ = L* - { }. 1.3.- OPERACIONES POTENCIACIÓN. CON LENGUAJES: CONCATENACIÓN: Sean L1 y L2 dos lenguajes, entonces L1 concatenación de L1 con L2. . UNIÓN, L2 = {wx | w L1, x L, se CONCATENACIÓN, L2 } es el lenguaje Ejemplo: Sean los lenguajes L1 = {pátz, camé, yuré, cará, zitá} y L2 = {cuaro}, entonces la concatenación de L1 con L2 es L1. L2 = {pátzcuaro, camécuaro, yurécuaro, carácuaro, zitácuaro}. Sean los lenguajes L1 = {01, 21} y L2 = {a, ba, ca}, entonces la concatenación de L1 con L2 es L1 . L2 ={01a, 01ba, 01ca, 21a, 21ba, 21ca} Similarmente se puede obtener L2 . L1 ={a01, ba01, ca01, a21, ba21, ca21} POTENCIA: Sea L un lenguaje sobre el alfabeto , entonces para cualquier n enésima potencia de L se define recursivamente como sigue: 𝐿𝑛 = 0, se tiene que la {Ɛ} para n = 0 𝑛−1 𝐿𝐿 para n > 0 Ejemplo: Sea L= { ab } entonces L0 = { }, L1 = { ab} Sea L = {0,1} entonces L0 = { }, L1 = {0, 1}, L2 = {00, 01, 10, 11}, Etc. UNIÓN: Las demás operaciones de conjuntos se aplican igualmente a los lenguajes, es decir: si L1 y L2 son dos lenguajes cualesquiera, entonces L1 L2 , L1 L2 , L1 - L2 , L2 – L1 y L1 L2 también son lenguajes. 1.4 GRAMÁTICA GENERATIVA Y ÁRBOLES DE DERIVACIÓN: SÍMBOLOS TERMINALES, SÍMBOLOS NO TERMINALES, SÍMBOLOS INICIALES, REGLAS DE PRODUCCIÓN, DERIVACIÓN DE PALABRAS. GRAMATICA GENERATIVA: Una gramática generativa es la cuarteta G= (N, , S, P), donde: es un alfabeto de símbolos terminales, N es la colección de símbolos no terminales, S es el símbolo inicial de una gramática (no terminal, S N) y P es la colección de reglas de sustitución, también llamadas producciones. Ejemplo: G= (N, , S, P), donde: N= {S, A, B} = {a, b} P = {SaB, SbA, Aa, AaS, A bAA, Bb, BbS, BaBB} DERIVACIÓN DE PALABRAS: El proceso de generar una cadena se llama “derivación”, donde la doble flecha significa genera o deriva; parte de un símbolo inicial representado por S. Los símbolos en minúsculas son los elementos del alfabeto y se les conoce como símbolos terminales, mientras que las letras mayúsculas se denominan símbolos no terminales (SNT), debido a que solamente aparecen durante el proceso de derivación, pero no pueden figurar en una cadena finalizada, estos son los símbolos que pueden ser reemplazados aplicando alguna de las reglas de sustitución o producciones. Ejemplo: G= (N, , S, P), donde: N= {S, A, B, C} = {a, b} P = S aA S aB A aA A bC B bB B bC C (por ser un estado de aceptación) La secuencia de transiciones que genera la cadena w= aaab, es la siguiente: S 𝑎 𝑎 𝑎 𝑏 A A A C → → → → La primer regla se interpreta como que la transición del estado S al estado A genera el símbolo a. La flecha expresa que S “es sustituido por” o “produce” la cadena Aa, de modo que puede utilizarse esta regla cuando se tiene al símbolo S en una cadena, el cual puede ser sustituido por la expresión que aparece a la derecha de la flecha. Por lo tanto la cadena w= aaab se puede generar por medio de las reglas anteriores. De este modo si se parte del símbolo inicial S y se aplica la primer regla, se obtiene aA, y si luego se aplica en dos ocasiones la tercera regla, se obtiene aaaA, luego se emplea la cuarta regla para obtener aaabC y finalmente la última regla para terminar en aaab. Este proceso se puede describir de manera compacta así: S aA aaA aaaA aaabC aaab ARBOL DE DERIVACIÓN: Es un árbol que representa en forma gráfica la manera como una gramática dada genera a una cadena concreta y tiene las siguientes propiedades: La etiqueta de la raíz es S. La etiqueta de cualquier vértice que no es hoja es un símbolo no terminal. La etiqueta de cualquier vertice hoja es un simbolo terminal o . Para cada producción de la forma A w, que se aplique en una derivación, deberá haber un nodo etiquetado con el SNT A, cuyos descendientes correspondan a cada uno de los símbolos que forman la cadena w, (en el mismo orden). La concatenación de los símbolos que haya en cada una de las hojas (leídos de izquierda a derecha) proporciona la cadena obtenida en la derivación que representa el árbol. 1.5 JERARQUÍA DE CHOMSKY PARA LAS GRAMÁTICAS 1.5.1 Gramáticas tipo 0 o de estructuras de frase. Corresponden a las gramáticas no restringidas, también conocidas como las gramáticas irrestrictas o gramáticas de estructura frase. A los lenguajes generados por estas gramáticas se les llama lenguajes recursivamente enumerables, o simplemente lenguajes enumerables y pueden ser aceptados, pero tal vez no decididos, por alguna de Turing. 1.5.2 Gramáticas tipo 1 o sensitiva al contexto. Gramáticas sensibles al contexto. Los autómatas lineales acotados reconocen lenguajes de este tipo. Las producciones son de la forma: y deben cumplir que 1.5.3 Gramática tipo 2 o de libre contexto. Corresponden a las gramáticas independientes del contexto, las cuales generan los lenguajes independientes del contexto y pueden ser reconocidos por medio de los autómatas de pila no determinista. 1.5.4 Gramática tipo 3 o regular. Los lenguajes reconocidos por estas gramáticas se denominan lenguajes regulares, y son reconocidos por autómatas finitos. 1.6 GRAMÁTICAS Y LENGUAJES. Informalmente, tal como se entiende en el contexto de los lenguajes naturales, una gramática es un conjunto de reglas que definen la estructura de algún lenguaje formal. Esto es, la estructura de las cadenas válidas dentro de dicho lenguaje. UNIDAD II “AUTOMATAS DE ESTADO FINITO” 2.1 ESPECIFICACIÓN DE UN AUTÓMATA DE ESTADO FINITO. Un Autómata finito (AF) es una máquina de estados que determina si una cadena pertenece o no a un Lenguaje. Para decidir si la cadena pertenece al lenguaje lee los caracteres que la forman de izquierda a derecha y con esta información decide si debe permanecer en el estado en el que se encuentre o cambiarse a otro estado. El AF tiene un solo estado inicial que es el estado en el que se encuentra cundo empieza a leer la entrada y puede tener varios estado finales. Si cuando termine de leer la entrada se encuentra en uno de estos estados finales, entonces la entrada es una cadena que pertenece al Lenguaje. Si cuando termine de leer la entrada no queda el autómata en uno de los estados finales, entonces la entrada no es una cadena que forme parte del lenguaje. 2.1.1 AUTÓMATA FINITO DETERMINISTA. Formalmente se define a un autómata finito determinista (AFD) por la quíntupla M= (Q, , s, F, ), donde: Q es un conjunto finito de estados, es el alfabeto de entrada, s Q es el estado inicial, F es el subconjunto de Q de los estados de aceptación (F Q) y es la función de transición definida por : Q x Q. La característica principal de un AFD es que es una función que está definida para todos los posibles estados qi Q y para todos los símbolos . Es decir, para cualquier pareja de la forma (qi, j ) siempre existe un único estado siguiente. Ejemplo: Sea M el AFD donde Q= {q0, q1}, ={a, b}, s= q0, F={ q0} y las siguientes transiciones: ( q0,a)= q0, ( q0,b) = q1 , ( q1,a) = q1 y ( q1,b) = q0. Esto se representa por medio de la siguiente tabla de transiciones: Tabla 2.1 A partir de la tabla se puede construir el diagrama de transiciones correspondiente a este AFD, el cual se muestra en la siguiente figura: Figura 2.1 2.1.2 AUTÓMATA FINITO NO DETERMINISTA. Autómata finito no determinista es aquel que puede tener cero, una o más transiciones distintas para el mismo símbolo desde un mismo estado y se abrevia AFN. Todo AFD puede considerarse como un tipo particular de AFN, pero generalmente resulta mucho más sencillo construir e interpretar a un AFN que a un AFD. DEFINICION FORMAL DE AFN Formalmente se define un AFN por la quíntupla M= (Q, , s, F), donde: Q es un conjunto finito de estados, es el alfabeto de entrada, s Q es el estado inicial, F es el subconjunto de Q de los estados de aceptación (F Q) y es la función de transición ( : Q x 2Q ), donde se puede apreciar que el contra-dominio de la función es el conjunto potencia de Q, es decir, que esta función devuelve conjuntos de estados en vez de un solo estado. Ejemplo: El siguiente diagrama representa a un AFN que acepta el lenguaje: L= (0 1)* 1(0 1)2, que es el lenguaje formado por las cadenas de ceros y unos cuyo antepenúltimo símbolo es un uno. Por tratarse de un autómata no determinista, se puede ver que para el estado q3, no existen transiciones definidas, mientras que para el estado q0 hay dos transiciones para el símbolo 1. Figura 2.2 Compare el diagrama anterior con el correspondiente al AFD que se muestra en la figura 2.3. Figura 2.3 El AFN de la figura 2.2 está definido por Q= {q0, q1, q2, q3}, s= q0, F={q3}, ={0, 1} y contiene a las transiciones siguientes: (q0, 0) = {q0} (q1, 0) = {q2} (q2, 0) = {q3} (q0, 1) = {q1, q0} (q0, 1) = {q2} (q0, 1) = {q3} O resumiendo, el AFN y todos sus elementos se muestran en la siguiente tabla: Tabla 2.2 2.1.3 AUTÓMATAS Y EXPRESIONES REGULARES. Para construir autómatas a partir de expresiones regulares, se puede iniciar con los casos más sencillos, los cuales se muestran en la figura 2.4. Posteriormente se pueden construir otros más complejos con base en las operaciones de unión, concatenación y cerradura. Figura 2.4 Supongamos que M1= (Q1, ∑1, ∆1, q0, F1) y M2= (Q2, ∑2, ∆2, p0, F2), son dos AFN que aceptan los lenguajes L1 y L2 respectivamente, entonces podemos construir un nuevo AFN M3= (Q3, ∑3, ∆3, q0’, F3),, que acepte al lenguaje unión L3= L1 U L2, a partir de M1 y M2, añadiendo un nuevo estado inicial q0 y dos nuevas transiciones Ɛ que vayan de q0 a los estados iníciales q0 y p0, respectivamente, así como también añadimos un único estado final qf. Unido desde qf y desde pf por medio de dos transiciones Ɛ. Figura 2.5 EJEMPLO UNION Sean M1 y M2, los AFN que aceptan los lenguajes L(M1)=ab* y L(M2)=a*b, respectivamente, entonces el AFN M3, obtenido a partir de M1 y M2, acepta el lenguaje L(M3)=ab*Ua*b, tal como se muestra. Figura 2.6 Figura 2.7 EJEMPLO CONCATENACIÓN Supongamos que M1= (Q1, ∑1, ∆1, q0, F1) y M2= (Q2, ∑2, ∆2, p0, F2), son dos AFN que aceptan los lenguajes L1 y L2 respectivamente, entonces podemos construir un nuevo AFN llamado M3= (Q3, ∑3, ∆, q0, F3),, que acepte al lenguaje L3=L1●L2, colocando primero a M1 con su estado inicial q0 y enseguida se enlaza con M2,añadiendo una transición Ɛ que vaya del estado de aceptación qf de M1, que dejara de serlo, al estado inicial p0 de M2, que también deja de serlo . Figura 2.8 Sean M1 y M2, los cuales aceptan los lenguajes L(M1)=ab* y L(M2)=(ab)*, respectivamente, entonces el AFN M3, obtenido a partir de M1 y M2, acepta el lenguaje (M3)=ab*(ab)*, tal como se muestra en la figura 2.9. Figura 2.9 2.1.4 CONVERSIÓN DE AUTÓMATAS FINITOS NO DETERMINISTA A DETERMINISTA. Aunque se puede considerar a un AFD dado como un caso particular de los AFN y que éstos últimos son más versátiles, esto no significa que los AFN sean más poderosos que los AFD, esto se confirma demostrando que para cualquier AFN, siempre existe un AFD equivalente que acepta el mismo lenguaje. EJEMPLO 1 Encontrar un AFD equivalente al AFN definido por el diagrama de transiciones mostrado en la figura siguiente: Figura 2.10 Es necesario, primero, representar al AFN por medio de sus tablas de transiciones correspondiente, ya que a partir de ella se podrá encontrar el AFD equivalente. Tabla 2.3 Ahora debemos definir a M’, el AFD equivalente a M, como sigue: cada uno de los posibles estados de M’ corresponderá a una combinación de estados de M, de tal forma que Q’ ={ [q0], [q1], [q0,q1], [Ø] }, donde el estado inicial es s’ =[q0], y los estados de aceptación son todos aquellos que contengan a q0, que es el estado de aceptación de M, es decir: F’ = { [q0], [q0,q1] }. El empleo de los corchetes en esta notación sirve para diferenciar el hecho de que en un AFN las transiciones pueden referirse a un conjunto de estados, mientras que la notación con corchetes se refiere a un solo estado y que el conjunto que encierra deberá ser visto como una unidad y sólo sirve pan señalar la referencia con el conjunto sobre el que se ha establecido la correspondencia. Esta unicidad es necesaria para preservar el determinismo. De esta manera, queda definido por las transiciones que se obtienen directamente de la tabla 2.4: Tabla 2.4 Además, para completar la tabla, hay que agregar las transiciones para los estados faltantes, por un lado, el estado [Ø] corresponde a un estado no deseado, por lo que sus transiciones permanecerán en este estado: ([Ø],0)= [Ø] y ([Ø],1)= [Ø]. Finalmente, pan determinar las transiciones del estado [q0, q1], tenemos que observar que se derivan de las siguientes transiciones en M, uniendo las celdas de ambas filas, para cada estado, directamente de la tabla 2.5: ∆({ q0,q1}, 0)= ∆({ q0}, 0) ∆({ q1}, 0)= { q0,q1}, Ø= { q0,q1} ∆({ q0,q1}, 1)= ∆({ q0}, 1) ∆({ q1}, 1)= { q1} { q0,q1}= { q0,q1} Dando como resultado que las transiciones para el estado [q0,q1] son: ([q0,q1], 0)= [q0,q1] y ([q0,q1], 0)= [q0,q1], todo lo anterior se resume en la tabla 2.5a, mostrada a continuación. Como ultimo paso, se sugiere renombrar a cada uno de los estados de M´ con nombres más simples, por ejemplo, se puede renombrar así: p0= [q0], p1=[q1], p2= [q0,q1] y p3= [Ø], tal como se muestra en la tabla 2.5b. Tabla 2.5 a Tabla 2.5b De esta forma, el diagrama de transición del AFD equivalente es el mostrado en la figura 2.11. Haciendo un análisis del mismo, se puede ver que el autómata acepta todas las cadenas que tengan unos y ceros, con excepción de w= 1 y de todas las cadenas que inicien con el prefijo 10. Figura 2.11 2.2 MINIMIZACIÓN DE ESTADOS Se explican los fundamentos teóricos del algoritmo de minimización, se da dicho algoritmo y se ve su funcionamiento sobre un ejemplo. 2.2.1 RELACIONES DE EQUIVALENCIAS ENTRE LOS ESTADOS DE UN AUTÓMATA FINITO. Sean M1 y M2 dos AFD, entonces se dice que M1 y M2 son equivalentes si se cumple que L(M1) = L(M2). Considere a los AFD M1 y M2 sobre el alfabeto ∑= {0,1} que se muestran en la figura 2.12 (a) y 2.12 (b), como se puede verificar, ambos aceptan el mismo lenguaje 0*10*, por lo tanto, son equivalentes. Figura 2.12 (a) Figura 2.12 (b) A pesar de que pueden existir varios autómatas equivalentes para un lenguaje dado, solamente existe un único AFD mínimo equivalente (de mínimo numero de estados), que se considera como la representación óptima para dicho lenguaje, como es el caso del autómata etiquetado como M2 en este ejemplo. 2.2.2 ALGORITMO DE MINIMIZACIÓN. Dado M, un AFD cualquiera, se puede obtener M, el AFD con el mínimo numero de estados que sea equivalente a M, por medio del siguiente algoritmo. 1. Se obtiene el autómata conexo equivalente, eliminando todos los estados que no son accesibles desde q0. 2. Se realiza una partición de los estados de Q en dos clases: En la clase C1 se incluyen a los estados de aceptación, es decir: C1 = F. En la clase C2 a los demás estados, esto es: C2 = Q-F. 1. Se analiza cada clase Cm con objeto de ver si para todo qk Cm se cumple para cada símbolo i ∑ que (qk, i) Cn. 2. En caso de que no se cumpla lo anterior para alguna clase Cm , se realiza una participación de esa clase, dividiéndola en subclases que estén formadas por los grupos de estados que satisfagan la condición anterior entre sí. 3. Se repite el paso 3 hasta verificar que todas las clases cumplan la condición requerida, entonces cada clase de estados equivalentes resultante se representará por un solo estado en el AFD mínimo. Ejemplo. Considérese al AFD de la figura 2.12 (a). Es fácil verificar que se trata de un AFD conexo, entonces, aplicando el segundo paso del algoritmo, se hace la partición inicial: C1= {q2,q3,q4} y C2= {q0, q1, q5}. Ahora continuando con el paso 3 del algoritmo, analizamos las transiciones para los tres estados contenidos en la clase C1: (q2, 0)= q4 C1 (q3, 0)= q4 C1 (q4, 0)= q4 C1 (q2, 1)= q5 C2 (q3, 1)= q5 C2 (q4, 1)= q5 C2 Para todos los estados de esta clase se cumple la condición de equivalencia requerida en este paso, por lo que no se requiere realizar ninguna partición. A continuación se hace el análisis de las transiciones para los tres estados contenidos en la clase C2: (q0, 0)= q1 C2 (q0, 1)= q2 C1 (q1, 0)= q0 C2 (q1, 1)= q3 C1 (q5, 0)= q5 C2 (q5, 1)= q5 C2 Se observa que se satisface la condición exigida para todos los casos, entonces hay que separar los estados de C2 en dos subclases a saber: C3= {q0, q1}, dado que ambos se comportan de forma equivalente y C4= {q5}. Ahora se debe repetir el paso 3 para verificar que se cumple la condición requerida para cada una de las tres clases que ahora se tienen. Se puede observar que esta partición no afecta los resultados para la clase C 1, puesto que solamente se remplaza C2 por C4 en las transiciones del símbolo 1. A continuación se muestra que también se cumple la condición de equivalencia para las otras dos clases: Para C3: (q0, 0)= q1 C3 (q1, 0)= q0 C3 (q0, 1)= q2 C1 (q1, 1)= q3 C1 Y para C4 la condición se cumple por necesidad, puesto que tiene un solo estado: (q5, 0)= q5 C4 (q5, 1)= q5 C4 Con esto se concluye que el AFD mínimo solamente consta de tres estados, el cual está representado por la siguiente tabla de transiciones. Tabla 2.6 Obsérvese que la clase C3 que contiene el estado inicial original q0 se considera el nuevo estado inicial y que la clase C1, que surgió a partir de los estados de aceptación será el nuevo estado de aceptación. El diagrama de transiciones correspondiente a este AFD mínimo es el mismo que fue representado por el autómata M2 en la figura 2.12 (b). 2.3 AUTÓMATAS FINITOS Y GRAMÁTICA REGULAR. Para construir una gramática regular, a partir de una expresión regular dada, se puede construir un diagrama de transiciones que represente al AFN que acepta al lenguaje regular en cuestión y de ahí obtener las producciones respectivas a partir de cada una de las transiciones y agregando las producciones Epsilon para los estados de aceptación que hubiere. 2.3.1 OBTENCIÓN DE UNA GRAMÁTICA REGULAR A PARTIR DE UN AUTÓMATA FINITO. Para obtener una gramática regular para generar al lenguaje regular: L= a*b a, primero se construye el diagrama de transiciones correspondiente al AFN que acepta el lenguaje referido, de esta manera se obtiene el diagrama mostrado en la figura 2.13. Figura 2.13 De las transiciones del diagrama anterior y considerando que B es el estado de aceptación, se obtiene la gramática correspondiente: S A A aA B Ɛ ab bB Podemos encontrar una gramática equivalente al sustituir al SNT B, y queda: S A A aA a b 2.3.2 OBTENCIÓN DE UNA AUTÓMATA FINITO A PARTIR DE UN GRAMÁTICA REGULAR. Si L es un lenguaje generado por la gramática regular G = (ΣN; ΣT; S; P), entonces existe un AF M = (Q; Σ; δ; qo; F), tal que L = L(M) = L(G), y lo construimos de la siguiente forma: Q = ΣN {z} Σ = ΣT qo = S F = {z} δ se define usando unas reglas: Para cada producción A aB ϵ P se define la transición δ(A; a) = B Para cada producción A a ϵ P se define la transición δ(A; a) = z Para cada producción A λ ϵ P se define la transición δ(A; λ) = z 2.4 OPERACIONES CON AUTÓMATAS. COCIENTES. Dado un conjunto cualquiera C, una partición de C es cualquier colección π de subconjuntos disjuntos y no vacios de C cuya unión es el propio C. A cada elemento de π se le denomina bloque. Para cada x ϵ C llamaremos π(x) al bloque que contiene a x. La partición trivial es aquella en la que cada bloque contiene un solo elemento. Para simplificar la descripción de una partición, en algunos casos enumeraremos solo aquellos bloques que contienen más de un elemento. Dentición Sea A = (Q, Σ, δ, I, F) un autómata finito y sea π una partición de Q. El autómata finito A/π = (Q/π, Σ, 𝛿 𝜋 , Q/π-2𝑄−1, Q/π-2𝑄−𝐹 ), siendo 𝛿 𝜋 (π(p), a) = {π(q) : δ(π(p), a) π(q) ǂ 0}, se denomina autómata cociente de A por π. Evidentemente si p ϵ δ(q, x) entonces π(p) ϵ 𝛿 𝜋 (π(q), x) y además p ϵ I π(p) ϵ Q/π- 2𝑄−𝐼 y p ϵ F π(p) ϵ Q/π- 2𝑄−𝐹 por lo que en todo caso L(A) L(A/π). Definición Autómata finito A es irreducible si L(A/π) = L(A) implica que π es la partición trivial. REVERSO. Definición Se denomina reverso de un autómata finito A = (Q, Σ, δ, I, F) al autómata finito 𝐴𝑅 = (Q, Σ, 𝛿 𝑅 , I, F), donde (p, a, q) ϵ 𝛿 𝑅 ↔ (q, a, p) ϵ δ. Por inducción sobre |x|, x ϵ Σ*, se demuestra que 𝛿 𝑅 (P1, x) = P2 ↔ δ(P2, 𝑥 𝑅 ) = P1, y de esto se deduce que L(𝐴𝑅 ) = (L(A))𝑅 . Evidentemente (𝐴𝑅 )𝑅 = A. Además, si A es aseado también lo es 𝐴𝑅 , si A es irreducible también lo es 𝐴𝑅 y si A es minimal también lo es 𝐴𝑅 SUBAUTÓMATAS. Un Subautómatas de un autómata finito A = (Q, Σ, δ, I, F) es cualquier autómata A’ = (Q’, Σ, δ’, I’, F’) tal que Q’ Q; δ’ δ (Q’ x Σ x Q’), I’ I Q’, F’ F Q’. Obviamente, si A’ es un subautómatas de A entonces L (A’) L(A). Definición Sea A = (Q, Σ, δ, I, F) un autómata finito y sea P un subconjunto de Q. Denominaremos subautómatas de A inducido por P al autómata AP = (P, Σ, δ (P x Σ x P), I P, F P). Igualmente, dado I’ I, F’ F o δ’ δ llamaremos AI → I’, AF → F’, Aδ → δ’ respectivamente a los subautómatas (Q, Σ, δ, I’, F), (Q, Σ, δ, I, F’), (Q, Σ, δ’, I, F). Así, A‘ es un subautómatas de A = (Q, Σ, δ, I, F) si y solo si existen I’ P Q tales que A’ es isomorfo a (((AI → I’) AF → F’) Aδ → δ’)P. I, F’ F, δ’ y HOMOMORFISMOS. Definición Un homomorfismo de un autómata A = (Q, Σ, δ, I, F) sobre un autómata A’ = (Q’, Σ’, δ’, I’, F’) es cualquier función h : Q → Q’ tal que h(I) I’, h(F) F’ Y (p, a, q) ϵ δ → (h(p), a, h(q)) ϵ δ’. Claramente, para todo q ϵ Q, Lq Lh(q) y Rq Rh(q) por lo que si existe algún homomorfismo de A sobre A’ entonces necesariamente L(A) L(A’). Así, dados dos autómatas finitos A y A’, existe un homomorfismo de A sobre A’ si y solo si existe un subautómatas de A’ isomorfo a algún cociente de A. UNIÓN. Definición Dados A = (Q, Σ, δ, I, F) y A’ = (Q’, Σ, δ’, I’, F’) autómatas finitos, llamaremos al autómata A A’ = (Q Q’, Σ, δ δ’, I I’, F F’) donde todas las uniones son disjuntas, unión de A y A’. Evidentemente L(A A’) = L(A) L(A’). DETERMINIZACIÓN. Denominaremos Determinización de un autómata finito al método clásico de obtención de un autómata finito determinista aseado equivalente a un autómata finito dado. Sea A = (Q, Σ, δ, I, F) un autómata finito. Diremos que un subconjunto P de Q es alcanzable si existe x ϵ Σ* tal que δ(I, x) = P. Llamaremos Alc(2𝑄 ) al conjunto de partes alcanzables de Q. MINIMIZACION. La minimización es el proceso de obtención del autómata finito determinista mínimo equivalente a un autómata finito dado. 2.5 LENGUAJES QUE NO SON REGULARES. Dado que para todo lenguaje regular infinito se cumple el lema de bombeo, si nos dan un lenguaje infinito y demostramos que para él no se cumple, habremos demostrado que no es un lenguaje regular. Como el lema de bombeo es una propiedad que se cumple para todas las cadenas de longitud mayor o igual a cierta n, bastará encontrar una cadena de ese lenguaje, de longitud mayor o igual a esa n, que no se pueda “bombear” para demostrar que el lenguaje no es regular. Con esta idea en mente, los pasos a dar para demostrar que un lenguaje dado no es regular son los siguientes: 1. Elegir una palabra w que pertenezca al lenguaje dado. Podemos elegir cualquier palabra del lenguaje, pero debe ser una cuya longitud sea mayor o igual que una constante n que desconocemos (la constante del lema de bombeo). Como desconocemos n, lo habitual será elegir una palabra en función de un n cualquiera y cuya longitud sea mayor o igual que n. 2. El lema de bombeo dice que si el lenguaje fuera regular, podríamos encontrar una forma de partir esa palabra w en tres, cumpliendo ciertas restricciones, y que esa partición sería bombeable. Como queremos demostrar que el lenguaje no es regular, tendremos que demostrar que no hay ninguna forma de partir la palabra en tres cumpliendo las restricciones del lema, y que después se pueda bombear siempre. 3. Finalmente bastará con encontrar una constante k ≥ 0 que haga que ninguna de las particiones posibles de w sea bombeable. UNIDAD 3 AUTÓMATAS DE PILA (STACK) 3.1 ESPECIFICACIÓN DE UN AUTÓMATA DE PILA Un autómata de pila o Push-Down es un autómata que cuenta con un mecanismo que permita almacenamiento ilimitado y opera como una pila. El autómata de pila (se abrevia PDA de sus siglas en inglés Push-Down Autómata) tiene una cinta de entrada, un control finito y una pila. La pila es una cadena de símbolos de algún alfabeto. El símbolo que se encuentra más a la izquierda se considera como que está en la “cima”. El dispositivo será no determinístico y tendrá un número finito de alternativas de movimiento en cada situación 3.1.1 ACEPTACIÓN POR PILA VACÍA Cuando se usa esta noción, los autómatas no requieren un conjunto F de estados finales, solamente los seis restantes componentes: (Q, q0, , , s0, ). Definición: Dado un autómata con pila M = (Q, q0, , , s0, ), ya sea AFPD o AFPN, el lenguaje aceptado por M por pila vacía se define como N(M) := {w : existe un cómputo (q0,w, s0) (p, , )}. O sea, una cadena es aceptada por pila vacía si se puede ir, en cero, uno o más pasos, desde la configuración inicial hasta una configuración en la que la pila esté completamente desocupada. Nótese que, para ser aceptada, la cadena de entrada w debe ser procesada completamente. Para AFPN las nociones de aceptación por pila vacía y por estados finales resultan ser equivalentes, como se establece en los dos siguientes teoremas. Es importante anotar que para autómatas deterministas AFPD los dos tipos de aceptación no son equivalentes. Teorema: Si L = L(M) para algún autómata con pila AFPN M, entonces L = N(M0) para algún AFPN M0. Es decir, M0 acepta por pila vacía lo que M acepta por estado final. Teorema: Si L = N(M) para algún autómata con pila AFPN M, entonces L = L(M0) para algún AFPN M0. Es decir, M0 acepta por estado final lo que M acepta por pila vacía. 3.1.2 ACEPTACIÓN POR ESTADO FINAL La segunda manera es designando algunos estados, es como estados finales y se define el lenguaje aceptado como el conjunto de todas las entradas para las cuales alguna selección de movimiento ocasiona que el autómata de pila tenga acceso a un estado final. Un autómata de pila M es un sistema (Q, S, G, d, q0, Z0, F), en donde: Q es un conjunto finito de estados. S es el alfabeto llamado alfabeto de entrada. G es el alfabeto, conocido como alfabeto de pila. q0 ϵ Q, es el estado inicial. Z0 ϵ G, es el símbolo llamado símbolo inicial. F ϵ Q es el conjunto de estados finales. d es una transformación de Q x (S È a {e }) x G en los subconjuntos finitos Q x G *. 3.2 FORMAS NORMALES PARA GRAMÁTICA LIBRES DE CONTEXTO Para cada GLC existen dos formas de normalización, las cuales son: Forma Normal de Chomsky Forma Normal de Greinbach 3.2.1 FORMA NORMAL DE CHOMSKY Diremos que una gramática incontextual G=(N, T, P, S) que no genera la cadena vacía, está en FNC cuando todas sus reglas son de la forma: A → BC con A, B, C ∈ N A → a, con A, B ∈ N y a ∈T Teorema. Todo lenguaje incontextual L que no incluye la cadena vacía, es generado por una gramática en FNC. Ejemplo Sea la gramática incontextual G definida por las siguientes reglas: S → bA | aB A → bAA | aS | a B → aBB | bS | b Tras la aplicación del PASO 1 se obtiene la gramática en FNC intermedia G': S → CbA | CaB A → CbAA | CaS | a B → CaBB | CbS | b Ca → a Cb → b A partir de G', tras el PASO 2 se obtiene la gramática en FNC G'': S → CbA | CaB A → CbD1 | CaS | a D1 → AA B → CaD2 | CbS | b D2 → BB Ca → a Cb → b 3.2.2 FORMAS NORMALES DE GREINBACH Una gramática es en forma normal de Greinbach (FNG) si G (es decir, su ∑N) solamente contiene variables útiles todas las producciones de G (es decir, en su P) son de la forma X → δY donde δ ∈∑T y Y ∈∑*n, es decir, todas las reglas tienen como primer símbolo en sus partes derechas un símbolo terminal que es seguido por una palabra de variables. (porque así no se podría derivar ε) si $ (es decir, el símbolo inicial de G) no aparece al lado derecho de una producción, también está permitido que $ → ε ∈ P Obviamente cualquier gramática en forma normal de Greinbach es una gramática libre de contexto que se verifica directamente analizando la forma de producciones permitidas. Una interesante propiedad es: para cualquier lenguaje libre de contexto existe una gramática en forma normal de Greinbach, que genera el lenguaje. La comprobación de este hecho detallamos con la siguiente construcción, donde a partir de una gramática libre de contexto dada elaboramos una nueva gramática en forma normal de Greinbach. Sea L un lenguaje libre de contexto y G = (∑N, ∑T, P, $) una gramática que genere L (es decir L = L(G)). La construcción sigue 4 pasos (asumimos que ε ∉ L, eso remediamos al final): Construimos una gramática equivalente en forma normal de Chomsky Sustituimos las reglas recursivas a la izquierda, es decir, reglas de tipo X → XY Establecemos un orden en las variables, es decir ∑N = {X1, X2,..., Xn} de tal manera que todas las reglas serán de tipo Xi → XjY con i < j, Y ∈ ∑N. Sustituimos las reglas que no tengan un símbolo terminal como primer símbolo en su parte derecha. Las gramáticas después de cada paso llamamos G = G0, G1, G2,..., G4 = GFNG respectivamente. Usamos la misma gramática inicial como en el apartado anterior G0 = ({$, A, B, C, D,E, F}, {a, b, c}, P0, $) Donde P0 contenga las siguientes producciones: $ → Bdd | Ca | bc A → B | Acc | baD B → Cbd | ϵ | AC C → bD | aBA D → CD | a | EF E → Eb F→a 3.3.1 OBTENCIÓN DE UN AUTÓMATA DE PILA A PARTIR DE UNA GRAMÁTICA Para construir un ADP a partir de una gramática G = (N, S, S, P) se hace lo siguiente: Se define un ADPND con: Q = {q1, q2, q3} = N {z} F = {q3} s = q1 la regla de transición está compuesta por cuatro tipos de transiciones: D(q1, e, z) = {(q2, Sz)}, la cual se corresponde con la introducción del símbolo inicial en la pila. D(q2, e, A) = {(q2, w) | A w es una producción de P} para cada no terminal A de N. D(q2, a, a) = {(q2, )} para cada símbolo terminal a de . D(q2, e, z) = {(q3, z)}. Obsérvese que si se tiene que (q2, x, Aa) (q2, x, ba), es posible A * b. Por tanto si w = a1a2…an es aceptada por el ADP debemos tener: (q2, a1a2…an, Sz) * (q2, a1a2…an, a1b1z) (q2, a2…an, b1z) * (q2, an, anz) (q2, , z) (q3, , z) y por se obtienen las derivaciones siguientes S * a1b1 * a1a2b1 * … * a1a2…an = w Por consiguiente, si w es aceptada por el ADPND, entonces w se deriva de la gramática. Similarmente, si S * a1a2…an, entonces tendremos una derivación de a1a2…an por la izquierda y de la forma S * A1a1 a1a1 * a1A2a2 a1a2a2 * a1a2… an Por tanto, en un ADPND derivado de la gramática, se puede tener la secuencia (q2, a1a2…an, Sz) * (q2, a1a2…an, a1a1z) (q2, a2…an, a1z) * (q2, , z) (q3, , z) Es decir el ADPND acepta la cadena w = a1a2…an. TEOREMA Si L es un lenguaje independiente del contexto, entonces existirá un ADPND para el cual L = L(M). UNIDAD 4. AUTÓMATAS LINEALMENTE ACOTADOS. 4.1 GRAMÁTICA SENSIBLE AL CONTEXTO Las gramáticas sensibles al contexto o de tipo 1, son las que generan los lenguajes sensibles al contexto. Los lenguajes sensibles al contexto son aquellos que pueden ser reconocidos por los Autómatas Linealmente Acotados ALA. En forma general toda gramática se define mediante una cuádrupla G=(N, T, P, S), siendo N es un conjunto finito de símbolos no terminales T es un conjunto finito de símbolos terminales P es un conjunto finito de reglas de producción S Símbolo distinguido o Axioma 4.1.1 FORMA NORMAL DE KURODA En el mundo de la computación dentro de las formas normales más usadas se encuentra la de Kuroda y a continuación mostramos con un simple ejemplo cuales son las reglas que sigue esta forma: AB → CD or A → BC or A → B or A→α Donde A, B, C and D son elementos no terminales and α is a un elemento terminal. Todas las gramáticas en la forma normal de Kuroda generan un lenguaje sensible al contexto, y por consecuencia, todos los lenguajes sensibles al contexto los cuales no generen cadenas vacías o nulas pueden y serán generados por una gramática en la forma normal de Kuroda. 4.2 ESPECIFICACIÓN DE UN AUTÓMATA DE DOBLE PILA. Se define un autómata de doble pila de la siguiente manera M = (K, Σ, Γ, Δ, s, F) K es un conjunto finito de estados, Σ es el alfabeto (los símbolos de entrada), Γ es un alfabeto (la entrada de la pila), s ϵ K es el estado inicial, F ϵ K es el que da el estado final, y Δ, Es la relación de transición, y está dada por (K x (Σ U {e}) x Γ* x Γ*) x (K x Γ* x Γ*), donde el tercer parámetro elimina un elemento a la primera pila, el cuarto parámetro elimina un elemento a la segunda pila, el quinto parámetro pone un símbolo nuevo a la primera pila, y el sexto parámetro pone un nuevo elemento a la segunda pila. 4.3 ESPECIFICACIÓN DE UN AUTÓMATA LINEALMENTE ACOTADO Un autómata lineal acotado es una máquina de Turing no determinística que satisface las siguientes dos condiciones: El alfabeto de entrada de cinta incluye dos símbolos: < y >, los señaladores de extremo izquierdo y derecho, respectivamente. El LBA no tiene movimientos a la izquierda de < o a la derecha de >, ni puede sustituir los símbolos < y >. Un autómata linealmente acotado como una máquina de Turing no determinista M=(Q, Σ , Γ , δ , q0, B, F), en la cual el alfabeto de cinta contenga dos símbolos especiales < y >. M comienza con la configuración (q1, ≤ w>) (donde q1 es el estado inicial de M). No se permite que M reemplace los símbolos < o >, ni que mueva su cabeza a la izquierda de < o a la derecha de >, con lo cual, el LBA tiene que realizar su computación en las únicas celdas de la cinta que estaban originalmente ocupadas por la cadena de entrada. Por ejemplo, consideremos el LBA definido por: Q = {q1, q2}, Σ = {a, b}, Γ = {a, b, <, >}, F = {q2}, q0 =q1 y δ dado por: δ (q1, <) = (q1, <, R) δ (q1, a) = (q1, b, R) δ (q1, b) = (q1, a, R) δ (q1, >) = (q1, >, S), donde S significa "permanecer", es decir no mover la cabeza de lectura/escritura. Este LBA complementa sus cadenas de entrada convirtiendo las a’s en b’s y viceversa. Obsérvese que, aunque puede reconocer y trabajar sobre los símbolos < y >, no puede reemplazarlos o moverse más allá de ellos. UNIDAD 5 MAQUINAS DE TURING 5.1 GRAMÁTICAS DE ESTRUCTURA DE FRASE. Una gramática con estructura de frase ´ G = (V, T, S, P) consiste de: Un vocabulario V. Un subconjunto T de V que son elementos terminales. Un símbolo inicial S de V − T. Un conjunto de producciones P (reglas que especifican que podemos reemplazar una cadena por otra). El conjunto V − T es denotado por N. los elementos de N son llamados elementos no terminales. Cada producción en ´ P debe contener al menos un símbolo no terminal en su lado izquierdo. 5.1.1 FORMA NORMAL DE UNA GRAMÁTICA TIPO 0. También llamadas de estructura de frase. Aquellas que no imponen ninguna restricción a sus producciones. 5.2 ESPECIFICACIONES DE LA MÁQUINA DE TURING. Es un modelo computacional que realiza una lectura/escritura de manera automática sobre una entrada llamada cinta, generando una salida en esta misma. 5.2.1 DEFINICIÓN Y NOTACIÓN. Una máquina de Turing es una séptupla M= (Γ, Σ, •, Q, q0, f, F) donde: 1. 2. 3. 4. 5. 6. 7. Γ es el alfabeto de símbolos de la cinta Σ ⊂ Γ es el alfabeto de símbolos de entrada ∈ Γ es el símbolo blanco que no pertenece a Σ Q es un conjunto finito de estados q0 ∈ Q es el estado inicial F ⊆ Q es el conjunto de estados finales f es una función de transición parcial f: Q×Γ → Q×Γ×{L,R} Dispositivo capaz de adoptar un estado determinado (de Q) y que está conectado a una cabeza lectura/escritura que puede leer y escribir símbolos en una cinta infinita. En cada acción o movimiento: 1. La máquina lee el símbolo de la cinta en la posición donde se encuentra la cabeza de lectura/escritura 2. En función del símbolo leído y del estado actual la máquina: a) pasa a un nuevo estado (de forma determinista) b) imprime un símbolo en la cinta en la misma posición donde acaba de leer el símbolo actual c) mueve la cabeza de lectura/escritura una posición a la izquierda (L), o a la derecha (R). Inicialmente, la cinta (infinita a ambos lados) contiene un número finito de símbolos de Σ, precedidos y seguidos por un número infinito de blancos. La cinta se comporta como un dispositivo de entrada/salida. La máquina de Turing posee una cinta dividida en celdas, cada celda es capaz de almacenar un símbolo. Además posee una cabeza lectora/escritora que lee y escribe un símbolo en la cinta. Inicialmente la cinta contiene b en todas sus celdas. La función de q, σ) en ternas de la forma (p, t, X), donde p es el siguiente estado, t es el símbolo escrito en la cinta y X es el movimiento de la cabeza lectora/escritora, que puede ser L o R. 5.2.2 CONSTRUCCIÓN DE UN MÁQUINA DE TURING. La construcción de maquinas de Turing se lleva a cabo mediante los diagramas de transición y combinarlos de manera parecida a lo que se realiza en la formación de la unión y concatenación de los autómatas finitos. Pasos para la construcción de una máquina de Turing a) Elimine las características de inicio de los estados iniciales de las maquinas, excepto la de aquel donde iniciara la maquina compuesta. b) Elimine las características de detención de los estados de parada de todas la maquinas e introduzca un nuevo estado de parada que nos se encuentre en ninguno de los diagramas que se combinan. c) Para cada uno de los antiguos estados de parada p y cada x en y. 5.2.3 MÁQUINA DE TURING La máquina de Turing es un modelo computacional introducido por Alan Turing en el trabajo. Turing construyó un modelo formal de computador, la máquina de Turing, y demostró que existían problemas que una máquina no podía resolver. La máquina de Turing es un modelo matemático abstracto que formaliza el concepto de algoritmo. Una máquina de Turing con una sola cinta puede ser definida como una 6-tupla, donde Q es un conjunto finito de estados, es un conjunto finito de símbolos de cinta, el alfabeto de cinta 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. ¿Como funciona una maquina de turing? Una máquina de Turing es un dispositivo que transforma un INPUT en un OUTPUT después de algunos pasos. Tanto el INPUT como el OUPUT constan de números en código binario (ceros y unos). En su versión original la máquina de Turing consiste en una cinta infinitamente larga con unos y ceros que pasa a través de una caja. La caja es tan fina que solo el trozo de cinta que ocupa un bit (0 ó 1) está en su interior. La máquina tiene una serie de estados internos finitos que también se pueden numerar en binario. Para llevar a cabo algún algoritmo, la máquina se inicializa en algún estado interno arbitrario. A continuación, se pone en marcha y la máquina lee el bit que se encuentra en ese momento en su interior y ejecuta alguna operación con ese bit (lo cambia o no, dependiendo de su estado interno). Después se mueve hacia la derecha o hacia la izquierda, y vuelve a procesar el siguiente bit de la misma manera. Al final se para, dejando el resultado al lado izquierdo por ejemplo. Una instrucción típica podría ser: 0111011i La traducción es como sigue: si la máquina se encuentra en el estado interno 0 y lee 1 en la cinta, entonces pasará al estado interno 1101 (13), escribirá 1 y se moverá hacia la izquierda un paso (la cinta se moverá hacia la derecha). A continuación es conveniente inventar una notación para la secuencia del INPUT. Esta notación se llama notación binaria expandida. Consiste en cambiar la secuencia original binaria por otra construida de la siguiente forma: el 0 se cambia por 0 y el 1 por 10 y se ponen un cero a la izquierda y/o a la derecha del resultado si empieza o acaba en 1 respectivamente. Así por ejemplo, el número 13 que en binario es 1101 es en binario expandido 1010010 con un cero delante por esta última regla 01010010. Para volver al original hay que contraer el binario expandido con la siguiente regla: Empezamos a leer por la izquierda el binario expandido. Cuando encontremos un 0 tomamos nota de cuántos 1 hay hasta llegar al siguiente 0 y lo escribimos. Si encontramos que hay dos 0 seguidos, apuntaríamos un 0 porque no habría ningún 1.Veamos con el 13 cómo se haría. El primer 0 se encuentra en la primera posición y el siguiente 0 está en la posición 3. Entre los dos solo hay un 1. Lo anotamos. Seguidamente hay un 1, y después un 0, entonces apuntamos 1 porque hay un 1 entre medias de ellos. Esto es lo que se hace sucesivamente y encontramos: 1101 que es el número original. Descripción La 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: Avanzar el cabezal lector/escritor para la derecha; • avanzar el cabezal lector/escritor para la izquierda. El cómputo es determinado a partir de una tabla de estados de la forma: (Estado, valor)-→(\nuevo estado, \nuevo valor, dirección) Definición Una máquina de Turing con una sola cinta puede ser definida como una 6-tupla M=(Q,T,s,b,F,S) , donde: • • • • • • Q es un conjunto finito de estados. T es un conjunto finito de símbolos de cinta, el alfabeto de cinta. s E Q es el estado inicial. b E L es un símbolo denominado blanco, y es el único símbolo que se puede repetir un número infinito de veces. F _C Q es el conjunto de estados finales de aceptación. S : Q x L → Q x L x {L,R} es una función parcial denominada función de transición, donde L 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 S como símbolo de “no movimiento” en un paso de cómputo o el símbolo Σ para indicar el alfabeto de entrada. 5.2.4 PROBLEMAS DE PARO El problema de la parada o problema de la detención para Máquinas de Turing consiste en lo siguiente: dada una Máquina de Turing M y una palabra w, determinar si M terminará en un número finito de pasos cuando es ejecutada usando w como dato de entrada, demostró que el problema de la parada de la Máquina de Turing es indecidible, en el sentido de que ninguna máquina de Turing lo puede resolver. 5.3 DECIDIBILIDAD Un sistema deductivo completo puede demostrar cualquier conclusión que esté implicada por las premisas, es decir, tal que 0 C. Pero ¿qué ocurre si 0 / C? En la teoría de la computación se define un problema de decisión como aquél que tiene dos respuestas posibles: «sí» o «no». Cualquier problema puede reducirse a un conjunto de problemas de decisión. Se dice que un problema de decisión es decidirle si existe un algoritmo (es decir, un procedimiento que acabe en un tiempo finito) que lo resuelva. Un sistema deductivo es decidible si ante la consulta ¿ 0 C? termina en un tiempo finito respondiendo «sí» o «no». Pero las cuestiones de compleción y decidibilidad se pueden plantear en términos más generales: dados 0 y C, • • el problema de la compleción es: si 0 C, ¿existe algún algoritmo que demuestre C?; el problema de la decidibilidad es: ¿existe algún algoritmo que responda «sí» en el caso de que 0 C y «no» en el caso de que 0 / C? En lógica de proposiciones ambas cuestiones tienen una respuesta positiva (algoritmos obvios son los basados en las tablas de verdad). 5.3.1 LA TESIS DE CHURCH-TURING Tesis Church-Turing El nombre algoritmo, y los adjetivos computable, mecánico y recursivo se utilizan todos para denotar el carácter propio de las operaciones que puede realizar una máquina de Turing. Definamos lo que es un procedimiento mecánico M: 1.- M se expresa mediante un número finito de instrucciones, donde cada instrucción se construye a partir de un número finito de símbolos. 2.- M producirá, si se ejecuta sin error, el resultado deseado en un número finito de pasos. 3.- Un ser humano puede ejecutar M (en la práctica o en teoría) sin necesidad de utilizar ninguna máquina o artilugio, sólo provisto de lápiz y papel. 4.- El humano que ejecutase el procedimiento M simplemente tiene que seguir las instrucciones y los pasos que definen a M, no necesita de intuiciones o comprensión de lo que se está haciendo. Para cualquier procedimiento mecánico se puede encontrar una máquina de Turing que lo represente y ejecute. En este sentido nos preguntamos si el concepto de máquina de Turing incorpora todo procedimiento M mecánico. Casi paralelamente al trabajo de Turing, sólo un poco antes Alonzo Church descubrió el cálculo landa para abordar el mismo problema propuesto por Hilbert en 1900. Un poco más tarde estos mismos autores demostrarán que el cálculo landa y la máquina de Turing son equivalentes. Esto vino a conocerse como la tesis de Church-Turing y viene a decir, que la máquina de Turing (y el cálculo landa) definen lo que se entiende por algoritmo o proceso mecánico. Esta tesis no era tan evidente hace 70 años, como lo puede ser ahora gracias a la capacidad computacional de los ordenadores de hoy día. Turing demostró que hay cierta clase de problemas que no tienen solución algorítmica, entre ellos el más famoso es “El problema de la parada”. Turing muestra que para cierta clase de problemas la máquina que lleva su nombre no para; es decir, no decide sobre los problemas, es lo que llamamos la cuestión de la indecidibilidad. Una demostración simplificada y divulgativa del problema de la parada. Con la indecidibilildad el problema propuesto por Hilbert queda resuelto con una respuesta negativa: No puede haber un algoritmo general que resuelva todo problema matemático. Hay que tener cuidado de no extender las conclusiones más allá de lo que permite el mismo problema resuelto. Los algoritmos no dicen, ni pueden decir por sí mismos, nada sobre las verdades de las sentencias o proposiciones matemáticas. Es indiscutible que la validez de un algoritmo debe establecerse por medios externos al propio algoritmo. Menos aún se pueden sacar conclusiones que impliquen a sistemas físicos como el cerebro. De momento solo se puede decir que existen problemas para los que no existe una máquina de Turing mientras esos mismos problemas sí se intuyen por la mente humana. O de otra forma hay procesos que puede realizar la mente humana que no son algorítmicos en el sentido de existencia de una máquina de Turing. 5.4 COMPUTABILIDAD Cosas qué pueden ser computadas por un ser humano, que trabajo era el desarrollar máquinas que computaran, y que pudieran automatizar el tedioso y lleno de errores trabajo de la computación humana. Es la parte de la computación que estudia los problemas de decisión que pueden ser resueltos con un algoritmo o equivalentemente con una máquina de Turing. La teoría de la computabilidad se interesa a cuatro preguntas: • • • • ¿Qué problemas puede resolver una máquina de Turing? ¿Qué otros formalismos equivalen a las máquinas de Turing? ¿Qué problemas requieren máquinas más poderosas? ¿Qué problemas requieren máquinas menos poderosas? Los problemas se clasifican en esta teoría de acuerdo a su grado de imposibilidad: Los computables son aquellos para los cuales sí existe un algoritmo que siempre los resuelve cuando hay una solución y además es capaz de distinguir los casos que no la tienen. También se les conoce como decidible, resolubles o recursivos. Los semicomputables son aquellos para los cuales hay un algoritmo que es capaz encontrar una solución si es que existe, pero ningún algoritmo que determine cuando la solución no existe (en cuyo caso el algoritmo para encontrar la solución entraría a un bucle infinito). El ejemplo clásico por excelencia es el problema de la parada. A estos problemas también se les conoce como listables, recursivamente enumerables o reconocibles, porque si se enlistan todos los casos posibles del problema, es posible reconocer a aquellos que sí tienen solución. Los incomputables son aquellos para los cuales no hay ningún algoritmo que los pueda resolver, no importando que tengan o no solución. El ejemplo clásico por excelencia es el problema de la implicación lógica, que consiste en determinar cuándo una proposición lógica es un teorema; para este problema no hay ningún algoritmo que en todos los casos pueda distinguir si una proposición o su negación es un teorema. La teoría de la complejidad computacional: es la rama de la teoría de la computación que estudia, de manera teórica, la complejidad inherente a la resolución de un problema computable. Los recursos comúnmente estudiados son el tiempo (mediante una aproximación al número y tipo de pasos de ejecución de un algoritmo para resolver un problema) y el espacio (mediante una aproximación a la cantidad de memoria utilizada para resolver un problema). Se pueden estudiar igualmente otros parámetros, tales como el número de procesadores necesarios para resolver el problema en paralelo. La teoría de la complejidad difiere de la teoría de la computabilidad en que ésta se ocupa de la factibilidad de expresar problemas como algoritmos efectivos sin tomar en cuenta los recursos necesarios para ello. Los problemas que tienen una solución con orden de complejidad lineal son los problemas que se resuelven en un tiempo que se relaciona linealmente con su tamaño. Hoy en día las computadoras resuelven problemas mediante algoritmos que tienen como máximo una complejidad o coste computacional polinómico, es decir, la relación entre el tamaño del problema y su tiempo de ejecución es polinómica. Éstos son problemas agrupados en la clase P. Los problemas que no pueden ser resueltos por nuestras computadoras (las cuales son Máquinas Determinísticas), que en general poseen costes factorial o combinatorio pero que podrían ser procesados por una máquina nodeterminista, están agrupados en la clase NP. Estos problemas no tienen una solución práctica, es decir, una máquina determinística (como una computadora actual) no puede resolverlos en un tiempo razonable. 5.5 OTROS MODELOS DE MÁQUINA DE TURING. Maquina con cinta infinita en ambos sentidos Un lenguaje L es reconocido por una máquina de Turing con cinta infinita si y solo si L es reconocido por una máquina de Turing con cinta semiinfinita. Maquina Multicinta • La máquina dispone de tantos cabezales independientes como cintas • Una cinta (la primera) contiene la entrada. Las demás están en blanco • Cada movimiento viene determinado por el estado y por los símbolos leídos por los distintos cabezales: - Cambiando de estado - Sustituyendo los símbolos en las cintas accedidas - Desplazando (L; R) o no (S) la posición del cabezal de cada cinta (nueva opción) Un lenguaje L es reconocido por una máquina de Turing multicinta si y solo si L es reconocido por una máquina de Turing estándar. Maquina no determinista Máquina de Turing con una única cinta y control finito único Un lenguaje L es reconocido por una máquina de Turing no determinista si y solo si L es reconocido por una máquina de Turing estándar. Maquina multicabezal Un único movimiento permite desplazar independientemente las n cabezas de la máquina sobre la única cinta. Maquina multidimensional Máquina con una matriz de celdas k dimensional infinita como cinta. En función del estado y el símbolo analizado, la máquina cambia de estado y desplaza el cabezal de lectura en una de la 2k direcciones. 5.5.1 MAQUINA DE TURING MULTICINTA. En este modelo, la máquina de Turing tiene k cintas, infinitas en ambos sentidos, y k cabezales de L/E. La función de transición para maquinas de Turing con n cintas: δ : Q × 𝛤 𝑛 → Q × 𝛤 𝑛 × {𝐷, 𝑁, 𝐼, }𝑛 Figura 5.1 Diagrama de maquina multicinta Solo hay una entrada de información, en la primera cinta. Los tres pasos asociados a cada transición son ahora: - transición de estado, - escribir un símbolo en cada una de las celdas sobre las que están los cabezales de L/E, - el movimiento de cada cabezal es independiente y será R, L ´o NADA (Z). Demostración:(Idea Intuitiva) 1. Si L es reconocido por una Máquina de Turing de una sola cinta, L es reconocido por una Máquina de Turing Multicinta. Basta con hacer funcionar una sola cinta de la Máquina de Turing multicinta, la que se utiliza para realizar la entrada de información. 2. Si L es reconocido por una Maquina de Turing Multicinta, L es reconocido por una Maquina de Turing de una sola cinta. Gracias al teorema 7.1 el hecho de que las cintas sean o no infinitas en ambos sentidos es indiferente. La idea básica, entonces, será pasar de un Maquina de Turing multicinta con k cintas a una Maquina de Turing de una cinta pero con 2k sectores. Así, por cada cinta de la Máquina de Turing multicinta se tendrá en un sector, la información, y en el otro, una marca que indique la posición del cabezal de L/E de la maquina original. Figura 5.2 Diagrama de posición del cabezal en la maquina multicinta La maquinaM2 simula el funcionamiento de la m´aquinaM1 por barridos. Se necesitara un contador de valor inicial k y, suponiendo que el cabezal de M2 está ajustado sobre la marca situada más a la izquierda, se comienza un movimiento hacia la derecha. Cada vez que se detecte una marca de cabezal de L/E, se decrementa el contador y se almacena el símbolo asociado en el control finito. El barrido acaba cuando el contador valga 0. Habrá k símbolos almacenados en el CF de M2. Se realizaría la misma transición que se realizaría en M1. Para poder llevar a cabo los movimientos, habrá que realizar un nuevo barrido hacia la izquierda, trasladando las marcas hacia donde haya que trasladarlas (L, R ´o Z) y sobre escribiendo los símbolos que haya que reescribir; una vez completado el barrido, se cambia de estado. Nótese que un movimiento de M1 equivale a varios movimientos de M2. Este modelo tiene el mismo poder computacional, pero suele ser más eficiente que el modelo con una sola cinta. Ejemplo: Si se calcula el número de movimientos necesarios para reconocer una cadena del lenguaje L = {w𝑤 −1 | w ϵ 𝛴 ∗ } Con respecto a su longitud, en una máquina con 2 cintas el resultado sería lineal y en una maquina con una cinta, cuadrático. Figura 5.3 Maquina lineal Figura 5.4 Maquina cuadrática Maquina de Turing con Múltiples Cabezales. Tiene k cabezales de L/E, como la multicinta, pero con una sola cinta. Los cabezales operan todos de forma independiente. Como en las Maquinas de Turing multicinta, se admiten movimientos L, R ´o Z. Figura 5.5 Maquina múltiples cabezales Demostración:(Idea Intuitiva) 1. Si L es reconocido por una Maquina de Turing unicabezal, L es reconocido por una Maquina de Turing multicabezal. Basta con trabajar con un solo cabezal en la de múltiples cabezales. 2. Si L es reconocido por una Maquina de Turing multicabezal, L es reconocido por una Maquina de Turing unicabezal. La simulación es similar a la realizada para las Maquinas de Turing multicinta: se utiliza una cinta con k+1 sectores, k para marcar las posiciones de los distintos cabezales y uno para la información de la cinta. Maquina de Turing Offline. Es un caso particular de las Maquinas de Turing multicinta: tienen una cinta especial de solo lectura en la que el cabezal, que solo puede moverse hacia la derecha, no puede moverse de la zona delimitada por un par de símbolos especiales. Figura 5.6 Maquina Offline Para simularla, no hace falta más que construir una Maquina de Turing multicinta con una cinta especial sobre la que se copia la información de entrada. El cabezal de esa cinta solo lee (sobre escribe siempre el mismo símbolo que lee) y para al encontrar el símbolo $. A partir de la Máquina de Turing multicinta se puede aplicar el teorema 7.2 para demostrar que su poder computacional es el mismo que el de una Máquina de Turing estándar. Maquina de Turing No Determinista. Es una Maquina de Turing con cinta limitada a la izquierda, que se caracteriza por tener asociada más de una transición desde algún estado con el mismo símbolo, f(qi, a) = {(qi, b, L), (qi, a, R), (qj, a, R), (qj, b, R)} f(qi, b) = {(qi, b, R)} f(qj, a) = {(qj, b, L), (qj, a, R)} ... El número de transiciones asociado a cada par estado/símbolo siempre es finito. Demostración:(Idea Intuitiva) 1. Si L es reconocido por una Máquina de Turing Determinista, L es reconocido por una Maquina de Turing No Determinista. Las Maquinas de Turing deterministas son Maquinas de Turing no deterministas en las que solo hay una transición por cada par estado/símbolo. 2. Si L es reconocido por una Maquina de Turing No Determinista, L es reconocido por una Maquina de Turing Determinista. La demostración consiste en determinar como una Maquina de Turing determinista puede simular el comportamiento de una Maquina de Turing no determinista. Para ello, en primer lugar, y ya que el numero de transiciones asociadas a cada par estado/símbolo es finito, se determina r, el numero máximo de opciones asociadas a las transiciones (en el ejemplo anterior, r=4). Además, se necesita disponer de una Maquina de Turing determinista con 3 cintas, limitadas a la izquierda. La primera cinta, recoge la información de entrada, la cadena a reconocer. La segunda cinta sirve para llevar la cuenta de que opciones se van tomando. Para ello, sobre esa cinta hay que ir generando cadenas del alfabeto {1, 2, .., r} por orden numérico: - primero, todas las cadenas de longitud 1, 1, 2, 3, ..., r - segundo, todas las cadenas de longitud 2, 11, 12, 13, ..., 1r, 21, 22, 23, ..., 2r, ..., r1, r2, r3, ..., rr - tercero, todas las cadenas de longitud 3, 111, 112, 113, ..., 11r, 121, 122, 123 ..., 12r, ..., 1r1, 1r2, ..., 1rr, ..., rr1, rr2, rr3, ..., rrr - y, en general, en el paso i-´esimo se generarían todas las cadenas de longitud i, 11..1, 11..2, ..., 11..r, 11..21, 11..22, ..., 11..r1, .. etc. Sobre la tercera cinta se desarrolla la simulación propiamente dicha. Cada vez que se genera una secuencia en la cinta 2, se copia la cadena de entrada en la cinta 3. La secuencia de la cinta 2 indica que transición concreta se elige cada vez. Si, por ejemplo, en la cinta 2 está la secuencia 11231.. Quiere decir que la primera vez que aplique la función de transición se aplica la primera transición de entre las posibles. La segunda también se aplica la primera; la tercera, se debe aplicar la segunda, la cuarta se debe aplicar la tercera, la quinta se debe aplicar la primera2. . . Con este “chivato”, la máquina operara sobre la cinta 3. Cada vez que se prueba una Secuencia y no se llega a un estado de aceptación, se genera la siguiente y se vuelve a comenzar la simulación. Cuando se encuentra una secuencia que permite aceptar la cadena, la máquina para y acepta. Si la cadena es aceptada por la Máquina de Turing no determinista, es porque existe una secuencia de aplicaciones de la función de transición que conducen a un estado final. Como en la cinta 2 se van generando todas las posibles secuencias, esta nueva Máquina de Turing determinista alguna vez tendrá que encontrar la correcta y parar aceptando. Máquinas de Turing Restringidas. El objetivo de las subsecciones anteriores era poner de relieve que diferentes mejoras físicas sobre el modelo de Máquina de Turing, no se traducen en un mayor poder computacional, sino en una mayor eficiencia en el calculo o en una mayor simplicidad de diseño. De la misma forma que podría creerse que introduciendo mejoras físicas en el modelo tendría que aumentar su poder computacional, puede parecer que si se considera un modelo más restringido, ´este debe disminuir. Sin embargo, es posible establecer restricciones sobre el número de estados o el número de símbolos del alfabeto de la Máquina de Turing, sin que esto ocurra. En concreto, una Máquina de Turing sin restricciones sobre el alfabeto, con una cinta y sólo tres estados puede simular el comportamiento de cualquier Máquina de Turing. Si lo que se restringe es el número de símbolos, se puede probar el siguiente resultado: 5.6.1 FUNCIONES RECURSIVAS PRIMITIVAS La recursión primitiva permite definir una clase de funciones que forman un importante paso en la formalización de la noción de computabilidad. Se definen usando como principales operaciones la recursión y composición de funciones y forman un subconjunto estricto de las funciones recursivas, que son precisamente las funciones computables. Las funciones recursivas se definen agregándole a la recursión primitiva el operador de búsqueda no acotada que permite definir funciones parciales. Muchas de las funciones normalmente estudiadas en teoría de los números, y las aproximaciones a las funciones de valor real utilizan la recursión primitiva. Como ejemplo de ellas se tiene la suma, la división, el factorial, el enésimo primo, etc. De hecho, no es fácil definir una función que sea recursiva pero que no se pueda definir con recursión primitiva. Para definir las funciones recursivas primitivas, se utiliza un conjunto de funciones que por definición son recursivas, este conjunto inicial de funciones se denomina base de la recursión. Al aplicar un conjunto de reglas sobre las funciones recursivas primitivas, se obtienen nuevas funciones recursivas. La base de la recursión está formada por las funciones siguientes funciones: - Función "Nula" o "Cero" - Función "Sucesor" - Proyección i-ésima de orden n Las reglas que se aplican sobre estas funciones son las siguientes: - Composición Recursión primitiva Base de recursión Como se ha dicho anteriormente, hay tres funciones que forman la base de recursión. A continuación se explica cada una de ellas. • Función "Nula" o "Cero" N(x) = 0 La función que hace corresponder a cualquier número natural el número 0 es una función recursiva primitiva. Función sucesor S(x) = x' Esta función hace corresponder a cada numero natural su sucesor, que denotamos por x’. Produce el siguiente número entero según los axiomas de Peano. Es una función recursiva primitiva. Función proyección 𝐼𝑖𝑛 (𝑥1 , 𝑥2 , … , 𝑥𝑛 ) = 𝑥𝑖 Esta función es una función recursiva primitiva. A cada n-tupla se le hace corresponder su i-ésima componente, es decir, produce como resultado el argumento de la posición i. Reglas El conjunto de las funciones recursivas primitivas se define según las bases de recursión anteriores y las siguientes reglas: Regla de composición Dadas las funciones gi(x1,x2,...,xn),(i = 1,2,...m) y la función f que depende de las m funciones anteriores, es decir f = (g1,g2,...,gm), entonces decimos que h(x1,x2,...,xn) es la función compuesta de las gi mediante f si está definida de la siguiente forma: h(x1,x2,...,xn) = f(g1(x1,x2,...,xn),g2(x1,x2,...,xn),...,gm(x1,x2,...,xn)) Regla de recursión primitiva Vamos a diferenciar las reglas de recursión primitivas con parámetros y sin parámetros. Regla de recursión primitiva con parámetros Dadas dos funciones recursivas conocidas: f(x1,x2,...,xn), g(y,x1,x2,...,xn,z), Que dependen de los parámetros x1,x2,...,xn , se define la función h(y,x1,x2,...,xn), mediante el siguiente esquema de recursión: h(0,x1,x2,...,xn) = f(x1,x2,...,xn) h(y',x1,x2,...,xn) = g(y,x1,x2,...,xn,h(y,x1,x2,...,xn)) Regla de recursión primitiva sin parámetros Es un caso particular del anterior en el que no aparecerán los parámetros y el esquema de recursión sería: h(0) = k h(y') = g(y,h(y)) donde g(y,z) es una función recursiva conocida y k es una constante (un numero natural dado). Las funciones definidas de esta manera son construidas a partir de un conjunto base y mediante procedimientos de cálculo sencillos y pasos sucesivos; por lo tanto, se pueden calcular efectivamente. Esta clase de funciones es la misma que la que se define utilizando las Máquinas de Turing. La función de Ackermann La función de Ackermann es una función recursiva que toma dos números naturales como argumentos y devuelve un único número natural. Como norma general se define como sigue: A(m, n) = n+1, si m = 0; A(m-1, 1), si m > 0 y n= 0; A(m-1, A(m, n – 1)), si m > 0 y n > 0 Propiedades Sea k ϵ N, fk ϵ FRP Sea a > b, fk(a) > fk(b) Sea x, k ϵ N, fk(x) > x Sea k ϵ N, fk+1(x) > fk(x) Además la función de Ackerman (ACK(x) = fx(x)) no es FRP (función recursiva primitiva). La demostración de este teorema se lleva a cabo por reducción al absurdo y utilizando el lema de que toda función recursiva primitiva está mayorada por una función Ackermann. Comenzamos suponiendo que ACK(x) ϵ FRP, por tanto ACK(x) + 1 ϵ FRP Usando el lema de la mayoración, debe existir un k tal que ACK(x) + 1 ≤ fk(x) Pero entonces, como esto vale para todo x, también valdrá para x=k ACK(k) + 1 ≤ fk(k), usando la definición, llegamos a que: ACK(k) + 1 ≤ ACK(k) Lo cual es absurdo. Esta función crece extremadamente rápido: el valor A(4,2) ya tiene 19.729 dígitos. Este crecimiento desmesurado se puede utilizar para demostrar que la función computable f(n) = A(n, n) crece más rápido que cualquier función recursiva primitiva, y por ello no es recursiva primitiva. Algunos Ejemplos. Las siguientes funciones son (primitivas) recursivas: La función identidad /N : N → N Las funciones constantes : 𝐶𝑎𝑛 ∶ 𝑁 𝑛 → 𝑁, 𝐶𝑎𝑛 (𝑥⃗) = 𝑎 La función predecesor :pr : N → N Pr(x)= o x-1 La función diferencia reducida : −̇ : 𝑁 2 → N si x = 0 si x > 0 x –̇ y = 0 x-1 si x = 0 si x > 0 La función signo : sg : N → N Sg(x) = 0 1 si x = 0 e.c.o.c. 5.6.2 FUNCIONES RECURSIVAS PARCIALES. Fueron definidas por Herbrand y Gödel (1932-1933) su construcción a partir de: funciones básicas y operaciones: • Composición • Recursión • Minimización Coinciden con las funciones while-computables y con las funciones Turing-computables, subconjunto importante: funciones primitivas recursivas. Definición de la suma: – suma(0,x)=x – suma(n+1, x)=succ(suma(n,x)) Definición de la multiplicación: –mult(0,x)=0 – mult(n+1,x)=suma(mult(n,x),x) Definición de la potencia – pot(x,0)=1 – pot(x,n+1)=mult(pot(x,n),x) 5.6.3 MÁQUINA DE ACCESO ALEATORIO. La Máquina de Acceso Aleatorio (RAM) también conocida como RAM (Random Access Machine) es la consecuencia de dos máquinas de estados finitos es decir está basada como si usáramos dos máquinas estados finitos. Esta máquina está formada por: Unidad Central de Procesamiento (CPU) la cual se encarga de las funciones y procesos de la máquina y contiene a la Unidad Aritmética Lógica (ALU). Memoria de Acceso Aleatorio (RAM) que tiene como función almacenar y guardar los resultados de las operaciones realizadas con la máquina. La máquina de acceso aleatorio cuenta con los siguientes funciones o comandos Read (lectura) Write (Escritura) y NO-OP (Sin operar o rechazo). Además también cuenta con ciertas instrucciones: LOAD, STORE, ADD, SUB, MULT, DIV, READ, WRITE, JUMP, JNZ, JZ y HALT, algunas igualmente parecidas a las instrucciones que se utilizan hoy en día en el lenguaje ensamblador. Figura 5.7 Una maquina de Turing de acceso aleatorio tiene un número fijo de registros y una cinta limitada en un sentido Figura 5.8 Cada registro y casa celda de la cinta es capaz de contener un numero natural. La maquina actúa sobre las celdas de su cinta y sus registros siguiendo las instrucciones de un programa inalterable (este programa es análogo a la función de transición del modelo convencional). La Máquina de Turing formada por una cinta no acotada formada por casillas que contaba con un mecanismo de control, que pasaba por un conjunto de estados que empezaban a leerse a través de una cabeza de entrada con la que se examinaba casilla por casilla la cinta hasta terminar de leer es decir hasta obtener elementos nulos en la cinta. 5.6.4 AUTÓMATAS CELULARES. Este tipo de autómatas proviene del estudio de la estructura de las neuronas humanas y sus conexiones, los autómatas de células están constituidos por un conjunto de células interconectadas entre sí. Las células presentan las siguientes propiedades: Pueden estar en dos estados: activo (1) o inactivo (0). Pueden recibir dos tipos de señales a partir de otras células o como entrada del autómata: positivas (1) o negativas (0). Pueden tener una o varias entradas (ei) de dos tipos: excitadoras () o inhibidoras (--o) Tienen una salida o respuesta, r (t) Su salida puede ir a una o varias células (incluida ella misma) Su estado en el tiempo t+1 depende solo de la entrada que reciban en el tiempo t, pero no del estado en el tiempo t. Disponen de una función de transición, g, que permite transitar entre estados a partir de las entradas a una célula Tiene un umbral u ϵ Z, que, permite definir las diferentes funciones de transición. Representación. Como se muestra en la figura donde: e(t) = [e1(t), e2(t), …, en(t)] es el ventor de las entradas de la célula, y r (t) es la salida en el instante t. Al estado en el que se encuentra en un determinado instante, se le denominará q (t). 𝑒1 𝑒2 r u c … 𝑒𝑛 Figura 5.9 Diagrama de una Célula Se cumple, además: 1. r(t) = q(t), con lo que la salida en una determinado instante t depende solo del estado en ese instante. 2. q(t+1) = g(e(t)), con lo que el estado en el instante t+1 solo es función de la entrada en el instante t y es calculado por la función de transición g a partir de la entrada en el instante previo t; y 1 2 q(t+1) g(e(t)), con lo que la salida en el instante t+1 solo depende del = = estado al que transicione la célula a partir de las entradas en el instante previo t. 3. r(t+1) De acuerdo a todo esto, su comportamiento es análogo al de una maquina secuencial de Moore. Variando la función de transición g, se obtiene diferentes tipos de células. Se puede definir g de la siguiente manera: g(t) = 1 0 si ∑𝑛𝑖=0 𝑒𝑖 (𝑡) ≥ 𝑢 en otro caso donde n es el número de entradas de una célula, y 𝑒𝑖 (𝑡) = 1 -1 0 si la entrada es excitadora y la señal es 1 si la entrada es inhibidora y la señal es 1 en otro caso Es decir las células se activaran si la suma de las señales que recibe en entradas es mayor o igual que el umbral. Ejemplo: Dado el autómata de celas siguiente, la tabla de la figura refleja las transiciones definidas por la anterior función de transición g (t). Figura 5.10 Por ejemplo, en el caso de la entrada 101, la salida será 0, ya que la entrada en e1 es inhibidora y por ser su valor 1, cuenta como -1 para la función g. Construcción de un autómata de células equivalente a un AF. Para cada AF hay un autómata de células; si el AF = (Σ, Q, f, q0, F), se construye el autómata de células de la siguiente forma: Cada símbolo de entrada a ϵ Σ será una entrada del autómata de células Para cada estado q ϵ Q y símbolo de entrada a ϵ Σ, se crea una célula de nombre qa con umbral u=2, que recibirá una entrada excitadora desde la entrada α. Para cada transición f(p,a) = q y símbolo b ϵ Σ se crea un arco excitador desde la célula pa a cada célula qb. Se crea una célula de nombre α con umbral u=1, que recibe como entrada en símbolo inicial de la cadena Ⱶ. Este símbolo servirá para comenzar el proceso. Para cada a ϵ Σ, se crea un arco excitador desde la célula α a todas las células. Se crea una célula F con umbral u=2 que recibe una entrada excitadora del símbolo final de cadena ˧. Para cada transición f(p, a) = q tal que q ϵ F, se crea un arco excitador desde pa a la célula F. Bibliografía • Pedro Isasi, Paloma Martínez, Daniel Borrose, Lenguajes, gramáticas y autómatas un enfoque practico, Editorial Adisson Wesley • Dean Kelley, Teoría de autómatas Lenguajes y Formales,Editorial Prentice Hall • Forma normal de Kuroda S-Y. Kuroda, Classes of languages and linear-bounded automata, Information and Control 7(2): 207–223, June 1964. • Teoría de Autómatas y Lenguajes Formales, Alvaro E. Campos Ponticia Universidad Católica de Chile Escuela de Ingenieria, Departamento de Ciencia de la Computación • Universidad de Oviedo TEORÍA DE AUTÓMATA; Escuela Universitaria de Ingeniería Técnica en Informática de Oviedo (E.U.I.T.I.O); Alberto Suárez López • HOPCROFT,John E. and Ullman Jefrey D.; Introducción a la Teoría de Autómatas, Lenguajes y Computación; Edit. Addison-Wesley, U.S.A, Edic. 2002 • Lenguajes gramáticas y autómatas, Juan Manuel Cueva Lovalle, departamento de informática universidad de Oviedo, segunda edición 2001 • Teoría de la computación, Carrión Viramontes, Tecnológico de monterrey, editorial limusa, primera edición. • Lenguajes, Gramáticas y Autómatas, cuarto cuatrimestre (primavera) de Ingeniería en Informática, Rubén Béjar Hernández, Pedro Javier Álvarez, Dpto. Informática e Ingeniería de Sistemas, Universidad de Zaragoza • LENGUAJES Y GRAMATICAS, Orlando Arboleda Molina, Escuela de Ingeniería de Sistemas y Computación de La Universidad del Valle • Teoría de Autómatas y Lenguajes Formales, Profesor: Jose Ignacio Gómez Espínola • Autómatas finitos: Irreductibilidad e Inferencia, UNIVERSIDAD POLITECNICA DE VALENCIA DEPARTAMENTO DE SISTEMAS INFORMATICOS Y COMPUTACION, Vázquez de Parga Andrade y Pedro García Gómez