¿Cómo funcionan las 'tácticas' en asistentes de prueba?

44

Pregunta: ¿Cómo funcionan las 'tácticas' en asistentes de prueba? Parecen ser formas de especificar cómo reescribir un término en un término equivalente (para alguna definición de 'equivalente'). Presumiblemente, hay reglas formales para esto, ¿cómo puedo aprender cuáles son y cómo funcionan? ¿Implican algo más que elegir el orden para la reducción beta?

Antecedentes sobre mi interés: Hace varios meses, decidí que quería aprender matemáticas formales. Decidí seguir con la teoría de tipos porque, según investigaciones preliminares, parece La forma correcta de hacer las cosas (tm) y porque parece unificar la programación y las matemáticas, lo cual es fascinante . Creo que mi objetivo final es poder usar y comprender un asistente de pruebas como Coq (creo que especialmente puedo usar tipos dependientes ya que tengo curiosidad sobre cosas como representar los tipos de matrices). Comencé sabiendo muy poco, ni siquiera una programación funcional rudimentaria, pero estoy progresando lentamente. He leído y entendido grandes fragmentos de Tipos y Lenguajes de Programación (Pierce) y aprendí algunos Haskell y ML.

John Salvatier
fuente
1
Este es un anuncio descarado para mis tutoriales en video de Coq, math.andrej.com/2011/02/22/…
Andrej Bauer

Respuestas:

36

ABABABABcon las mismas hipótesis), aplique un lema (~ aplicación de función), divida un lema sobre algún tipo inductivo en un caso para cada constructor, y así sucesivamente. Las tácticas básicas pueden tener éxito o fracasar dependiendo del contexto en el que se aplican. Las tácticas más avanzadas son como pequeños programas funcionales que ejecutan las tácticas básicas, realizan una coincidencia de patrones sobre los términos en el objetivo y / o suposiciones, toman decisiones basadas en el éxito o el fracaso de las tácticas, etc. Las tácticas más avanzadas se ocupan de la aritmética y otros tipos específicos de teorías. El documento clave sobre el lenguaje táctico de Coq es el siguiente:

  • D. Delahaye. Un lenguaje táctico para el sistema Coq . En Proceedings of Logic for Programming and Automated Reasoning (LPAR), Reunion Island, volumen 1955 de Lecture Notes in Computer Science, páginas 85–95. Springer-Verlag, noviembre de 2000.

Las reglas formales que forman la esencia de las tácticas básicas se definen en la guía del usuario de Coq aquí o en el Capítulo 4 del pdf .

Un documento bastante instructivo sobre la implementación de tácticas y tácticas (esencialmente tácticas que toman otras tácticas como argumentos) es:

El lenguaje táctico de Coq tiene la limitación de que las pruebas escritas con él apenas se parecen a las pruebas que uno hace a mano. Se han realizado varios intentos para permitir pruebas más claras. Estos incluyen Isar (para Isabelle / HOL) y el lenguaje de prueba de Mizar .

Aparte: ¿Sabía también que el lenguaje de programación ML fue originalmente diseñado para implementar tácticas para el probador de teoremas LCF ? Muchas ideas desarrolladas para ML, como la inferencia de tipos, han influido en los lenguajes de programación modernos.

Dave Clarke
fuente
3
Gran respuesta. La programación certificada de Adam Chlipala con tipos dependientes ( adam.chlipala.net/cpdt ) es otro buen recurso sobre el uso de tácticas en Coq.
jbapple
16

LCF es de hecho el abuelo de todos estos sistemas: Coq, Isabelle, HOL, incluido el lenguaje de programación ML (que vemos hoy como OCaml, SML, también F #). Sí, estoy incluyendo a Coq como miembro de la gran familia LCF. En comparación con los asistentes de prueba estadounidenses-estadounidenses (en particular, ACL2), o el totalmente ajeno Mizar, Coq está culturalmente bastante cerca de Isabelle y los HOL, principalmente debido a la idea compartida de tácticas .

Entonces, ¿qué son las tácticas de todos modos, desprovistas de observaciones accidentales sobre reescritura, conversiones, introducción o eliminación de conectivos?

El principio de estratificación principal aquí se hereda del LCF de Milner:

  • Inferencias principales (razonamiento directo), ya sea como tipo thmde datos abstractos en el enfoque LCF original, o con una verificación separada de los términos de prueba en la rama de la familia de la teoría de tipo (Coq, Matita). Esto le da una cierta base lógica para los resultados que el probador considera como teoremas. Entonces, podrías tener una inferencia primitiva que tome takes A y ⊢ B y te dé ⊢ A ∧ B. Otra inferencia primitiva podría darte ⊢ t = u, donde u es la forma beta normal de t. Ninguno de estos mecanismos son tácticas, sin embargo, son reglas de inferencia como en la lógica estándar.

  • Prueba dirigida al objetivo (razonamiento hacia atrás). La idea es operar con alguna noción de "estado objetivo" al refinarlo, dividiéndolo en más y más objetivos secundarios, objetivos secundarios cercanos, hasta que todo se resuelva. Terminando el estado objetivo, hará que un cierto teorema salga del proceso. LCF ha introducido cierta infraestructura extralógica para objetivos, que todavía está presente en los HOL: una táctica es alguna función de ML que refina un objetivo y produce alguna justificación para el refinamiento. Al final de la prueba, las justificaciones se reproducen en orden inverso para producir una prueba de manera progresiva de acuerdo con las inferencias primitivas esbozadas anteriormente.

Coq y Matita todavía están bastante cerca de este principio LCF. Isabelle es diferente aquí: ya en 1989, Larry Paulson reformó las nociones de objetivo y táctica para acercarlas a la lógica, que es el marco lógico "puro" de Isabelle aquí. ¡Isabelle / Pure proporciona una lógica mínima de orden superior con implicación ==> y cuantificador! que indican tanto la estructura de las reglas de deducción natural como los estados del objetivo.

Por ejemplo, ⊢ A ==> B ==> A ∧ B es la regla de introducción de conjunción (de la lógica del objeto) como teorema del marco lógico.

Los estados de objetivos también son solo teoremas, comenzando con ⊢ C ==> C para su reclamo inicial C, que se refina a ⊢ X ==> Y ==> Z ==> C en estados intermedios, donde X, Y, Z son los objetivos secundarios actuales y el proceso termina con ⊢ C (sin objetivos secundarios).

Ahora volvamos a las tácticas, que son más uniformes para todos estos probadores: dada alguna noción del estado del objetivo (por ejemplo, el de Isabelle anterior), una táctica es una función que asigna un estado del objetivo al seguimiento (0, 1 o más) estados de la meta. Además, una táctica es un combinador de tales funciones tácticas, por ejemplo, para expresar composición secuencial, elección, repetición, etc. De hecho, el lenguaje de tácticas y tácticas está relacionado con el enfoque de "lista de éxitos" de los combinadores de analizadores sintácticos.

Las tácticas permiten describir ciertas estrategias de refinamiento de objetivos sistemáticamente. Resultó bastante exitoso desde su invención en LCF en la década de 1970/80, pero producen guiones de prueba notoriamente ilegibles.

A. Asperti et al., PLMMS 2009, ver las actas del taller en la página 22.

Mizar e Isabelle / Isar se han mencionado como enfoques alternativos al razonamiento estructurado legible por humanos , y no se basan en tácticas en ese sentido. Mizar no está relacionado con la familia LCF, por lo que no conoce esa terminología táctica. Isabelle / Isar incorpora la tradición táctica hasta cierto punto, pero su noción de método de prueba es un poco más estructurada (con contexto de prueba de Isar explícito, indicación explícita de hechos encadenados y evitar el pirateo interno de objetivos en el curso del razonamiento).

Muchas más reformas y reconsideraciones de los lenguajes tácticos han ocurrido en las últimas décadas. Por ejemplo, una rama reciente de la comunidad Coq favorece SSReflect (por G. Gonthier) en lugar del Ltac tradicional.

Makarius
fuente
12

¿Cómo funcionan las 'tácticas' en asistentes de prueba?

Sospecho que esta respuesta será un poco divagada.

Primero, no es suficiente preguntar "cómo funcionan las tácticas en asistentes de prueba" porque funcionan de manera diferente en asistentes de prueba diferentes. Hoy se usan dos clases principales de asistentes: las derivadas del LCF original, como Isabelle, HOL y HOL light, y asistentes de pruebas basados ​​en la teoría de tipos como Coq y Matita. En estas dos clases diferentes de asistente de pruebas, las tácticas funcionan de diferentes maneras, una reflexión de que lo que está sucediendo debajo del capó, por ejemplo, en Isabelle, es bastante diferente a lo que sucede debajo del capó, por ejemplo, en Matita.

Pregúntese: ¿qué sucede cuando intentamos probar una proposición P en Matita? Introducimos una X metavariable con tipo P. Luego jugamos un juego, por así decirlo, donde refinamos X, agregando más y más estructura al término incompleto, hasta que obtengamos un término lambda completo (es decir, que no contenga más metavariables). Una vez que estamos en posesión de un término lambda completo, escribimos verificar con respecto a P, asegurándonos de que habita el tipo requerido. Luego vemos que en Coq y Matita, una táctica es simplemente una función de términos de prueba incompletos a términos de prueba incompletos, que con suerte agrega un poco de estructura al término después de la aplicación (esta observación ha motivado bastante trabajo reciente de, por ejemplo, Jojgov , Pientka y otros).

Por ejemplo, la "introducción" de la táctica de Matita introduce una abstracción lambda sobre el término existente, "casos" introduce una expresión de coincidencia en el término y "aplicar" introduce una aplicación de un término al otro. Estas tácticas básicas se pueden unir, utilizando funciones de orden superior, para crear otras más complejas. Sin embargo, la idea básica es siempre la misma: una táctica siempre tiene como objetivo agregar un poco de estructura a un término de prueba incompleto.

Tenga en cuenta que los implementadores tienen como objetivo devolver un término que vuelva a escribir después de cada aplicación táctica. Estrictamente hablando, no es necesario que lo hagan, ya que todo lo que importa para los asistentes de pruebas basados ​​en la teoría de tipos es que, cuando el usuario llega a Qed la prueba, estamos en posesión de un término de prueba que habita la proposición P. Cómo llegado a este término de prueba es en gran medida irrelevante. Sin embargo, tanto Coq como Matita tienen como objetivo devolver al usuario un término de prueba (posiblemente incompleto) que comprueba después de cada aplicación de táctica. Sin embargo, este invariante puede (y a menudo falla), especialmente en lo que respecta a las dos comprobaciones sintácticas que los asistentes de pruebas basados ​​en CIC deben implementar.

En particular, podemos llevar a cabo lo que parece ser una prueba válida, aplicando una serie de tácticas hasta que no queden objetivos abiertos. Luego llegamos a Qed la supuesta prueba, solo para descubrir que el verificador de terminación de Matita, o su estricto verificador de positividad, se queja, ya que el término de prueba generado por las tácticas ha invalidado una de estas verificaciones sintácticas (es decir, una posición metavariable en argumento para una llamada recursiva se instancia con un término que no es sintácticamente más pequeño que el argumento original). Esto es un reflejo de que la teoría del tipo CIC no es, en cierto sentido, "lo suficientemente fuerte" y no refleja los requisitos sintácticos de positividad o tamaño en sus tipos (una observación que motiva los tipos de tamaño de Abel y algunos trabajos recientes sobre tipos de positividad )

Por otro lado, los asistentes de prueba de estilo LCF son bastante diferentes. Aquí, el núcleo consiste en un módulo (generalmente implementado en una variante de ML), que contiene un tipo abstracto "thm", y funciones que implementan las reglas de inferencia de la lógica del asistente de pruebas, asignando "thm" a "thm", y así adelante. Confiamos en la disciplina de mecanografía de ML para garantizar que la única forma de construir un valor de tipo "thm" es a través de estas reglas de inferencia (tácticas básicas). El núcleo de Isabelle está aquí .

Las pruebas consisten entonces en una serie de aplicaciones de estas tácticas básicas (o tácticas más complejas y más grandes, que nuevamente se hacen al unir tácticas más simples usando funciones de orden superior --- en Isabelle, las funciones de orden superior, llamadas tácticas, pueden ser visto aquí ). A diferencia de los asistentes de prueba basados ​​en la teoría de tipos, no es necesario en un asistente de estilo LCF mantener un término de prueba explícito testigo por ahí. La exactitud de la prueba está garantizada por la construcción y nuestra confianza en la disciplina de mecanografía de ML (muchos asistentes, por ejemplo, Isabelle, sin embargo, generan términos de prueba para sus pruebas).

Dominic Mulligan
fuente