Coq(8.5p1)似乎在理解-(x + y)
等“负面”表达方面遇到了一些麻烦,如下例所示:
Require Import ZArith.
(* Open Scope Z_scope. *)
Goal (forall x:Z, x + (-x) = 0)
-> forall a b c:Z, a + b + c + (-(c+a)) = b.
对于上述情况,我收到了错误(针对CoqIDE中的-x
和(-(c+a))
):
错误:符号“ - _”的未知解释。
我很困惑为什么会发生这种错误。另外,如果我在评论中执行Open Scope Z_scope.
,或者使用有理数(Z
)替换整数(Q
),则错误就会消失。对我而言,Z
和Q
在采取否定方面应该是相同的。
这背后有原因吗?
答案 0 :(得分:3)
Coq参考手册v8.5:
备注:
Close Scope
和Require Import QArith.
不会在它们发生的部分结束后继续存在。在节之外定义时,它们将导出到导入模块的模块。
正如Mark在评论中提到的,Qscope
打开了ZArith
范围(在某个部分之外)。但是,从Z_scope
模块导出的文件可以在Local Open Scope Z_scope.
本地打开Close Scope Z_scope.
,也可以在最后使用Print Visibility.
。
您可以使用Require Import Coq.ZArith.ZArith.
Print Visibility.
(* does not show anything interesting *)
检查当前可用的符号并打开范围。
Require Import Coq.ZArith.ZArith.
Open Scope Z_scope.
Print Visibility.
(* ...
Visible in scope Z_scope
...
"- x" := Z.opp x (* that's what we want! *)
*)
另一种观点:
Require Import Coq.QArith.QArith.
Print Visibility.
(* ...
Visible in scope Q_scope
...
"- x" := Qopp x
*)
现在是理性数字:
{{1}}