[英]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.
的nn
是0通過Nat.sub_diag
和0 mod S n
也為0通過Nat.mod_0_l
。 但是,我不能輕易將這些引理應用於類型。 我嘗試了remember/rewrite/subst
通常技巧,但是subst
部分失敗了:
remember (gen (n-n)) as Q.
remember (n-n) as Q1.
rewrite Nat.sub_diag in HeqQ1.
subst.
PS此問題可能使用更好的標題。 請提出建議。
subst
策略失敗了,因為remember
是越野車。 我在這里報告了這個錯誤。 ( Coq.Compat.AdmitAxiom
理智,請使用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 - n
和0 mod S n
在判斷上是相等的。 使用simpl
揭示這一事實,並允許rewrite
工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.