Coq 中的 forall 平等

forall equality in 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 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。这个问题可能使用更好的标题。请提出建议。

subst 策略失败,因为 remember 有问题;我已经报告了这个错误 here。 (作为理智,检查一下,用 abstract admit 完成一个目标,其中 admit 来自 Coq.Compat.AdmitAxiom,应该永远不会因类型错误而失败。如果是这样,那就意味着 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 工作。