首先,在对类型类了解不多的情况下,似乎类型类是重载类型符号的最佳方式,除非我不能使用类型类,或者不知道如何使用。我没有使用类型类。
其次,我很确定我不想覆盖对所有类型都有意义的运算符的符号,例如\<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它不给我警告吗?
*(注意:给定示例,从数学上讲,使用符号代替会更有意义+,但这*是我不想覆盖的符号。)