Como você verifica se dois algoritmos (por exemplo, classificação de mesclagem e classificação Naïve) retornam o mesmo resultado para qualquer entrada, quando o conjunto de todas as entradas é infinito?
Atualização: Obrigado Ben por descrever como isso é impossível de ser feito algoritmicamente no caso geral. A resposta de Dave é um ótimo resumo de métodos algorítmicos e manuais (sujeitos à inteligência e metáfora humanas) que nem sempre funcionam, mas são bastante eficazes.
computability
formal-methods
software-engineering
software-verification
Andres Riofrio
fonte
fonte
Respostas:
Em contraste com o que dizem os negativistas, existem muitas técnicas eficazes para fazer isso.
A bisimulação é uma abordagem. Veja, por exemplo, o artigo de Gordon sobre Coindução e Programação Funcional .
Outra abordagem é usar teorias operacionais de equivalência de programas, como o trabalho de Pitts .
Uma terceira abordagem é verificar se os dois programas atendem à mesma especificação funcional. Existem milhares de artigos sobre essa abordagem.
Uma quarta abordagem é mostrar que um programa pode ser reescrito no outro usando transformações de programas de som .
Obviamente, nenhum desses métodos está completo devido à indecidibilidade, mas volumes e volumes de trabalho foram produzidos para solucionar o problema.
fonte
Para elaborar um pouco as declarações "é impossível", aqui está um esboço de prova simples.
Podemos modelar algoritmos com saída da Turing Machines que param com sua saída em sua fita. Se você deseja ter máquinas que podem parar, aceitando com saída na fita ou rejeitando (nesse caso, não há saída), você pode facilmente criar uma codificação que permita modelar essas máquinas com a opção "parar ou parar", não há máquinas "rejeitadas".
Agora, suponha que eu tenha um algoritmo P para determinar se duas dessas TMs têm a mesma saída para cada entrada. Então, dado uma TM A e uma entrada X , posso construir uma nova TM B que opera da seguinte maneira:
Agora eu posso correr P em A e B . B não para em X , mas tem a mesma saída que A para todas as outras entradas, portanto, se e somente se A não para em X , esses dois algoritmos têm a mesma saída para cada entrada. Mas P foi assumida para ser capaz de dizer se dois algoritmos têm a mesma saída para cada entrada, de modo que se tivéssemos P poderíamos dizer se uma máquina pára arbitrárias sobre uma entrada arbitrária, que é o Deter problema. Como o problema da parada é conhecido como indecidível, P não pode existir.
Isso significa que não há uma abordagem geral (computável) para determinar se dois algoritmos têm a mesma saída que sempre funciona; portanto, você deve aplicar um raciocínio específico ao par de algoritmos que você está analisando. No entanto, na prática, pode haver abordagens computáveis que funcionem para grandes classes de algoritmos, e certamente existem técnicas que você pode usar para tentar elaborar uma prova para qualquer caso específico. A resposta de Dave Clarke fornece algumas coisas relevantes para você analisar aqui. O resultado da "impossibilidade" se aplica apenas à criação de um método genérico que resolva o problema de uma vez por todas, para todos os pares de algoritmos.
fonte
É impossível em geral, mas muitas restrições podem tornar isso possível. Por exemplo, você pode verificar a equivalência de dois programas de código linear usando BDDs. A execução simbólica pode lidar com muitos outros casos.
fonte
É impossível conceber um algoritmo que prove essa igualdade em geral. Dica: redução do problema de parada.
fonte