Tenir compte de la langue d'expression simple suivante:Problèmes avec types dépendants en assistant à la preuve Coq
Inductive Exp : Set :=
| EConst : nat -> Exp
| EVar : nat -> Exp
| EFun : nat -> list Exp -> Exp.
et son prédicat wellformedness:
Definition Env := list nat.
Inductive WF (env : Env) : Exp -> Prop :=
| WFConst : forall n, WF env (EConst n)
| WFVar : forall n, In n env -> WF env (EVar n)
| WFFun : forall n es, In n env ->
Forall (WF env) es ->
WF env (EFun n es).
qui stipule essentiellement que tous les symboles variables et fonctions doivent être définies dans l'environnement. Maintenant, je veux définir une fonction qui indique la décidabilité de WF
prédicat:
Definition WFDec (env : Env) : forall e, {WF env e} + {~ WF env e}.
refine (fix wfdec e : {WF env e} + {~ WF env e} :=
match e as e' return e = e' -> {WF env e'} + {~ WF env e'} with
| EConst n => fun _ => left _ _
| EVar n => fun _ =>
match in_dec eq_nat_dec n env with
| left _ _ => left _ _
| right _ _ => right _ _
end
| EFun n es => fun _ =>
match in_dec eq_nat_dec n env with
| left _ _ => _
| right _ _ => right _ _
end
end (eq_refl e)) ; clear wfdec ; subst ; eauto.
Le problème est de savoir comment affirmer que WF
prédicat détient ou non pour une liste d'expressions dans le cas EFun
. Je pense évidente était:
...
match Forall_dec (WF env) wfdec es with
...
Mais Coq refuse, en faisant valoir que l'appel récursif wfdec
est mal formé. Ma question est la suivante: est-il possible de définir la décidabilité d'un tel prédicat de bonne forme sans modifier la représentation de l'expression?
Le code de travail complet est le suivant: gist.
C'est le problème typique qui nécessite un principe d'induction différent pour 'exp' en raison de la liste sous-localisée. Je vais essayer de google pour un exemple. – ejgallego