重写中与Coq相关的类型错误
我正在使用数学组件库,并试图证明这一点:重写中与Coq相关的类型错误,coq,ssreflect,Coq,Ssreflect,我正在使用数学组件库,并试图证明这一点: Lemma card_sub_ord (k : nat) (P : nat -> bool) : #|[set i : 'I_k | P i]| <= k. Proof. set S := [set i : 'I_k | P i]. have H1 : S \subset 'I_k. by apply: subset_predT. have H2 : #|S| <= #|'I_k|. by apply:
Lemma card_sub_ord (k : nat) (P : nat -> bool) :
#|[set i : 'I_k | P i]| <= k.
Proof.
set S := [set i : 'I_k | P i].
have H1 : S \subset 'I_k.
by apply: subset_predT.
have H2 : #|S| <= #|'I_k|.
by apply: subset_leq_card.
have H3 : k = #|'I_k|.
by rewrite card_ord.
(* Only goal left: #|S| <= k *)
rewrite H3 (* <--- this fails *)
Admitted.
引理卡片(k:nat)(P:nat->bool):
#|[set i:'i_k | P i]
重写失败的原因是
k
在S
中显示为一个隐藏参数,因此通过重写所有事件,可以使目标类型错误。您可以使用Set Printing All
进行检查
by rewrite {5}H3.
这将实现你的目标。请注意,mathcomp不鼓励使用H1…Hn
样式命名目标。您的缩进也不符合math comp样式,您可能希望使用exact:
代替by apply:
使用max\u卡
,您的证明也可以缩短:
by rewrite -{8}(card_ord k) max_card.
或
YMMV.重写失败的原因是
k
在S
中显示为一个隐藏参数,因此通过重写所有事件,您会使目标类型错误。您可以使用Set Printing All
进行检查
by rewrite {5}H3.
这将实现你的目标。请注意,mathcomp不鼓励使用H1…Hn
样式命名目标。您的缩进也不符合math comp样式,您可能希望使用exact:
代替by apply:
使用max\u卡
,您的证明也可以缩短:
by rewrite -{8}(card_ord k) max_card.
或
YMMV
by rewrite (leq_trans (max_card _)) ?card_ord.