【发布时间】:2017-04-17 14:24:01
【问题描述】:
考虑以下简单的表达语言:
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。
【问题讨论】:
-
这是典型的问题,由于子嵌套列表,需要对
exp进行不同的归纳原则。我会尝试谷歌的例子。
标签: coq dependent-type