我试图了解
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
究竟是什么?我假设它定义了一种数据类型。
此外,在最后+
之后没有任何内容的事实似乎令人恼火。
答案 0 :(得分:2)
这不是数据类型,而是Haskell样式的类。伊莎贝尔的类型类系统在Florian Haftmann的manual中有所描述。 locales的概念也密切相关。我想说,Isabelle的两个先进概念都是我不建议初学者深入研究的。 (这也是教程没有提到它们的原因)
简要概述:类型类是一种谈论具有共同点的类型集合的方法;例如,ring
类讨论形成环的所有类型:它们具有0
元素,加法和乘法运算,并且所有这些都满足某些定律。您找到的gcd
类是对其上定义了GCD和LCM的类型的类型类(尽管它尚未要求它们满足任何法则;这在semiring_gcd
类中完成。)
在最终的+
之后:fixes
。类声明意味着类gcd
是类zero
(类型包含元素0),类one
(包含1)和类{{1}的交集。 }(包含可分性的概念),它还需要存在两个函数dvd
和gcd
。
这个类有点奇怪,因为它纯粹是语法,即它不需要任何法则来保存。因此,我们也看一下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_semidom
和normalization_semidom
感到疑惑:这是一个非常技术性的问题。基本上,如果你有几个相关的元素(如1和-1,或多项式ℝ[X],X和2X),你通常会有一些概念,其中哪些是'规范'代表:如果我问你什么2和3的GCD是,你可能会说1而不是-1,如果我问2X和X²∈[X]的GCD是什么,你可能会说X而不是2X。