Доказательство неуместности в целом не подразумевается теорией, стоящей за Coq. Даже доказательство несоответствия равенству не подразумевается; это эквивалентно аксиоме К STREICHER в . Оба могут быть добавлены в качестве аксиом .
Существуют разработки, в которых полезно рассуждать об объектах доказательства, и несоответствие доказательства делает это почти невозможным. Можно утверждать, что в этих разработках должны быть все объекты, структура которых имеет значение Set
, но с базовой теорией Coq такая возможность есть.
Существует важная часть доказательства несоответствия, которая всегда имеет место. Аксиома Штрейхера K всегда выполняется в разрешимых областях, т. Е. Доказательства равенства на разрешимых множествах единственны. Общее доказательство находится в Eqdep_dec
модуле в стандартной библиотеке Coq. Вот ваша теорема как следствие (мое доказательство здесь не обязательно самое элегантное):
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.
Для этого особого случая вот прямое доказательство (вдохновленное общим доказательством в Eqdep_dec.v
). Во-первых, определим, что мы определяем каноническое доказательство true=b
(как обычно в Coq, проще сначала иметь константу). Затем мы показываем, что любое доказательство true=b
должно быть 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.
Если вы добавите классическую логику в Coq, вы получите доказательство неуместности. Говоря интуитивно, классическая логика дает вам оракул решения для предложений, и этого достаточно для аксиомы K. В модуле стандартной библиотеки Coq есть доказательство Classical_Prop
.