可以在here找到的Coq标准库文件Coq.Init.Logic包含语句
Notation "A -> B" := (forall (_ : A), B) : type_scope.
鉴于符号->
已具有内置含义,因此我不知道如何实现。 ->
被这个覆盖吗?
如果我输入A -> B
,Coq怎么知道我的意思是A -> B
或forall (x : A), B
?
是的,我知道这两个命题在逻辑上是等效的,但这不应该是定理而不是符号吗?
您可以说,我在Coq方面没有太多经验,但是我想了解细节。
答案 0 :(得分:12)
->
符号实际上是由您在Coq.Init.Logic
中找到的符号定义的! forall
是内置的,而->
是使用符号系统定义的。 Coq.Init.Logic
模块会自动加载到Coq中,因为它是由Coq.Init.Prelude导出的,这就是为什么您可以立即访问它。
编写A -> B
时会使用forall (_:A), B
表示法进行解释;这在语法上与forall (x:A), B
类似,除了不允许表达式B
依赖于x
。毫无歧义-这是A -> B
的唯一定义,实际上,如果您加载Coq时没有任何前奏(例如,通过传递-noinit
标志),A -> B
将不会解析。
使->
看起来内在的Coq的一方面是符号是双向的-它适用于解析和打印。这就是为什么您在目标中以及使用->
和Check
时看到Search
的原因。这里确实有歧义;在这种情况下,如果forall (x:A), B
的{{1}}不依赖于B
,则Coq倾向于使用表示法而不是内置语法来打印它。如果您关闭注释(x
的打印,您会在曾经查看Unset Printing Notation.
的所有地方看到forall (_:A), B
。当然,如果您具有真正依赖项的函数类型,那么Coq需要使用A -> B
,因为forall (x:A), B
需要引用变量B
。