我可以更改内置 Isabelle 类型中的符号吗-class

Can I change the notation in a built-in Isabelle type-class

我已将我的一种类型设为 monoid_add:

的实例
instantiation "marking_ext" :: (monoid_add) monoid_add  
begin
  definition
    marking_add_def:
    "M + N = 
    ...
end

我现在可以在 ('a :: monoid_add) marking_ext 类型的值之间使用熟悉的 + 表示法,例如,写 M + N。但我宁愿使用\<oplus>,写作M \<oplus> N.

我可以更改类型类实例的表示法,同时保持在类型的内置层次结构中吗-类?

您可以在您的类型上为 + 添加额外的符号,例如通过引入缩写:

abbreviation marking_add' :: "marking_ext ⇒ marking_ext ⇒ marking_ext" (infixl "⊕" 65)
  where "(⊕) ≡ (+)"

您可以根据需要调整运算符优先级(65 是正常 + 具有的优先级)。

但是请注意,如果引入额外的符号与其他理论中的符号冲突,则可能会出现问题。如果将来有人想将你的开发与其他一些也定义了符号 的库一起使用,就会出现语法冲突,这会让那个人的生活变得更加艰难。通常有一种方法可以解决它(特别是对于像这样的简单符号),但仍然:我 通常 建议不要使用不必要的额外符号,除非有真正的好处。在这种特殊情况下,我真的看不出有什么好处。但这只是我的建议,当然可以忽略它! :)

上面的答案给了我实际需要的东西,但是,问题的 /literal/ 答案是你可以使用 notation 全局更改类型 class 的符号:

notation plus (infixl "⊕" 65)

您可能不想为 plus 这样做,因为如果您这样做,算术将呈现您的新面貌:

term "(2 :: nat) + 3"

--> "2 ⊕ 3"
  :: "nat"