Eu estava lendo outra explicação do problema da parada, e isso me fez pensar em todos os problemas que vi que são dados como exemplos e envolvem sequências infinitas. Mas nunca uso sequências infinitas nos meus programas - elas demoram muito. Todas as aplicações do mundo real têm limites inferior e superior. Mesmo reais não são reais - são aproximações armazenadas como 32/64 bits etc.
Portanto, a questão é: existe um subconjunto de programas que pode ser determinado se eles forem interrompidos? É bom o suficiente para a maioria dos programas. Posso criar um conjunto de construções de linguagem que possam determinar a 'suspensão' de um programa. Tenho certeza de que isso já foi estudado em algum lugar antes, para que qualquer ponteiro seja apreciado. O idioma não estaria completo, mas existe algo quase completo que é bom o suficiente?
Naturalmente, esse construto precisaria excluir a recursão e os loops ilimitados, mas eu posso escrever um programa sem esses facilmente.
A leitura da entrada padrão como exemplo teria que ser limitada, mas isso é fácil - vou limitar minha entrada a 10.000.000 caracteres, etc, dependendo do domínio do problema.
tia
[Atualizar]
Depois de ler os comentários e as respostas, talvez eu deva reafirmar minha pergunta.
Para um determinado programa no qual todas as entradas são limitadas, é possível determinar se o programa é interrompido. Em caso afirmativo, quais são as restrições do idioma e quais são os limites do conjunto de entradas. O conjunto máximo dessas construções determinaria uma linguagem que pode ser deduzida para parar ou não. Existe algum estudo que foi feito sobre isso?
[Atualização 2]
aqui está a resposta: sim, em 1967, em http://www.isp.uni-luebeck.de/kps07/files/papers/kirner.pdf
O fato de que o problema da parada pode ser resolvido pelo menos teoricamente para sistemas de estados finitos já foi discutido por Minsky em 1967 [4]: “... qualquer máquina de estados finitos, se deixada completamente sozinha, cairá eventualmente em um período perfeitamente periódico. padrão repetitivo. A duração desse padrão de repetição não pode exceder o número de estados internos da máquina ... ”
(e, portanto, se você se apegar a máquinas de torção finitas, poderá construir um oráculo)
fonte
Respostas:
O problema não está na entrada (obviamente, com entrada ilimitada, você pode ter um tempo de execução ilimitado apenas para ler a entrada), mas no número de estados internos.
Quando o número de estado interno é limitado, teoricamente, você pode resolver o problema de parada em todos os casos (apenas imite-o até atingir a parada ou a repetição de um estado); quando não estiver, há casos em que não é solucionável . Mas, mesmo que o número de estados internos seja, na prática, limitado, também é tão grande que os métodos que dependem do limite do número de estados internos são inúteis para provar o término de qualquer um dos programas mais triviais.
Existem maneiras mais práticas de verificar o encerramento dos programas. Por exemplo, expresse-os em uma linguagem de programação que não recursione nem salte, e cujas estruturas de loop tenham um limite para o número de iterações que devem ser especificadas na entrada do loop. (Observe que o limite não deve estar realmente relacionado ao número efetivo de iterações, uma maneira padrão de provar o término de um loop é ter uma função que você prova estar diminuindo estritamente de uma iteração para outra e sua condição de entrada garantir que seja positivo, você pode colocar a primeira avaliação como seu limite).
fonte
Primeiro, considere o que aconteceria se tivéssemos um detector de parada. Sabemos pelo argumento diagonal que existe pelo menos um programa que faria com que um detector de parada nunca parasse ou desse uma resposta errada. Mas esse é um programa bizarro e improvável.
Há outro argumento, porém, de que um detector de parada é impossível, e esse é o argumento mais intuitivo de que um detector de parada seria mágico. Suponha que você queira saber se o Último Teorema de Fermat é verdadeiro ou falso. Você acabou de escrever um programa que pára se for verdadeiro e executa para sempre se for falso e, em seguida, executa o detector de parada nele. Você não executa o programa , apenas executa o detector de parada no programa . Um detector de parada nos permitiria resolver imediatamente um grande número de problemas abertos na teoria dos números apenas escrevendo programas.
Então, você pode escrever uma linguagem de programação que garanta a produção de programas cuja interrupção pode ser sempre determinada? Certo. Ele simplesmente não pode ter loops, condições e usar muito armazenamento arbitrariamente. Se você deseja viver sem loops, sem instruções "se" ou com uma quantidade estritamente restrita de armazenamento, pode escrever um idioma cuja interrupção é sempre determinável.
fonte
Eu recomendo que você leia Gödel, Escher, Bach . É um livro muito divertido e esclarecedor que, entre outras coisas, aborda o teorema da incompletude de Gödel e o problema da parada.
Para responder sua pergunta em poucas palavras: o problema da parada é decidível desde que o seu programa não contenha um
while
loop (ou qualquer uma de suas muitas manifestações possíveis).fonte
Para todo programa que trabalha com uma quantidade limitada de memória (incluindo todo tipo de armazenamento), o problema de parada pode ser resolvido; isto é, um programa indecidível deve consumir mais e mais memória em execução.
Mas, mesmo assim, esse insight não significa que possa ser usado para problemas do mundo real, pois um programa de interrupção, trabalhando com apenas alguns kilobytes de memória, pode facilmente levar mais tempo do que a vida útil restante do universo para ser interrompido.
fonte
Para (parcialmente) responder à sua pergunta "Existe um subconjunto de programas que evita o problema de parada": sim, de fato existe. No entanto, esse subconjunto é incrivelmente inútil (observe que o subconjunto de que estou falando é um subconjunto estrito dos programas que são interrompidos).
O estudo da complexidade dos problemas para a maioria das entradas é chamado de complexidade de casos genéricos . Você define algum subconjunto das entradas possíveis, prova que esse subconjunto cobre 'a maioria das entradas' e fornece um algoritmo que resolve o problema desse subconjunto.
Por exemplo, o problema da parada é solucionável em tempo polinomial para a maioria das entradas (de fato, em tempo linear, se eu entender o papel corretamente).
No entanto, esse resultado é inútil por causa de três notas laterais: em primeiro lugar, falamos sobre máquinas de Turing com uma única fita, em vez de programas de computador do mundo real em computadores do mundo real. Até onde eu sei, ninguém sabe se o mesmo vale para computadores do mundo real (embora os computadores do mundo real possam calcular as mesmas funções das máquinas de Turing, o número de programas permitidos, seus comprimentos e se eles podem ser interrompidos). completamente diferente).
Em segundo lugar, você deve observar o que significa 'mais entradas'. Isso significa que a probabilidade de que um programa aleatório de 'comprimento' n possa ser verificado por esse algoritmo tende a 1, pois n tende ao infinito. Em outras palavras, se n for grande o suficiente, então um programa aleatório de comprimento n pode quase certamente ser verificado por esse algoritmo.
Quais programas podem ser verificados pela abordagem descrita no artigo? Essencialmente, todos os programas que são interrompidos antes de repetir um estado (onde 'state' corresponde aproximadamente a uma linha de código em um programa).
Embora quase todos os programas possam ser verificados dessa maneira, nenhum dos programas que podem ser verificados dessa maneira é muito interessante e geralmente não será projetado por seres humanos, portanto, isso não tem nenhum valor prático.
Também indica que a complexidade de casos genéricos provavelmente não poderá nos ajudar com o problema de interrupção, pois quase todos os programas interessantes são (aparentemente) difíceis de verificar. Ou, em alternativa: quase todos os programas são desinteressantes, mas fáceis de verificar.
fonte
Existem e, de fato, existem programas na vida real que resolvem o problema de parada para outros problemas o tempo todo. Eles fazem parte do sistema operacional em que você está executando o computador. Indecidibilidade é uma afirmação estranha que apenas diz que não existe um programa que funcione para TODOS os outros programas.
Uma pessoa afirmou corretamente que a prova de interrupção parece ser o único programa para o qual não pode ser resolvida, pois se traça infinitamente como um espelho. Essa mesma pessoa também afirmou que, se houvesse uma máquina de parada, seria mágico porque nos contaria problemas matemáticos difíceis, informando com antecedência se o algoritmo do solucionador seria interrompido.
A suposição em ambos os casos é que a máquina de parar não rastreia porque não há provas de que ela rastreia. No entanto, na realidade, ele realmente rastreia / executa o programa em que é executado com a entrada fornecida.
A prova lógica, pelo menos, é simples. Se não precisasse rastrear pelo menos a primeira etapa, não precisaria da entrada junto com o programa em que é executado. Para fazer uso das informações, é necessário pelo menos rastrear a primeira etapa antes de tentar analisar para onde está indo esse caminho.
Os problemas matemáticos difíceis mencionados na resposta superior são aqueles em que você não pode avançar rapidamente para descobrir a resposta, o que significa que o problema de parada teria que continuar rastreando até que algum padrão fosse reconhecível.
Portanto, o único argumento prático a ser obtido com o problema de parada é que uma máquina de parada não pode determinar o resultado de um solucionador de problemas otimizado mais rapidamente do que o solucionador de problemas pode terminar.
Dar uma prova formal para esse raciocínio é mais difícil, e, embora eu acredite que poderia, tentar explicá-lo a alguém da academia resultará em um macaco como birra e balançando no candelabro. É melhor não discutir com essas pessoas.
fonte
aqui está a resposta: sim, em 1967, em http://www.isp.uni-luebeck.de/kps07/files/papers/kirner.pdf
O fato de que o problema da parada pode ser resolvido pelo menos teoricamente para sistemas de estados finitos já foi discutido por Minsky em 1967 [4]: “... qualquer máquina de estados finitos, se deixada completamente sozinha, cairá eventualmente em um período perfeitamente periódico. padrão repetitivo. A duração desse padrão de repetição não pode exceder o número de estados internos da máquina ... ”
(e, portanto, se você se apegar a máquinas de torção finitas, poderá construir um oráculo)
Claro quanto tempo isso leva é outra questão
fonte
Sim.
Defina "a maioria".
Sim.
Defina "quase".
Muitas pessoas escrevem Python sem usar
while
declaração ou recursão.Muitas pessoas escrevem Java usando apenas a
for
instrução com iteradores ou contadores simples que podem ser provados trivialmente como terminando; e eles escrevem sem recursão.É muito fácil evitar
while
e recursão.Não.
Hum. O problema da parada significa que o programa nunca pode determinar coisas sobre programas tão complexos quanto ele. Você pode adicionar qualquer um de um grande número de restrições para superar o problema de parada.
A abordagem padrão para o problema da parada é permitir provas usando um conjunto de formulários matemáticos um pouco mais "ricos" do que os disponíveis na linguagem de programação.
É mais fácil estender o sistema de provas do que restringir o idioma. Qualquer restrição leva a argumentos para o algoritmo que é difícil de expressar por causa da restrição.
Sim. É chamado "Teoria de Grupos". Um conjunto de valores fechado em um conjunto de operações. Coisas muito bem compreendidas.
fonte
for
loop é um loop while, e as pessoas geralmente colocam coisas mais complicadas no termo de condição do que apenasx < 42
.for
loop é muito, muito restrito para trabalhar com um iterador. Umfor
loop mais geral em Java, no entanto, pode incluir condições extras que invalidam o uso simples de um iterador.