格雷厄姆·赫顿:出版物

列表bibtex条目引用也可以使用。


计算有效的编译器

扎克·加比和格雷厄姆·哈顿。提交给哈斯克尔研讨会,2024年6月。

编译器计算是从规范中派生编译器的过程使用等式推理验证其正确性。这方面的工作经常专注于纯语言,没有输入/输出、状态和例外情况。在本文中,我们展示了现有编译器计算通过利用效果的代数方法。为了使想法尽可能容易理解,我们优先使用基本函数编程技术。


超越树:计算基于图形的编译器(pdf格式)

Patrick Bahr和Graham Hutton。提交给2024年2月举行的功能规划国际会议。

Bahr和Hutton最近开发了一种编译器计算方法,允许广泛的根据正确性规范派生的编译器范围。然而,该方法的一个局限性是,它会导致编译器生成树结构代码。相比之下,真实的编译器生成代码这基本上是图结构的,图中的边表示将控制流转移到代码中其他位置的跳转。在这个文章中,我们展示了他们的方法如何自然地适应计算在不更改底层代码的情况下生成图形结构代码的编译器使用高阶抽象语法的计算方法图的表示。


HoTT操作(pdf格式)

布兰登·休尔(Brandon Hewer)和格雷厄姆·赫顿(Graham Hutton)。2024年3月。

内部化数据类型类是一个长期追求的类型理论。例如,容器捕获严格的正类型,而组合物种捕获有限标记结构。然而,到目前为止,还没有类似的尝试将操作数据类型。在本文中,我们展示了操作数理论是如何扩展的具有良好组成概念的物种提供了一种自然的方法将有限的操作内化。我们呈现了歌剧的内在化在同伦类型理论中,它为捕获和关于具有特定代数性质的运算的推理。我们所有人结果在Cubical Agda中进行了形式化。


Quotient Haskell:适用于所有人的轻量级商类型(纸张)

布兰登·休尔和格雷厄姆·赫顿。美国计算机学会编程会议录语言,第8卷,第POPL期,第27条,2024年1月。

子类型和商类型是双重类型的抽象。然而,虽然子类型广泛用于显式和隐式,商类型有除了校对助理之外,没有太多实际用途。关键难点在于商类型的广泛采用在于因使用而产生的校对义务。在本文中,我们将解决这个问题通过引入一类商类型来解决这个问题可由SMT求解器决定。我们通过以下方式在实践中证明了这一想法呈现商Haskell,Liquid Haskell的扩展支持商类型。

商Haskell系统.


编程语言语义:简单如1、2、3(纸张,围巾)

格雷厄姆·赫顿。函数编程杂志,第33卷,2023年10月。

编程语言语义是理论计算机中的一个重要课题科学,但初学者往往觉得很有挑战性。本文提供了本课程的教程介绍,其中整数和加法被用作表示一系列语义的最小设置简单的概念。在这种情况下,很容易做到1、2、3。

Haskell源代码.


计算编译器的并发性(纸张,围巾)

Patrick Bahr和Graham Hutton。美国计算机学会编程会议录语言,第7卷,ICFP期,第213条,2023年8月。

最近引入了选择树作为定义具有多种功能和影响。在本文中,我们将关注并发语言,并展示选择树的代码敏感版本允许此类语言的语义使用等式推理系统地转换为编译器技术。共密度结构是实现高级代数方法。作为一个案例研究,我们为基于信道通信的并发lambda演算。

Agda的正式化.


不减少的子类型(pdf格式,围巾)

布兰登·休尔(Brandon Hewer)和格雷厄姆·赫顿(Graham Hutton)。第14届程序构建数学国际会议论文集,LNCS第13544卷,2022年9月。

子类型非常有用,并且无处不在,允许数据的重要属性直接在类型中捕获。然而,子类型的标准编码没有给出控制何时减少分型证明,这可以显著影响类型检查的性能。在本文中,我们显示如何以更有效的方式表示子类型上的操作没有表现出还原行为。我们给出了Cubical Agda中的技术,利用高诱导类型的支持,并通过一些示例。

立方体Agda形式化.


一元编译器计算(纸张,围巾)

Patrick Bahr和Graham Hutton。美国计算机学会编程会议录语言,第6卷,ICFP期,第93条,2022年8月。

Bahr和Hutton最近开发了一种计算正确值的新方法编译器直接从规范中判断其正确性。然而方法论只考虑收敛的源语言的行为,这意味着编译器可能会产生任意的、错误的发散源程序的代码。在本文中,我们将展示方法论可以自然地扩展以支持编译器的计算既解决了趋同行为,也解决了发散行为同时,无需对每个方面进行单独的推理。我们的方法是基于关于使用偏单数使散度显式,以及使用强相似性来支持等式计算,但通过改变底层单子,也可以概括为其他形式的效果。

Agda的正式化;
视频讲座.


计算相关类型的编译器(纸张,围巾)

米切尔·皮卡德和格雷厄姆·赫顿。美国计算机学会编程会议录语言,第5卷,ICFP期,第82条,2021年8月。

编译器很难编写,也很难正确使用。巴尔和赫顿最近开发了一种直接从它们的正确性规范,确保生成的编译器结构正确。然而,到目前为止,这项技术只是适用于非类型化的源语言。在本文中,我们展示了转移到依赖类型的设置允许我们自然地支持类型化源语言,确保所有编译组件都是类型安全的,以及使用证明使计算结果更容易进行机械检查助理。

Agda的正式化;
视频讲座.


计算正确的编译器II:寄存器机器的返回(纸张,围巾)

Patrick Bahr和Graham Hutton。《函数编程杂志》,第30卷,2020年8月。

在“计算正确的编译器”(Bahr&Hutton,2015)中,我们开发了一个新的直接从编译器的规范计算编译器的方法正确性。我们的方法只需要基本的推理技术,并且已用于计算各种语言功能的编译器,以及它们的组合。然而,该方法侧重于基于堆栈的目标机器,而真正的编译器通常以基于寄存器的机器为目标。在这个文章中,我们展示了如何自然地调整我们的方法来计算寄存器机器的编译器。

Coq中的形式化.


用于程序改进的预序度量空间(pdf格式)

詹妮弗·哈克特(Jennifer Hackett)和格雷厄姆·哈顿(Graham Hutton)。2020年3月。

改进理论允许程序的不等式证明效率的书写方式与等式证明类似程序正确性。然而,现有的改进理论是本质上是可操作的,与外延方法相反倾向于用于正确性。此外,它们与特定的语言和成本模型,每种选择都需要一个新的理论,虽然这些理论有共性,但很难将它们之间的联系方式正式化。本文介绍了这些问题使用预序度量空间,以下各项的组合两种通常不同的程序语义方法。产生的结果理论给出了外延的提高效率的方法通用和直观,并解决了以前的问题在空间效率方面。我们展示了我们的理论如何能够用于建立通用改进结果,以及解释具体的编程示例。


清算资产:关于Liquid Haskell中资源使用的推理(纸张,围巾)

马丁·汉德利(Martin Handley)、尼基·瓦祖(Niki Vazou)和格雷厄姆·赫顿(Graham Hutton)。ACM会议记录编程语言,第4卷,POPL期,第24条,2020年1月。

Liquid Haskell是支持通过将逻辑属性编码为细化类型。在本文中,我们将展示如何使用Liquid Haskell在相同的设置下分析程序效率。我们使用系统的现有的验证机制,以确保我们的成本分析结果与特定程序上下文的自定义不变量一起有效确保我们的分析结果是准确的。为了说明我们的方法,我们分析了广泛流行的数据结构的效率和算法,并在此过程中探索资源使用的各种概念。我们的经验表明,在Liquid Haskell中关于效率的推理通常只是就像对正确性的推理一样简单,而这两者自然可以合并。


2019年MPC会议记录(html格式,围巾)

格雷厄姆·赫顿,编辑。第十三届国际会议记录关于程序构造的数学,LNCS第11825卷,Springer,2019年10月。

本卷包含2019年MPC,第13届国际程序构造数学会议。会议于年举行2019年10月7日至9日,在葡萄牙波尔图与第三届世界形式方法大会。


呼叫-需求是洞察呼叫-值(纸张,围巾)

詹妮弗·哈科特和格雷厄姆·赫顿。詹妮弗·哈克特(Jennifer Hackett)和格雷厄姆·哈顿(Graham Hutton)。美国计算机学会程序设计语言会议录,第3卷,ICFP期,第114条,2019年8月。

按需调用求值,也称为惰性求值,提供了两个键优点:组合编程和无限数据。标准语义Launchbury的自然语义是“懒惰”,它使用堆来记住延迟评估的结果。然而这个堆使lazy的操作行为的推理变得非常复杂程序。在本文中,我们提出了懒惰的另一种语义,洞察力评估用不确定性取代了状态效应,以及证明该语义在强烈意义上与标准语义等价。我们承认,展示这种新语义如何大大简化操作推理文献中许多结果的简单证明,以及如何证明导致第一个指称成本语义用于惰性评估。


定理证明:Liquid Haskell中的方程推理(pdf格式,围巾)

尼基·瓦祖(Niki Vazou)、约阿希姆·布雷特纳(Joachim Breitner)、罗斯·昆克尔(Rose Kunkel)、大卫·范霍恩(David Van Horn)和格雷厄姆·赫顿(Graham Hutton)。Haskell研讨会论文集,美国密苏里州圣路易斯,2018年6月。

等式推理是纯函数语言的关键特征之一例如Haskell。然而,迄今为止,这种推理总是在外部进行的在纸上手动或在定理证明器中机械化。这个文章展示了如何直接无缝地进行等式推理并使用Liquid Haskell进行检查。特别地,语言学习者——外部定理证明者是遥不可及的——可以从机械地检查他们的证据中获益。具体来说,我们展示了如何赫顿教科书中的方程式证明和推导可以是在Haskell中重铸为证据(扰流板:它们看起来基本相同)


AutoBench:比较Haskell程序的时间性能(pdf格式,围巾)

马丁·汉德利和格雷厄姆·赫顿。Haskell研讨会论文集,美国密苏里州圣路易斯,2018年6月。

编程的两个基本目标是正确性(产生正确的结果)和效率(使用尽可能少的资源)。基于属性QuickCheck等测试工具提供了一种轻量级的方法来检查Haskell程序的正确性,但其效率如何?在这个本文中,我们展示了如何将QuickCheck与Criterion基准测试相结合库提供一种轻量级方法来比较Haskell的时间性能程序。我们介绍了自动工作台系统,通过一些案例研究证明其实用性,并发现许多QuickCheck正确性属性也提高了效率。

系统下载;
时间性能数据(较大版本)。


参数多态性和操作改进(纸张,围巾)

詹妮弗·哈克特(Jennifer Hackett)和格雷厄姆·哈顿(Graham Hutton)。ACM会议记录关于编程语言,第2卷,ICFP,第68条,2018年9月。

操作和指称形式的参数性,长期以来一直是推理程序正确性的有用工具。然而,对于程序推理,目前还没有类似的技术改进也就是说,当一个程序使用的资源少于另一个。现有的参数论无法解决这一问题问题在于它们在资源使用方面是不可知的。这篇文章通过提出新的操作理论来解决这个问题对时间成本敏感的参数,可用于推理关于时间改进属性。我们展示了我们理论通过展示如何使用它来证明程序融合技术是时间改进,包括定点融合、地图融合和捷径融合。


改进Haskell(pdf格式,围巾)

马丁·汉德利和格雷厄姆·赫顿。2018年3月,瑞典哥德堡,函数编程趋势研讨会论文集。获得奖项获得最佳论文和最佳学生论文。

懒惰的评估是Haskell的一个关键特性,但可能会使其难以程序效率的原因。改进理论解决了这一问题为程序改进的证据提供基础随叫随到的设置,最近又重新引起了人们的兴趣。然而,改进的证明是复杂的,需要一个不等式大多数Haskell程序员都不熟悉的推理风格。在这个文章中,我们介绍了一个不等式推理的设计和实现为改进证明提供机械支持的助理,以及通过验证来自文学。


编写50年的旅程(纸张,围巾)

Graham Hutton和Patrick Bahr。函数编程杂志,第27卷,2017年9月。

50年前,约翰·麦卡锡和詹姆斯·佩因特发表了第一篇关于编译器验证,其中展示了如何正式证明将算术表达式转换为代码的编译器的正确性对于基于注册表的计算机。在本文中,我们在现代上下文,并展示如何直接计算这样的编译器使用简单的等式推理从其正确性的说明技术。


更快地失败:基于属性的测试的重叠模式(pdf格式,围巾)

乔纳森·福勒和格雷厄姆·赫顿。第19届国际会议记录声明性语言的实际方面专题讨论会,法国巴黎,2017年1月。

在基于属性的测试中,一个关键问题是生成输入数据满足属性的前提条件。一种方法是尝试这样做自动地,从前提条件本身的定义。这个想法有使用所需的缩小范围技术实现,如LazySmallCheck系统,但实际上这种方法经常导致回溯导致效率低下。为了减少回溯,我们扩展到所需的狭窄范围,允许前提条件是使用重叠模式更快地失败。我们将我们的扩展形式化,展示如何实现它,并证明在许多情况下,它可以提高效率。


Haskell编程(网页,围巾)

格雷厄姆·赫顿。剑桥大学出版社,2016年9月。

Haskell是一种纯函数式语言,允许程序员快速开发清晰、简洁和正确的软件。语言已经发展近年来,无论是在教学还是在工业界,都很受欢迎。这本书是基于作者教哈斯克尔二十多年的经验年。所有概念都是从第一原理解释的,没有编程经验是必需的,使这本书能够被广泛的读者。第一部分重点介绍基本概念,第二部分介绍读者到更高级的主题。这个新版本已经过广泛更新扩展到包括Haskell最新和更高级的功能,新的示例练习、精选解决方案、免费下载的演讲幻灯片和示例代码。演示既简洁又全面符合最新版本的语言,包括最近的更改关于应用类型、单体类型、可折叠类型和可遍历类型。


无限上的压缩函数数据结构(pdf格式,围巾)

维南西奥·卡普雷塔、格雷厄姆·赫顿和毛罗·贾斯克利奥夫。第28届实施与应用研讨会会议记录2016年8月,比利时鲁汶,《函数语言》杂志。

共性数据结构,如流或无限树,有许多在函数编程和类型理论中的应用使用递归方程定义。但我们如何确保这些方程有意义,也就是说它们实际上生成了一个生产性的无限对象?A类实现生产力的标准方法是使用巴拿赫不动点定理,它保证了上递归方程解的唯一存在性某些条件下的度量空间。满足这些条件的函数称为收缩。在本文中,我们给出了以声音和完整表示形式的流上的收缩定理,并将此结果推广到一类广泛的非良基结构,首先是无限二叉树,然后是容器函子。

这些结果在功能上有重要的潜在应用编程,在编程中,可以成功地将同化和同化部署到模拟连续反应系统、动态交互、信号处理,以及其他需要灵活处理非基础数据的任务。我们的表示定理为紧凑计算提供了一个定义范式使用这些数据,并且很容易对其进行推理。


删除延续部分(pdf格式,围巾)

Graham Hutton和Patrick Bahr。可以更改的成功列表《世界》,LNCS 9600,斯普林格出版社,2016年。

在程序转换领域,人们经常将程序转换为continuation-passing样式使其控制流显式,然后使用非功能化立即删除产生的延续使程序成为第一顺序。在本文中,我们将展示这两个变换可以融合到一个单独的变换步骤中这样就不需要先引入延续,然后再消除延续。我们的方法是计算,使用标准的等式推理技术,并且应用广泛。

Powerpoint幻灯片;
Coq中的形式化.


计算正确的编译器(纸张,围巾)

Patrick Bahr和Graham Hutton。函数编程杂志,第25卷,2015年9月。

在本文中,我们提出了一种解决以下问题的新方法计算编译器。特别是,我们开发了一个简单但允许我们从中派生正确编译器的通用技术通过系统计算实现高级语义,包括所有细节编译器的实现计算过程。我们的方法基于使用标准等式推理技术,并已应用计算各种语言功能的编译器及其组合,包括算术表达式,异常、状态、各种形式的lambda计算、有界以及无界循环、非确定性和中断。全部本文中的计算已使用Coq证明助手,作为一个方便的交互工具用于开发和验证计算的工具。

Powerpoint幻灯片;
Coq中的形式化;
附录(附加示例);
视频讲座.


便宜的程序!(pdf格式,围巾)

詹妮弗·哈克特(Jennifer Hackett)和格雷厄姆·哈顿(Graham Hutton)。会议记录第三十届ACM/IEEE计算机逻辑年会《科学》,日本京都,2015年7月。

写下工件上递归操作符的定义纸张。告诉我它的类型,但小心别让我看到操作员的定义。我会告诉你一个优化算子满足的定理。作为额外奖励,我将还可以为优化提供正确性证明,以及并正式保证其对性能的影响。本文的目的是解释这些技巧。


走向触角理论(pdf格式,围巾)

乔纳森·福勒和格雷厄姆·赫顿。函数式编程趋势(Manuel Serrano和Jurrian Hage编辑),LNCS 9547,Springer,2016.功能趋势研讨会论文选集2015年6月,法国索菲亚·安蒂波利斯,《编程》。

测试程序时,通常有一些部分很少执行,因此更难测试。寻找符合以下条件的输入确保执行这些部分是到达问题,它通常寻求确保计划的目标部分始终执行。在之前的工作中,Naylor和Runciman基于使用函数逻辑编程的惰性收缩。他们的工作是重点关注有关执行和性能。在本文中,我们为基础这种系统的理论,通过正式确立正确性一个简单的可达解算器。


工人/包装工/制造工/更快(pdf格式,围巾)

詹妮弗·哈克特(Jennifer Hackett)和格雷厄姆·哈顿(Graham Hutton)。第19届会议记录ACM SIGPLAN函数编程国际会议,瑞典哥德堡,2014年9月。

程序优化的许多研究都集中在形式化方法上正确性:证明优化保留了程序的含义。矛盾的是,对于效率:证明优化程序的性能实际上是改进。本文针对一个通用的优化技术,工人/包装器转换。特别地,我们使用改进理论的按需调用变体来建立条件工人/包装器转换被正式保证保留或缩短时间用Haskell等惰性语言编写的程序的性能。


工作,包裹,修理,折叠(纸张,围巾)

尼尔·斯卡索普(Neil Sculthorpe)和格雷厄姆·赫顿(Graham Hutton)。函数编程杂志,24(1):113-1272014年1月。

工人/包装器转换是一种通用技术重构递归程序以提高其性能。前两种将技术形式化的方法是基于不同的递归运算符和不同的正确性条件。在本文中,我们将展示这两种方法如何通过结合其正确性以统一的方式进行概括条件,用两个都是的新条件扩展理论确保正确的worker/wrapper技术,并探索其带来的好处。所有证明均已使用Agda系统进行机械验证。

Powerpoint幻灯片;
Agda的正式化;
扩展版本(使用示例和所有证明)。


表现不佳的问题:一种新方法优化共草书程序(pdf格式,围巾)

詹妮弗·哈克特、格雷厄姆·赫顿和毛罗·贾斯克利奥夫。程序第25届功能实现与应用研讨会Languages,荷兰奈梅亨,2013年8月。

本文提出了一种新的优化同位语程序的方法通过因子分解。特别是,我们关注使用共递归操作符展开。我们使用并扩展了证据守卫式造币和展开融合技术,捕获用抽象方法推广共性假设的模式和表示函数。我们观察到的模式很简单以前没有观察到,并且广泛适用。我们开发了一个此模式的一般程序分解定理,通过一系列实例证明其实用性。


按单编译(pdf格式,围巾)

Laurence E.Day和Graham Hutton。第25届会议记录函数语言实现与应用研讨会,荷兰奈梅亨,2013年8月。

在以前的工作中,我们提出了解决这个问题的新方法通过组合早期开发模块化口译员的工作模块化点菜法的monad变换器语法。在本文中,我们对现有的框架的多个方向。特别是,我们展示了如何使用泛化代数数据类型来支持采用更模块化的方法键入单个语言功能,我们通过考虑可变状态、变量绑定和非交换问题我们展示了锌提取机适用于为提供模块化通用目标机器我们的模块化编译器。

哈斯克尔源代码也可以使用。


表示收缩流上的函数(pdf格式,围巾)

格雷厄姆·赫顿(Graham Hutton)和毛罗·贾斯克利奥夫(Mauro Jaskelioff)。2011年10月。

流或无限列表有许多功能性应用程序编程,和是使用递归方程自然定义的。但我们如何确保这些等式有意义,即它们实际上产生了定义明确的流?在本文中,我们提出了一种基于拓扑的解决此问题的新方法流上压缩函数的概念。特别是,我们给出压缩式的一个完备表示定理流上的函数,说明此定理作为生成定义明确的流并显示如何提高结果定义的效率使用压缩函数的另一种表示法。

Powerpoint幻灯片;
Haskell源代码;
扩展版本(连同所有证据);
视频讲座.


面向效果的模块化编译器(pdf格式,围巾)

Laurence E.Day和Graham Hutton。函数式编程趋势第12卷(Ricardo Pena和Rex Page,编辑),LNCS 7193,Springer,2012年3月。第十二届国际研讨会论文集《函数式编程趋势》,西班牙马德里,2011年5月。收到最佳学生论文奖。

编译器传统上被分解为多个单独的阶段,例如解析、类型检查、代码生成等另一个获得相对较少收益的潜在因子分解注意:处理单独的语言特性,例如可变状态、输入/输出、异常、并发等等。在本文中我们关注模块化编译的问题,其目的是独立开发独立语言功能的编译器然后根据需要进行组合。我们总结了迄今为止的进展、问题以及进一步的工作。

Haskell源代码也可以使用。


折叠折叠以实现更快的功能(纸张,围巾)

格雷厄姆·赫顿(Graham Hutton)、毛罗·贾斯克利奥夫(Mauro Jaskelioff)和安迪·吉尔(Andy Gill)。第页,共页泛型程序设计专题,20(3和4):353-3732010年6月。

工人/包装器转换是通过更改递归程序的类型。之前的形式化(Gill&Hutton,2009)是基于基于递归的简单不动点语义。在本文中我们开发了一种基于初始代数的更结构化方法语义。特别是,我们展示了worker/wrapper转换是如何进行的可以应用于使用结构化模式定义的程序由fold操作符捕获的递归,并说明我们的新技术并举例说明。

扩展文章(连同所有证明)也可用。


正确编译并发:剪切中间人(pdf格式,围巾)

胡立阳(Liyang Hu)和格雷厄姆·赫顿(Graham Hutton)。函数编程卷趋势10(Zoltan Horvath和Viktoria Zsok,编辑),Intellect,9月2010年,第十届功能趋势研讨会论文集编程,斯洛伐克科马诺,2009年6月。

证明编译器并发正确性的标准方法语言需要使用多个中间翻译过程演算。我们提出了一种更简单的方法,避免了对于这种中间语言,使用一种新的方法直接在源语言和目标语言之间建立互模拟。我们使用Agda系统在两种小型语言上演示了该技术呈现并正式验证编译器的正确性证明。


工作者/包装器转换(纸张,围巾)

安迪·吉尔和格雷厄姆·赫顿。函数编程杂志,19(2):227-2512009年3月。

worker/wrapper转换是一种用于更改类型的技术通常是为了提高计算性能。它已经被编译器编写人员使用了多年,但该技术在更广泛的函数式编程社区中鲜为人知从未被准确描述过。在本文中,我们将解释、形式化、,并探讨worker/wrapper转换的一般性。我们还为其用作等式推理提供了一个系统的方法提高程序性能的技术,并说明使用一系列示例说明此配方的功效。

Powerpoint幻灯片和一个扩展文章(连同所有证据)也可用。


模块化和实现数学操作语义(pdf格式,围巾)

毛罗·贾斯克利奥夫(Mauro Jaskelioff)、尼尔·加尼(Neil Ghani)和格雷厄姆·赫顿(Graham Hutton)。理论计算机科学电子笔记,第229卷,第5期,第75-95页,2011年3月。第二次讲习班会议记录关于数学结构函数编程,冰岛雷克雅未克,2008年7月。

结构操作语义是一种流行的指定技术通过归纳子句表达程序的含义。一个寻求句法对这些子句的限制,以便生成操作语义表现良好。这种方法简单而具体,但有一些缺点。图里开创了一种更抽象的分类治疗基于操作语义本质上是一种分布的思想语法重于行为。在本文中,我们采用了Turi的方法两个新方向。首先,我们展示了如何编写操作语义作为模块化组件,以及如何组合这些组件来指定完整的语言。其次,我们展示了Turi的操作语义使其非常适合在函数式编程语言,如Haskell。

Haskell源代码也可以使用。


实现软件的验证实现事务性存储器(pdf格式,围巾)

胡立阳(Liyang Hu)和格雷厄姆·赫顿(Graham Hutton)。函数编程卷趋势9(彼得·阿赫滕、彼得·库普曼和马可·莫拉赞编辑),Intellect,2009年7月。第九届国际趋势研讨会论文集函数编程,荷兰奈梅亨,2008年5月。

近年来,并发的想法引起了人们的极大兴趣编程使用事务性存储器,例如提供的STM Haskell公司。虽然为程序员提供了一个简单的高级基于stop-the-world语义的事务模型低级实现相当复杂,使用了微妙的执行多个并发事务的优化技术高效,这对编程模型的可行性至关重要。在本文中,我们向正式验证事务性内存的实现。特别是,我们提出了一个受STM Haskell启发的剥离式、理想化并发语言,并展示此语言的低级实现通过编译器根据高级语义进行调整及其正确性定理,使用QuickCheck和HPC。事实证明,这些工具的使用在我们形式化的发展。


关于效果的推理:查看穿过树林的树林(pdf格式,围巾)

格雷厄姆·赫顿和戴安娜·富尔格。研讨会会议记录《函数编程趋势》,荷兰奈梅亨,2008年5月。

纯函数式语言支持使用利用单数等数学概念产生不纯效果,应用函子和箭头。然而,与财富相比关于使用这些概念编写有效程序的研究,关于结果程序。在本文中,我们将重点讨论这个问题,使用一个关于重新标记的简单但有启发性的示例二叉树。

扩展文章(连同所有证据)也可用。


这些常数的含义是什么干扰?(纸张,围巾)

格雷厄姆·赫顿和乔尔·赖特。格雷厄姆·赫顿。函数编程杂志,17(6):777-792,剑桥大学出版社,2007年11月。

异步异常,或中断,对于编写健壮的模块化程序,但传统观点认为从语义角度来看很难。在本文中,我们为中断提供一个简单的、形式上合理的语义。我们的方法是展示中断的高级语义可以通过以下方式证明低级实现的合理性编译器的方法及其正确性定理。以这种方式我们对这个问题有两种不同的观点等效,这对正确性有更大的信心我们的语义。

Powerpoint幻灯片,Haskell源代码和一个扩展文章(连同所有证据)也可用。


Haskell编程(网页,围巾)

格雷厄姆·赫顿。剑桥大学出版社,2007年1月。

Haskell是教授函数的主要语言之一编程,使学生能够编写更简单、更干净的代码,学习如何组织和推理程序。这个入门是初学者的理想选择:它不需要以前的编程经验和所有概念都从第一个开始解释通过精心挑选的示例实现原则。每章包括从简单的项目到扩展的项目,以及进一步阅读更高级主题的建议。演讲清晰简单,受益于经过几年的精炼和分类测试。结果是一个文本可用于课程或自学。功能包括:每个章节都有可自由访问的powerpoint幻灯片;解决方案练习和考试问题(含解决方案)可用于辅导员;完全符合Haskell最新发布。


紧凑型聚变(pdf格式,围巾)

凯瑟琳·霍普和格雷厄姆·赫顿。研讨会会议记录数学结构函数编程,爱沙尼亚库雷萨雷,2006年7月。

构图风格,如清晰度和模块化。然而,生成的中间数据结构可能意味着由此产生的程序在空间方面效率低下。这些可能使用毁林技术移除,但是否性能实际上取决于结构按照生产的顺序消费。在这个本文使用示例探讨了这个问题,其中中间结构是一个列表,并提供一个解决方案。然后,我们使用抽象机器将这些结果形式化公开所涉及的底层数据结构。


精确的步数(pdf格式,围巾)

凯瑟琳·霍普和格雷厄姆·赫顿。实施和应用函数语言,计算机科学讲义卷4015,施普林格-柏林/海德堡,2006年。论文选自第十七届实施与应用国际研讨会2005年9月,爱尔兰都柏林,功能语言学院。

从语言的求值器开始,它是使用连续程序可以机械地导出相同的语言转换。这与研究空间和时间都相关程序的属性,因为这些属性可以通过计数来估计抽象机器的转换和测量需要额外的数据结构,例如环境和堆栈。本文使用这个过程来推导一个精确的函数计算计算简单表达式所需的步骤数语言。


BCTCS 2005报告(pdf格式,围巾)

格雷厄姆·赫顿,编辑。欧洲理论协会公报《计算机科学》,第86期,第241-256页,2005年6月。

此报告包含编辑的摘要BCTCS 2005,于举行2005年3月22日至24日,英国诺丁汉。


同草书程序的证明方法(pdf格式,围巾)

杰里米·吉本斯和格雷厄姆·赫顿。《基础信息学》节目转型专刊,66(4):353-366,IOS出版社,2005年4月至5月。

递归是一种众所周知的强大编程技术广泛的应用。取芯的双重技术较少众所周知,但越来越证明它同样有用。这个本文是关于四种主要证明方法的教程共递归程序的属性:不动点归纳近似(或take)引理、共聚和融合。


计算异常机器(pdf格式,围巾)

格雷厄姆·赫顿和乔尔·赖特。函数编程卷趋势5(Hans-Wolfgang Loidl,编辑),Intellect,2006年2月。挑选出来的第五届函数编程趋势研讨会论文,慕尼黑,2004年11月。

在之前的工作中,我们演示了如何验证小型语言的编译器但有例外。在本文中,我们展示了如何计算与验证相反,抽象机器用于此语言。关键的一步是使用雷诺德的非功能化,最近出现的一种旧的程序转换技术丹维等人(Danvy et al。

扩展版本(包括所有计算);
Powerpoint幻灯片;
视频讲座.


正确编译异常(pdf格式,围巾)

格雷厄姆·赫顿和乔尔·赖特。第七届国际会议记录课程建设数学会议,年讲义《计算机科学》第3125卷,斯普林格出版社,2004年7月。

例外是现代编程语言的一个重要特征,但他们的编纂传统上被视为先进的主题。在本文中,我们展示了编译的基本方法可以解释和验证使用堆栈展开的异常简单而准确地使用初等函数编程技术。特别是,我们为一种小型语言开发了一个编译器例外情况,以及其正确性的证明。

扩展版本(连同所有证据);
Isabelle中的形式化(托比亚斯·尼普科);
Powerpoint幻灯片;
Haskell源代码;
带跳转的版本.


首次APPSEM-II研讨会会议记录(围巾)

格雷厄姆·赫顿,编辑。诺丁汉大学,2003年3月。

本卷包含首次APPSEM-II研讨会,于3月26日至28日举行2003年,英国诺丁汉。


倒计时问题(纸张,围巾)

格雷厄姆·赫顿。函数编程杂志,12(6):609-616,剑桥大学出版社,2002年11月。

我们系统地开发了一个函数程序,用于解决倒计时问题,一种数字游戏,其中目的是构造满足以下条件的算术表达式某些约束。从正式开始我们提出了一个简单但效率低的程序这解决了问题,并证明了该程序的正确性。然后我们使用程序融合计算等效但更有效的程序,然后通过利用算术特性进一步改进。

新闻稿;
谈话幻灯片(幻灯片演示文件,波浪);
Haskell源代码;
带有定时信息的版本;
视频讲座(微软系列客座演讲Haskell编程).

许多国家和地方报纸都提到了这项工作,包括《泰晤士报》、《泰晤士高等教育增刊》、《伦敦晚报》、《诺丁汉晚报》和诺丁汉大学杂志。


Haskell特刊(社论,围巾)

格雷厄姆·赫顿,编辑。功能编程杂志,12(4&5):293-510,剑桥大学出版社,2002年7月。

《函数编程杂志》的这期特刊是致力于Haskell,并在关于1995年至2000年期间使用的语言。


泛型逼近引理(pdf格式,围巾)

格雷厄姆·赫顿和杰里米·吉本斯。信息处理信件,79(4):197-201,爱思唯尔科学,2001年8月。

近似引理是对众所周知的取引理,并用于证明程序的属性生成值列表。我们展示了近似引理与take引理自然可以从列表推广到大型一类数据类型,并给出一个泛型近似引理它在应用到的数据类型中是参数化的。作为有用的副产品,我们发现在这里推广近似引理这种方法也简化了它的证明。


什么时候函数是折叠还是展开?(pdf格式,围巾)

杰里米·吉本斯(Jeremy Gibbons)、格雷厄姆·哈顿(Graham Hutton)和托尔斯汀·阿尔滕科奇(Thorsten Altenkirch)。的程序第四届计算机科学协同算法国际研讨会,理论计算机科学电子笔记,第44.1卷,2001年4月。

我们给出了当可以使用递归操作符编写set-theoretic函数折叠,递归操作符的对偶条件展开。这些条件简单实用,并且在基础数据类型。


2000年ACM SIGPLAN Haskell研讨会论文集(html格式,围巾)

格雷厄姆·赫顿,编辑。理论计算机科学电子笔记,41(1),爱思唯尔科学,2001年8月。

本卷包含哈斯克尔2000年研讨会会议于2000年9月17日在加拿大蒙特利尔举行。该研讨会由ACM SIGPLAN赞助,是2000年PLI原理、逻辑和实现座谈会高级编程语言,包括ICFP/PPDP会议以及相关的研讨会。


结构化共递归程序的证明方法(pdf格式,围巾)

杰里米·吉本斯和格雷厄姆·赫顿。苏格兰第一届会议记录函数编程研讨会,苏格兰斯特林,1999年8月。

协同安全程序产生最大不动点类型的值与递归程序相反,递归程序使用最小不动点的值类型。有许多广泛使用的属性证明方法核心草书程序,包括不动点归纳、take引理和共归纳。然而这些方法都是相当低级的,因为他们没有利用通常出现在同草书定义中。我们争论一种更结构化的方法来证明同草书的性质程序。特别是,我们通过编写共草书程序来说明使用封装通用模式的简单运算符共草书定义,然后我们可以使用高级代数属性这个操作符以纯粹的计算方式进行证明这避免了使用归纳法或共归纳法。

A类日志版本本文的还有更广泛的重点。


折叠的普遍性和表现力教程(纸张,围巾)

格雷厄姆·赫顿。函数编程杂志,9(4):355-372,剑桥大学出版社,1999年7月。

在函数式编程中,fold是一个标准运算符,用于封装处理列表的简单递归模式。这篇文章是关于列表折叠操作符的两个关键方面的教程。第个,共个总之,我们强调使用折叠的通用属性两者都是一种证明原则,避免了归纳法的需要证明,并作为指导使用fold将递归函数转换为定义。其次,我们表明,即使递归模式由fold很简单,在元组和函数都是一流的语言中值折叠运算符的表达能力比可能的更强首先应该是。


折叠和展开程序语义(pdf格式,围巾)

格雷厄姆·赫顿。第三届ACM SIGPLAN国际会议记录《函数编程》,马里兰州巴尔的摩,1998年9月。

在本文中,我们解释了递归操作符如何用于a中程序语义的结构和原因功能语言。特别是,我们展示了递归运算符fold可用于构造指称语义,双重递归运算符展开如何用于构造操作语义,以及代数这些运算符的属性可以用于推理程序语义。这些技术借助于两个主要示例,第一个涉及算术表达式,第二个是关于Milner的并发语言CCS。这个本文的目的是为函数式程序员提供新的见解递归操作符、程序语义和关系他们之间。


Haskell中的单数分析(纸张,围巾)

Graham Hutton和Erik Meijer。函数编程杂志,8(4):437-444,剑桥大学出版社,1998年7月。

本文是关于在Haskell中定义递归下降解析器的教程。本着一站式购物的精神,本文结合了将三个区域合并为一个源。这三个区域是功能解析器,使用单子来构造函数程序,以及使用特殊Haskell中一元程序的语法。更具体地说,论文显示如何使用Haskell中的do符号定义一元解析器。这篇论文是针对熟悉Haskell,并完成了语法和解析课程。关于以下方面的一些知识函数解析器会很有用,但假设没有使用monad的经验。

Haskell中的一元解析库.

本文的扩展版本可作为技术报告.


一元解析器组合子(pdf格式,围巾)

Graham Hutton和Erik Meijer。技术报告NOTTCS-TR-96-4,部门诺丁汉大学计算机科学系,1996年。

在函数编程中,一种流行的构建递归的方法下降解析器是将解析器建模为函数,并定义实现的高阶函数(或组合子)语法结构,如排序、选择和重复。这样的解析器形成一个monad实例,一个代数实例数学结构已被证明对寻址有用许多计算问题。本报告的目的是提供关于构建monadic方法的分步教程函数分析器,并解释由此产生的一些好处利用monad。没有解析器组合符的先验知识假设为单子的or。事实上,这份报告也可以被视为第一次介绍monad在编程中的使用。

Gofer中的一个简单单子解析库;
Gofer的一个更复杂的图书馆.

此报告的精简版本显示为功能性珍珠在JFP中。


回到基础:从功能上派生表示变换器(纸张,围巾)

Graham Hutton和Erik Meijer。功能编程杂志,6(1):181-188,剑桥大学出版社,1996年1月。

许多功能程序可以被视为表示变换器,也就是说,作为从一个具体值转换抽象值的函数向另一方表示。此类程序的示例包括基本转换器、二进制加法器和乘法器以及编译器。本文给出了一些不同的方法来指定表示变换器(逐点、函数和关系),并提出一种可用于推导函数的简单技术规范中的程序。


太空香蕉:将折叠和展开扩展为指数类型(pdf格式,围巾)

埃里克·梅耶尔(Erik Meijer)和格雷厄姆·赫顿(Graham Hutton)。第七届SIGPLAN-SIGARCH-WG2.8国际会议记录职能会议编程与计算机建筑,ACM出版社,加利福尼亚州拉荷亚,1995年6月。

折叠和展开是用于处理的通用功能和构建列表。通过使用分类方法将递归数据类型建模为函子的不动点,这些泛函及其代数性质是从列表推广到多项式(产品总和)数据类型。然而,对多项式的限制数据类型是一个严重的限制:它排除了使用指数(函数空间),而函数式编程的核心是是一级值,因此指数应该能够在数据类型定义中自由使用。在本文中,我们解释Freyd如何对递归数据类型建模因为difunctor的不动点显示了如何推广折叠并从多项式数据类型展开到涉及指数。


类别、寓言和电路设计(pdf格式,围巾)

卡罗琳·布朗和格雷厄姆·赫顿。第十届IEEE年会会议记录《计算机科学中的逻辑》,IEEE计算机社会出版社,洛斯阿拉米托斯,加利福尼亚州,1994年7月。

基于二进制关系的语言为根据规范构建程序。例如,使用关系而不是函数使规范更加抽象(例如,许多程序使用相反的关系上的运算符),并对非决定论进行了自然处理在规范中。在本文中,我们提出了一种新颖的图像解释关系项作为电路的简单图片,以及可靠性/完整性使得关系方程能够通过图解推理得到证明的结果。


Ruby解释器(pdf格式,围巾)

格雷厄姆·赫顿。查尔默斯大学研究报告72技术,1993年5月。

Ruby是一种用于设计数字电路的关系演算。本文档是Ruby解释器的指南允许“可实现”的特殊类要执行的Ruby程序。编写了Ruby解释器在函数编程语言Lazy ML中,并在交互式Lazy ML系统。

如何获取和安装口译员.


函数程序的关系派生(pdf格式,围巾)

格雷厄姆·赫顿。STOP暑期学校关于建构算法的课堂讲稿,荷兰阿米兰,1992年9月。

本文介绍了关系计算在派生程序。使用关系演算Ruby,我们推导出向二进制数加一位以给出一个新的二进制数。由此产生的程序不足为奇标准的“半加数列”,但推导说明了关于处理关系而不是函数的一些要点。


计算程序中的函数和关系(pdf格式,围巾)

格雷厄姆·赫顿。格拉斯哥大学博士论文,1992年10月。可作为研究报告FP-93-5获得。

本论文是关于编程的计算方法,从规范中派生程序。一个这样的计算范式是Ruby,它是一种用于设计数字电路。我们确定了两个使用Ruby进行派生的缺点。第一个是程序是该规范从未被精确化。第二个是派生过程中出现的特定类型断言已通过非正式论据或使用谓词演算,而不是应用Ruby的代数法则。

在本论文中,我们解决了这两个缺点如上所述。我们定义它对Ruby意味着什么通过引入因果关系的概念和所表示的网络通过一个程序。此外,我们还提供了一名口译员对于作为实现的程序。我们展示了如何使用在Ruby中验证类型断言给出的算子的代数性质关系的最佳左右类型。


用于解析的高阶函数(纸张,围巾)

格雷厄姆·赫顿。函数编程杂志,2(3):323-343,剑桥大学出版社,1992年7月。

在组合符解析中,解析器的文本类似于BNF符号。我们介绍了基本方法和一些扩展。我们解决了white-space和带有单独的词汇和句法阶段。特别是给出了越位规则的处理方法。基本的其他扩展方法包括一个“into”组合形式和许多有用的应用程序,以及一种简单的方法,通过这种方法组合器解析器可以产生更多信息性错误消息。

Gofer中的解析库;
Lazy ML中的解析库.

最近的一些文章解释了函数解析器的一元方法也可以短格式提供JFP文章,或作为扩展技术报告.


pers作为类型的计算理论(pdf格式,围巾)

格雷厄姆·赫顿和埃德·沃曼。研究报告1992/R1,格拉斯哥大学计算科学系,1992年。

在编程的计算方法中,程序是从通过代数推理进行规格说明。本报告提供了一个计算基于二进制关系as概念的编程框架程序和部分等价关系(pers)作为类型。工作随着程序泛化功能范式,承认非决定论和关系逆的使用。作为类型允许对受法律约束的类型进行自然处理和限制。


使功能更通用(pdf格式,围巾)

格雷厄姆·赫顿和埃德·沃曼。1991年格拉斯哥研讨会会议记录函数编程(苏格兰波特里),Springer-Verlag系列1992年,柏林施普林格-弗拉格计算机研讨会。

“功能”概念的定义不是一成不变的,但这取决于我们在语言中采用的类型。带有部分等价关系(pers)作为关系语言中的类型,我们展示了函数关系正是那些满足简单方程f=f o fu o f,其中“o”和“u”分别是关系的合成和逆运算符。这篇文章构成“pers作为类型的计算理论”的一部分。


带关系的函数编程(pdf格式,围巾)

格雷厄姆·赫顿。1990年格拉斯哥功能性研讨会会议记录编程(苏格兰Ullapool),Springer Verlag系列研讨会《计算》,施普林格-弗拉格出版社,柏林,1991年。

虽然在关系框架中编程比功能风格在表现力、关系计算方面效率更低,语义更麻烦。在本文中,我们提出功能风格和关系风格的新颖融合。我们确定一类“因果关系”,它继承了关系的双向属性,但保留了效率功能风格的语义基础。


使用组合符进行解析(围巾)

格雷厄姆·赫顿。1989年格拉斯哥功能性研讨会会议记录编程(苏格兰弗雷泽堡),Springer-Verlag系列研讨会《计算机》,施普林格-弗拉格出版社,柏林,1990年。

在组合符解析中,解析器的文本类似于BNF符号。我们介绍基本方法,并说明如何将其扩展到更多实用解析器。我们解决布局的特殊问题,以及具有独立词汇和语法阶段的解析器。特别地,给出了一种优雅的处理越位规则的新方法。给出了许多例子和评论。

(本文没有电子版。)