Coq中的平等

时间:2017-10-11 00:19:22

标签: coq

我试图证明以下平等:

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-nNat.sub_diag之前为0,而0 mod S nNat.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。这个问题可能会使用更好的标题。请建议。

1 个答案:

答案 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 - n0 mod S n在判断上是平等的。使用simpl公开了这一事实,并允许rewrite工作。