使用Coq中的负归纳类型证明为假

时间:2015-07-05 01:17:35

标签: infinite-loop coq non-termination

CPDT的第三章简要讨论了为什么在Coq中禁止负归纳类型。如果我们有

Inductive term : Set :=
| App : term -> term -> term
| Abs : (term -> term) -> term.

然后我们可以轻松定义一个函数

Definition uhoh (t : term) : term :=
  match t with
    | Abs f => f t
    | _ => t
  end.

因此术语uhoh (Abs uhoh)将是非终止的,我们将能够证明每个定理"。

我理解非终止部分,但我不知道如何用它来证明任何事情。如何使用上面定义的False证明term

1 个答案:

答案 0 :(得分:4)

阅读你的问题让我意识到我也不太了解亚当的论点。但是在这种情况下的不一致很容易从Cantor的常见diagonal argument(逻辑上的悖论和谜题的永无止境的来源)中得到。请考虑以下假设:

Section Diag.

Variable T : Type.

Variable test : T -> bool.

Variables x y : T.

Hypothesis xT : test x = true.
Hypothesis yF : test y = false.

Variable g : (T -> T) -> T.
Variable g_inv : T -> (T -> T).

Hypothesis gK : forall f, g_inv (g f) = f.

Definition kaboom (t : T) : T :=
  if test (g_inv t t) then y else x.

Lemma kaboom1 : forall t, kaboom t <> g_inv t t.
Proof.
  intros t H.
  unfold kaboom in H.
  destruct (test (g_inv t t)) eqn:E; congruence.
Qed.

Lemma kaboom2 : False.
Proof.
  assert (H := @kaboom1 (g kaboom)).
  rewrite -> gK in H.
  congruence.
Qed.

End Diag.

这是一个通用开发,可以使用CPDT中定义的term类型进行实例化:T将是termxy将是term的两个元素我们可以测试区分(例如App (Abs id) (Abs id)Abs id)。关键点是最后一个假设:我们假设我们有一个可逆函数g : (T -> T) -> T,在您的示例中,它将是Abs。使用该函数,我们使用通常的对角化技巧:我们定义一个函数kaboom,它的构造不同于每个函数T -> T,包括它自己。由此产生了矛盾。