Coq 错误:非法应用程序(非功能性构造)

Coq 错误:非法应用程序(非功能性构造),coq,Coq,我正试图使用HoTT书中的类型构造函数/消除器来证明各种demorgan定律。我已经跳过挑选相关的东西,并将其全部转储到一个.v文本文件中。我需要产品、副产品的消除/引入规则以及设置否定的方法。到目前为止, Definition idmap {A:Type} (x:A) : A := x. Inductive prod {A B:Type} : Type := pair : A -> B -> @prod A B. Notation "x * y" := (prod x y) :

我正试图使用HoTT书中的类型构造函数/消除器来证明各种demorgan定律。我已经跳过挑选相关的东西,并将其全部转储到一个.v文本文件中。我需要产品、副产品的消除/引入规则以及设置否定的方法。到目前为止,

Definition idmap {A:Type} (x:A) : A := x.

Inductive prod {A B:Type} : Type := pair : A -> B -> @prod A B.

Notation "x * y" := (prod x y) : type_scope.

Section projections.
  Context {A : Type} {B : Type}.
  Definition fst (p: A * B ) :=
    match p with
      | (x , y) => x
    end.

  Definition snd (p:A * B ) :=
    match p with
      | (x , y) => y
    end.
End projections.
“定义fst(p:A*B):=”上的错误为


我尝试在Coq站点上搜索错误列表,但没有找到任何内容。

您的代码有两个问题:

  • prod
    的两个
    Type
    参数声明为隐式
因此,符号
“x*y”
对应于
prod{{u}{u}x y
,这将总是导致类型错误的术语:
prod{u}{u}
是一种
类型
,因此对其应用某些内容是没有意义的

解决方法是将这两个隐式参数转换为显式参数:

Inductive prod (A B:Type) : Type := pair : A -> B -> @prod A B.
  • 符号
    (x,y)
    尚未声明
一旦您修复了
prod
的定义,该定义仍然不会进行类型检查,因为Coq不知道您所说的模式
(x,y)
是什么意思。您可以在
节投影之前将其声明为新符号,如下所示:

Notation "x , y" := (pair _ _ x y) (at level 10).

您的代码有两个问题:

  • prod
    的两个
    Type
    参数声明为隐式
因此,符号
“x*y”
对应于
prod{{u}{u}x y
,这将总是导致类型错误的术语:
prod{u}{u}
是一种
类型
,因此对其应用某些内容是没有意义的

解决方法是将这两个隐式参数转换为显式参数:

Inductive prod (A B:Type) : Type := pair : A -> B -> @prod A B.
  • 符号
    (x,y)
    尚未声明
一旦您修复了
prod
的定义,该定义仍然不会进行类型检查,因为Coq不知道您所说的模式
(x,y)
是什么意思。您可以在
节投影之前将其声明为新符号,如下所示:

Notation "x , y" := (pair _ _ x y) (at level 10).

如果下面的答案帮助你解决了问题,那么你接受答案就好了。如果下面的答案帮助你解决了问题,那么你接受答案就好了。