Isabelle 隐藏运算符以避免AST中的歧义

Isabelle 隐藏运算符以避免AST中的歧义,isabelle,Isabelle,我正在尝试伊莎贝尔官方教程中的列表示例。我将#替换为:,将@替换为++,使其语法与Haskell相同。现在我收到了AST中关于歧义的警告。我知道我可以用hide_const隐藏函数,但这不适用于中缀表示法中的运算符。如何在Isabelle中隐藏运算符 确切的警告信息是: Ambiguous input⌂ produces 2 parse trees: ("\<^const>HOL.Trueprop" ("\<^const>HOL.eq" ("\<^con

我正在尝试伊莎贝尔官方教程中的列表示例。我将
#
替换为
,将
@
替换为
++
,使其语法与Haskell相同。现在我收到了AST中关于歧义的警告。我知道我可以用
hide_const
隐藏函数,但这不适用于中缀表示法中的运算符。如何在Isabelle中隐藏运算符

确切的警告信息是:

Ambiguous input⌂ produces 2 parse trees:
  ("\<^const>HOL.Trueprop"
    ("\<^const>HOL.eq" ("\<^const>Map.map_add" ("/<^const>toylist.list.Nil") ("_position" ys))
      ("_position" ys)))
  ("\<^const>HOL.Trueprop"
    ("\<^const>HOL.eq" ("\<^fixed>app" ("\<^const>toylist.list.Nil") ("_position" ys)) ("_position" ys)))
Fortunately, only one parse tree is well-formed and type-correct,
but you may still want to disambiguate your grammar or your input.
模棱两可的输入⌂ 生成2个解析树:
(“\HOL.Trueprop”
(“\HOL.eq”(“\Map.Map\u add”(“/toylist.list.Nil”)(“\u position”ys))
(“_位置”ys)))
(“\HOL.Trueprop”
(“\HOL.eq”(“\app”(“\toylist.list.Nil”)(“\u position”ys))(“\u position”ys)))
幸运的是,只有一个解析树格式正确,类型正确,
但您可能仍然希望消除语法或输入的歧义。

您可以使用命令
no_notation
,该命令采用与命令
notation
在注释声明期间使用的相同参数(或在常量定义内)

集合已经使用了
++
两个符号。成员和映射分别添加
。因此,您必须找到这些符号声明,并在
no_notation
中使用它们:

no_notation Set.member ("(_/ : _)" [51, 51] 50)
no_notation map_add (infixl "++" 100)
然后,您可以按照您肯定已经采用的相同方式进行操作,并删除列表中现已过时的语法:

no_notation Cons (infixr "#" 65)
notation Cons (infixr ":" 65)

no_notation List.append (infixr "@" 65)
notation List.append (infixr "++" 65)

term "x : (xs ++ ys)"

Set.member的符号
不会真正丢失,因为已经有xsymbol/utf-8符号
。我认为
map\u add
并没有被使用,但是你可以使用免费的符号
@

隐藏操作符并不会删除它的符号。有一个单独的命令
no_notation
删除现有的注释。在Isabelle/HOL中,
++
绑定到
map\u add
,这可以从歧义警告中看出。您可以按如下方式删除它

no_notation map_add (infixl "++" 100)
请注意,必须重复声明要删除的符号的确切优先级参数。没有简单的方法可以找到常量的符号声明,但是声明接近常量声明的符号是一种很好的方式;按住Ctrl键并单击某个常量会将您带到其声明

关于
,这在默认情况下绑定到
Set.member
。您可以使用
no_notation Set.member((/:)”[51,51]50)删除它


除非出于演示或探索的目的,否则我建议不要太多地更改Isabelle的默认语法。否则,其他Isabelle用户将发现很难阅读您的代码,并且您的理论将与其他用户的理论不兼容。原因是,当导入不同的理论时,符号会被附加合并。因此,如果删除
+
映射的符号
+
,则在理论
A
中添加
,理论
B
导入理论
A
和从
Main
导出的其他一些理论,而不是
A
,然后,
++
的歧义又回到了理论上
B

我接受了你的答案,因为你指出了改变默认语法的后果。