Je suis tombé sur un désaccord déroutant entre Agda et Coq qui n'est évidemment pas lié aux distinctions les plus connues entre leurs théories de types (par exemple, (im) prédicativité, induction-récursivité, etc.).
En particulier, la définition suivante est acceptée par Agda:
data Ty : Set0 -> Set0 where
c1 : Ty ℕ
c2 : Ty (Ty ℕ)
tandis que la définition équivalente de Coq est rejetée parce que l'apparition de [Ty _] comme un index de lui-même dans c2 est considérée comme violant la positivité stricte.
Inductive Ty : Set -> Set :=
| c1 : Ty nat
| c2 : Ty (Ty nat).
En fait, ce cas est presque mot pour mot un exemple tiré de la section 14.1.2.1 de Coq'Art de violation de la positivité stricte:
Inductive T : Set -> Set := c : (T (T nat)).
Mais je ne vois pas les raisons de cette différence entre les théories de type. L'exemple classique de prouver Faux en utilisant une occurrence négative d'un type dans un argument constructeur est clair pour moi, mais je ne vois pas comment on pourrait dériver une contradiction de ce style d'indexation (indépendamment des arguments constructeur autrement strictement positifs).
En fouillant dans la littérature, le premier article de Dybjer sur les familles inductives fait un commentaire désinvolte sur la solution de Paulin-Mohring dans le document CID ayant des restrictions légèrement différentes, et suggère vaguement que les différences pourraient être liées à l'imprédicativité, mais n'élabore pas davantage. Le document de Dybjer semble permettre cela, alors que celui de Paulin-Mohring l'interdit clairement.
Apparemment, je ne suis pas le premier à remarquer cette différence d'opinion, et certains pensent que cette définition ne devrait pas être autorisée dans les deux systèmes ( https://lists.chalmers.se/pipermail/agda/2012/004249.html ), mais Je n'ai trouvé aucune explication de la raison pour laquelle il est soit sain dans un système mais pas dans l'autre, ou juste une différence d'opinion.
Je suppose donc que j'ai plusieurs questions:
- Est-ce un exemple d'un type monotone, mais non strictement positif? (En Coq; clairement Agda le considère strictement positif)
- Pourquoi Agda le permet-il alors que Coq le rejette? C'est simplement une différence idiosyncrasique dans l'interprétation de «strictement positif», y a-t-il une différence subtile entre Coq et Agda qui la rend saine dans Agda et non saine dans Coq, ou est-ce une question de goût motivée par des préférences théoriques particulières?
- Existe-t-il une différence significative entre la première définition ci-dessus et la définition équivalente inductive-récursive ci-dessous?
Définition inductive-récursive:
mutual
data U : Set0 -> Set0 where
c : (i : Fin 2) -> U (T i)
T : Fin 2 -> Set0
T zero = ℕ
T (suc zero) = U ℕ
Je suis heureux d'avoir des pointeurs sur la littérature pertinente.
Merci d'avance.
la source
Ty is not strictly positive, because it occurs in an index of the target type of the constructor c2 in the definition of Ty.
Réponses:
Le problème semble être la confusion résultant de la confluence de deux facteurs:
Cette lecture plus approfondie est bien sûr cohérente avec la vérification effectuée par Coq et (versions récentes de) Agda, qui interdisent toute apparition de T dans ses propres indices.
la source
Une raison possible de la différence, comme l'indiquent vos propres remarques, est l'imprédicativité. Coq avait historiquement un ensemble imprédicatif (toujours disponible comme drapeau je crois!)
Citant le livre d'Adam Chlipala http://adam.chlipala.net/cpdt/html/Universes.html
la source