【发布时间】:2012-09-05 05:04:54
【问题描述】:
在简单类型的 lambda 演算中类型推导是唯一的证明在纸上是微不足道的。我熟悉的证明是通过对类型推导的完全归纳来进行的。但是,我无法证明类型派生(通过 类型派生的类型表示)是唯一的。这里,如果变量x 在环境Γ 中具有τ 类型,则谓词dec Γ x τ 为真。类型谓词 J 像往常一样定义,只是读取简单类型 lambda 演算的类型规则:
Inductive J (Γ : env) : term → type → Set :=
| tvar : ∀ x τ, dec Γ x τ → J γ (var x) τ
| tabs : ∀ τ₁ τ₂ e, J (τ₁ :: γ) e τ₂ → J γ (abs τ₁ e) (arr τ₁ τ₂)
| tapp : ∀ τ₁ τ₂ e₁ e₂, J γ e₁ (arr τ₁ τ₂) → J γ e₂ τ₁ → J γ (app e₁ e₂) τ₂.
在证明类型派生是唯一的时,我无法公开 J 类型的术语的结构。例如,我可以在以下引理中对d1 或d2 进行归纳,但不能对d1 进行归纳,然后破坏d2,反之亦然。 Coq 给出的错误消息(对术语进行抽象会导致输入错误的术语)有点模糊,并且 Coq wiki 没有提供任何帮助。作为参考,这是我试图证明的引理:
Lemma unique_derivation : ∀ Γ e τ (d₁ d₂ : J Γ e τ), d₁ = d₂.
我在归纳术语时没有问题,例如,在证明类型是唯一的时。
编辑:我添加了最少数量的定义来说明我遇到问题的结果。作为对 huitseeker 评论的回应,我选择了 J 类型,因为我想将派生类型作为结构化对象进行推理,以便执行提取等操作并证明唯一性等结果,这是我以前在 Coq 中没有做过的。
针对评论的第一部分,我可以在d1 或d2 上执行induction,但在执行induction 之后 我不能使用destruct,@ 987654339@,或induction 剩余期限。这意味着我不能同时公开d1 和d2 的结构来推理这两个证明树。当我尝试这样做时收到的错误是,对剩余术语进行抽象会导致术语类型错误。
Require Import Unicode.Utf8.
Require Import Utf8_core.
Require Import List.
Inductive type : Set :=
| tau : type
| arr : type → type → type.
Inductive term : Set :=
| var : nat → term
| abs : type → term → term
| app : term → term → term.
Definition dec (Γ : list type) x τ : Prop :=
nth_error γ x = Some τ.
Inductive J (Γ : list type) : term → type → Set :=
| tvar : ∀ x τ, dec Γ x τ → J Γ (var x) τ
| tabs : ∀ τ₁ τ₂ e, J (τ₁ :: Γ) e τ₂ → J Γ (abs τ₁ e) (arr τ₁ τ₂)
| tapp : ∀ τ₁ τ₂ e₁ e₂, J Γ e₁ (arr τ₁ τ₂) → J Γ e₂ τ₁ → J Γ (app e₁ e₂) τ₂.
Lemma derivations_unique : ∀ Γ e τ (d1 d2 : J Γ e τ), d1 = d2.
Proof. admit. Qed.
我尝试过使用dependent induction 和Coq.Logic 库中的几个结果,但没有成功。推导是独一无二的,这似乎是一个容易证明的命题。
【问题讨论】:
-
请更准确地说您尝试过的内容('a term which is ill-typed' 对于您的特定问题可能有多种含义 - 是 Coq 还是您进行打字?-,您使用 destruct 作为动词,但这可能意味着
case、destruct或其他)。最后,您确定J的类型吗?你熟悉预测性的概念吗? -
我熟悉谓词的概念,
Set在 Coq 中是谓词。我有限的理解向我表明这不是问题。我编辑了原始帖子以反映陈述定理所需的最小发展,并尝试更详细地描述我遇到的问题。 -
@huitseeker “类型错误”可识别为 Coq 错误,但实际证明尝试和准确错误消息的复制粘贴确实会受到赞赏。如果您想将它们作为一流的对象进行推理,那么在
Set中包含J是正确的,比如证明它们的唯一性。
标签: lambda-calculus coq