Curry-Howard y programas de pruebas no constructivas

29

Esta es una pregunta de seguimiento para

¿Cuál es la diferencia entre pruebas y programas (o entre proposiciones y tipos)?

¿Qué programa correspondería a una prueba no constructiva (clásica) de la forma ? (Suponga que es una relación decidible interesante, por ejemplo, -th TM no se detiene en pasos)T e kk T(e,k)¬k T(e,k)Tek

(PD: estoy publicando esta pregunta en parte porque estoy interesado en aprender más sobre lo que Neel quiere decir con " la traducción de Godel-Gentzen es una transformación de paso continuo" en su comentario ).

Kaveh
fuente
2
Respuesta parcial en la página 2 de estas notas de clase . Es un poco críptico; Trataré de desenterrar algo más completo.
Dave Clarke
Me toma un poco más de tiempo de lo planeado escribir mi respuesta, ya que cometí el error de decidir probar las cosas que sabía en lugar de solo afirmarlas. :)
Neel Krishnaswami
1
El JSL más reciente tenía este artículo . La esencia es que el contenido computacional de las pruebas clásicas puede depender en gran medida de cómo elija extraerlo. Realmente no lo he digerido todavía, pero pensé en tirarlo allí.
Mark Reitblatt
Pero ha especificado que T es una relación decidible , por lo que se deduce que hay pruebas constructivas de su propuesta. La lógica clásica es un subconjunto de la lógica intuicionista y usted especificó que T pertenece a ese subconjunto al llamarlo decidible.
wren romano
wren, eso es lo que pensé al principio también! Pero la proposición P en el ejemplo P \ / ~ P en la pregunta si realmente se cuantifica sobre todo k, y esta cuantificación de T no es necesariamente decidible.
jbapple

Respuestas:

25

Esta es una pregunta interesante. Obviamente, uno no puede esperar tener un programa que decida para cada si cumple o no, ya que esto decidiría el problema de detención. Como ya se mencionó, hay varias formas de interpretar las pruebas computacionalmente: extensiones de Curry-Howard, realizabilidad, dialéctica, etc. Pero todos interpretarían computacionalmente el teorema que usted mencionó más o menos de la siguiente manera.k T ( e , k )ekT(e,k)

Para simplificar, considere el teorema clásico equivalente

(1)ij(¬T(e,j)¬T(e,i))

Esto es (constructivamente) equivalente al mencionado porque dado podemos decidir si cumple o no simplemente comprobando el valor de . Si mantiene, entonces y, por lo tanto, . Si, por otro lado, no se cumple, entonces (1) tenemos que implica .k T ( e , k ) ¬ T ( e , i ) ¬ T ( e , i ) i ¬ T ( e , i ) ¬ i T ( e , i ) ¬ T ( e , i ) j ( ¬ T ( e , j ) )ikT(e,k)¬T(e,i)¬T(e,i)i¬T(e,i)¬iT(e,i)¬T(e,i)j(¬T(e,j))jT(e,j)

Ahora, una vez más, no podemos calcular en (1) para cada dada porque resolveríamos nuevamente el problema de detención. Lo que todas las interpretaciones mencionadas anteriormente harían es mirar el teorema equivalenteeie

(2)fi(¬T(e,f(i))¬T(e,i))

La función se llama función Herbrand. Intenta calcular un contraejemplo para cada testigo potencial dado . Está claro que (1) y (2) son equivalentes. De izquierda a derecha esto es constructivo, simplemente tome en (2), donde es el testigo supuesto de (1). De derecha a izquierda uno tiene que razonar clásicamente. Suponga que (1) no era cierto. Luego,j i i = i ifjii=ii

(3)ij¬(¬T(e,j)¬T(e,i))

Sea una función testigo de esto, es decirf

(4)i¬(¬T(e,f(i))¬T(e,i))

Ahora, tome en (2) y tenemos , para algunos . Pero tomando en (4) obtenemos la negación de eso, contradicción. Por lo tanto (2) implica (1).f=f(¬T(e,f(i))¬T(e,i))ii=i

Entonces, tenemos que (1) y (2) son clásicamente equivalentes. Pero lo interesante es que (2) tiene ahora un testigo constructivo muy simple. Simplemente tome si no se cumple, porque entonces la conclusión de (2) es verdadera; o bien tome si cumple, porque entonces no se cumple y la premisa de (2) es falsa, lo que lo vuelve a hacer verdadero.i=f(0)T(e,f(0))i=0T(e,f(0))¬T(e,f(0))

Por lo tanto, la forma de interpretar computacionalmente un teorema clásico como (1) es mirar una formulación equivalente (clásica) que se pueda demostrar de manera constructiva, en nuestro caso (2).

Las diferentes interpretaciones mencionadas anteriormente solo divergen en la forma en que aparece la función . En el caso de la realizabilidad y la interpretación dialéctica, esto es explícitamente dado por la interpretación, cuando se combina con alguna forma de traducción negativa (como la de Goedel-Gentzen). En el caso de las extensiones de Curry-Howard con los operadores de call-cc y de continuación la función surge del hecho de que el programa se le permite "saber" como un valor determinado (en nuestro caso se utilizará), por lo que es la continuación del programa alrededor del punto donde se calcula .ffifi

Otro punto importante es que desea que el pasaje de (1) a (2) sea "modular", es decir, si (1) se usa para probar (1 '), entonces su interpretación (2) debe usarse de manera similar para probar la interpretación de (1 '), diga (2'). Todas las interpretaciones mencionadas anteriormente lo hacen, incluida la traducción negativa de Goedel-Gentzen.

Paulo
fuente
8
¡Bienvenido! Es genial ver a un teórico de pruebas experto aquí.
Neel Krishnaswami
1
Gracias Paulo, tu respuesta ha aclarado una parte de la imagen en un problema relacionado en el que estoy trabajando.
Kaveh
17

Es bastante conocido que la aritmética clásica e intuicionista es equiconsistente.

Una forma de mostrar esto es a través de las "incorporaciones negativas" de la lógica clásica en la lógica intuicionista. Entonces, supongamos que son fórmulas de aritmética clásica de primer orden. Ahora, podemos definir una fórmula de lógica intuicionista de la siguiente manera:ϕ

G()=¬¬G(ϕψ)=¬¬(G(ϕ)G(ψ))G()=¬G(¬ϕ)=¬G(ϕ)G(ϕψ)=¬(¬G(ϕ)¬G(ψ))G(x.ϕ)=x.¬¬G(ϕ)G(x.ϕ)=¬x.¬(G(ϕ))G(P)=¬¬P

Tenga en cuenta que es básicamente un homomorfismo que se adhiere a los no-no adicionales en todas partes, excepto que en disyunciones y existenciales, utiliza la dualidad de Morgan para convertirlos en conjunciones y universales. (Estoy bastante seguro de que esta no es la traducción exacta de Godel-Gentzen, ya que lo preparé para esta respuesta; básicamente, cualquier cosa que escriba usando doble negación + dualidad de Morgan funcionará. Esta variedad en realidad resulta ser importante para interpretaciones computacionales de la lógica clásica; ver más abajo).G(ϕ)

Primero: es obvio que esta traducción conserva la verdad clásica, de modo que es verdadera si y solo si es, en términos clásicos.ϕG(ϕ)ϕ

Segundo: es menos obvio, pero sigue siendo el caso, que para las fórmulas en fragment, la probabilidad en la lógica intuitiva y clásica coincide. La forma de demostrar esto es mirar primero las fórmulas extraídas de esta gramática:,,,¬

A,B::=x.A(x)|AB|AB|¬A|¬¬P

Y luego podemos demostrar como un lema (por inducción en ) que es derivable intuitivamente. Entonces, ahora podemos mostrar la equiderivabilidad de las fórmulas negativas haciendo una inducción sobre la estructura de la prueba (en, por ejemplo, el cálculo posterior) y usar el lema anterior para simular la ley del medio excluido.G ( A )AG(A)A

Entonces, ¿cómo deberías pensar en esto intuitivamente?

  • Primero, la vista de la prueba teórica. Si observa las reglas del cálculo posterior, puede ver que el único lugar en el que la lógica clásica e intuitiva difiere seriamente es en las reglas de disyunción y existenciales. Entonces, estamos usando este hecho para mostrar que las pruebas en una lógica de estas fórmulas pueden traducirse en pruebas en la otra. Esto muestra cómo pensar en la lógica constructiva como una extensión de la lógica clásica con los dos nuevos conectivos y . Lo que llamamos "existencia clásica" y "disyunción clásica" no eran más que abreviaturas que implicaban , conjunción y negación, y por eso, para hablar sobre la existencia real, necesitábamos introducir nuevas conectivas.

  • En segundo lugar, hay una vista topológica. Ahora, el modelo de una lógica clásica (como una familia de conjuntos) es un álgebra booleana (es decir, una familia de subconjuntos cerrados bajo uniones arbitrarias, intersecciones y complementos). Resulta que el modelo de lógica intuitiva es como un espacio topológico , con las proposiciones interpretadas como conjuntos abiertos. La interpretación de la negación es el interior del complemento, y luego es fácil demostrar que , lo que significa que la doble negación nos envía al clopen más pequeño que cubre cada abierto --- y los clopens forman un álgebra booleana.¬¬¬P=¬P

Ahora, gracias a Curry-Howard, sabemos cómo interpretar las pruebas en lógica intuicionista como programas funcionales. Entonces, una posible respuesta (pero no la única) a la pregunta de "¿cuál es el contenido constructivo de una prueba clásica?" es el siguiente:

El contenido computacional de una prueba clásica es cualquiera que sea el contenido computacional de la traducción de su prueba (de acuerdo con la traducción negativa).

Entonces, veamos la traducción de . Entonces esto dice que el contenido constructivo del medio excluido es lo mismo que decir que no es el caso que y mantengan, es decir, no contradicción. Entonces, en este sentido, en realidad no hay mucho contenido computacional en la ley del medio excluido.G(A¬A)=¬(¬G(A)¬¬G(A))¬P¬¬P

Para ver qué es concretamente, recuerde que constructivamente, la negación se define como . Entonces, esta fórmula es . El siguiente bit de código Ocaml ilustrará:¬A==A((G(A))((G(A))))

type bot = Void of bot
type 'a not = 'a -> bot

let excluded_middle : ('a not * 'a not not) not = fun (u, k) -> k u 

Es decir, si obtiene no-A y no-no-A, puede pasar la primera negación a la segunda para obtener la contradicción que desea.

Ahora, ¿qué es una continuación de las transformaciones de estilo de paso?

  • Una continuación de tipo es algo que toma un valor de tipo y calcula una respuesta final a partir de él.ττ
  • Las continuaciones se utilizan para modelar los contextos del programa. Es decir, podríamos tener un término evaluando como parte de un programa mucho más grande . Todas esas cosas a su alrededor tomarán el resultado de calcular y calcularán la respuesta final.3+5C[3+5]3+5
  • Entonces, puede pensar en una continuación de tipo como una función , donde es el tipo de respuesta que sea.τ α ατταα
  • Entonces, si tiene un programa de tipo , podemos "convertirlo a CPS" encontrando un término de tipo , que terminará pasando lo que haya calculado Su continuación. (Básicamente, esto solo hace que el flujo de control sea explícito).τ ( τ α ) α eeτ(τα)αe
  • Pero tenemos que hacer esto de forma hereditaria, para que cada subterráneo del programa haya hecho explícita su continuación.

Ahora,

  • La traducción negativa básicamente envía hereditariamente a .¬ ¬ ϕϕ¬¬ϕ
  • Sin embargo, aunque nuestra traducción utiliza la negación, en realidad nunca elimina la proposición falsa, por lo que la traducción funciona paramétricamente en esa proposición.
  • En particular, podemos reemplazar con cualquier tipo de respuesta .αα
  • Así que reemplazamos hereditariamente con .( ϕ α ) αϕ(ϕα)α
  • Esta es una transformación de CPS.

Vi "una" transformación de CPS, ya que como mencioné anteriormente, hay muchas traducciones negativas que le permiten probar este teorema, y ​​cada una corresponde a una transformación de CPS diferente. En términos operativos, cada transformación corresponde a un orden de evaluación diferente . Por lo tanto, no existe una interpretación computacional única de la lógica clásica, ya que tiene que tomar decisiones y las opciones de diferencia tienen características operativas muy diferentes.

Neel Krishnaswami
fuente
3
Esta es una respuesta genial. Me recordó al artículo de Wadler "Call-by-value es dual to call-by-name": homepages.inf.ed.ac.uk/wadler/topics/call-by-need.html , que incluye una anécdota muy memorable en la sección 4 para explicar la relación entre callCC y el medio excluido.
sclv
8

Hay conferencias completas sobre el tema de las pruebas no constructivas como programas , y no soy un experto en el tema. Arriba, Neel Krishnaswami aludió a una respuesta más larga que está preparando, que, a juzgar por su trabajo aquí, será excelente. Esto es solo una muestra de una respuesta.

Resulta que el tipo de llamada con continuación actual corresponde a la proposición conocida como la ley de Peirce , que puede usarse para probar la Ley del Medio Excluido ( ). Se puede escribir un programa LEM usando callcc. En Coq:P,P¬P

Set Implicit Arguments.

Axiom callcc : forall (A B : Set), ((A -> B) -> A) -> A.

Lemma lem : forall (A B:Set), sum A (A -> B).
Proof.
  intros.
  eapply callcc.
  intros H.
  right.
  intros.
  apply H.
  left.
  assumption.
Defined.

Recursive Extraction lem.

da el código O'Caml:

type ('a, 'b) sum =
  | Inl of 'a
  | Inr of 'b

(** val callcc : (('a1 -> 'a2) -> 'a1) -> 'a1 **)

let callcc =
  failwith "AXIOM TO BE REALIZED"

(** val lem : ('a1, 'a1 -> no) sum **)

let lem =
    callcc (fun h -> Inr (fun h0 -> h (Inl h0)))

La introducción más clara a esto que he visto está en la "Noción de control de fórmulas como tipos" de Tim Griffin .

jbapple
fuente
3
Debe intentar extraer en Scheme y decirle al procedimiento de extracción que debe extraer su callcca Scheme's callcc. Entonces puedes probar cosas.
Andrej Bauer