使用`o`作为变量/函数名时出现内部语法错误

时间:2017-01-10 02:52:43

标签: isabelle

在玩Isabelle(版本2016-1)时,我遇到了以下奇怪的情况:我不能在各种(大多数/全部?)上下文中使用字母o作为变量或函数名称。尽管为英语字母表中的大多数(全部?)其他字母工作,以下示例都会失败:

value o (* quoted version doesn't work either *)

definition invert :: ‹bool ⇒ bool› where
  ‹invert o = (¬ o)›

definition o :: ‹bool ⇒ bool› where
  ‹o a = (¬ a)›

fun default_int :: ‹int option ⇒ int› where
  ‹default_int None = 0› |
  ‹default_int o = the o›

fun default_int :: ‹int option ⇒ int› where
  ‹default_int None = 0› |
  ‹default_int (Some o) = o›

fun o :: ‹int option ⇒ int› where
  ‹o None = 0› |
  ‹o (Some i) = i›

我似乎无法找到任何记录o是保留名称的信息,因此这是一个错误还是o的其他一些用法将其排除在变量/函数名称之外?所有情况的错误消息是"内部语法错误⌂无法解析术语"除了注意到错误似乎与内部语法相关(第三个和第三个错误消息)之外,这不是很有帮助。最后一个案例使用引号内的o而不是定义/有趣的行显示在行上。

1 个答案:

答案 0 :(得分:3)

o是函数组合运算符的ASCII表示法。您可以看到o被解释为语法,因为它以一种深绿色的颜色打印,而其他标识符是蓝色,黑色,绿色或橙色(取决于它们是什么)。您可以使用其他预定义语法获得相同的内容,例如OOOpowrhas_derivative等。

您可以使用命令

禁用它
no_notation Fun.comp (infixl "o" 55)
但是,你应该只为实验做这件事;在生产使用中,禁用这种全局预定义符号将被视为不好。

我认为,这些天来,这些旧的ASCII符号大多是不必要的,如果是o,实际上是有害的(例如它如何让你困惑)。我建议在Isabelle邮件列表中删除这个特定的符号。