自定义Isabelle语法破坏了现有语法

时间:2014-04-25 11:21:09

标签: syntax isabelle

我正在尝试生成一个很好的语法,用于将函数映射到关联列表的值,即我想为[x ↦ f y | (x ↦ y) ∈ l]mapAList f l。我想出了

syntax
 "_alist_map" :: "['b, pttrn, ('a × 'b) list] ⇒ ('a × 'b) list"
 ("[x ↦ _ | '(x ↦ _') ∈ _]")

有效,但导致term "(x,y)#[]"告诉我Inner syntax error at "(x , y ) # []",而(x的阴影略有不同。

原因似乎一旦x出现在mixfix注释中,它现在总是语法的文字标记(根据isar-ref的第7.4.1节的分隔符)和不再是标识符 - 就像if ... then ... else ...的语法阻止if成为变量名一样

我可以以某种方式解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

mixfix注释中使用的标识符名称不能再用作标识符,我也不知道如何解决这个问题。因此,您可以选择x\<xX>之类的非标识符符号,并设置LaTeX输出,将其打印为\<mapAListvariable>,而不是使用x作为变量名称。将\newcommand{\isasymmapAListvariable}{x}添加到您的root.tex

您还可以将\<xX>\<mapAListvariable>添加到Isabelle / JEdit的符号文件中(最好在$ISABELLE_HOME_USER/etc/symbols中)并为其指定一些将用于在Isabelle中显示的Unicode点/ JEDIT。

答案 1 :(得分:1)

我刚刚使用函数map_alist做了一个小实验,希望它与您的mapAList相对应,其定义如下:

fun map_alist :: "('b ⇒ 'c) ⇒ ('a × 'b) list ⇒ ('a × 'c) list"
where
  "map_alist f [] = []" |
  "map_alist f ((x, y) # xs) = (x, f y) # map_alist f xs"

然后可以使用现有的语法,它看起来像你想要的那样。也许这是一个选择?

lemma "map_alist f xs = [(x, f y). (x, y) ← xs]"
  by (induct xs) auto