|
1 | 1 | # Trabajo práctico transversal
|
2 | 2 |
|
3 |
| -## ¿Qué es? |
| 3 | + |
4 | 4 |
|
5 |
| -a |
| 5 | +## Descripción |
| 6 | + |
| 7 | +> ¿Mucho texto? Avanza hasta [instalación](#instalaci%C3%B3n) o [cómo usar](#c%C3%B3mo-usar). |
| 8 | +
|
| 9 | +El trabajo está compuesto por dos partes. |
| 10 | + |
| 11 | +La primera es un TAD (tipo abstracto de datos) que permite modelar los objetos matemáticos conjuntos y listas, cuyos componentes más elementales son cadenas de caracteres pero también pueden contener conjuntos o listas de forma recursiva, con cualquier nivel de anidamiento o profundidad. |
| 12 | + |
| 13 | +La segunda utiliza el TAD diseñado para implementar algoritmos de autómatas finitos. |
| 14 | + |
| 15 | +### TAD |
| 16 | + |
| 17 | +**L**ST (listas), **S**ET (conjuntos) y **S**TR (cadenas) son los tres tipos de datos que puede representar un nodo **LSS**. |
| 18 | + |
| 19 | +```c |
| 20 | +enum NODE_TYPE { LST, SET, STR }; |
| 21 | + |
| 22 | +struct LSSNode { |
| 23 | + enum NODE_TYPE type; |
| 24 | + union { |
| 25 | + char *str; |
| 26 | + struct { |
| 27 | + struct LSSNode *data; |
| 28 | + struct LSSNode *next; |
| 29 | + }; |
| 30 | + }; |
| 31 | +}; |
| 32 | +``` |
| 33 | + |
| 34 | +#### Conjuntos |
| 35 | + |
| 36 | +- Se simbolizan con una llave de apertura, una secuencia de elementos separados por comas y una llave de cierre. Ejemplo: `{uno, dos, tres}`. |
| 37 | +- No poseen elementos repetidos. |
| 38 | +- No tienen orden. El conjunto `{uno, dos, tres}` es el mismo conjunto que `{dos, uno, tres}` o que `{tres, dos, uno}`. En el programa se ordenan para simplificar operaciones como la comparación. |
| 39 | +- Aritmética de conjuntos: |
| 40 | + - Unión (no implementado). |
| 41 | + - Intersección. |
| 42 | + - Diferencia (no implementado). |
| 43 | + - Pertenencia. |
| 44 | + - Cardinal. |
| 45 | + |
| 46 | +#### Listas |
| 47 | + |
| 48 | +- Se simbolizan con un corchete de apertura, la lista de elementos separados por comas y un corchete de cierre. Ejemplo: `[uno, dos, tres]`. |
| 49 | +- Pueden tener elementos repetidos. |
| 50 | +- Tienen orden. La lista `[uno, dos, tres]` es distinta que `[dos, uno, tres]` o que `[tres, dos, uno]`. |
| 51 | +- Aritmética de listas: |
| 52 | + - Agregar elementos al inicio y al final. |
| 53 | + - Remover elementos al inicio y al final (no implementado). |
| 54 | + - Pertenencia. |
| 55 | + - Tamaño de la lista. |
| 56 | + |
| 57 | +### Autómatas finitos |
| 58 | + |
| 59 | +Los autómatas finitos pueden ser deterministas o no deterministas. En ambos casos su estructura es una *5-upla* definida por ( 𝑄 , 𝛴 , 𝛿 , 𝑞₀ , 𝐹 ) en donde: |
| 60 | + |
| 61 | +- 𝑄 es el conjunto de estados, |
| 62 | +- 𝛴 es el conjunto de símbolos de entrada, |
| 63 | +- 𝑞₀ es el estado inicial, |
| 64 | +- 𝐹 el conjunto de estados de aceptación |
| 65 | +- 𝛿, cuando el AF es determinista, es una función de 𝑄 × 𝛴 en 𝑄 y, cuando el AF es no determinista, es una relación en 𝑄 × 𝛴 × 𝑄. Se puede pensar a 𝛿 como una terna o lista de tres elementos que representan el estado de partida, el carácter leído, y los estados destino (puede ser uno) respectivamente. |
| 66 | + |
| 67 | +La transición de un AFD 𝛿 { 𝑞₀ , a } = 𝑞₁ se puede representar como [ 𝑞₀ , a , 𝑞₁ ]. |
| 68 | + |
| 69 | +La transición de un AFND 𝛿 { 𝑞₀ , a } = { 𝑞₁ , 𝑞₂ } se puede representar como [𝑞₀ , a , { 𝑞₁ , 𝑞₂ } ]. |
| 70 | + |
| 71 | +Como los AFD son casos particulares de un AFND, se puede pensar en almacenar a los AFD con su tercera componente como un conjunto de un solo elemento. Así, generalizando, se representa a 𝛿 como una terna o lista de tres elementos cuyo primer elemento es una cadena (el estado), segundo elemento también una cadena (el símbolo leído) y tercer elemento un conjunto de cadenas (conjunto de estados destino). |
| 72 | + |
| 73 | +Entonces un AF puede ser almacenado con la siguiente estructura: |
| 74 | + |
| 75 | +[ { 𝑞₀ , 𝑞₁ , ... , 𝑞ₙ } , { a , b } , { [ 𝑞₀ , a , { 𝑞₀ , 𝑞₁ } ] , ... , [ 𝑞₂ , b , { 𝑞₁ } ] } , 𝑞₀ , { 𝑞₂ } ] |
| 76 | + |
| 77 | +Donde: |
| 78 | + |
| 79 | +- 𝑄 = { 𝑞₀ , 𝑞₁ , ... , 𝑞ₙ } |
| 80 | +- 𝛴 = { a , b } |
| 81 | +- 𝛿 = { [ 𝑞₀ , a , { 𝑞₀ , 𝑞₁ } ] , ... , [ 𝑞₂ , b , { 𝑞₁ } ] } |
| 82 | +- 𝑞₀ = 𝑞₀ |
| 83 | +- 𝐹 = { 𝑞₂ } |
| 84 | + |
| 85 | +Se puede concluir que el TAD diseñado permite almacenar autómatas finitos. |
| 86 | + |
| 87 | +### Objetivos |
| 88 | + |
| 89 | +Implementar el [TAD](#tad) descripto utilizando la estructura de datos propuesta. Luego utilizarlo en un programa para las siguientes tareas: |
| 90 | + |
| 91 | +- Cargar un AF "por partes": primero el conjunto de estados, luego el alfabeto, etc. (cargar la transición de estados por terna). |
| 92 | +- Almacenar el AF en la estructura propuesta. |
| 93 | +- Mostrar el autómata finito. |
| 94 | +- Dada una cadena, indicar si pertenece al lenguaje regular cuyo autómata finito es el ingresado. |
| 95 | +- Si el AF es no determinista, convertirlo en determinista. |
6 | 96 |
|
7 | 97 | ## Instalación
|
8 | 98 |
|
9 | 99 | ### Windows
|
10 | 100 |
|
11 |
| -Puedes descargar el ejecutable de la última versión [aquí](https://github.com/CrysoK/TCI_TPT/releases). |
| 101 | +Puede descargar el ejecutable de la última versión [aquí](https://github.com/CrysoK/TCI_TPT/releases). |
12 | 102 |
|
13 |
| -También puedes compilar el programa por tu cuenta. Lo más simple es usar `MakeWindows.cmd`. [Más información](https://github.com/CrysoK/Win-Linux_C_Makefile). |
| 103 | +También puede compilar el programa por su cuenta. Lo más simple es usar `MakeWindows.cmd`. [Más información](https://github.com/CrysoK/Win-Linux_C_Makefile). |
14 | 104 |
|
15 | 105 | ### Linux
|
16 | 106 |
|
17 |
| -Debes compilar el programa por tu cuenta. Lo más simple es usar `MakeLinux.sh`. [Más información](https://github.com/CrysoK/Win-Linux_C_Makefile). |
| 107 | +Debe compilar el programa por su cuenta. Lo más simple es usar `MakeLinux.sh`. [Más información](https://github.com/CrysoK/Win-Linux_C_Makefile). |
18 | 108 |
|
19 | 109 | ## ¿Cómo usar?
|
20 | 110 |
|
21 |
| -## Ejemplos |
| 111 | +El programa cuenta con una interfaz sencilla basada en menús y opciones que se indican por teclado. |
| 112 | + |
| 113 | +Algunos mensajes utilizan ciertos símbolos, que indican lo siguiente: |
| 114 | + |
| 115 | +- `<x>` Mensaje de error.` |
| 116 | +- `<!>` Mensaje de advertencia. |
| 117 | +- `<i>` Información secundaria. |
| 118 | +- `<?>` Mensajes que se activan al usar `#DEBUG 1` en el código fuente. |
| 119 | +- `#` Se espera que el usuario ingrese datos. |
| 120 | + |
| 121 | +### Carga de un autómata finito |
| 122 | + |
| 123 | +Puede cargar cualquier AF siempre que sea correcto y se respete el formato indicado más [arriba](#autómatas-finitos). |
| 124 | + |
| 125 | +[Estos](afs.md) AF pueden servirle para probar el programa. La forma más rápida de cargarlos es copiar y pegar en la opción de carga directa. |
| 126 | + |
| 127 | +### Visualización de un autómata finito |
| 128 | + |
| 129 | +#### Consola |
| 130 | + |
| 131 | +Basta con elegir la opción 2 para ver al AF cargado como texto simple en la consola. |
| 132 | + |
| 133 | +#### Externa |
| 134 | + |
| 135 | +La opción 3 genera el archivo `LSS.dot` en la misma carpeta en la que se encuentra el ejecutable. Este archivo se puede usar con [Graphviz](https://graphviz.org/) para crear una representación gráfica mucho más detallada de los datos cargados. |
| 136 | + |
| 137 | +Está en los planes que el programa genere directamente una imagen si el usuario tiene Graphviz instalado. |
| 138 | + |
| 139 | +### Aceptación de cadenas |
| 140 | + |
| 141 | +La opción 4 permite ingresar cadenas y comprobar si el AF cargado las acepta o no. Las cadenas deben estar formadas por símbolos que estén definidos en el AF. |
| 142 | + |
| 143 | +### Conversión |
22 | 144 |
|
23 |
| -Puedes cargar cualquiera de [estos](afs.md) autómatas finitos en el programa con el método de carga directa. |
| 145 | +En el caso de cargar un AFND, se muestra la opción 5 para convertirlo en un AFD. |
| 146 | +El AFD resultante es completamente válido y se puede usar en el resto de opciones. |
0 commit comments