考虑以下简单的表达语言:
Inductive Exp : Set :=
| EConst : nat -> Exp
| EVar : nat -> Exp
| EFun : nat -> list Exp -> Exp.
及其格式良好的谓词:
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).
它基本上规定每个变量和函数符号都必须在环境中定义。现在,我想定义一个函数来说明WF
谓词:
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.
问题是如何表述WF
谓词是否适用于表达式列表EFun
案件。我的明显猜测是:
...
match Forall_dec (WF env) wfdec es with
...
但 Coq 拒绝了,认为递归调用wfdec
格式不正确。我的问题是:是否可以在不改变表达式表示的情况下定义这种格式良好谓词的可判定性?
完整的工作代码如下gist https://gist.github.com/rodrigogribeiro/132e4feca910f40198242d3da3eca040.