TR

Thiago Ramos17/11/2025 18:13
Compartilhe

Programas impossíveis de se construir

  • #Lógica de Programação

Já se perguntou por que o compilador não emite Warnings caso o seu código possa entrar em loop infinito? Já se perguntou também por que ninguém nunca fez um programa que prova um teorema matemático automaticamente?

Na verdade, essas duas perguntas estão relacionadas de alguma forma. A resposta para essas perguntas é que esses tipos de programas são impossíveis de se programar.

O problema de se verificar loops infinitos em programas tem um nome: problema da parada. Suponha que esse problema tenha solução, ou seja, existe um programa que verifica parada para o programa "P" e entrada "i".

bool Halt(string P, string i){
  //Código mágico que verifica se o programa representado 
  //pela string P para a entrada representada pela string i.
}

Utilizando esse trecho de código, vamos criar o seguinte programa:

bool Miracle(string P){
if Halt(P,P){
   while(true){}  
}else{
  return true
}
}

Executemos esse programa com entrada ele mesmo. O que vai acontecer? Se ele para com sua própria entrada ele irá executar o while e não irá parar. Mas caso ele não pare, ele irá retornar true e irá parar. Temos uma contradição. Portanto é impossível verificar parada de programas.

Quanto a provadores automáticos, suponha que eles existam. Com eles é possível especificar programas e pedir prova de parada. Assim, também é impossível que eles existam.

Esse resultado relacionado com loops infinitos é chamado de Indecibilidade do Problema da Parada e foi provado por Alan Turing em seu artigo " On computable numbers, with an application to the Entscheidungsproblem".

Existem outros programas impossíveis de se programar e em geral todos eles derivam do problema da parada.

Compartilhe
Comentários (1)
DIO Community
DIO Community - 18/11/2025 14:18

Excelente, Thiago! Que artigo cirúrgico, fascinante e essencial! Você tocou no ponto crucial da Teoria da Computação: o Problema da Parada é a barreira lógica e matemática que define os limites fundamentais do que os computadores podem ou não fazer.

É fascinante ver como você aborda o tema, mostrando que a indecibilidade de certos programas (como verificar loops infinitos) não é uma falha de software, mas uma impossibilidade teórica provada por Alan Turing em 1936.

Qual você diria que é o maior desafio para um desenvolvedor ao migrar um sistema de core banking para uma arquitetura cloud-native, em termos de segurança e de conformidade com as regulamentações, em vez de apenas focar em custos?