You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Sep 20, 2024. It is now read-only.
Copy file name to clipboardExpand all lines: README.md
+68-29Lines changed: 68 additions & 29 deletions
Original file line number
Diff line number
Diff line change
@@ -2,21 +2,28 @@
2
2
3
3
[](https://app.codacy.com/gh/CrysoK/TC1-TPT?utm_source=github.com&utm_medium=referral&utm_content=CrysoK/TC1-TPT&utm_campaign=Badge_Grade_Settings)
4
4
5
-
> :warning:**Si actualmente estás cursando TCI, no deberías estar aquí. Primero debes resolverlo por tu cuenta.**
5
+
> :warning:**Si actualmente estás cursando TCI, no deberías estar aquí. Primero
6
+
> debes resolverlo por tu cuenta.**
6
7
7
8
## Descripción
8
9
9
-
> Si quieres pasar a la acción, avanza a [instalación](#instalaci%C3%B3n) o [cómo usar](#c%C3%B3mo-usar).
10
+
> Si quieres pasar a la acción, avanza a [instalación](#instalaci%C3%B3n) o
11
+
> [cómo usar](#c%C3%B3mo-usar).
10
12
11
13
El trabajo está compuesto por dos partes.
12
14
13
-
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.
15
+
La primera es un TAD (tipo abstracto de datos) que permite modelar los objetos
16
+
matemáticos conjuntos y listas, cuyos componentes más elementales son cadenas de
17
+
caracteres pero también pueden contener conjuntos o listas de forma recursiva,
18
+
con cualquier nivel de anidamiento o profundidad.
14
19
15
-
La segunda utiliza el TAD diseñado para implementar algoritmos de autómatas finitos.
20
+
La segunda utiliza el TAD diseñado para implementar algoritmos de autómatas
21
+
finitos.
16
22
17
23
### TAD
18
24
19
-
**L**ST (listas), **S**ET (conjuntos) y **S**TR (cadenas) son los tres tipos de datos que puede representar un nodo **LSS**.
25
+
**L**ST (listas), **S**ET (conjuntos) y **S**TR (cadenas) son los tres tipos de
26
+
datos que puede representar un nodo **LSS**.
20
27
21
28
```c
22
29
enum NODE_TYPE { LST, SET, STR };
@@ -35,9 +42,12 @@ struct LSSNode {
35
42
36
43
#### Conjuntos
37
44
38
-
- Se simbolizan con una llave de apertura, una secuencia de elementos separados por comas y una llave de cierre. Ejemplo: `{uno, dos, tres}`.
45
+
- Se simbolizan con una llave de apertura, una secuencia de elementos separados
46
+
por comas y una llave de cierre. Ejemplo: `{uno, dos, tres}`.
39
47
- No poseen elementos repetidos.
40
-
- 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.
48
+
- No tienen orden. El conjunto `{uno, dos, tres}` es el mismo conjunto que
49
+
`{dos, uno, tres}` o que `{tres, dos, uno}`. En el programa se ordenan para
50
+
simplificar operaciones como la comparación.
41
51
- Aritmética de conjuntos:
42
52
- Unión (no implementado).
43
53
- Intersección.
@@ -47,9 +57,11 @@ struct LSSNode {
47
57
48
58
#### Listas
49
59
50
-
- Se simbolizan con un corchete de apertura, la lista de elementos separados por comas y un corchete de cierre. Ejemplo: `[uno, dos, tres]`.
60
+
- Se simbolizan con un corchete de apertura, la lista de elementos separados por
61
+
comas y un corchete de cierre. Ejemplo: `[uno, dos, tres]`.
51
62
- Pueden tener elementos repetidos.
52
-
- Tienen orden. La lista `[uno, dos, tres]` es distinta que `[dos, uno, tres]` o que `[tres, dos, uno]`.
63
+
- Tienen orden. La lista `[uno, dos, tres]` es distinta que `[dos, uno, tres]` o
64
+
que `[tres, dos, uno]`.
53
65
- Aritmética de listas:
54
66
- Agregar elementos al inicio y al final.
55
67
- Remover elementos al inicio y al final (no implementado).
@@ -58,23 +70,36 @@ struct LSSNode {
58
70
59
71
### Autómatas finitos
60
72
61
-
Los autómatas finitos pueden ser deterministas o no deterministas. En ambos casos su estructura es una *5-upla* definida por ( 𝑄 , 𝛴 , 𝛿 , 𝑞₀ , 𝐹 ) en donde:
73
+
Los autómatas finitos pueden ser deterministas o no deterministas. En ambos
74
+
casos su estructura es una *5-upla* definida por ( 𝑄 , 𝛴 , 𝛿 , 𝑞₀ , 𝐹 ) en
75
+
donde:
62
76
63
77
- 𝑄 es el conjunto de estados,
64
78
- 𝛴 es el conjunto de símbolos de entrada,
65
79
- 𝑞₀ es el estado inicial,
66
80
- 𝐹 el conjunto de estados de aceptación
67
-
- 𝛿, 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.
81
+
- 𝛿, cuando el AF es determinista, es una función de 𝑄 × 𝛴 en 𝑄 y, cuando el
82
+
AF es no determinista, es una relación en 𝑄 × 𝛴 × 𝑄. Se puede pensar a 𝛿
83
+
como una terna o lista de tres elementos que representan el estado de partida,
84
+
el carácter leído, y los estados destino (puede ser uno) respectivamente.
68
85
69
-
La transición de un AFD 𝛿 { 𝑞₀ , a } = 𝑞₁ se puede representar como [ 𝑞₀ , a , 𝑞₁ ].
86
+
La transición de un AFD 𝛿 { 𝑞₀ , a } = 𝑞₁ se puede representar como [ 𝑞₀ , a
87
+
, 𝑞₁ ].
70
88
71
-
La transición de un AFND 𝛿 { 𝑞₀ , a } = { 𝑞₁ , 𝑞₂ } se puede representar como [𝑞₀ , a , { 𝑞₁ , 𝑞₂ } ].
89
+
La transición de un AFND 𝛿 { 𝑞₀ , a } = { 𝑞₁ , 𝑞₂ } se puede representar
90
+
como [𝑞₀ , a , { 𝑞₁ , 𝑞₂ } ].
72
91
73
-
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).
92
+
Como los AFD son casos particulares de un AFND, se puede pensar en almacenar a
93
+
los AFD con su tercera componente como un conjunto de un solo elemento. Así,
94
+
generalizando, se representa a 𝛿 como una terna o lista de tres elementos cuyo
95
+
primer elemento es una cadena (el estado), segundo elemento también una cadena
96
+
(el símbolo leído) y tercer elemento un conjunto de cadenas (conjunto de estados
97
+
destino).
74
98
75
99
Entonces un AF puede ser almacenado con la siguiente estructura:
@@ -88,22 +113,29 @@ Se puede concluir que el TAD diseñado permite almacenar autómatas finitos.
88
113
89
114
### Objetivos
90
115
91
-
Implementar el [TAD](#tad) descripto utilizando la estructura de datos propuesta. Luego utilizarlo en un programa para las siguientes tareas:
116
+
Implementar el [TAD](#tad) descripto utilizando la estructura de datos
117
+
propuesta. Luego utilizarlo en un programa para las siguientes tareas:
92
118
93
-
- Cargar un AF "por partes": primero el conjunto de estados, luego el alfabeto, etc. (cargar la transición de estados por terna).
119
+
- Cargar un AF "por partes": primero el conjunto de estados, luego el alfabeto,
120
+
etc. (cargar la transición de estados por terna).
94
121
- Almacenar el AF en la estructura propuesta.
95
122
- Mostrar el autómata finito.
96
-
- Dada una cadena, indicar si pertenece al lenguaje regular cuyo autómata finito es el ingresado.
123
+
- Dada una cadena, indicar si pertenece al lenguaje regular cuyo autómata finito
124
+
es el ingresado.
97
125
- Si el AF es no determinista, convertirlo en determinista.
98
126
99
127
## Instalación
100
128
101
-
Puedes descargar el código fuente (como archivo comprimido) o un ejecutable (solo para Windows) [aquí](https://github.com/CrysoK/TCI_TPT/releases).
102
-
Se incluye `MakeWindows.cmd` y `MakeLinux.sh` para facilitar la compilación ([más información](https://github.com/CrysoK/WLCM)). Otros sistemas operativos no deberian tener problemas si cuentan con `make`.
129
+
Puedes descargar el código fuente (como archivo comprimido) o un ejecutable
130
+
(solo para Windows) [aquí](https://github.com/CrysoK/TCI_TPT/releases). Se
131
+
incluye `MakeWindows.cmd` y `MakeLinux.sh` para facilitar la compilación ([más
132
+
información](https://github.com/CrysoK/WLCM)). Otros sistemas operativos no
133
+
deberían tener problemas si cuentan con `make`.
103
134
104
135
## ¿Cómo usar?
105
136
106
-
El programa cuenta con una interfaz sencilla basada en menús y opciones que se indican por teclado.
137
+
El programa cuenta con una interfaz sencilla basada en menús y opciones que se
138
+
indican por teclado.
107
139
108
140
Algunos mensajes utilizan ciertos símbolos, que indican lo siguiente:
109
141
@@ -115,27 +147,34 @@ Algunos mensajes utilizan ciertos símbolos, que indican lo siguiente:
115
147
116
148
### Carga de un autómata finito
117
149
118
-
Puede cargar cualquier AF siempre que sea correcto y se respete el formato indicado más [arriba](#autómatas-finitos).
150
+
Puede cargar cualquier AF siempre que sea correcto y se respete el formato
151
+
indicado más [arriba](#autómatas-finitos).
119
152
120
-
[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.
153
+
[Estos](afs.md) AF pueden servirle para probar el programa. La forma más rápida
154
+
de cargarlos es copiar y pegar en la opción de carga directa.
121
155
122
156
### Visualización de un autómata finito
123
157
124
158
#### Consola
125
159
126
-
Basta con elegir la opción 2 para ver al AF cargado como texto simple en la consola.
160
+
Basta con elegir la opción 2 para ver al AF cargado como texto simple en la
161
+
consola.
127
162
128
163
#### Externa
129
164
130
-
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.
131
-
132
-
Está en los planes que el programa genere directamente una imagen si el usuario tiene Graphviz instalado.
165
+
La opción 3 permite visualizar la estructura cargada usando
166
+
[Graphviz](https://graphviz.org/download/). Genera un archivo `.dot` en la
167
+
carpeta donde está el ejecutable y, si
168
+
[Graphviz](https://graphviz.org/download/) está instalado correctamente, genera una
169
+
imagen y la muestra.
133
170
134
171
### Aceptación de cadenas
135
172
136
-
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.
173
+
La opción 4 permite ingresar cadenas y comprobar si el AF cargado las acepta o
174
+
no. Las cadenas deben estar formadas por símbolos que estén definidos en el AF.
137
175
138
176
### Conversión
139
177
140
178
En el caso de cargar un AFND, se muestra la opción 5 para convertirlo en un AFD.
141
-
El AFD resultante es completamente válido y se puede usar en el resto de opciones.
179
+
El AFD resultante es completamente válido y se puede usar en el resto de
0 commit comments