首先,在对类型类了解不多的情况下,似乎类型类是重载类型符号的最佳方式,除非我不能使用类型类,或者不知道如何使用。我没有使用类型类。
其次,我很确定我不想覆盖对所有类型都有意义的运算符的符号,例如\<in>
, \<times>
, *
,\<union>
等。
但是,诸如此类的运算符+
对我的 type 没有任何意义sT
,尽管这与我的第一点有关。我最终希望+
type 有多种含义sT => sT => sT
,我认为这不会发生。
示例的四个版本
为了使我的问题具体化并表明我不是唯一一个有问题的人,我从Klein 的课程中举了一个简单的例子,文件是Demo14.thy。
在示例的四个版本之后,我问:“对于第四个示例,我可以摆脱警告吗?”
他从一个没有警告或错误的简单示例开始:
locale semi =
fixes prod :: "['a, 'a] => 'a" (infixl "\<cdot>" 70)
assumes assoc: "(x \<cdot> y) \<cdot> z = x \<cdot> (y \<cdot> z)"
他使用\<cdot>
, 这代表了我到目前为止所做的事情,而不是使用 Isabelle/HOL 已经声称的符号。
我将他的更改\<cdot>
为+
,我得到一个错误:
locale semi2 =
fixes prod :: "['a, 'a] => 'a" (infixl "+" 70)
assumes assoc: "(x + y) + z = x + (y + z)"
在查看了 HOL 源代码后,我看到+
已经为 type 定义了它('a => 'a => 'a)
,特别是为某些类型类。
我修改semi2
以确保它不是'a
单独的,然后我只收到警告:
locale semi3 =
fixes prod :: "('a => 'a) => ('a => 'a) => 'a" (infixl "+" 70)
assumes assoc: "(x + y) + z = x + (y + z)"
我真正关心的是第四个版本,它给出了一个警告,即使我已经插入(x::sT)
:
locale semi4 =
fixes prod :: "sT => sT => sT" (infixl "+" 70)
assumes assoc: "((x::sT) + y) + z = x + (y + z)"
警告是:
Ambiguous input
produces 16 parse trees (10 displayed):
[...]
Fortunately, only one parse tree is type correct,
but you may still want to disambiguate your grammar or your input.
总结和问题
对于我自己,我将其总结如下: 运算符+
已在许多地方定义,尤其是 type 'a => 'a => 'a
,它通常也为sT => sT => sT
. 正因为如此,证明者做了很多工作,在最终弄清楚 mysemi4
是唯一+
为 type 定义的地方之后sT => sT => sT
,它让我使用它。
我不知道我的摘要,但我可以修复semi4
它不给我警告吗?
*
(注意:给定示例,从数学上讲,使用符号代替会更有意义+
,但这*
是我不想覆盖的符号。)