Me topé con un desacuerdo confuso entre Agda y Coq que obviamente no está relacionado con las distinciones más conocidas entre sus teorías de tipo (por ejemplo, (im) predicatividad, inducción-recursión, etc.).
En particular, Agda acepta la siguiente definición:
data Ty : Set0 -> Set0 where
c1 : Ty ℕ
c2 : Ty (Ty ℕ)
mientras que la definición equivalente de Coq se rechaza porque se considera que la aparición de [Ty _] como un índice de sí mismo en c2 viola la positividad estricta.
Inductive Ty : Set -> Set :=
| c1 : Ty nat
| c2 : Ty (Ty nat).
De hecho, este caso es casi literalmente un ejemplo de la Sección 14.1.2.1 de Coq'Art de violar la positividad estricta:
Inductive T : Set -> Set := c : (T (T nat)).
Pero no veo las razones de esta diferencia entre las teorías de tipos. El ejemplo clásico de probar False usando una ocurrencia negativa de un tipo en un argumento de constructor es claro para mí, pero no puedo ver cómo uno podría derivar una contradicción de este estilo de indexación (independientemente de los argumentos de constructor estrictamente positivos).
Al revisar la literatura, el primer artículo de Indbctive Families de Dybjer hace un comentario casual sobre la solución de Paulin-Mohring en el documento del CID que tiene restricciones ligeramente diferentes, y sugiere vagamente que las diferencias podrían estar relacionadas con la impredecibilidad, pero no da más detalles. El artículo de Dybjer parece permitir esto, mientras que el de Paulin-Mohring lo prohíbe claramente.
Aparentemente, no soy el primero en notar esta diferencia de opinión, y algunos creen que esta definición no debería permitirse en ninguno de los sistemas ( https://lists.chalmers.se/pipermail/agda/2012/004249.html ), pero No he encontrado ninguna explicación de por qué está bien en un sistema pero no en el otro, o simplemente una diferencia de opinión.
Entonces supongo que tengo varias preguntas:
- ¿Es este un ejemplo de un tipo monótono, pero no estrictamente positivo? (En Coq; claramente Agda lo considera estrictamente positivo)
- ¿Por qué Agda permite esto mientras Coq lo rechaza? Es simplemente una diferencia idiosincrásica en la interpretación de "estrictamente positivo", ¿existe una sutil diferencia entre Coq y Agda que lo hace sonar en Agda y no es sólido en Coq, o es una cuestión de gusto impulsada por preferencias teóricas particulares?
- ¿Existe una diferencia significativa entre la primera definición anterior y la definición inductiva-recursiva equivalente a continuación?
Definición inductiva-recursiva:
mutual
data U : Set0 -> Set0 where
c : (i : Fin 2) -> U (T i)
T : Fin 2 -> Set0
T zero = ℕ
T (suc zero) = U ℕ
Estoy feliz de tener consejos sobre literatura relevante.
Gracias por adelantado.
Ty is not strictly positive, because it occurs in an index of the target type of the constructor c2 in the definition of Ty.