A teoria das categorias e a álgebra abstrata lidam com a maneira como as funções podem ser combinadas com outras funções. A teoria da complexidade lida com a dificuldade de calcular uma função. É estranho para mim não ter visto ninguém combinar esses campos de estudo, pois eles parecem pares naturais. Alguém já fez isso antes?
Como um exemplo motivador, vamos dar uma olhada nos monoides. É sabido que, se uma operação é monóide, podemos paralelizar a operação.
Por exemplo, em Haskell, podemos definir trivialmente que a adição é um monóide sobre números inteiros como este:
instance Monoid Int where
mempty = 0
mappend = (+)
Agora, se quisermos calcular a soma de 0 a 999, poderíamos fazê-lo sequencialmente como:
foldl1' (+) [0..999]
ou poderíamos fazê-lo em paralelo
mconcat [0..999] -- for simplicity of the code, I'm ignoring that this doesn't *actually* run in parallel
Mas paralelizar esse monóide só faz sentido porque o mappend é executado em tempo constante. E se não fosse esse o caso? As listas, por exemplo, são monoides onde o mappend não executa um tempo inconstante (ou espaço!). Eu estou supondo que é por isso que não há nenhuma função mconcat paralela padrão no Haskell. A melhor implementação depende da complexidade do monóide.
Parece que deve haver uma maneira conveniente de descrever as diferenças entre esses dois monóides. Deveríamos, então, poder anotar nosso código com essas diferenças e fazer com que os programas escolham automaticamente os melhores algoritmos para usar, dependendo da complexidade de um monóide.
fonte
Respostas:
Dado o destaque da complexidade computacional como um campo de pesquisa, se eles fossem companheiros naturais, talvez alguém já tivesse trazido a conexão?
Especulação selvagem. Deixe-me entreter o leitor com pensamentos sobre o porquê de uma renderização categórica da complexidade computacional ser difícil. Indiscutivelmente, o cluster de conceitos-chave na teoria das categorias está centrado em construções / propriedades universais (com o aparato associado de functores, transformações naturais, complementos e assim por diante). Se pudermos mostrar que uma construção matemática tem uma propriedade universal, isso fornece muitas informações. Portanto, se quiséssemos uma abordagem categórica da complexidade computacional, precisaríamos encontrar uma categoria conveniente e exibir como os conceitos-chave da teoria da complexidade (por exemplo, LOGSPACE ou dureza NP) podem ser dados por construções universais usando essa categoria. Isso ainda não foi feito, e acho que é porque é um problema realmente difícil.
Vamos ver as fitas primeiro. Existem algumas maneiras naturais de compor fitas, nenhuma das quais parece funcionar para uma descrição composicional das MTs.
Cole-os juntos como adição ordinal. Esta não é a noção correta, porque as fitas são infinitas e, juntando-as como adição ordinal, obtemos um objeto infinito duplo que vai além da computabilidade finita, levando a computação / hipercomputação infinita, que são interessantes como matemáticas, mas não correspondem a computação viável.
Cole-os em paralelo , por exemplo, duas máquinas de 3 cabeças se transformam em uma máquina de 6 cabeças. Isso não nos diz como as máquinas componentes interagem umas com as outras.
Entrelaçar fitas. Um problema com essa abordagem é que não está claro qual poderia ser a intercalação canônica, se houver. Além disso, a intercalação 'confundirá' o controle existente, que tende a ser afinado para um layout de fita específico. Portanto, não podemos reutilizar o controle diretamente.
Em suma, estamos muito distantes de um tratamento algébrico / categórico substancial da complexidade computacional e precisaríamos de vários avanços conceituais para chegar lá.
fonte
Esta resposta sobre isomorfismos entre linguagens formais combina resultados algébricos da teoria dos códigos com noções da teoria das categorias para investigar possíveis noções de equivalência e isomorfismo entre linguagens formais e classes de complexidade.
Minha própria interpretação desses resultados é que os pontos de sincronização nas palavras são diferentes para transdutores determinísticos e não-ambíguos não-determinísticos e até diferentes entre transdutores determinísticos para a frente e determinísticos para trás. Tomar essa perspectiva dos pontos de sincronização permite conectar esses resultados a linguagens visíveis de empilhamento e levanta a questão de saber se eles também devem considerar separadores simples (como um espaço ou vírgula) além de chamadas e retornos. (Meu palpite é que um separador pode ser emulado por uma chamada de retorno + combinada, mas como esses requerem dois símbolos em vez de um, não está claro se isso é suficiente. Também pode haver idiomas visíveis que possuem apenas separadores, mas não chamar ou retornar símbolos.)
fonte