La teoría de categorías y el álgebra abstracta tratan la forma en que las funciones se pueden combinar con otras funciones. La teoría de la complejidad trata de cuán difícil es calcular una función. Es extraño para mí que no haya visto a nadie combinar estos campos de estudio, ya que parecen pares tan naturales. ¿Alguien ha hecho esto antes?
Como ejemplo motivador, echemos un vistazo a los monoides. Es bien sabido que si una operación es un monoide, entonces podemos paralelizar la operación.
Por ejemplo, en Haskell, podemos definir trivialmente que la suma es un monoide sobre los enteros como este:
instance Monoid Int where
mempty = 0
mappend = (+)
Ahora, si queremos calcular la suma de 0 a 999, podríamos hacerlo secuencialmente como:
foldl1' (+) [0..999]
o podríamos hacerlo en paralelo
mconcat [0..999] -- for simplicity of the code, I'm ignoring that this doesn't *actually* run in parallel
Pero paralelizar este monoide tiene sentido solo porque mappend se ejecuta en tiempo constante. ¿Y si este no fuera el caso? Las listas, por ejemplo, son monoides donde mappend no ejecuta un tiempo inconstante (¡o espacio!). Supongo que es por eso que no hay una función mconcat paralela predeterminada en Haskell. La mejor implementación depende de la complejidad del monoide.
Parece que debería haber una manera conveniente de describir las diferencias entre estos dos monoides. Entonces deberíamos poder anotar nuestro código con estas diferencias y hacer que los programas elijan automáticamente los mejores algoritmos para usar según la complejidad de un monoide.
fuente
Respuestas:
Dada la importancia de la complejidad computacional como campo de investigación, si fueran compañeros de cama tan naturales, ¿tal vez alguien ya habría sacado la conexión?
Especulación salvaje. Permítanme entretener al lector con pensamientos sobre por qué es difícil una representación categórica de la complejidad computacional. Podría decirse que el grupo de conceptos clave en la teoría de categorías se centra en las construcciones / propiedades universales (con el aparato asociado de functores, transformaciones naturales, adjuntos, etc.). Si podemos demostrar que una construcción matemática tiene una propiedad universal, eso nos da mucha información. Entonces, si quisiéramos un enfoque categórico de la complejidad computacional, tendríamos que encontrar una categoría conveniente y exhibir cómo los conceptos clave de la teoría de la complejidad (por ejemplo, LOGSPACE o dureza NP) pueden ser dados por construcciones universales usando esa categoría. Esto aún no se ha hecho, y creo que es porque es un problema realmente difícil.
Veamos primero las cintas. Hay un par de formas naturales para componer cintas, ninguna de las cuales parece funcionar para una descripción compositiva de TM.
Pegarlos juntos como la suma ordinal. Esta no es la noción correcta, porque las cintas son infinitas y al unirlas como una suma ordinal obtenemos un objeto doble infinito que va más allá de la computabilidad finita, lo que lleva a una computación / hipercomputación infinita, que son interesantes como matemáticas pero no corresponden a Cálculo factible.
Pegarlos en paralelo , por ejemplo, dos máquinas de 3 cabezales se convierten en una máquina de 6 cabezas. Esto no nos dice cómo las máquinas componentes interactúan entre sí.
Cintas intercaladas. Un problema con este enfoque es que no está claro cuál podría ser el intercalado canónico, si lo hay. Además, el intercalado 'confundirá' el control existente, que tiende a ajustarse finamente hacia un diseño de cinta específico. Entonces no podemos reutilizar el control directamente.
Con todo, estamos bastante lejos de formar un tratamiento algebraico / categórico sustancial de la complejidad computacional, y necesitaríamos varios avances conceptuales para llegar allí.
fuente
Esta respuesta sobre isomorfismos entre lenguajes formales combina resultados algebraicos de la teoría de códigos con nociones de teoría de categorías para investigar posibles nociones de equivalencia e isomorfismo entre lenguajes formales y clases de complejidad.
Mi propia interpretación de estos resultados es que los puntos de sincronización en palabras son diferentes para transductores deterministas y no deterministas no ambiguos, e incluso diferentes entre transductores deterministas hacia adelante y hacia atrás deterministas. Tomar esta perspectiva de los puntos de sincronización permite conectar estos resultados a lenguajes visiblemente pushdown, y plantea la cuestión de si esos también deberían considerar separadores simples (como un espacio o una coma) además de llamadas y devoluciones. (Supongo que un separador podría ser emulado por una combinación de retorno + llamada, pero debido a que requieren dos símbolos en lugar de uno, no me queda claro si esto es suficiente. También puede haber idiomas visibles que solo tengan separadores, pero no llamar o devolver símbolos.)
fuente