我想在Coq中使用标准符号,例如“ x∈{x}”。 但是有问题:
1)花括号在Coq中有特殊含义,因此会发生以下情况:
Notation " x ∈ y " :=(tin x y) (at level 50).
Notation " { x } ":=(Sing x).
Check fun x => (x ∈ { x }).
(*error: Unknown interpretation for notation "_ ∈ { _ }". *)
如何正确定义此表示法?
2)如果第一个问题不能解决,那么还有另一个。 (在这里,我决定在符号中使用附加符号'`'。)
Notation " { x }` ":=(Sing x).
Check fun x => (x ∈ { x }`).
(* fun x : Ens => x ∈ {x }` *)
现在我应该
a)在第一个花括号后添加空格,或者
b)删除最后一个x字母后的无用空格。
我该怎么做?
答案 0 :(得分:5)
除其他符号外,您还可以通过为tin x (Sing y)
添加符号来使符号生效。由于几个重叠的符号,解析器中的花括号有些奇怪;参见https://github.com/coq/coq/pull/6743进行一些讨论。
您可以通过使用Coq的format
修饰符(请参见manual on printing notations)来相当普遍地解决空白打印。或者,在符号中使用两个空格将迫使Coq在此处打印一个空格(如第二个示例所示,有时似乎还是决定打印一个空格,在这种情况下,您必须求助于自定义格式)。
以下是为您的示例实施的所有上述解决方案:
Axiom Ens : Set.
Axiom tin : Ens -> Ens -> Prop.
Axiom Sing : Ens -> Ens.
Section FixingBraceNotation.
Notation "x ∈ y" := (tin x y) (at level 50).
(* Note: the level on the following modifier is already set for this
notation and so is redundant, but it needs to be reproduced exactly if
you add a format modifier (you can overwrite the notation but not the
parsing levels). *)
Notation "{ x }" := (Sing x) (at level 0, x at level 99).
Notation "x ∈ { y }" := (tin x (Sing y)) (at level 50).
Check fun x => (x ∈ { x }).
Check fun x => {x}.
End FixingBraceNotation.
Section RemovingWhitespace.
Notation "x ∈ y" := (tin x y) (at level 50).
Notation "{ x }`" := (Sing x) (at level 0, format "{ x }`").
Check fun x => (x ∈ { x }`).
End RemovingWhitespace.
Section AddingWhitespace.
Notation "x ∈ y" := (tin x y) (at level 50).
Notation "{ x }`" := (Sing x) (at level 0).
Check fun x => (x ∈ {x}`).
End AddingWhitespace.