Coq 作为道具的唱片?
我刚刚了解到,“record”关键字可用于定义道具类型,例如: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 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 forprod
。