Coq 作为道具的唱片?

Coq 作为道具的唱片?,coq,Coq,我刚刚了解到,“record”关键字可用于定义道具类型,例如: Record Equivalence (A : Type) (R : relation A) : Prop := Build_Equivalence { Equivalence_Reflexive : Reflexive R; Equivalence_Symmetric : Symmetric R; Equivalence_Transitive : Transitive R } 但当我试图使用记录定义命题时,如

我刚刚了解到,“record”关键字可用于定义道具类型,例如:

Record Equivalence (A : Type) (R : relation A) : Prop := Build_Equivalence
  { Equivalence_Reflexive : Reflexive R;
    Equivalence_Symmetric : Symmetric R;
    Equivalence_Transitive : Transitive R }
但当我试图使用记录定义命题时,如:

Record proprecord : Prop := Build_proprecord
{
 Baa : nat; 
 Boo : Prop
}.
我从Coq得到以下信息:

proprecord is defined
Baa cannot be defined because it is informative and proprecord is not.
[cannot-define-projection,records]
Boo cannot be defined because it is informative and proprecord is not.
[cannot-define-projection,records]

有人能解释一下Coq在抱怨什么以及如何解决它吗?

对于类型在
Prop
中的字段,您只能获得投影函数(获取整个记录并返回单个字段的函数,如
fst
snd
),原因是您只能从
Prop
中获取
Prop
中的内容(对于所谓的内容有一些警告)。因此Coq警告您,它无法编写函数
Baa:proprecord->nat
Boo-proprecord->Prop

如果希望记录的行为类似于
exists
量词,则可以安全地忽略或消除这些警告

您可以使用
Prop
将类型压缩为
Prop
,这样您就可以编写

Record proprecord : Prop := Build_proprecord
{
 Baa : inhabited nat; 
 Boo : inhabited Prop
}.

如果这是你想要的,可以得到投影
Baa:proprecord->有人居住的nat
Boo:proprecord->有人居住的Prop

你能解释一下术语“投影函数”吗?@Kaind-see,投影函数获取整个记录并返回一个字段,类似于
fst
snd
do for
prod