在Coq中使用空格和花括号设置理论符号

时间:2018-11-03 06:38:39

标签: coq

我想在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字母后的无用空格。

我该怎么做?

1 个答案:

答案 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.