Coq:负整数表达式的未知解释

时间:2016-06-24 16:35:52

标签: coq

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),则错误就会消失。对我而言,ZQ在采取否定方面应该是相同的。

这背后有原因吗?

1 个答案:

答案 0 :(得分:3)

Coq参考手册v8.5:

  

备注Close ScopeRequire 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}}