Пример для различных доказательств равенства

Я ищу пример в 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 здесь. Если вы хотите использовать аксиому, лучше работать с одной из библиотек теории Гомотопических типов, доступных в интернете:Хотт и . Обратите внимание, что первый из них на самом деле слегка модифицированная версия Coq.