为什么用冒号来表示值属于类型?


19

Pierce(2002)通过撰写第92页的文章介绍打字关系

算术表达式的类型关系,写为“ t:T”,是由一组将类型分配给项的推理规则定义的

并且脚注说符号经常代替:。我的问题很简单,为什么类型理论家更喜欢使用:而不是?如果类型是一组值,则写入绝对有意义,不需要新的符号。TtT

这是否类似于某些cs编写者甚至认为滥用符号并应将其写为类似?3n2=O(n2)3n2O(n2)


7
的隶属谓词 可以为true或false,而类型声明通常被解释为被声明为true 为真的事实陈述,可以通过纯粹的语法手段得出。将此与质数进行比较,对于该质数而言,成员资格的语法方法不足。xX x:X
Musa Al-hassy

4
@ MusaAl-hassy:这是对正在发生的事情的错误陈述。声明它不是真实的,例如,这意味着我可以“声明”“ falseint”。也不是必须通过“纯粹的句法手段”得出判断的情况,例如在具有家庭类别的内部类型理论的情况下。
Andrej Bauer


2
要添加到@ MusaAl-hassy的评论,在computatioal类型理论鲍勃·康斯特布尔,斯图亚特·艾伦,鲍勃·哈珀等人,,因为它更类似于一个会员谓词通常用于打字的判断(见这个谈话,滑动器25 (例如)。
xrq

3
当然也是符号的滥用和应该被写入λ ñ 0.3 ň 2Ø λ ñ ñ 2?(数学家可能更ñ 3 ň 2Ø ñ ñ 2。)3n2O(n2)λn.3n2O(λn.n2)n3n2O(nn2)
奥斯卡坎宁安

Answers:


12

因为冒号右侧的内容不一定是集合,而冒号左侧的内容不一定是集合的成员。

类型理论起源于20世纪初期,是建立数学基础的一种方法。伯特兰·罗素(Bertrand Russel)在朴素的集合论中发现了一个悖论,他从事类型理论的研究,以限制集合论的表达能力来避免这种(以及任何其他)悖论。多年来,Russel等人定义了许多类型理论。在某些类型理论中,类型是具有某些属性的集合,而在其他类型中,它们是另一种野兽。

特别是,许多类型理论都有句法表述。有些规则使事物具有类型。当打字规则作为一种理论的基础时,重要的是要区分打字规则的内容和通过应用其他外部知识可能得出的结论。如果键入规则是证明理论的基础,则这一点尤其重要:例如,基于具有经典逻辑的集合论和选择公理的定理可能会也可能不会存在于构造逻辑中。该领域的开创性论文之一是丘奇(Church)的简单类型理论的提法》(A Formulation of Types of Types)(1940)。

类型和集合之间的区别最明显的方式可能是集合的最基本规则,即两个集合具有相同的元素(如果它们具有相同的元素)是相等的,通常不适用于类型。有关一些示例,请参见Andrej Bauer在此处的答案以及他在相关问题上的答案。第二个线程还有其他值得一读的答案。

在类型化演算中,说类型是集合实际上是在给类型赋予语义。为演算赋予类型理论的语义并非无关紧要。例如,假设您要使用功能定义语言。函数的类型是什么?正如我们在集合论101中所教的那样,总功能由它们的图确定。但是偏函数呢?您是否要为所有非终止函数赋予相同的语义?在回答了这个问题之前,您不能将类型解释为允许递归函数的微积分的集合。在1970年代初期,为编程语言或计算赋予名词性语义是一个难题。此处的开创性论文是“迈向计算机语言的数学语义学”(1971年),作者:Dana ScottChristopher Strachey。该哈斯克尔维基对该主题的好介绍。

正如我在上面写的那样,答案的第二部分是,即使您设法为类型赋予了集合理论的语义,冒号左侧的内容也不总是集合的元素。值具有类型,其他事物也具有类型,例如表达式和变量。例如,使用类型化编程语言的表达式即使不终止也具有类型。您可能愿意integerZ合并,但(x := 0; while true; do x := x + 1; x)不是Z的元素。

我不知道类型的冒号是什么时候出现的。现在它在语义上是标准的,并且在编程语言中很常见,但是Russel和Church都没有使用它。Algol并没有使用它,但是受Algol启发的Pascal语言在1971年使用了。我怀疑它不是第一语言,因为许多1970年代初期的理论论文都使用了该符号,但是我不知道较早使用。有趣的是,这是在将编程和逻辑的类型概念统一后不久的-正如西蒙·马丁尼(Simon Martini)在“ 几种编程语言的类型类型”中所展示的那样,直到1960年代,编程语言中的“类型”都来自白话语。这个词的使用,而不是类型理论。


37

主要的理由,更喜欢的冒号表示t:T的成员关系tT是隶属关系,可能会产生误导,因为类型不(仅仅)的集合

[ 补充:我应该注意,历史类型理论使用编写的。马丁·洛夫(Martin-Löf)的类型概念意在建设性地捕获集合,而罗素(Russell)和怀特黑德(Whitehead)已经将ϵ用作班级纪念。追踪以下时刻的有趣之处:变得比更普遍。]

类型描述一种特定的构造,即如何使对象具有特定的结构,如何使用它们以及有关它们的方程式。

例如,产品类型A×B具有介绍规则,该规则解释了如何制作有序对,而消除规则则说明了我们可以从A×B任何元素投射第一个和第二个组件。定义A×B没有的话开始“所有的集合......”也不认为这是说在任何地方任何类似“的所有要素A×B是对”(但它遵循从定义中的每一个元素A×B命题等于一对)。相反,X×Y 的集合理论定义称为“所有有序对的集合...”。

符号t:T表示t具有T描述的结构的事实。

不要将类型T与它的扩展名混淆,扩展名是所有类型T对象的集合。类型不是由其扩展名决定的,就像组不是由其载波集确定的一样。此外,可能会发生两种类型具有相同的扩展名但有所不同的情况,例如:

  1. 大于2的所有偶数素数的类型:Σ(n:N).isprime(n)×iseven(n)×(n>2)
  2. 所有小于2的奇数素数的类型:Σ(n:N).isprime(n)×isodd(n)×(n<2)

两者的扩展名都是空的,但是它们不是同一类型。

类型理论:和集合理论之间还有其他区别。对象a集合论存在独立的什么套属于,它可能属于多套。相反,大多数类型的理论满足独特的打字:如果t:Tt:U然后TU。或者换种方式,类型理论建构t正好有一种T,而事实上是没有办法有只是一个对象t没有它的(唯一确定)型。

另一个区别是,在集合论中,我们可以否认的事实是aA由文字¬(aA)aA。在类型论中这是不可能的,因为t:T是可以使用类型论的规则得出的判断,但是在类型论中没有什么可以让我们声明尚未得到某些东西。当一个孩子用乐高积木制作东西时,他们自豪地奔向父母向他们展示建筑,但他们从未奔向父母向他们展示自己的东西。


1
安德烈,很好的答案。您是否偶然知道冒号的历史渊源?
Andreas Rossberg

las,我没有。教会的类型理论使用的标,即类型的变量α。罗素(Russell)和怀特黑德(Whitehead)用ϵ表示一个阶级的归属关系。Algol 68将类型放在变量名的前面。在1972年马丁-LOF型理论用途,也是如此的1984年版,但[1994版]使用结肠。xααϵ
Andrej Bauer

1
因此,您的论点是类型就像群一样?这是有意义的,但符号常见于抽象代数。gG
比约恩·林德奎斯特(BjörnLindqvist)

2
@BjörnLindqvist:我不认为这个答案是完整的。即使在标准数学中,我们也使用“ ”来表示f是从ST的函数。为什么我们不能用“ ˚F 小号牛逼 ”或类似的东西?好吧,我们只是没有。当然,有充分的理由要避免在某些类型理论的表述中使用“ ”,这仅仅是因为我们不希望ZFC培训的人认为它就像ZFC集,这显然不是案件。但是,这并不意味着结肠有没有已经f:STfSTf(ST)类型理论在普及之前就已被广泛使用。
user21820

1
@ user21820“为什么我们不使用?” 只是推测:因为数学家从未将S T视为集合。有关此符号的历史,请参见此处。我怀疑f S T的冒号是类型理论家的灵感来源。类型理论家冒号更可能与ε不是ASCII字符这一事实有关。f(ST)STf:ST
迈克尔

5

比约恩

可能有一个较早的参考,但有一点是,在Pascal编程语言中使用了冒号:

First Google hit for Pascal


2
以前没有使用过的编程语言:吗?
Andrej Bauer

@AndrejBauer的确,我写了“可能有一个更早的参考书,但是...”来防止这种可能的事实。
比约恩·乔斯-汉森

@AndrejBauer Algol没有。是:理论上的论文中使用20世纪70年代之前?
吉尔斯(Gilles)的“ SO-不再是邪恶的”

1
Fortran有,REAL :: x但是我不知道这是否早于Pascal。
迈克尔

1
@Michael Fortran早于Pascal(大约1955年与1970年左右)出现,但是我认为这种特定的语法仅在Fortran 90中引入,因此比Pascal晚很多。参见例如此处fortranwiki.org/fortran/show/Modernizing+Old+Fortran
Federico
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.