首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Coq/SSreflect中的有序序号

Coq/SSreflect中的有序序号
EN

Stack Overflow用户
提问于 2017-06-24 07:29:00
回答 1查看 157关注 0票数 2

我目前正在使用Coq中的红黑树,并希望为nat列表配备一个订单,以便可以使用MSetRBT模块将它们存储在红黑树中。

因此,我定义了seq_lt,如下所示:

代码语言:javascript
复制
Fixpoint seq_lt (p q : seq nat) := match p, q with
  | _, [::] => false
  | [::], _ => true
  | h :: p', h' :: q' =>
    if h == h' then seq_lt p' q'
    else (h < h')
end.

到目前为止,我已经成功地展示了:

代码语言:javascript
复制
Lemma lt_not_refl p : seq_lt p p = false.
Proof.
  elim: p => //= ? ?; by rewrite eq_refl.
Qed.

以及

代码语言:javascript
复制
Lemma lt_not_eqseq : forall p q, seq_lt p q -> ~(eqseq p q).
Proof.
  rewrite /not. move => p q.
  case: p; case: q => //= a A a' A'.
  case: (boolP (a' == a)); last first.
  - move => ? ?; by rewrite andFb.
  - move => a'_eq_a A'_lt_A; rewrite andTb eqseqE; move/eqP => Heq.
    move: A'_lt_A; by rewrite Heq lt_not_refl.
Qed.

然而,我正在努力证明以下几点:

代码语言:javascript
复制
Lemma seq_lt_not_gt p q : ~~(seq_lt q p) -> (seq_lt p q) || (eqseq p q).
Proof.
  case: p; case: q => // a A a' A'.
  case: (boolP (a' < a)) => Haa'.
  - rewrite {1}/seq_lt.
    suff -> : (a' == a) = false by move/negP => ?.
    by apply: ltn_eqF.
  - rewrite -leqNgt leq_eqVlt in Haa'.
    move/orP: Haa'; case; last first.
    + move => a_lt_a' _; apply/orP; left; rewrite /seq_lt.
      have -> : (a == a') = false by apply: ltn_eqF. done.
    + (* What now? *)
Admitted.

我甚至不确定最后一个引理是否可以使用归纳法,但我已经在它上面几个小时了,不知道从这一点到哪里去。seq_lt的定义有问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-24 09:13:16

我不确定你在归纳法上有什么问题,但证据似乎很简单:

代码语言:javascript
复制
Local Notation "x < y" := (seq_lt x y).
Lemma seq_lt_not_gt p q : ~~ (q < p) = (p < q) || (p == q).
Proof.
elim: p q => [|x p ihp] [|y q] //=; rewrite [y == x]eq_sym eqseq_cons.
by case: ifP => h_eq; [exact: ihp | rewrite orbF ltnNge leq_eqVlt h_eq negbK].
Qed.

如果你要使用orders,我建议你使用一些扩展ssreflect的库;我似乎记得Cyril Cohen在github上有一个开发。请注意,orders上的引理在mathcomp中的形式略有不同(例如ltn_neqAle),因此您也可以这样做:

代码语言:javascript
复制
Lemma lts_neqAltN p q : (q < p) = (q != p) && ~~ (p < q).
Proof.
elim: p q => [|x p ihp] [|y q] //=; rewrite eqseq_cons [y == x]eq_sym.
by case: ifP => h_eq; [apply: ihp | rewrite ltnNge leq_eqVlt h_eq].
Qed.

这对于重写来说可能会更好一些。

附注:对于你的第二个引理,我建议用这个证明:

代码语言:javascript
复制
Lemma lt_not_eqseq p q : seq_lt p q -> p != q.
Proof. by apply: contraTneq => heq; rewrite heq lt_not_refl. Qed.
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44731224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档