考虑下面这个简单的表达式语言问题:与相关类型的勒柯克证明助理
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
CASE表达式的列表。我明显的猜测是:
...
match Forall_dec (WF env) wfdec es with
...
但勒柯克拒绝这一提议,认为递归调用wfdec
是形成不良。我的问题是:是否可以在不改变表达式表示的情况下定义这种良好形式谓词的可判定性?
完整的工作代码位于以下gist。
这是一个典型的问题,由于subnested列表需要'exp'的不同归纳原理。我会尝试以谷歌为例。 – ejgallego