¿Cómo se verifica si dos algoritmos (por ejemplo, ordenar por combinación y ordenar por ingenuo) devuelven el mismo resultado para cualquier entrada, cuando el conjunto de todas las entradas es infinito?
Actualización: Gracias Ben por describir cómo esto es imposible de hacer algorítmicamente en el caso general. La respuesta de Dave es un gran resumen de métodos algorítmicos y manuales (sujetos a ingenio y metáfora humana) que no siempre funcionan, pero son bastante efectivos.
computability
formal-methods
software-engineering
software-verification
Andres Riofrio
fuente
fuente
Respuestas:
En contraste con lo que dicen los que no dicen, hay muchas técnicas efectivas para hacer esto.
La bisimulación es un enfoque. Véase, por ejemplo, el artículo de Gordon sobre Coinducción y Programación Funcional .
Otro enfoque es utilizar teorías operacionales de equivalencia de programas, como el trabajo de Pitts .
Un tercer enfoque es verificar que ambos programas satisfagan la misma especificación funcional. Hay miles de documentos sobre este enfoque.
Un cuarto enfoque es mostrar que un programa puede reescribirse en el otro mediante transformaciones de programas de sonido .
Por supuesto, ninguno de estos métodos está completo debido a la indecidibilidad, pero se han producido volúmenes y volúmenes de trabajo para abordar el problema.
fuente
Para elaborar un poco sobre las declaraciones de "es imposible", aquí hay un bosquejo de prueba simple.
Podemos modelar algoritmos con salida por Turing Machines que se detienen con su salida en su cinta. Si desea tener máquinas que puedan detenerse, ya sea aceptando con salida en su cinta o rechazando (en cuyo caso no hay salida), puede encontrar fácilmente una codificación que le permita modelar estas máquinas con el "alto o alto no". no hay máquinas de rechazo ".
Ahora, suponga que tengo un algoritmo P para determinar si dos de estas TM tienen la misma salida para cada entrada. Luego, dada una TM A y una entrada X , puedo construir una nueva TM B que funcione de la siguiente manera:
Ahora puedo correr P en A y B . B no se detiene en X , pero tiene la misma salida que A para todas las demás entradas, por lo que si y solo si A no se detiene en X , estos dos algoritmos tienen la misma salida para cada entrada. Pero se suponía que P podía determinar si dos algoritmos tienen la misma salida para cada entrada, por lo que si tuviéramos P podríamos saber si una máquina arbitraria se detiene en una entrada arbitraria, que es el problema de detención. Como se sabe que el problema de detención es indecidible, P no puede existir.
Esto significa que no existe un enfoque general (computable) para determinar si dos algoritmos tienen el mismo resultado que siempre funciona, por lo que debe aplicar un razonamiento particular al par de algoritmos que está analizando. Sin embargo, en la práctica puede haber enfoques computables que funcionen para grandes clases de algoritmos, y ciertamente existen técnicas que puede usar para tratar de encontrar una prueba para un caso particular. La respuesta de Dave Clarke le da algunas cosas relevantes para ver aquí. El resultado de "imposibilidad" solo se aplica al diseño de un método genérico que resuelva el problema de una vez por todas, para todos los pares de algoritmos.
fuente
Es imposible en general, pero muchas limitaciones pueden hacerlo posible. Por ejemplo, puede verificar la equivalencia de dos programas de código de línea recta utilizando BDD. La ejecución simbólica puede manejar muchos otros casos.
fuente
Es imposible diseñar un algoritmo que pruebe esta igualdad en general. Sugerencia: reducción del problema de detención.
fuente