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?
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
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
Ah okay! Antwort angenommen! – pyon