Ich bin auf ein Ziel stecken.Nachweisende Erhöhung Iota in Coq
Angenommen, wir die folgende Definition haben:
Fixpoint iota (n : nat) : list nat :=
match n with
| 0 => []
| S k => iota k ++ [k]
end.
Und wollen wir beweisen:
Theorem t1 : forall n, In n (iota n) -> False.
Proof.
intros.
induction n.
- cbn in H. contradiction.
- cbn in H. apply app_split in H.
Focus 2. unfold not. intros.
unfold In in H0. destruct H0. assert (~(n = S n)) by now apply s_inj.
contradiction.
apply H0.
apply IHn.
:
Theorem t1 : forall n, In n (iota n) -> False.
Bisher habe ich die folgenden Managed Ich habe diese beiden Lemmas benutzt, Beweise weggelassen:
Axiom app_split : forall A x (l l2 : list A), In x (l ++ l2) -> not (In x l2) -> In x l.
Axiom s_inj : forall n, ~(n = S n).
Allerdings bin ich ganz fest, ich brauche die irgendwie zeigen: In n (iota n)
vorausgesetzt In (S n) (iota n)
.
Interessant - wie geht man die Intuition dafür bekommen, wenn etwas mit seiner gegenwärtigen Formulierung unmöglich zu beweisen ist - ist es so, dass entweder einige der Annahmen oder die induktive Hypothese direkt (oder indirekt) im Widerspruch zu der Schlussfolgerung stehen würden? Oder gibt es eine Vorstellung von "nicht ausreichend/stark" genug Induktions-Hypothese? Wie kann man es sagen? (Das ist offensichtlich, wenn Sie es mir zeigen, aber das selbst herauszufinden ...) – Majha
Erleben Sie meistens. Aber wenn zwei Dinge im Gleichschritt sind oder ein Wert als Konstante festgelegt ist und Sie daran gehindert werden, die Induktions-Hypothese zu verwenden, ist das ein starker Geruch, den Sie vielleicht nach einer allgemeineren Aussage suchen möchten. [Dieser Blogpost] (https://homes.cs.washington.edu/~jrw12/InductionExercises.html) erstellt eine Reihe von Übungen, bei denen Sie die Induktions-Hypothese verallgemeinern müssen, damit sie funktioniert. Vielleicht möchtest du es untersuchen. – gallais
Vielen Dank! Grundsätzlich muss ich "git gud" :). – Majha