为什么Coq.Init.Logic定义符号“ A-> B”?

时间:2018-09-09 18:27:51

标签: coq

可以在here找到的Coq标准库文件Coq.Init.Logic包含语句

Notation "A -> B" := (forall (_ : A), B) : type_scope.

鉴于符号->已具有内置含义,因此我不知道如何实现。 ->被这个覆盖吗?

如果我输入A -> B,Coq怎么知道我的意思是A -> Bforall (x : A), B

是的,我知道这两个命题在逻辑上是等效的,但这不应该是定理而不是符号吗?


您可以说,我在Coq方面没有太多经验,但是我想了解细节。

1 个答案:

答案 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