Пример для различных доказательств равенства
Я ищу пример в Coq для различных доказательств равенства.
Это значит:
Дайте некоторый тип T и два элемента x , y : T и два доказательства p1, p2 : x=y с p1p2.
1 ответов
это классический пример неполноты в Coq. В своей основной теории (то есть, без каких-либо дополнительных аксиом), невозможно доказать или опровергнуть следующее утверждение:
exists (T : Type) (x y : T) (p q : x = y), p <> q.
таким образом, мы обычно не можем демонстрировать разные доказательства равенства между двумя точками. Что это означает на практике? Если вы хотите использовать теорию Coq как есть, вы должны избегать разговоров о равенствах между доказательствами равенства, потому что нет ничего очень полезного, с чем мы можем сделать их. Единственным исключением являются типы с разрешимым равенством, для которых мы можем доказать forall x y : T, x = y \/ x <> y
; в таких случаях мы можем показать единство доказательств идентичности:
UIP : forall (x y : T) (p q : x = y), p = q.
если мы готовы добавить аксиомы, история изменений. Одна из аксиом, которую мы можем добавить, -доказательство ненужности, обобщение UIP
принцип выше. Тут написано
proof_irrelevance : forall (P : Prop) (p q : P), p = q.
теория Кока была разработана, чтобы позволить такую аксиому без возникновения противоречия, и многие события этого. В таком случае ...--6--> выполняется для всех типов, а не только для тех, которые имеют разрешимое равенство.
С другой стороны, есть are полезные аксиомы, которые мы можем добавить, несовместимы с UIP. Самый известный из них -univalence аксиома С теория Гомотопий, что примерно говорит о том, что для всех типов A
и B
существует взаимно однозначное соответствие между доказательствами равенства A = B
и эквивалентных между A
и B
-- то есть, функции A -> B
которые имеют двусторонний обратный. Вот упрощенная версия, просто чтобы объяснить основную идею:
Record Equiv (A B : Type) : Type := {
equiv_l : A -> B;
equiv_r : B -> A;
_ : forall x, equiv_l (equiv_r x) = x;
_ : forall x, equiv_r (equiv_l x) = x
}.
Axiom univalence : forall A B, Equiv (A = B) (Equiv A B).
если мы примем эту аксиому, мы можем показать, например, что есть два разных доказательства равенства в bool = bool
: один, соответствующий функции тождества, и другой, соответствующий логическому отрицанию:
Definition id_Equiv : Equiv bool bool.
Proof.
apply (BuildEquiv _ _ (fun x => x) (fun x => x)); trivial.
Defined.
Definition negb_Equiv : Equiv bool bool.
Proof.
apply (BuildEquiv _ _ negb negb); intros []; trivial.
Defined.
Lemma not_UIP : exists p q : bool = bool :> Type , p <> q.
Proof.
exists (equiv_r _ _ (univalence bool bool) id_Equiv).
exists (equiv_r _ _ (univalence bool bool) negb_Equiv).
intros H.
assert (H' : id_Equiv = negb_Equiv).
{ now rewrite <- (equiv_lr _ _ (univalence bool bool)), <- H,
(equiv_lr _ _ (univalence bool bool)). }
assert (H'' : equiv_l _ _ id_Equiv true = equiv_l _ _ negb_Equiv true).
{ now rewrite H'. }
simpl in H''. discriminate.
Qed.
имейте в виду, что фактическое определение унивалентности более запутанно, чем то, которое я дал выше, в котором я даже не совсем уверен. Вы не можете просто скопировать то, что я дал выше, и ожидать, что он будет работать гладко. Для реального определения, см. IsEquiv
здесь и isequiv_equiv_path
здесь. Если вы хотите использовать аксиому, лучше работать с одной из библиотек теории Гомотопических типов, доступных в интернете:Хотт и