Salut,
Je vous montre le problème lié aux types inductifs que j’ai mentionné hier.
On définit d’abord le type `Sigma`
Sigma = typecons (Sigma (l1 ::: TypeLevel) (l2 ::: TypeLevel) (A : Type_ l1) (B : A -> Type_ l2)) (sigma (fst : A) (snd : B fst)); sigma = datacons Sigma sigma;
Mais quand il s’agit de construire une expression de ce type, on se retrouve dans l’obligation de fournir la valeur de `B` explicitement lors de la construction même si l’information se trouve déjà dans l’annotation de type.
up : Sigma Unit (lambda _ -> Unit);; up = sigma (B := lambda _ -> Unit) unit unit; %% ça ne marche plus si on enlève l’argument B
Si on enlève le B, on obtient l’erreur "Context expected: (?B↑0 unit) but expression has type: Unit”. J’ai investigué un tout petit peu, mais malheureusement j’ai pas pu trouver la source de ce problème.
J’ai rencontré un autre problème avec les indices de Debruijn quand j’écrivais cette preuve
HoTT_isContr A = Sigma A (lambda (x : A) -> ((y : A) -> Eq x y));
isContrΠ : (A : Type_ ?) ≡> (B : A -> Type_ ?) ≡> (h : (x : A) -> HoTT_isContr (B x)) -> HoTT_isContr ((x : A) -> B x); isContrΠ h = sigma (A := (x : A) -> B x) (B := (lambda (x : ((x : A) -> B x)) -> ((y : ((x : A) -> B x)) -> Eq x y))) (lambda x -> case (h x) | sigma bx p => bx) (lambda f -> Eq_eq (f := lambda i ≡> lambda x -> case (h x) | sigma bx p => Eq_uneq (p := p (f x)) (i := i)));
qui donnait l’erreur
[X] Fatal :(DEBRUIJN) DeBruijn index 2 refers to wrong name. Expected: " %gensym% no 42 “ got " %gensym% no 39 “
On rencontre ce problème quand on est dans la branche du 2e `case` dans le code. Mon hypothèse est que le `bx` n’est pas égal à l’autre `bx` dans le 1er `case`, et puisque ce que renvoit le 2e `case` dépend de ce qui est renvoyé dans l’autre, ça devient un problème. La bonne nouvelle c’est que j’ai réussi à contourner le problème en remplaçant les deux `case ` par des appels à des fonctions auxiliaires.
pr1 : Sigma ?A ?B -> ?A; pr1 s = case s | sigma a _ => a;
pr2 : (s : Sigma ?A ?B) -> ?B (pr1 s); pr2 = lambda _ _ A B ≡> lambda s -> case s | sigma a b => let branch=s : Eq (sigma (A := A) (B := B) a b) s; branch=s = ##DeBruijn 0; res : B (pr1 s); res = Eq_cast (p := branch=s) (f := lambda x -> B (pr1 x)) b; in res;
isContrΠ : (A : Type_ ?) ≡> (B : A -> Type_ ?) ≡> (h : (x : A) -> HoTT_isContr (B x)) -> HoTT_isContr ((x : A) -> B x); isContrΠ = lambda _ _ A B ≡> lambda h -> sigma (A := (x : A) -> B x) (B := (lambda (x : ((x : A) -> B x)) -> ((y : ((x : A) -> B x)) -> Eq x y))) (lambda x -> pr1 (h x)) (lambda g -> Eq_eq (f := lambda i ≡> lambda x -> Eq_uneq (p := (pr2 (h x)) (g x)) (i := i)));
A première vue, c’est peut-être lié à un problème similaire dans `hurkens.typer` (regardez la ligne 87). Pour faciliter la reproduction de ces bugs, j’ai attaché en pièce jointe un fichier qui contient tout le code que j’ai montré ci-dessus.
James