我试图证明以下平等:
Lemma Foo (A : Type) (n : nat) (gen : forall p : nat, p < S n -> A)
(ic0 : 0 < S n) (ic1 : 0 mod S n < S n):
gen (n - n) ic1 = gen 0 ic0.
n-n
在Nat.sub_diag
之前为0,而0 mod S n
在Nat.mod_0_l
之前也为0。但是我不能轻易地将这些引理应用于类型。我尝试了remember/rewrite/subst
的常用技巧,但subst
部分失败了:
remember (gen (n-n)) as Q.
remember (n-n) as Q1.
rewrite Nat.sub_diag in HeqQ1.
subst.
P.S。这个问题可能会使用更好的标题。请建议。
答案 0 :(得分:4)
subst
策略失败,因为remember
是错误的;我已经报告了这个错误here。 (作为一个理智,检查,使用abstract admit
来完成目标,其中admit
来自Coq.Compat.AdmitAxiom
,应该永远不会因类型错误而失败。如果确实如此,那就意味着&#39; sa Coq中的错误(或您正在使用的插件)。)
这是一个工作证明(在8.6.1和8.7 + beta2中测试):
Require Import Coq.Arith.Arith.
Lemma Foo (A : Type) (n : nat) (gen : forall p : nat, p < S n -> A)
(ic0 : 0 < S n) (ic1 : 0 mod S n < S n):
gen (n - n) ic1 = gen 0 ic0.
Proof.
revert ic0 ic1; simpl; rewrite Nat.sub_diag; intros ic0 ic1.
apply f_equal, le_unique.
Qed.
请注意,从某种意义上说,幸运的是n - n
和0 mod S n
在判断上是平等的。使用simpl
公开了这一事实,并允许rewrite
工作。