伊萨贝尔的“阶级”做了什么

时间:2017-02-18 20:04:29

标签: isabelle

我试图了解

class gcd = zero + one + dvd +
  fixes gcd :: "'a ⇒ 'a ⇒ 'a"
    and lcm :: "'a ⇒ 'a ⇒ 'a"
begin
来自GCD.thy

表示。浏览Nipkow Programming and Proving没有透露任何示例,这解释了class的作用,而不是Tutorial on Isabelle/HOL

您能否向我解释一下class究竟是什么?我假设它定义了一种数据类型。  此外,在最后+之后没有任何内容的事实似乎令人恼火。

1 个答案:

答案 0 :(得分:2)

这不是数据类型,而是Haskell样式的类。伊莎贝尔的类型类系统在Florian Haftmann的manual中有所描述。 locales的概念也密切相关。我想说,Isabelle的两个先进概念都是我不建议初学者深入研究的。 (这也是教程没有提到它们的原因)

简要概述:类型类是一种谈论具有共同点的类型集合的方法;例如,ring类讨论形成环的所有类型:它们具有0元素,加法和乘法运算,并且所有这些都满足某些定律。您找到的gcd类是对其上定义了GCD和LCM的类型的类型类(尽管它尚未要求它们满足任何法则;这在semiring_gcd类中完成。)

在最终的+之后:fixes。类声明意味着类gcd是类zero(类型包含元素0),类one(包含1)和类{{1}的交集。 }(包含可分性的概念),它还需要存在两个函数dvdgcd

这个类有点奇怪,因为它纯粹是语法,即它不需要任何法则来保存。因此,我们也看一下lcm

semiring_gcd

此类要求存在gcd / lcm(基于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(见下文)。然后还有一些假设也需要满足。

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

奖金内容:(不是非常相关,只是为了好奇)

如果您对normalization_semidomnormalization_semidom感到疑惑:这是一个非常技术性的问题。基本上,如果你有几个相关的元素(如1和-1,或多项式ℝ[X],X和2X),你通常会有一些概念,其中哪些是'规范'代表:如果我问你什么2和3的GCD是,你可能会说1而不是-1,如果我问2X和X²∈[X]的GCD是什么,你可能会说X而不是2X。