¿Por qué Coq tiene Prop?

35

Coq tiene un tipo de Prop. De prueba proposiciones irrelevantes que se descartan durante la extracción. ¿Cuál es la razón para tener esto si usamos Coq solo para pruebas? Prop es impredicativo, por lo que Prop: Prop, sin embargo, Coq infiere automáticamente índices de universo y podemos usar Tipo (i) en todas partes. Parece que Prop complica mucho todo.

Leí que hay razones filosóficas para separar Set y Prop en el libro de Luo, sin embargo, no las encontré en el libro. ¿Qué son?

Konstantin Solomatov
fuente
66
“Si usamos Coq solo para pruebas”: creo que has identificado un punto clave aquí. Coq no se usa solo para pruebas.
Gilles 'SO- deja de ser malvado'

Respuestas:

34

Prop es muy útil para la extracción de programas porque nos permite eliminar partes de código que son inútiles. Por ejemplo, para extraer un algoritmo de clasificación, probaríamos la declaración "para cada lista hay una lista tal que está ordenada es una permutatiom de ". Si escribimos esto en Coq y lo extraemos sin usar , obtendremos:k k k P r o pkkkProp

  1. "para todos hay " nos dará un mapa que lleva listas a listas,kksort
  2. "tal que se ordene " dará una función que corre a través de y verifica que esté ordenada, ykkverifyk
  3. " es una permutación de " dará una permutación que lleva a . Tenga en cuenta que no es solo un mapeo, sino también el mapeo inverso junto con programas que verifican que los dos mapas son realmente inversos.kkpikpi

Si bien el material adicional no es totalmente inútil, en muchas aplicaciones queremos deshacernos de él y mantenernos justos sort. Esto se puede lograr si usamos para indicar " está ordenado" y " es una permutación de ", pero no "para todos hay ". k k kPropkkk

En general, una forma común de extraer código es considerar una declaración de la forma donde es input, es salida, y explica lo que significa que sea ​​una salida correcta. (En el ejemplo anterior, y son los tipos de listas y es " está ordenado es una permutación de ".) Si está en entonces extracción da un mapa tal que cumple para todosx y ϕ ( x , y ) y A B ϕ ( , k ) k k ϕ P r o p f : A B ϕ ( x , f ( x ) ) x A ϕ S e t g g ( x ) ϕ ( x ,x:A.y:B.ϕ(x,y)xyϕ(x,y)yABϕ(,k)kkϕPropf:ABϕ(x,f(x))xA . Si es decir en entonces también obtenemos una función tal que es la prueba de que sostiene, por todo . A menudo, la prueba es computacionalmente inútil y preferimos deshacernos de ella, especialmente cuando está anidada profundamente en alguna otra declaración. nos da la posibilidad de hacerlo.ϕSetgg(x)x A P r o pϕ(x,f(x))xAProp

Agregado 2015-07-29: Hay una pregunta sobre si podríamos evitar por completo al optimizar automáticamente el "código extraído inútil". Hasta cierto punto podemos hacer eso, por ejemplo, todo el código extraído del fragmento negativo de la lógica (material construido a partir del tipo vacío, tipo de unidad, productos) es inútil ya que simplemente se baraja alrededor de la unidad. Pero hay decisiones de diseño genuinas que uno debe tomar al usar . Aquí hay un ejemplo simple, donde significa que estamos en y significa que estamos en . Si extraemos de P r o p Σ T y p eP r o p Π n : N Σ b : { 0 , 1 } Σ k : NPropPropΣTypePropn b k Π n : N Σ b : { 0 , 1 }k : N

Πn:NΣb:{0,1}Σk:Nn=2k+b
obtendremos un programa que descompone en su bit más bajo y los bits restantes , es decir, computa todo. Si extraemos de entonces el programa solo calculará el bit más bajo . La máquina no puede decir cuál es la correcta, el usuario tiene que decirle lo que quiere.nbkb
Πn:NΣb:{0,1}k:Nn=2k+b
b
Andrej Bauer
fuente
1
Estoy un poco confundido ¿Está diciendo que sin sería imposible reconocer en el programa extraído que no contribuye a la salida (es decir, que simplemente lo verifica)? ¿Hay escenarios en los que uno no podría extraer ese código inútil a través de los medios habituales disponibles para los optimizadores de código? g ( x )Propg(x)
usuario
1
Del programa extraído se podría decir, "Quiero ", y retroceder desde allí. No he podido llegar a un escenario tan enredado que no podamos optimizar nada que no contribuya directamente a determinar la permutación sin que de hecho sea necesario para calcular dicha permutación (de todos modos, desde un punto de vista de optimización global) ) k
usuario
1
No tienes la información "Quiero ". Esa es una suposición adicional, y obviamente una vez que le dicen qué resultado en particular desean, simplemente puede optimizar el código muerto. En realidad, pensé en una mejor respuesta: es una pregunta de diseño qué cosas poner en . Necesita saber lo que quiere el usuario, y él le dice lo que quiere usando . Es fácil encontrar ejemplos donde hay varias opciones. Agregaré uno a mi respuesta. P r o p P r o pkPropProp
Andrej Bauer
2
Hasta donde yo sé, nadie puede decir realmente cómo extraer algo de los tipos . Está claro que contienen algo de contenido computacional, pero no lo que podría ser. (1)
Andrej Bauer
3
Prop
19

Prop

impredicative Prop+large elimination+excluded middle

es inconsistente Por lo general, desea mantener la posibilidad de agregar el medio excluido, por lo que una solución es mantener una gran eliminación y hacer que Prop sea predictivo. El otro es suprimir la gran eliminación.

¡Coq hizo las dos cosas! Cambiaron el nombre del Prop predicativo a Establecer y deshabilitaron la eliminación grande en Prop.

La expresividad obtenida por la impredicatividad es "tranquilizadora" en el sentido de que el 99% de las matemáticas "razonables" se pueden formalizar con ella, y se sabe que es consistente en relación con la teoría de conjuntos. Esto hace que sea probable que no lo debiliten a algo como Agda, que solo tiene universos predicativos.

cody
fuente
8
Ah, y se me olvidó mencionar: es no el caso de que Prop : Prop, que serían incompatibles. Más bien las cuantificaciones sobre todas las proposiciones son nuevamente una proposición.
cody
¿Podría señalarme más recursos sobre esto? Todo lo que puedo encontrar parece muy disperso.
user833970
1
@ user833970, ¿hay cosas específicas que le gustaría tener apuntadores? Me temo que en realidad no hay una referencia global para la meta teoría de los tipos dependientes. Esta discusión (que apunta aquí atrás) podría ser útil: github.com/FStarLang/FStar/issues/360
cody
gracias, estoy trabajando en el documento de la paradoja de Berardi ahora, creo que eso aclarará mi confusión.
user833970
14

Incluso si no está interesado en extraer programas, el hecho de que Propsea ​​impredecible le permite construir algunos modelos que no puede construir utilizando una torre de universos predicativa. IIRC Thorsten Altenkirch tiene un modelo de Sistema F que usa la impredicatividad de Coq.

gallais
fuente