铸造可转换类型的coq

时间:2015-11-05 05:23:46

标签: types casting coq

以下内容:

Lemma test:
  forall n j  (jn : j < n)  (ln : j + 0 < n) (P:  forall {x} {y}, (x<y) -> nat),
    P ln = P jn.

类型 ln jn 似乎可以相互转换(从算术的角度来看)。我怎样才能用这个事实证明上面的引理?我很容易证明assert(JL: j < n -> j + 0 < n) by auto.但我没有看到如何将其应用于类型

2 个答案:

答案 0 :(得分:2)

类型可以相互转换,因为在Coq中定义自然数的加法(即通过第一个参数的递归)。事实上,你的引理可以在Coq中输入的唯一原因是P的第一个隐式参数被实例化为右侧的j + 0

不幸的是,即使这些类型 可以转换,也不可能在没有其他假设的情况下证明这个引理,因为它需要命题扩展性的公理(参见{例如{3}}。

答案 1 :(得分:2)

引理不可证明。试试intros. remember (j+0) as Q. rewrite <- plus_n_O in HeqQ. subst Q.它将摆脱+ 0。你现在的目标是

P j n ln = P j n jn

双方属于nat类型。但是现在你需要证明这两个nat是相同的,而不知道关于它们的任何其他内容......

编辑:

实际上我太快了......函数P的值不能取决于lnjn,因为它们是Prop s。但要证明这一点,你需要proof irrelevance

如果你做Require Import ProofIrrelevance.,你会得到公理

Axiom proof_irrelevance : forall (P:Prop) (p1 p2:P), p1 = p2.

这不是Coq逻辑的结果,但它与它一致(并且通常就是我们对证明的意思 - 即使它们在细节上有所不同,两个正式的正确论证也同样正确)。

现在你做了

rewrite (proof_irrelevance _ ln jn). reflexivity. Qed.