2017-07-23 2 views
2

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).

Antwort

3

Wie Sie die Tatsache beobachtet haben, dass die n in In n und der in iota n in Lockstep in Ihrer Erklärung sind, macht die harte Induktionsvoraussetzung aufzurufen (wenn nicht sogar völlig nutzlos).

Der Trick hier ist, eine allgemeinere Aussage zu beweisen, als die, die Sie tatsächlich interessiert, die diese Abhängigkeit zwischen den zwei n s bricht. Ich würde vorschlagen:

Theorem t : forall n k, n <= k -> In k (iota n) -> False. 

, von dem Sie t1 als logische Folge ableiten können:

Corollary t1 : forall n, In n (iota n) -> False. 
intro n; apply (t n n); reflexivity. 
Qed. 

Wenn man sich den Beweis t spähen möchten, können Sie have a look at this self-contained gist

+0

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

+2

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

+0

Vielen Dank! Grundsätzlich muss ich "git gud" :). – Majha