2011-02-23 21 views
7

Tengo problemas para entender los principios de qué es un constructor y cómo funciona.¿Qué es un constructor en Coq?

Por ejemplo, en Coq, se nos ha enseñado a definir los números naturales como este:

Inductive nat : Type := 
    | O : nat 
    | S : nat -> nat. 

y me han dicho que S es un constructor, pero ¿qué significa eso exactamente?

Y si lo:

Check (S (S (S (S O)))). 

consigo que es 4 y de tipo nat.

¿Cómo funciona esto, y cómo Coq sabe que (S (S (S (S O)))) representa 4?

Supongo que la respuesta a esto es una magia de fondo extremadamente inteligente en Coq.

+3

El bastante-impresión de '(S (S (S (SO))))' 'como 4' es sólo una conveniencia de que no debes dejar que te distraiga Si está en el punto en el que desea hacerse una idea de lo que es un constructor, defina su propio tipo 'naturals' con los constructores' Z' (para cero) y 'N' (para el próximo). Entonces nada de magia sucederá. –

Respuesta

7
Inductive naturals : Type := 
    | Z : naturals 
    | N : naturals -> naturals. 

dice lo siguiente:

  1. Z es un término de tipo naturals

  2. cuando e es un término de tipo naturals, N e es un término de tipo naturals.

  3. Aplicar Z o N son las únicas dos maneras de crear un natural. Cuando se le da un natural arbitrario, usted sabe que fue hecho de uno o del otro.

  4. dos términos e1 y e2 de tipo naturals son iguales si y sólo si ambos son Z o si son respectivamente N t1 y N t2 con t1 igual a t2.

Puede ver cómo estas reglas se generalizarían a definiciones de tipo inductivo arbitrarias. Sin embargo, resulta que cuando la definición de tipo es para constructores de la forma Z y N, estas propiedades corresponden más o menos exactamente a Peano's axioms para números naturales. Esta es la razón por la que un tipo denominado nat está predefinido en Coq con constructores de estas formas que se utilizarán para representar números naturales. Este tipo recibe un tratamiento especial porque se cansa muy rápido para manipular la forma cruda, pero los tratamientos especiales solo están disponibles para su comodidad.

+1

En la viñeta 2, ¿quiso decir que N e es un término de tipo natural? – mushroom

+0

@mushroom Sí, lo hice. –

-1

En teoría de tipos, un constructor (tipo) es solo una forma de construir nuevos tipos a partir de los existentes (http://en.wikipedia.org/wiki/Type_constructor).

En su definición inductiva de nat, S es un constructor porque (si mira la firma) toma un nat y produce otro nat.

Por ejemplo, un constructor de tipo para un par de NAT será:

Inductive pair : Type := P: nat->nat->pair. 

Check P (S (O)) (S(S(O))). 
+3

Esta respuesta es un poco engañosa: el hecho de que 'S' sea un constructor no está determinado por su tipo. Por ejemplo 'plus 1' no es un constructor (aunque tiene el mismo tipo que' S' e incluso eta-reduce a él). 'S' es un constructor porque es una de las formas" canónicas "de construir un' nat'. Es importante que los constructores de un tipo sean las únicas formas de crear objetos de ese tipo. – Gilles

+0

Sí, vale la pena aclarar que estaba hablando en el contexto de una definición de tipo (inductiva). Una función simple no es un constructor de tipos, incluso si comparte la misma firma de tipo. (si eso es lo que estás hablando) – GClaramunt

+0

Puede haber mezclado los nombres, creo que se llaman constructor de valor – GClaramunt

Cuestiones relacionadas