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

Syntax 自定义Isabelle语法破坏现有语法,syntax,isabelle,Syntax,Isabelle,我正在尝试生成一个很好的语法,用于将函数映射到关联列表的值上,也就是说,我想编写[x]↦ f y |(x)↦ y)∈ l] 用于MapList f l。我想出了 syntax "_alist_map" :: "['b, pttrn, ('a × 'b) list] ⇒ ('a × 'b) list" ("[x ↦ _ | '(x ↦ _') ∈ _]") 这是可行的,但会导致术语“(x,y)#[]”告诉我“(x,y)#[]”处的内部语法错误,并且(x的阴影略有不同 原因似乎是,x一旦出现在

我正在尝试生成一个很好的语法,用于将函数映射到关联列表的值上,也就是说,我想编写
[x]↦ f y |(x)↦ y)∈ l] 
用于
MapList f l
。我想出了

syntax
 "_alist_map" :: "['b, pttrn, ('a × 'b) list] ⇒ ('a × 'b) list"
 ("[x ↦ _ | '(x ↦ _') ∈ _]")
这是可行的,但会导致
术语“(x,y)#[]”
告诉我“(x,y)#[]”处的
内部语法错误,并且
(x
的阴影略有不同

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


我能设法解决这个问题吗?

我刚刚用一个函数
map\u-alist
做了一个小实验,希望它与您的
map-alist
对应,定义如下:

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

我刚刚用一个函数
map\u-alist
做了一个小实验,它很可能对应于您的
map-alist
,定义如下:

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

我刚刚用一个函数
map\u-alist
做了一个小实验,它很可能对应于您的
map-alist
,定义如下:

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

我刚刚用一个函数
map\u-alist
做了一个小实验,它很可能对应于您的
map-alist
,定义如下:

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

mixfix注释中使用的标识符名称不能再用作标识符,我不知道如何解决这个问题。因此,您可以选择一个非标识符符号,如
\
\
,然后通过添加
\newcomma>将LaTeX输出设置为打印为
x
nd{\isasymapalistvariable}{x}
到您的
root.tex


您还可以将
\
\
添加到Isabelle/JEdit的符号文件中(最好是
$Isabelle\u HOME\u USER/etc/symbols
)然后给它分配一些Unicode点,用于在Isabelle/JEdit中显示。

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


您还可以将
\
\
添加到Isabelle/JEdit的符号文件中(最好是
$Isabelle\u HOME\u USER/etc/symbols
)然后给它分配一些Unicode点,用于在Isabelle/JEdit中显示。

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


您还可以将
\
\
添加到Isabelle/JEdit的符号文件中(最好是
$Isabelle\u HOME\u USER/etc/symbols
)然后给它分配一些Unicode点,用于在Isabelle/JEdit中显示。

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


您还可以将
\
\
添加到Isabelle/JEdit的符号文件中(最好是在
$Isabelle\u HOME\u USER/etc/symbols
中),并为其分配一些Unicode点,用于在Isabelle/JEdit中显示。

只是出于好奇,
MapList
是否仅映射
f
的值(即成对的第二个组件)?语法似乎比编写函数应用程序更麻烦;)您是否有一个实例,说明可读性实际上得到了提高(我知道这是非常主观的)。我的应用程序中的函数
f
是用特殊的sytnax本身编写的,即
[|x |]
映射(λx.[x |]
的可读性不如
[x]↦ [| y |]|(x↦ y)∈ l] 
只是出于好奇,
mapAList
是否只映射
f
l
的值(即成对的第二个组件)?语法似乎比仅仅编写函数应用程序更麻烦;)您有没有一个示例,说明可读性实际上得到了提高(我知道这是非常主观的。)我的应用程序中的函数
f
是用特殊的sytnax本身编写的,即
[|x |]
,而
映射(λx.[| x |])
的可读性不如
[x]↦ [| y |]|(x↦ y)∈ l] 
只是出于好奇,
mapAList
是否只映射
f
l
的值(即成对的第二个组件)?语法似乎比编写函数应用程序更麻烦;)您是否有一个可读性实际得到改善的示例(我知道这是h