2012-12-29 9 views
5

Ich versuche, einen Programmierstil zu entwickeln, die auf die Verhinderung schlechten Eingang so schnell wie möglich basiert. statt die folgenden plausible Definition für die Vorgänger-Funktion auf den natürlichen Zahlen Zum Beispiel:Wie verwende ich in einem Zweig eines Matchblocks die Assertion, dass der übereinstimmende Ausdruck dem Datenkonstruktorausdruck des Zweigs entspricht?

Definition pred1 n := 
    match n with 
    | O => None 
    | S n => Some n 
    end. 

ich mag es wie folgt schreiben:

Theorem nope n (p : n = O) (q : n <> O) : False. 
    contradict q. 
    exact p. 
Qed. 

Definition pred2 n (q : n <> O) := 
    match n with 
    | S n => n 
    | O => 
     let p := _ in 
     match nope n p q with end 
    end. 

Aber ich habe keine Ahnung, was _ zu ersetzen . Meine Intuition schlägt mir vor, dass es assumption : n = O in der | O => Verzweigung verfügbar sein muss. Führt Coq tatsächlich eine solche Annahme ein? Wenn ja, wie heißt es?

Antwort

5

Coq nicht automatisch eine solche Hypothese einführen, aber Sie können es explizit einzuführen, indem die vollständige Form des match Konstruktion mit:

Definition pred2 n (q : n <> O) := 
    match n as n' return n = n' -> nat with 
    | S p => fun _ => p 
    | O => fun Heq => match q Heq with end 
    end (eq_refl n). 

Erläuterungen:

  • return führt eine Typanmerkung mit der Typ des gesamten Ausdrucks match ... end;
  • as stellt einen Variablennamen, die in dieser Art Annotation verwendet werden kann und wird mit der linken Seite in jedem Zweig, substituiert sein. Hier,
    • im ersten Zweig, hat die rechte Seite Typ n = S p -> nat;
    • im zweiten Zweig weist die rechte Seite n = O -> nat eingeben. Daher hat q Heq den Typ False und kann angepasst werden.

Weitere Informationen im reference manual, im Kapitel über Extended pattern-matching.

+0

Es scheint mir, dass wir das Problem der Einführung der Annahme verschoben haben, dass 'n = O' in der' | O => 'verzweige zu dem Problem, die Annahme einzuführen, dass" n = n "auf der Ebene des gesamten Übereinstimmungsblocks ist. Dies zeigt sich in Ihrem Rückgabetyp 'pred2', der nicht derselbe ist wie der von mir. – pyon

+2

Es scheint, dass Stéphane im Beweis passieren vergessen: nur nach dem letzten 'end', fügen Sie' (eq_refl n) 'im Argumente vom Typ passieren' n = n'''. – Ptival

+0

Ah okay! Antwort angenommen! – pyon