2012-05-21 6 views
7

Kann mir bitte jemand ein einfaches Beispiel für existentielle Instanziierung und existenzielle Generalisierung in Coq geben? Wenn ich exists x, P beweisen möchte, wo P ist einige Prop, die x verwendet, möchte ich oft x (wie x0 oder einige solcher) nennen, und manipulieren P. Kann dies eine in Coq sein?existentielle Instanziierung und Verallgemeinerung in Coq

+0

ich weiß, dass es in der Vergangenheit coq Fragen hier, aber ich vermute, dass da mehr Websites, um den besten Platz für coq Fragen eingeführt werden, ist jetzt http://cs.stackexchange.com/ (nicht so glücklich mit die Fragmentierung selbst, aber es ist eine Tatsache des Lebens ...) –

+3

@andrewcooke [Dies wurde nicht abschließend festgestellt.] (http://meta.cs.stackexchange.com/questions/52/scope-limits-on- proof-assistants-eg-coq) Mein Gefühl ist, dass Coq-Fragen mehr zum Thema von SO gehören, wenn das Ziel ist, einen Beweis zu bekommen, und auf [cs.se], wenn das Ziel ist zu verstehen, warum eine Proof-Technik funktioniert oder nicht funktioniert, aber es ist eine sehr dünne Linie. Die Expertise ist über [so], [cs.se] und [cstheory.se] verbreitet. – Gilles

Antwort

5

Wenn Sie das Existential direkt und nicht durch ein Lemma beweisen möchten, können Sie eapply ex_intro verwenden. Dies führt eine existentielle Variable ein (geschrieben ?42). Sie können dann den Begriff manipulieren. Um den Beweis zu vervollständigen, müssen Sie eventuell einen Weg finden, einen Wert für diese Variable zu konstruieren. Sie können dies explizit mit der Taktik instantiate oder implizit durch Taktiken wie eauto tun.

Beachten Sie, dass es oft mühsam ist, mit existenziellen Variablen zu arbeiten. Viele Taktiken gehen davon aus, dass alle Begriffe instanziiert werden und möglicherweise Existenzen in Teilzielen verbergen. Sie werden nur herausfinden, wenn Qed Ihnen sagt "Fehler: Versuch, einen unvollständigen Beweis zu speichern". Sie sollten nur dann existentielle Variablen verwenden, wenn Sie einen Plan haben, sie in Kürze zu instanziieren.

Hier ist ein dummes Beispiel, das die Verwendung von eapply veranschaulicht.

Goal exists x, 1 + x = 3. 
Proof.      (* ⊢ exists x, 1 + x = 3 *) 
    eapply ex_intro.   (* ⊢ 1 + ?42 = 3 *) 
    simpl.      (* ⊢ S ?42 = 3 *) 
    apply f_equal.    (* ⊢ ?42 = 2 *) 
    reflexivity.    (* proof completed *) 
Qed. 
+0

Mit Coq trunk können Sie uninstantiierte Existenziale am Ende des Proofs in Teilziele umwandeln - was ich mir lange gewünscht habe. –

+0

Ein Zusatz zu [dem vorherigen Kommentar] (https://stackoverflow.com/questions/10686164/existential-instantiation-and-generalization-in-coq#comment13933112_10693631): dies kann mit ['Grab Existential Variables.' getan werden] (https://coq.inria.fr/refman/Reference-Manual009.html#GrabEvars) –