Creo que la respuesta a la primera pregunta es que, en general, es demasiado trabajo con las herramientas actuales. Para tener la sensación, sugiero intentar probar la corrección de Bubble Sort en Coq (o si prefieres un poco más de desafío, usa Quick Sort). No creo que sea razonable esperar que los programadores escriban programas verificados siempre y cuando demostrar que la corrección de estos algoritmos básicos es tan difícil y requiere mucho tiempo.
Esta pregunta es similar a preguntar por qué los matemáticos no escriben pruebas formales verificables por verificadores de pruebas. Escribir un programa con una prueba formal de corrección significa probar un teorema matemático sobre el código escrito, y la respuesta a esa pregunta también se aplica a su pregunta.
Esto no significa que no haya habido casos exitosos de programas verificados. Sé que hay grupos que están demostrando la corrección de sistemas como el hipervisor de Microsoft . Un caso relacionado es el compilador C verificado de Microsoft . Pero, en general, las herramientas actuales necesitan mucho desarrollo (incluidos sus aspectos SE y HCI) antes de ser útiles para programadores generales (y matemáticos).
Con respecto al párrafo final de la respuesta de Neel sobre el crecimiento del tamaño del programa para idiomas con funciones totales, en realidad es fácil probar aún más (si lo entendí correctamente). Es razonable esperar que la sintaxis de cualquier lenguaje de programación sea ce y el conjunto de funciones computables totales no sea ce, por lo que para cualquier lenguaje de programación donde todos los programas sean totales, existe una función computable total que ningún programa puede calcular ( de cualquier tamaño) en ese idioma.
Para la segunda pregunta, respondí una pregunta similar en el blog de Scott hace algún tiempo. Básicamente, si la clase de complejidad tiene una buena caracterización y es computablemente representable (es decir, es ce), entonces podemos demostrar que alguna representación de los problemas en la clase de complejidad es demostrablemente total en teorías muy débiles correspondientes a la clase de complejidad. La idea básica es que las funciones probables totales de la teoría contienen todas las funciones y un problema que es A C 0A C0 0A C0 0-completo para la clase de complejidad, por lo tanto, contiene todos los problemas en la clase de complejidad y puede probar la totalidad de esos programas. La relación entre las pruebas y la teoría de la complejidad se estudia en la prueba de la complejidad, vea el reciente libro de SA Cook y P. Nguyen " Fundamentos lógicos de la complejidad de la prueba " si está interesado. (Un borrador de 2008 está disponible.) Entonces, la respuesta básica es que para muchas clases "Probablemente C = C".
Esto no es cierto en general, ya que hay clases de complejidad semántica que no tienen caracterización sintáctica, por ejemplo, funciones computables totales. Si por recursivo te refieres a funciones recursivas totales, entonces las dos no son iguales, y el conjunto de funciones computables que son demostrablemente totales en una teoría está bien estudiado en la literatura de teoría de pruebas y se llaman funciones demostrablemente totales de la teoría. Por ejemplo: las funciones probables totales de son funciones recursivas ϵ 0 (o funciones equivalentes en el sistema T de Godel ), las funciones probables totales de P A 2 son funciones en el sistema F de Girard , las funciones probables totales dePAGSUNAϵ0 0TPAGSUNA2F son funciones recursivas primitivas, ....yoΣ1
Pero no me parece que esto signifique mucho en el contexto de verificación de programas, ya que también hay programas que calculan extensivamente la misma función pero no podemos probar que los dos programas calculan la misma función, es decir, los programas son extensionalmente iguales pero no intencionalmente. (Esto es similar al Morning Star y al Evening Star). Además, es fácil modificar un programa comprobablemente total dado para obtener uno que la teoría no puede probar su totalidad.
Creo que las dos preguntas están relacionadas. El objetivo es obtener un programa verificado. Un programa verificado significa que el programa satisface una descripción, que es una declaración matemática. Una forma es escribir un programa en un lenguaje de programación y luego probar sus propiedades como si satisface la descripción, que es la práctica más común. Otra opción es intentar probar el enunciado matemático que describe el problema utilizando medios restringidos y luego extraer un programa verificado de él. Por ejemplo, si demostramos en la teoría correspondiente a que para cualquier número dado n hay una secuencia de números primos cuyo producto es igual a n , entonces podemos extraer un PPAGSnortenortePAGSalgoritmo de factorización a partir de la prueba. (También hay investigadores que intentan automatizar el primer enfoque tanto como sea posible, pero verificar las propiedades interesantes no triviales de los programas es computacionalmente difícil y no puede verificarse completamente sin falsos positivos y negativos).