我正在尝试生成一个很好的语法,用于将函数映射到关联列表的值,即我想为[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
成为变量名一样
我可以以某种方式解决这个问题吗?
答案 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