J'ai l'extrait de code suivant.Incompatibilité d'univers (en raison d'une restriction de positivité stricte?)
Set Implicit Arguments.
Inductive Simple (A: Type) := simple : Simple A.
Inductive Wrap (A: Type) :=
| wrap : A -> Wrap A
| funWrap : forall X, Simple X -> (X -> Wrap A) -> Wrap A.
Definition anotherWrap A : Wrap A :=
funWrap (simple A) (fun x => wrap x).
Fail Definition specialWrap1 A : Wrap (Wrap A) :=
funWrap (simple (Wrap A)) (fun x => wrap x).
Fail Definition specialWrap A : Wrap A :=
funWrap (simple (Wrap A)) (fun x => x).
Ma première pensée était que le X
dans funWrap
ne peut pas être instancié avec Wrap A
, en raison de la restriction de positivité stricte pour les types inductives. Est-ce le cas ou existe-t-il une autre raison pour l'incohérence (et peut-être une approche différente pour définir la fonction specialWrap
)?
Éditer: L'explication de la deuxième définition est donnée dans un commentaire de la réponse sélectionnée.
Je voulais ajouter que j'ai compris pourquoi la deuxième définition ne fonctionne pas (même avec votre extension de polymorphisme de l'univers). Comme mentionné dans un [récent article de Timany et Jacobs] (https://lirias.kuleuven.be/bitstream/123456789/513812/2/CIT.pdf) l'extension des univers polymorphes de Coq ne supporte pas (encore) la cumulativité pour les types. Ma définition ci-dessus ressemble à leur exemple de petits ensembles. – ichistmeinname