重写中与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.