我是Coq的新手,致力于集合论证明。
我意识到括号被省略了,我很难阅读公式。例如,
1 subgoal
A, B : {set T}
H : B \subset A
______________________________________(1/1)
A :\: A :|: A :&: B = B
但我希望Coq打印(A :\: A) :|: (A :&: B) = B
。上面的输出是通过以下代码获得的。
Require Import ssreflect ssrbool ssrnat fintype finset.
Theorem a_a_b__b' (A B : {set T}) : B \subset A -> (A :\: (A :\: B)) = B.
Proof.
move=> H.
rewrite setDDr.
令我惊讶的是,如果我在finset.v中看到setDDr
的原始编码,则其括号如下
Lemma setDDr A B C : A :\: (B :\: C) = (A :\: B) :|: (A :&: C).
Proof. by rewrite !setDE setCI setIUr setCK. Qed.
所以我想知道为什么括号会消失,如何强制Coq在CoqIde中明确打印括号。
答案 0 :(得分:1)
我不知道有什么机制可以做你的建议(但它很可能存在,Coq符号支持丰富而复杂)。
Coq应该根据运算符的优先级插入括号,这意味着您必须重新定义:|:
的优先级才能达到您想要的效果。这是不可能轻易做到的,大多数人都不喜欢它。 :|:
的当前优先级是数学家所期望的。
可能的解决方法是为您自己使用定义不同的本地表示法:
From mathcomp
Require Import ssreflect ssrbool eqtype ssrnat seq choice fintype finset.
Section U.
Variable (T: finType).
Local Notation "A :||: B" := (@setU T A B) (at level 48, left associativity).
Theorem a_a_b__b' (A B : {set T}) : B \subset A -> (A :\: (A :\: B)) = B.
Proof.
move=> H; rewrite setDDr.
但是我建议你暂时使用它,尝试习惯当前的优先规则,因为你必须阅读其他人的证据,他们必须阅读你的,所以偏离标准做法已经非常重要的费用。
答案 1 :(得分:1)
您可以使用以下命令关闭所有符号:
Unset Printing Notations.
Printing Notations
是一个标志,Unset
将其关闭。您可以在这里找到有关符号的更多信息:https://coq.inria.fr/refman/user-extensions/syntax-extensions.html#syntax-extensions-and-interpretation-scopes。
例如,
(n + m) * 0 = n * 0 + m * 0
将被打印为
eq (Nat.mul (Nat.add n m) O) (Nat.add (Nat.mul n O) (Nat.mul m O))
我知道,这不是一个很好的解决方案。
答案 2 :(得分:1)
在最新版本的 Coq 中,Set Printing Parentheses
应该可以工作。