Skip to content
This repository was archived by the owner on Sep 20, 2024. It is now read-only.

Commit 75e5404

Browse files
committed
Update README.md
1 parent e26241d commit 75e5404

File tree

1 file changed

+130
-7
lines changed

1 file changed

+130
-7
lines changed

README.md

Lines changed: 130 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,146 @@
11
# Trabajo práctico transversal
22

3-
## ¿Qué es?
3+
![GitHub release (latest SemVer including pre-releases)](https://img.shields.io/github/v/release/crysok/tci_tpt?include_prereleases&style=flat-square)
44

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.
696

797
## Instalación
898

999
### Windows
10100

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).
12102

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).
14104

15105
### Linux
16106

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).
18108

19109
## ¿Cómo usar?
20110

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
22144

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

Comments
 (0)