Coq依赖于重写的类型错误

时间:2017-05-11 15:13:19

标签: 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: subset_leq_card.
  have H3 : k = #|'I_k|.
    by rewrite card_ord.
  (* Only goal left: #|S| <= k *)
  rewrite H3 (* <--- this fails *)
Admitted.

最后一次重写失败,并显示错误消息:

  

错误:重写(fun _pattern_value_ : nat => is_true (#|S| <= _pattern_value_)

时出现依赖类型错误

有关重写失败原因或对此错误消息的解释的任何想法吗?

1 个答案:

答案 0 :(得分:4)

重写失败的原因是kS中显示为隐藏参数,因此通过重写您使目标输入错误的所有事件。您可以使用Set Printing All

进行检查
by rewrite {5}H3.

将关闭你的目标。请注意,mathcomp中不鼓励以H1...Hn样式命名目标。您的缩进也不遵循math-comp样式,您可能希望使用exact:代替by apply:

使用max_card

,您的证明也可以缩短
by rewrite -{8}(card_ord k) max_card.

by rewrite -[k in _ <= k]card_ord max_card.

您还可以使用更通用的,不需要指定索引:

suff: #|[set i : 'I_k | P i]| <= #|'I_k| by rewrite card_ord.
exact: max_card.

避免索引修补的另一种方法是依靠传递性:

by rewrite (leq_trans (max_card _)) ?card_ord.

因人而异。