Ich spiele gerade mit Red-Black Trees in Coq und möchte Listen von nat
mit einer Bestellung ausstatten, so dass sie an einem rot-schwarzen Baum mit dem MSetRBT
Modul gespeichert werden können.Bestellte Reihenfolge in Coq/SSreflect
Aus diesem Grund habe ich seq_lt
wie gezeigt definiert:
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.
Bisher habe ich zu zeigen geschafft: Allerdings
Lemma lt_not_refl p : seq_lt p p = false.
Proof.
elim: p => //= ? ?; by rewrite eq_refl.
Qed.
sowie
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.
Ich habe Mühe, folgendes zu beweisen:
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.
Ich bin nicht einmal sicher, ob das letzte Lemma mit Induktion machbar ist, aber ich bin seit ein paar Stunden dabei und habe keine Ahnung, wohin ich von diesem Punkt aus gehen soll. Ist die Definition von seq_lt
problematisch?
Hinweise zum Beweis Stil: Einbuchtung überprüfen; 'by' ist ein Terminator (richtig' durch tac1; tac2' falsch: 'tac1; nach tac2'); 'move =>' wird bevorzugt mit 'move =>'; ähnlich für "case: (a ejgallego
@ejgallego: Bekannt, danke! – VHarisop