Tenemos la lógica de Hoare. ¿Por qué todavía es posible que un algoritmo sea correcto pero no hay pruebas de que sea correcto? Supongamos que el algoritmo se expresa en C. Luego, podemos argumentar paso a paso que está haciendo lo que se supone que debe hacer.
Entonces mi pregunta es:
Dame un ejemplo de un algoritmo correcto pero que no tenga una prueba de corrección.
EDITAR: Creo que un poco de información puede ayudar a aclarar a dónde voy. Déjame citar a Scott Aaronson:
Desde la década de 1970, se especula que P NP podría ser independiente (es decir, ni demostrable ni refutable) de los sistemas de axiomas estándar para las matemáticas, como la teoría de conjuntos de Zermelo-Fraenkel. Para ser claros, esto significaría que
no existe un algoritmo de tiempo polinómico para problemas de NP completo, pero nunca podemos probarlo (al menos no en nuestros sistemas formales habituales), o de lo contrario
un algoritmo de tiempo polinómico para problemas NP-completos hace existir, pero tampoco nunca puede probar que funciona, o que nunca se puede demostrar que se detiene en tiempo polinómico.
Me refiero a la segunda posibilidad. Dado que Aaronson puede enumerarlo tan confiadamente como una posibilidad, creo que debe haber un ejemplo existente del tipo 2. Es por eso que estoy haciendo esta pregunta. Pero parece que no se ve una respuesta rápida y clara.
fuente
Respuestas:
Aquí hay un algoritmo para la función de identidad:
La mayoría de las personas sospechan que este algoritmo calcula la función de identidad, pero no lo sabemos, y no podemos probarlo en el marco comúnmente aceptado para las matemáticas, ZFC .
fuente
La mayoría de los algoritmos no han demostrado ser correctos en la lógica de Hoare. La razón principal es que tales pruebas de corrección son extremadamente caras a partir de enero de 2017, probablemente en varios órdenes de magnitud en comparación con la 'mera' programación. Hay mucho trabajo en curso para reducir este costo mediante la automatización, pero es una lucha cuesta arriba.
Otra razón por la cual un algoritmo podría no tener una prueba de corrección, y una que es más relevante en la práctica que los fenómenos de incompletitud que mencionaron Yuval y Chi, es que podríamos no saber cuál es esta especificación. Este problema tiene dos dimensiones.
Los clientes no saben lo que quieren. Este es un problema bien conocido en ingeniería de software, y los ingenieros de software han desarrollado muchos enfoques para lidiar con esto.
La especificación es difícil. Un buen ejemplo es la corrección de los algoritmos criptográficos. Recientemente, Micali & Goldwasser ganó los premios Turing por especificar qué significa seguridad criptográfica. Sin embargo, tenga en cuenta que esa definición es (hasta donde yo sé) para "criptografía teórica" donde tiene un parámetro de seguridadn que van más allá de los números naturales, y los adversarios son máquinas de Turing probabilísticas de tiempo polinomial. A mi leal saber y entender (corríjame si me equivoco), existe un desajuste entre la teoría y la práctica, y los algoritmos concretos como AES y SHA256 no están dentro del alcance de esas especificaciones teóricas. No creo que haya una especificación completa para tales algoritmos, por lo tanto, no podemos, en principio, verificarlos en el sentido de, por ejemplo, la lógica de Hoare.
fuente
Esto está ligado a lo incompleto de la lógica subyacente. De hecho, la lógica de Hoare generalmente contiene una regla P debilitada o "pre-post" donde las implicacionesP
fuente
Problema: Escriba "Sí" si cada número par ≥ 4 es la suma de dos primos, y "No" si hay un número par ≥ 4 que no es la suma de dos primos.
Algoritmo: Imprimir "Sí"
La mayoría de la gente piensa que el algoritmo es correcto. No hay ninguna prueba conocida, y es muy posible que no es ninguna prueba.
fuente
Cualquier algoritmo que sea correcto pero no sabemos cuánto tiempo tarda en ejecutarse puede transformarse en un algoritmo que se detiene en un período de tiempo garantizado, pero no estamos seguros de si es correcto.
Por ejemplo, para encontrar un primo mayor quenorte , comienza a contar desde n + 1 probando si cada número es primo hasta que encuentre uno. Ahora modifíquelo para darse por vencido y regresar0 0 si no podemos encontrar una prima después Iniciar sesión( n )2 intentos. Si el algoritmo modificado alguna vez regresa0 0 , es incorrecto, pero nadie sabe si eso sucede o no. Incluso con tantos comonorte--√ siempre se encontrarán pasos que no podamos probar como primos.
Entonces, tenemos un algoritmo que es correcto pero no tenemos pruebas de que se ejecute en tiempo polinómico, y un algoritmo (el mismo, pero limitado en el tiempo) que se ejecuta en tiempo polinómico pero no tenemos pruebas de que sea correcto. Y como con elPAG= NPAG problema, para este ejemplo también es plausible que no existan tales pruebas.
fuente