Hoare三重表示法

时间:2018-11-09 19:43:52

标签: coq

最近的discussion集合符号激发了我去问一个问题(Tej?)是否有一个聪明的想法让Coq接受Hoare三元组的标准符号-像这样:

Notation "{ P }  c  { Q }" :=
  (hoare_triple P c Q) 
  (at level 0, P at level 99, c at level 99, Q at level 99) 
  : Hoare_scope.

Coq的错误是“错误:一种符号必须至少包含一个符号。”鉴于

这个事实,我不明白
Notation "{ x }" := (x) (at level 0, x at level 99).

起作用。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我建议在其他地方使用另一个符号使之可解析。我已经看到Adam Chlipala例如使用Notation "{{ P }} c {{ Q }}"。您也可以将{ P } c { Q }定义为仅打印符号,尽管我认为这样做没什么用,并且可能会使新用户感到困惑。

弯括号很特殊;它们的一些特殊方式是documented in the manual(向下滚动至第三音符),但是我承认,除了“这里有巨龙,请雨果·赫伯林问”之外,我并没有真正理解该音符。

我可以机械地告诉您为什么“ {x}”有效时出现错误:

  • 由于特殊的remove_curly_brackets函数,花括号不算作符号
  • 如果该符号已经在解析表中,则无需包含新符号

这是在metasyntax.ml中检查的,我是通过查找错误消息的抛出方式找到的。您还可以使用Print Grammar constr确认Coq语法是什么(这也是您弄清所有事物实际上是什么级别的方法。)