我可以更改内置 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"
我已将我的一种类型设为 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"