以下内容:
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.
但我没有看到如何将其应用于类型。
答案 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
的值不能取决于ln
和jn
,因为它们是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.