Se você tem um idioma L, sem fazer nenhuma prova, há uma maneira de saber se é reconhecível ou co-reconhecível ou decidível?
Basicamente, todas as dicas ou truques que podem ser usados para contar. Ou talvez os padrões comuns a serem pesquisados para saber qual é o tipo?
Respostas:
L é reconhecível
Uma linguagem é reconhecível se, e somente se, existe um verificador para , onde um verificador é uma máquina de Turing que pára em todas as entradas e para todos os , . Comumente, é pensado como um "certificado" ou "prova" de que está em eo verificador verifica se é uma prova válida de estar emeu eu w ∈Σ∗ w ∈ G ↔ ∃ c ∈Σ∗. V aceita ⟨ w , c ⟩ c W eu V c W eu . (Observe que essa definição é equivalente à definição de reconhecedor porque podemos construir um reconhecedor para um idioma a partir de um verificador para esse idioma). Agora, para determinar se um idioma está ou não no ER, podemos fazer a seguinte pergunta:
Por exemplo, considereHA L T= { ⟨ M, W ⟩ | M é uma TM que para em w } . HA L T é reconhecível porque provar a você que M pára w , Posso apenas dizer o número de etapas que você deve executar M para e se M parar depois de tantas etapas, você estaria convencido de que ⟨M,w⟩∈HALT .
L é co-reconhecível
Da mesma forma, um idiomaL é co-reconhecível se e somente se seu complemento for reconhecível ou, em outras palavras, se existir um verificador para L¯¯¯¯ . Assim, para ver se um idioma está em co-RE, podemos perguntar:
Tomando novamente o exemplo deHALT , podemos usar essa intuição para mostrar que HALT não é co-reconhecível. Isso porque se eu lhe dissesse que alguma máquinaM não para na entrada w , não há realmente nada que eu possa lhe dizer para convencê-lo desse fato. eu poderia correrM em w mas mesmo se estivéssemos assistindo M corra e ainda não o viu parar, não sabemos que não irá parar em algum momento no futuro.
L é decidível
Finalmente, uma linguagemL é decidível se ambos L e L¯¯¯¯ são reconhecíveis. Portanto, se a resposta para as duas perguntas acima for sim, o idioma será decidido.
Como exemplo, considereL={anbn | n∈N} . Dada uma stringw∈L , eu poderia provar para você que w∈L ? Claro, eu poderia contar o número dea se o número de b se mostrar que são iguais, então L é reconhecível. E sew∉L ? Eu poderia provar que uma string não está emL mostrando que não é da forma anbm ou que há uma incompatibilidade no número de a areia b s. Portanto,L é co-reconhecível. Como é reconhecível e co-reconhecível,L também é decidível.
Referência: eu sou um AT para uma aula de introdução à teoria da computabilidade / complexidade na minha universidade e meu professor fez este guia animado realmente útil para raciocinar sobre linguagens regulares, decidíveis e reconhecíveis.
fonte
Ideias principais
Ser reconhecível significa que você pode criar um processo automático (voltaremos a isso mais tarde) que usa uma palavra como parâmetro, de forma que
Ser co-reconhecível significa a linguagemw∈Σ∗,w∉L (ou, em inglês, o conjunto de todas as palavras que não estão em L , ou seja, complementar) é reconhecível.
Ser decidível significa que você pode criar um processo automático que use uma palavra como entrada, para que
Um resultado importante é queL é decidível se e somente se L é reconhecível e co-reconhecível.
A idéia para provar esse resultado é que você pode criar um processo automático a partir dos processos reconhecíveis e co-reconhecíveis, alternando etapas dos dois processos, até que um deles lhe dê a resposta SIM. Um deles precisa fazê-lo, pois cada palavra está ou não no idioma)
Processos automáticos
Sem ser muito formal, muitos tipos de máquinas foram projetados, e basicamente todos eles foram vinculados a tipos de linguagens (esses tipos dependem das ferramentas necessárias para definir tais linguagens. Para obter mais informações, Chomsky Hierarchy pode ajudar).
O significado usual do processo automático, em relação à decidibilidade, é uma Máquina de Turing. Você pode definir uma máquina de Turing para que ela possa:
Basicamente, uma máquina de Turing pode fazer tudo o que você pode definir em um programa, exceto que é um objeto matemático, com memória infinita e tempo para gastar em um cálculo. Nem sempre termina.
Outra propriedade importante das Máquinas de Turing é que você pode descrever uma máquina de Turing como uma única palavra (isso é codificação), e existe uma máquina de Turing que, dada como entrada, a codificação de uma máquinaM e uma palavra w , pode simular o cálculo de M na entrada w . Isso será importante daqui a pouco.
Vamos apenas salientar que as linguagens regulares - que são (quase) o tipo mais simples de linguagem que você pode pensar do ponto de vista da matemática - têm a propriedade peculiar de serem fechadas sob complemento. Isso significa basicamente que nessas línguas as noções de reconhecibilidade e decidibilidade são equivalentes. Isso não se aplica à medida que você avança na hierarquia de Chomsky.
Exemplo de um idioma indecidível
Estudaremos o problema da parada . A questão é: podemos construir uma máquina de Turing que, dada a codificação de outra máquina de TuringM e uma palavra w , Decide wetherM termina na entrada w ?
Obviamente, isso é reconhecível , pois precisamos simularM em w até que termine e, quando terminar, diga SIM. No entanto, seM nunca termina, não diremos NÃO, por isso reconhecemos esse idioma, mas não o decidimos. Está provado que esse idioma não pode ser decidido por uma máquina de Turing. Isso envolve um esquema matemático usual: um argumento diagonal, que eu não chamaria de intuitivo. Você pode verificar este esboço de prova para se acostumar.
Resumindo
Você não poderá, em um idioma, apenas declarar se é decidível ou não. Não existe nenhum algoritmo que possa fazer isso, e provar que uma linguagem não é decidida requer algum pensamento e pode exigir algum conhecimento sobre Máquinas de Turing, argumentos diagonais, etc.
No entanto, aqui está minha maneira pessoal de lidar com essa questão. Normalmente, ao estudar um idioma, presumo que seja decidível, a menos que mostre alguma forma de referência à maneira como a Turing Machine funciona. Nesse caso, começo a desconfiar e tento definir um algoritmo que decide a linguagem. Se isso não parecer fácil, às vezes ajuda a dividir o trabalho em algoritmos de reconhecimento e co-reconhecimento. Se eu ainda não conseguir, tentarei estabelecer uma conexão entre esse idioma e outro indecidível, como "Se eu posso decidir esse idioma, posso decidir o problema da interrupção". Esta é uma redução de Turing a um problema indecidível, portanto o primeiro problema não pode ser decidido. Se tudo isso falhar, posso tentar usar argumentos diagonais, mas isso pode ser um pouco complicado.
fonte
Um truque é que, se o idioma é finito, você tem certeza de que é decidível - pois pode "codificar" uma máquina para aceitar qualquer coisa nesse idioma. No entanto, acho que a maneira mais fácil é simplesmente reduzir de outro idioma
fonte
Como mencionei no meu comentário acima, acho útil pensar no espaço da solução do problema.
Pense em algo comoSAT . Sabemos que é decidível, pois para testá-lo, há um número finito de soluções que precisamos tentar. Se houver algum conjunto finito de condições a serem verificadas, em que uma dessas opções garante sim e nenhuma delas garante um não, então o problema é decidível, pois apenas verificamos as condições em sucessão. Observe que esse conjunto de condições pode ser muito grande (como no caso de problemas NP-complete).
Considere agora quando o espaço da solução é infinitamente contável, e podemos gerar cada solução possível em sequência, e testar cada solução é decidível. Nesse caso, sabemos que o problema é reconhecível. Por exemplo, um problema ao perguntar "existe um número natural tal que ..." é reconhecível, porque podemos começar em 0 e continuar tentando todos os números em sequência. Se houver uma solução, estamos garantidos em encontrá-la, mas não há necessariamente um limite no tempo que levará para encontrá-la. Além disso, esse algoritmo nunca seria interrompido se esse número inteiro não existisse, portanto, não prova que um problema seja decidível.
Você pode aplicar a mesma técnica ao conjunto de todas as strings, todos os números inteiros, todos os gráficos ou qualquer estrutura finita que possamos enumerar. Isso não funcionaria para encontrar um número real ou um conjunto (possivelmente infinito) de cadeias.
Observe, no entanto, que alguns problemas podem ter espaços de solução infinitos e ainda podem ser decididos.
fonte
O truque para ver se uma linguagem é indecidível é fazer a si mesmo a pergunta "posso codificar um cálculo da máquina de Turing usando essa linguagem"? Ou, de maneira mais geral, "fica tão complicado quanto o que acontece em uma computação?". É claro que algumas vezes essa codificação é difícil e ajuda a conhecer uma lista de problemas indecidíveis a serem reduzidos (como o problema de pós-correspondência). Se você não encontrar essa redução, tente pensar em algoritmos para decidir seu idioma. Por exemplo, o idioma das listas de números inteiros em ordens crescentes não é finito, mas é fácil projetar um algoritmo testando se uma lista é classificada em ordem crescente, portanto esse idioma é decidível. E para muitos idiomas, não sabemos sobre a sua decidibilidade, portanto, essa é uma pergunta difícil.
fonte