Existe um subconjunto de programas que evita o problema de parada

21

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)

daven11
fonte
13
"sequências infinitas ... demoram muito". Me fez rir alto.
Bryan Oakley
3
Acredito que SQL92 e expressões regulares são exemplos de linguagens que são garantidas para parar.
Elian Ebbing
2
Por favor, poste "Update2 ..." como resposta.
21411 S.Lott
2
Você não precisa excluir a recursão. Se você limitar a recursão a sub-termos estritos dos argumentos de chamada, sempre poderá provar o término. É um requisito suficiente - não são necessários "loops limitados" e similares, desde que você use os números da Igreja.
SK-logic
1
O idioma que Idris usa digitação dependente e um verificador de provas para provar que seus programas terminam antes de executá-los. É semelhante a Haskell e permite recursão, mas não recursão geral - apenas recursão que pode provar (através dos tipos dependentes) leva a algum estado terminal.
21414 Jack

Respostas:

8

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).

AProgrammer
fonte
10

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.

Eric Lippert
fonte
2
Pode-se ter a declaração if se o salto sempre tiver que ser para a frente, nunca para trás. Estou pensando em um subconjunto restrito da linguagem BASIC, em que "GOTO X" significa ir para o número da linha currentLine + X e X deve ser maior que 0. Se a linha for inválida, pare. Isso aumentaria as demandas de armazenamento, mas permitiria uma lógica não trivial. Provavelmente, isso é equivalente a uma máquina de estados finitos, na qual os vértices formam um gráfico e esse gráfico pode não ter ciclos, ou o FSM é inválido. Além disso, qualquer estado que seja um beco sem saída deve ser um estado de aceitação.
Job
3
poderia ter laços delimitados - para i = 1 a 10 por exemplo, da mesma forma iteradores bem comportados. Portanto, existe uma classe de problemas finitos que podem ser resolvidos - o teorema de fermats está novamente envolvido na sequência infinita de reais. Mas se restringirmos o domínio a números menores que 1 000 000, ele será interrompido.
David11
2
Por que não condições? Parece que as condições sem saltos sempre podem ser mostradas para ...
Billy ONeal
2
@nikie: Claro que é um argumento fraco. O ponto é que um detector de parada seria capaz de provar ou refutar tais afirmações sem necessariamente encontrar a prova . A intuição que pretendo que o leitor desenvolva aqui é que uma linguagem para a qual um detector de parada trivial poderia ser escrito é uma linguagem que não pode representar nem mesmo problemas simples na teoria dos números, como o último teorema de Fermat ou a conjectura de Goldbach, e, portanto, provavelmente não é uma linguagem muito útil.
precisa
3
@EricLippert: Errado. Essa linguagem terá loops, armazenamento adequado e muitas outras coisas úteis. É possível codificar quase tudo nele. Eis aqui: coq.inria.fr
SK-logic
6

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 whileloop (ou qualquer uma de suas muitas manifestações possíveis).

zvrba
fonte
Desculpe, eu não entendi direito. Eu apaguei meu comentário, mas vou reafirmar a recomendação do GEB.
AProgramador #
@zvrba Isso tem sido na minha lista de leitura por algum tempo - provavelmente hora de mergulhar no.
daven11
5

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.

user281377
fonte
3

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.

Alex ten Brink
fonte
2
-1, isso está errado em muitos níveis ... #
312877 dec28
1
Primeiro, os computadores do mundo real não podem computar nada que uma máquina de Turing não pode. Até agora, ninguém mostrou um computador do mundo real mais capaz (em termos de computabilidade) do que uma máquina de Turing. Segundo, se um programa repetir seu estado, ele não será interrompido, portanto o problema de interrupção será resolvido para esse programa e entrada. Lembre-se: O problema da parada é decidir se um programa será interrompido ou não com a entrada fornecida. Um loop infinito está ok quando você o detecta positivamente. Finalmente: existe um grande conjunto de programas úteis para os quais o problema de parada é solucionável: aqueles que operam em armazenamento limitado.
user281377
Quanto à sua primeira edição: como observado no artigo, mostrar que algum modelo de computação é Turing completo não preserva quantos programas exatamente são interrompidos; portanto, o resultado que eles provam não significa imediatamente nada para outros modelos de computação. Conheço bem a integridade de Turing e não sei por que isso faz com que minha resposta seja "errada".
Alex ten Brink
Quanto à sua segunda questão: os estados dos quais estou falando não são os mesmos que o 'estado de uma máquina' sobre o qual geralmente se fala (que envolve o estado de tudo o que pode ter estado), mas o estado, o autômato de estado finito usado para controlar a máquina de Turing, que corresponde aproximadamente à linha de código em que um programa está trabalhando a qualquer momento durante a execução. Ao repetir uma linha de código, o conteúdo da sua memória pode ser diferente; portanto, isso não implica em interrupção imediata. Vou atualizar minha resposta para deixar isso mais claro.
Alex ten Brink
@ammoQ: Não, o problema da parada não é solucionável se você estiver falando de sistemas do mundo real com armazenamento limitado, pois isso significaria criar um sistema do mundo real que possa lidar com combinações de estados. Como o número possível de estados de registro na maioria das CPUs excede o número de átomos no Universo, você não poderá fazer isso.
precisa
3

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.

Terrence Kwasha
fonte
1

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

daven11
fonte
0

existe um subconjunto de programas que pode ser determinado se parar?

Sim.

É bom o suficiente para a maioria dos programas?

Defina "a maioria".

Posso criar um conjunto de construções de linguagem que possam determinar a 'suspensão' de um programa?

Sim.

existe algo quase completo que seja bom o suficiente?

Defina "quase".

Muitas pessoas escrevem Python sem usar whiledeclaração ou recursão.

Muitas pessoas escrevem Java usando apenas a forinstrução com iteradores ou contadores simples que podem ser provados trivialmente como terminando; e eles escrevem sem recursão.

É muito fácil evitar whilee recursão.


Para um determinado programa no qual todas as entradas são limitadas, você pode determinar se o programa é interrompido?

Não.

Em caso afirmativo, quais são as restrições do idioma e quais são os limites do conjunto de entradas.

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.

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?

Sim. É chamado "Teoria de Grupos". Um conjunto de valores fechado em um conjunto de operações. Coisas muito bem compreendidas.

S.Lott
fonte
"quase" é o que estou perguntando. Existe uma classe finita de problemas para os quais se pode dizer que um programa é interrompido e quão limitado é o conjunto de problemas? Por exemplo, a declaração if (i <10) então print (i) pára para todos i. Se eu restringir o domínio de inteiros de 32 bits, ele também será interrompido.
precisa
Lembre-se de que um forloop é um loop while, e as pessoas geralmente colocam coisas mais complicadas no termo de condição do que apenas x < 42.
Billy ONeal
@BillyONeal: Bom ponto. No Python, um forloop é muito, muito restrito para trabalhar com um iterador. Um forloop mais geral em Java, no entanto, pode incluir condições extras que invalidam o uso simples de um iterador.
S.Lott
"Existe uma classe finita de problemas para os quais se pode dizer que um programa é interrompido?" A resposta permanece sim. "Quão limitado é o problema definido?" Hum. Finito é finito. Se você desistir de tentar aproximar números reais e se ater a números naturais, fechados em todas as operações matemáticas, estará fazendo uma teoria de grupo comum. Aritmética modular. Nada especial. Não está claro o que você está perguntando. Você está perguntando o que é aritmética modular?
S.Lott
@ S.Lott Quero dizer números como representados em uma máquina, não números no sentido abstrato. Então, pense nos números como um número fixo de bits. Esses números têm regras ligeiramente diferentes dos números inteiros e dos reais. Espero que isso faça sentido.
precisa