Aprendizaje de la prueba del teorema automatizado

44

Estoy aprendiendo la prueba de teorema automatizado / solucionadores SMT / asistentes de prueba por mi cuenta y publico una serie de preguntas sobre el proceso, comenzando aquí.

Tenga en cuenta que estos temas no se digieren fácilmente sin un fondo en lógicas (matemáticas). Si tiene problemas con los términos básicos, lea sobre ellos, por ejemplo, Logics in Computer Science de M. Huth y M. Ryan (en particular los capítulos uno, dos y cuatro) o Introducción a la lógica matemática y la teoría de tipos de P. Andrews
Para una breve introducción a la lógica de orden superior (HOL) ver aquí .

Miré a Coq y leí el primer capítulo de la introducción a Isabelle entre otros; Tipos de demostradores de teoremas automatizados

Conozco a Prolog desde hace algunas décadas y ahora estoy aprendiendo F #, por lo que ML, O'Caml y LISP son una ventaja. Haskell es una bestia diferente.

Tengo los siguientes libros

"Manual de razonamiento automatizado" editado por Alan Robinson y Andrei Vornkov

"Manual de lógica práctica y razonamiento automatizado" por John Harrison

"Reescritura de términos y todo eso" por Franz Baader y Tobias Nipkow

  1. ¿Cuáles son las diferencias entre Coq e Isabelle?

  2. ¿Debo aprender Isabelle o Coq, o ambos?

  3. ¿Hay alguna ventaja en aprender Isabelle o Coq primero?

Encuentra la siguiente pregunta de la serie aquí .

Guy Coder
fuente
77
Es importante tener en cuenta que las herramientas que menciona no son comprobadores automáticos sino asistentes de prueba (aunque pueden probar cosas fáciles por sí solos).
Raphael
@DaveClarke Duplicate?
Raphael
@Raphael: Sí (excepto que ahora mi respuesta contiene datos nuevos).
Dave Clarke
@DaveClarke ¿Crees que deberíamos cerrar este y fusionar los dos?
Raphael
@Raphael: Sí Acabo de copiar el texto de la respuesta aquí en mi respuesta para la otra pregunta.
Dave Clarke

Respuestas:

25

Prefiero Coq, pero imagino que otros prefieren a Isabelle. Una de las cosas extrañas que encontré sobre Isabelle es que hay una sintaxis de dos niveles, donde algunas de sus definiciones deben estar entre comillas dobles. No hay tales tonterías en Coq.

En última instancia, el que sea más adecuado para usted puede depender de lo que quiera probar. Ambos idiomas tienen mucho apoyo bibliotecario y comunidades activas que realizan todo tipo de teorías de desarrollo y ejemplos. Si un idioma proporciona el soporte adecuado de la biblioteca (u otro) para los tipos de teoría que desea desarrollar, entonces seleccionaría ese idioma.

Una estrategia es hacer un tutorial simple en ambos idiomas y seguir el que se sienta mejor. Por ejemplo,

Aquí hay una publicación de blog que compara brevemente los dos por alguien que finalmente prefiere a Isabelle.

Asegúrese de usar un IDE adecuado (como ProofGeneral ), en lugar de hacer cosas en la línea de comando.

Otra forma de ingresar a Coq es probar el libro en línea Software Foundations de Benjamin Pierce et al. Proporciona un excelente tutorial con muchos detalles proporcionados. El enfoque se centra principalmente en la semántica del lenguaje de programación, pero muchos de los conceptos básicos (y más allá) de Coq y la demostración de teoremas semiautomatizados se cubren en el camino.

Dave Clarke
fuente
44
¡ProofGeneral es increíble una vez que lo domesticas! Con respecto a la sintaxis de Isabelle: iirc, las cosas entre comillas dobles son las cosas de las que hablas, las fórmulas. Todo lo demás es control de prueba. Pensé que la distinción clara era agradable, pero las comillas dobles (y la consiguiente falta de resaltado de sintaxis dentro de las comillas) probablemente no sea la mejor manera de implementarla.
Rafael
44
Creamos un wiki de Isabelle / HOL el año pasado para un curso; tiene algunas buenas vistas generales difíciles de conseguir de lo contrario.
Raphael
18

Una cosa que creo que le resultará interesante es que el término "prueba de teorema" varía enormemente según el campo en el que se encuentre. Si bien son, en resumen, una prueba de teorema práctica algo relacionada (como el tipo ver elaborado en el Manual de razonamiento automatizado) tiene menos que ver con Coq o Isabelle de lo que piensas.

Cuando comencé a aprender sobre cuestiones relacionadas con la demostración de teoremas, el primer libro que leí (aunque ahora bastante anticuado) fue la excelente Prueba de lógica de primer orden y teorema automatizado de Melvin Fitting . Este libro fue realmente excelente y cubrió los tipos de temas que verás que se relacionan con las lógicas de orden inferior, donde realmente puedes obtener una buena cantidad de automatización. El tipo de lógica que aprendas debe estar dictado por lo que quieres razonar, y no tanto por demostrar el teorema por el simple hecho de hacerlo. Por ejemplo, mientras que la lógica de primer orden le brinda una buena cantidad de capacidad de expresividad y razonamiento, la mayoría de la comunidad de lenguajes de programación (donde terminé estos días) se ha alejado de la escuela más antigua de prueba de teoremas y verificación de modelos (que entra en el cubo de cosas que son más decidibles pero menos expresivas).

Sin embargo, no tome esto en el sentido de que cosas como el razonamiento de primer orden y la verificación de modelos no han sido extremadamente útiles en la práctica. ¡Ellos han estado! Puede ver a ACL2 como un ejemplo de un prover construido sobre la lógica de primer orden que ha tenido una increíble cantidad de éxito en el ámbito industrial. Junto con eso, también ha habido una increíble cantidad de desarrollo en la resolución de SMT. Los solucionadores SMT modernos están construidos sobre los solucionadores SAT muy potentes (principalmente a través de descubrimientos en los últimos veinte años para mejoras en DPLL), y han visto una gran cantidad de uso en cosas como la ejecución simbólica.

Sin embargo, como dije, aunque el bit más tradicional de "demostración de teoremas" es divertido, hay mucho más que aprender. Learning Coq, por ejemplo, tiene poco que ver con el aprendizaje de las herramientas de automatización que le brinda, y tiene mucho más que ver con el aprendizaje de la teoría de tipos en la que se basa (el cálculo predicativo de las construcciones coinductivas). Si no estás acostumbrado a la lógica constructiva, el curry howard isomorfismo o la teoría de tipos, te divertirás aprendiendo estas herramientas, pero difícilmente puedo pensar que estén demasiado relacionadas con las cosas que ves en el primer volumen del manual.

Así que decida qué quiere hacer: verifique los modelos y teoremas en la lógica de primer orden, o use una teoría de tipos poderosa para razonar sobre la corrección de sus programas (o teoremas en lógica constructiva). Si es el primero, aprenda sobre técnicas más basadas en deducción automática, si es el segundo, aprenda más sobre Coq, HOL, etc. Por cierto, si desea aprender Coq, aunque las referencias anteriores son buenas, creo que Hay dos referencias centrales para aprender Coq:

El libro de fundamentos de software de Benjamin Pierce (el Dr. Pierce es un excelente escritor, y le recomiendo que también vea su más popular "libro de ladrillos", si aún no lo ha hecho).

Programación certificada con tipos dependientes (Adam Chlipala también escribe bastante bien, aunque sus libros suponen un poco más de madurez e inteligencia que la introducción quizás más simple de Pierce).

Kristopher Micinski
fuente
15

Existe una variedad de sistemas para la Prueba interactiva de teoremas (ITP); consulte también la conferencia de ese nombre: Coq, Isabelle, HOL, ACL2, PVS, etc.

Todos ellos son relativamente difíciles de aprender, y cada uno tiene su propia cultura específica. Es como aprender un idioma extranjero: digamos que ya sabes inglés y luego puedes elegir entre francés, alemán, italiano, español y portugués. Todos están relacionados de alguna manera, esto no es chino, pero muy pocas personas manejan todo eso simultáneamente. Por lo tanto, debe intentar probar cada una de las culturas y comunidades, y luego comprometerse.

También puede haber la "característica asesina" que realmente necesita para su trabajo.

También ayuda tener expertos en uno de estos sistemas.

  • ¿Cuáles son las diferencias entre Coq e Isabelle?

Ambos son descendientes del sistema LCF de Stanford / Edimburgo / Cambridge. En 1985, G. Huet y L. Paulson estaban trabajando juntos en la última versión de Cambridge LCF. Luego, la división ocurrió hacia Coc / CIC / COQ (ahora Coq) en Francia, e Isabelle en Cambridge y Munich. Tenga en cuenta que HOL4, HOL-Light, HOL-XYZ son otros descendientes relacionados de LCF.

Hace más de 20 años, la distinción de Coq vs. Isabelle se habría hecho de acuerdo con fundamentos lógicos: lógica constructiva de tipo dependiente aquí, lógica clásica de tipo simple allí. Hoy en día, sorprendentemente hay poco impacto en eso en la práctica, ya que se han agregado más y más capas sobre cada sistema formal, incluidas las herramientas complementarias y las bibliotecas.

  • ¿Debo aprender Isabelle o Coq, o ambos?

Debes mirar a ambos, y tratar de sentir si te gusta más el vino y el queso, o las salchichas y salchichas. (Como uno de los muchachos detrás de Isabelle, pero actualmente en Francia, me sorprende la cantidad de franceses que realmente les gusta el chucrut cuando están en casa y nadie mira :-)

  • ¿Hay alguna ventaja en aprender Isabelle o Coq primero?

No lo creo. Puede existir el peligro de que te quedes atascado con el que intentas primero y no intentes con el segundo, o que te decepciones demasiado pronto con el primero y lo descartes demasiado pronto. En cualquier caso, necesitará tiempo y persistencia para ser productivo con cualquiera de los sistemas.

Como la Prueba general como "IDE" ya se mencionó: La Prueba general / Emacs solía ser la interfaz unificadora estándar para Coq e Isabelle durante muchos años, pero nunca la habría llamado IDE. También hay CoqIDE con "IDE" en su nombre, pero es un editor relativamente básico sobre widgets de Gtk. Isabelle actual incluye Isabelle / jEdit, que no tiene "IDE" en su nombre, pero está destinado a aproximar las cosas que ve habitualmente en Netbeans o IntelliJ IDEA --- para textos de prueba en lugar de código Java.

Makarius
fuente
10

Aquí hay algunos buenos tutoriales en video de Coq de Andrej Bauer. De ninguna manera está completo, pero creo que es una buena introducción.

Daniil
fuente
1
¡Excelente! Tenga en cuenta una oración central en "Una primera prueba con Coq": "Piense cómo lo haría en papel". El mejor consejo de todos.
Raphael
4

Esta introducción a Isabelle es bastante exhaustiva.

Vea también esta introducción a Isabelle

En general, Isabelle es relativamente fácil de comenzar, ya que hay muchos ejemplos disponibles. Por ejemplo, en el sitio web oficial

PD: de ninguna manera estoy afiliado a Isabelle, soy teórico en métodos formales, pero sé que Isabelle aparece a menudo como un punto de partida predeterminado.

Shaull
fuente
1
"Sé que Isabelle aparece a menudo como un punto de partida predeterminado". Preferiría decir que el HOL a menudo viene como un punto de partida predeterminado, y como asistente de prueba, eso es más bien Coq, que a menudo viene como predeterminado. Pensándolo bien, es divertido ... la lógica más famosa (HOL más famosa que CoC) y el asistente de pruebas más famoso (Coq más famoso que Isabelle), no coinciden (Coq se basa en CoC e Isabelle en HOL).
Hibou57
2

Recientemente he venido a estos tutoriales de Coq de conf2017, así que he descubierto que vale la pena compartirlo aquí para quien visite esta pregunta más adelante.λ

Además, las Fundaciones de software de la escuela de verano DeepSpec tienen algunas conferencias geniales:

Algunas de las conferencias basadas en la serie de fundamentos de software, que ya se mencionaron.

Aristu
fuente