在下面的Coq代码片段中(从一个真实示例中删除),我试图将exponent_valid
的第一个参数声明为隐式:
Require Import ZArith.
Open Scope Z.
Record float_format : Set := mk_float_format {
minimum_exponent : Z
}.
Record float (fmt : float_format) : Set := mk_float {
exponent : Z;
exponent_valid : minimum_exponent fmt <= exponent
}.
Arguments exponent_valid {fmt} _.
据我了解,exponent_valid
函数有两个参数:一个是类型float_format
,另一个是类型float
,第一个可以推断出来。但是,编译上面的代码段失败,并显示以下错误消息:
File "/Users/mdickinson/Desktop/Coq/floats/bug.v", line 13, characters 0-33:
Error: The following arguments are not declared: _.
确实,将Arguments
声明更改为:
Arguments exponent_valid {fmt} _ _.
使错误消息消失。
没关系;我是Coq的新手,我完全可以相信我忽略了一些东西。但是,现在因为真的让我感到困惑:如果我用<=
替换exponent_valid
定义中的<
,代码就会编译没有错误!
我有两个问题:
_
?<=
替换<
会对exponent_valid
所期望的参数数量产生影响?如果相关,我会使用Coq 8.4pl5。
答案 0 :(得分:6)
exponent_valid
的类型为
forall (fmt : float_format) (f : float fmt), minimum_exponent fmt <= exponent fmt f.
没有符号是
forall (fmt : float_format) (f : float fmt), Z.le (minimum_exponent fmt) (exponent fmt f).
Z.le
定义为
= fun x y : Z => not (@eq comparison (Z.compare x y) Gt).
not
定义为
= fun A : Prop => A -> False.
所以exponent_valid
的类型可以转换为
forall (fmt : float_format) (f : float fmt),
(minimum_exponent fmt ?= exponent fmt f) = Gt -> False,
这意味着该函数最多可以使用三个参数。
但是,我认为Arguments
命令是否应该考虑可转换性或者即使需要提供有关函数的所有参数的信息也是有争议的。也许只允许用户删除任何尾随的下划线。
答案 1 :(得分:2)
你的理解是正确的,这看起来像是一个(非常奇怪的)错误。我刚刚在错误跟踪器上提交了report。
编辑:啊,在我看这些东西的时候,下面的flockshade观察完全没有被注意到。毕竟它确实有三个参数!