Coq 记录、证明无关性和John Major';s平等

Coq 记录、证明无关性和John Major';s平等,coq,dependent-type,Coq,Dependent Type,假设我有以下类型的记录: Record R (A : Type) (P : A -> Prop) := {val : A; prop : P val}. 为了证明这两个记录相等,只要证明它们的字段val相等即可(通过证明不相关): Goal forall A P (r1 r2 : R A P), val _ _ r1 = val _ _ r2 -> r1 = r2. destruct r1, r2. simpl. intro H. revert prop0. rewrite H.

假设我有以下类型的记录:

Record R (A : Type) (P : A -> Prop) := {val : A; prop : P val}.
为了证明这两个记录相等,只要证明它们的字段
val
相等即可(通过证明不相关):

Goal forall A P (r1 r2 : R A P), val _ _ r1 = val _ _ r2 -> r1 = r2.
destruct r1, r2.
simpl.
intro H.
revert prop0.
rewrite H.
intros.
f_equal.
apply proof_irrelevance.
Qed.
Require Import Coq.Logic.JMeq.

Record R (A : Type) (P : A -> Prop) := {val : A; prop : P val}.

Axiom contra : forall A1 A2 P1 P2 (r1 : R A1 P1) (r2 : R A2 P2),
JMeq (val _ _ r1) (val _ _ r2) -> JMeq r1 r2.

Goal False.
assert (H1 := contra nat nat (fun n => True) (eq 0) (Build_R _ _ 0 I) (Build_R _ _ 0 eq_refl)).
assert (H2 : R nat (fun n => True) = R nat (eq 0) :> Type).
{ now destruct H1. }
assert (H3 : forall r1 r2 : R nat (fun _ => True), r1 = r2).
{ rewrite H2. intros [n1 p1] [n2 p2].
  now destruct p1; destruct p2. }
specialize (H3 (Build_R _ _ 0 I) (Build_R _ _ 1 I)).
discriminate.
Qed.
对于约翰·梅杰的平等性,类似的目标是否可以证明(可能依赖于一个安全的公理)?以下是我失败的尝试:

Goal forall A1 A2 P1 P2 (r1 : R A1 P1) (r2 : R A2 P2),
JMeq (val _ _ r1) (val _ _ r2) -> JMeq r1 r2.
destruct r1, r2.
simpl.
intro H.
revert prop0.
Fail rewrite H.
不,它不是(当然,除了假设
为False
)。问题在于
JMeq
意味着类型相等:

Goal forall A P (r1 r2 : R A P), val _ _ r1 = val _ _ r2 -> r1 = r2.
destruct r1, r2.
simpl.
intro H.
revert prop0.
rewrite H.
intros.
f_equal.
apply proof_irrelevance.
Qed.
Require Import Coq.Logic.JMeq.

Record R (A : Type) (P : A -> Prop) := {val : A; prop : P val}.

Axiom contra : forall A1 A2 P1 P2 (r1 : R A1 P1) (r2 : R A2 P2),
JMeq (val _ _ r1) (val _ _ r2) -> JMeq r1 r2.

Goal False.
assert (H1 := contra nat nat (fun n => True) (eq 0) (Build_R _ _ 0 I) (Build_R _ _ 0 eq_refl)).
assert (H2 : R nat (fun n => True) = R nat (eq 0) :> Type).
{ now destruct H1. }
assert (H3 : forall r1 r2 : R nat (fun _ => True), r1 = r2).
{ rewrite H2. intros [n1 p1] [n2 p2].
  now destruct p1; destruct p2. }
specialize (H3 (Build_R _ _ 0 I) (Build_R _ _ 1 I)).
discriminate.
Qed.