Der Beweis der Irrelevanz im Allgemeinen wird von der Theorie hinter Coq nicht impliziert. Sogar der Beweis der Irrelevanz für die Gleichheit ist nicht impliziert. es ist äquivalent Streicher Axiom K . Beide können als Axiome hinzugefügt werden .
Es gibt Entwicklungen, in denen es nützlich ist, über Beweisobjekte zu argumentieren, und Beweisunrelevanz macht dies nahezu unmöglich. Möglicherweise sollten diese Entwicklungen alle Objekte enthalten, deren Struktur neu Set
formuliert werden soll, aber mit der grundlegenden Coq-Theorie ist die Möglichkeit gegeben.
Es gibt eine wichtige Untergruppe von Beweisen, die immer irrelevant ist. Streichers Axiom K gilt immer für entscheidbare Bereiche, dh Gleichheitsnachweise für entscheidbare Mengen sind eindeutig. Der allgemeine Beweis befindet sich im Eqdep_dec
Modul in der Coq-Standardbibliothek. Hier ist Ihr Theorem als Konsequenz (mein Beweis hier ist nicht unbedingt der eleganteste):
Require Bool.
Require Eqdep_dec.
Theorem bool_pirrel : forall (b : bool) (p1 p2 : b = true), p1 = p2.
Proof.
intros; apply Eqdep_dec.eq_proofs_unicity; intros.
destruct (Bool.bool_dec x y); tauto.
Qed.
Für diesen speziellen Fall ist hier ein direkter Beweis (inspiriert durch den allgemeinen Beweis in Eqdep_dec.v
). Zuerst definieren wir einen kanonischen Beweis von true=b
(wie in Coq üblich, ist es einfacher, die Konstante zuerst zu haben). Dann zeigen wir, dass jeder Beweis true=b
dafür sein muss refl_equal true
.
Let nu b (p:true = b) : true = b :=
match Bool.bool_dec true b with
| left eqxy => eqxy
| right neqxy => False_ind _ (neqxy p)
end.
Lemma bool_pcanonical : forall (b : bool) (p : true = b), p = nu b p.
Proof.
intros. case p. destruct b.
unfold nu; simpl. reflexivity.
discriminate p.
Qed.
Wenn Sie Coq mit klassischer Logik erweitern, erhalten Sie den Beweis der Irrelevanz. Intuitiv ausgedrückt gibt Ihnen die klassische Logik ein Entscheidungsorakel für Aussagen, und das ist gut genug für Axiom K. Das Coq-Standardbibliotheksmodul enthält einen Beweis Classical_Prop
.