考慮下面這個簡單的表達式語言問題:與相關類型的勒柯克證明助理
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