2017-06-23 4 views
2

現在、CoqのRed-Black Treesで遊んでいて、natのリストを注文して、MSetRBTモジュールを使用して赤黒のツリーに保存できるようにしたいと考えています。そのためCoq/SSreflectで注文されたseq

示すように、私はseq_ltを定義している:

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. 

はこれまでのところ、私は示すことができた:

Lemma lt_not_refl p : seq_lt p p = false. 
Proof. 
    elim: p => //= ? ?; by rewrite eq_refl. 
Qed. 

など

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. 

しかし、私は次のことを証明するのに苦労しています:

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の定義に問題はありますか?

+2

注意事項証明スタイルに:インデントをご確認ください。 'by'はターミネータです(' by tac1; tac2.' wrong: 'tac1; by tac2'); 'move =>'は 'move =>'より優先されます。 'case:(a ejgallego

+1

@ejgallego:ありがとう、ありがとう! – VHarisop

答えて

4

私は誘導とあなたの問題が何であるかわからないが、証明は簡単なようだ:

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. 

あなたはつもり利用受注している場合は、その目的にssreflectを拡張するライブラリの一部を使用汝、私がお勧め。私はシリル・コーエンがギターの開発をしたことを思い出しているようです。注文の補題がmathcomp(例ltn_neqAle)でわずかに異なる形を持っていることに注意してくださいので、あなたも行うことができます。これは、書き換え用のビットがより良い仕事ができる

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. 

p.s:私はあなたの第二の補題のため、この証明をお勧め:

Lemma lt_not_eqseq p q : seq_lt p q -> p != q. 
Proof. by apply: contraTneq => heq; rewrite heq lt_not_refl. Qed. 
関連する問題