Isabelle “班级”在伊莎贝尔身上有什么作用

Isabelle “班级”在伊莎贝尔身上有什么作用,isabelle,Isabelle,我想知道是什么 class gcd = zero + one + dvd + fixes gcd :: "'a ⇒ 'a ⇒ 'a" and lcm :: "'a ⇒ 'a ⇒ 'a" begin 从GCD。您的表示。浏览Nipkow没有发现任何例子,这解释了class的作用,而不是 你能给我解释一下class到底做什么吗?我假设它定义了一个数据类型。 而且,在最后一个+之后没有任何内容的事实似乎令人恼火。这不是一个数据类型,而是一个Haskell样式的类型类。弗洛里安·哈夫特曼(

我想知道是什么

class gcd = zero + one + dvd +
  fixes gcd :: "'a ⇒ 'a ⇒ 'a"
    and lcm :: "'a ⇒ 'a ⇒ 'a"
begin
GCD。您的
表示。浏览Nipkow没有发现任何例子,这解释了
class
的作用,而不是

你能给我解释一下
class
到底做什么吗?我假设它定义了一个数据类型。
而且,在最后一个
+
之后没有任何内容的事实似乎令人恼火。

这不是一个数据类型,而是一个Haskell样式的类型类。弗洛里安·哈夫特曼(Florian Haftmann)的书中描述了伊莎贝尔的类型类系统。这一概念也密切相关。我想说,这两个都是《伊莎贝尔》中的高级概念,我不建议初学者深入研究。(这也是教程没有提到它们的原因)

给你一个简单的概述:类型类是一种谈论有共同点的类型集合的方式;例如,
ring
类讨论了构成一个环的所有类型:它们有一个
0
元素,一个加法和乘法运算,所有这些都满足一定的规律。您找到的
gcd
类是定义了gcd和LCM的类型的类型类(尽管它还没有要求这些类型满足任何规则;这是在
semiring\u gcd
类中完成的)

在最后的
+
之后有一些东西:
修复了
。类声明意味着类
gcd
是类
zero
(类型包含元素0)、类
one
(包含1)和类
dvd
(包含可分性概念)的交叉点,此外,它还需要两个功能
gcd
lcm

这个类有点奇怪,因为它是纯语法的,也就是说,它不需要任何定律。因此,我们也来看看
半环\u gcd

class semiring_gcd = normalization_semidom + gcd +
  assumes gcd_dvd1 [iff]: "gcd a b dvd a"
    and gcd_dvd2 [iff]: "gcd a b dvd b"
    and gcd_greatest: "c dvd a ⟹ c dvd b ⟹ c dvd gcd a b"
    and normalize_gcd [simp]: "normalize (gcd a b) = gcd a b"
    and lcm_gcd: "lcm a b = normalize (a * b) div gcd a b"
此类要求存在gcd/lcm(基于
gcd
类),且类型必须为
normalization\u semidom
(见下文)。还有一些假设也需要满足

总之,类型类是组织类型的公共属性和操作的一种很好的方法,但是我要说,对于初学者来说,理解它们的每一个细节以便能够使用它们并不重要


奖励内容:(不太相关,只是出于好奇)


如果您想知道
规范化\u semidom
规范化
:这是一件非常技术性的事情。基本上,如果你有几个相关的元素(比如1和-1,或者多项式)ℝ[十] ,X和2X),你通常会对其中哪一个是“规范”代表有一些概念:如果我问你2和3的GCD是什么,你可能会说1而不是-1,如果我问2X和X²的GCD是什么∈ ℝ[十] 是的,你可能会说X而不是2X。

很好的解释!你是否也知道,如果你所解释的一个类型类是有一个正式的数学理论作为基础的东西?(我知道在ZF(C)中,in不可能正式地说类——只是非正式地说——但数学的其他基础也明确允许类。但我不确定在数学中使用的“类”一词与你解释的计算机科学中的使用有多大关系——或者“类”一词在计算机科学中,类型类只是非正式地使用,与数学中的形式不同。)类型类与面向对象编程中的类或集合论中的类完全无关。至于数学基础,最近有一些Kun-ar和波佩斯库的研究表明,HOL+重载(包括类型类)是一致的W.R.T.ZFC。(希望我没有弄错):我经常发现isabelle语法发生变化,除
prog
之外的所有教程都使用与新版本不兼容的旧语法,比如isabelle-2016-1:-(你指的是什么教程?所有手册(就像我上面链接的课程手册应该是最新的。如果不是,请在Isabelle用户邮件列表中投诉。)。