跳到内容

琼斯特林/agda-calf

存储库文件导航

小牛:具有成本意识的逻辑框架

这个小牛语言是一种c(c)成本-器皿逻辑的如果研究功能程序定量方面的框架。

此存储库包含Agda实现小牛以及一些不同复杂性的案例研究。

HTML浏览

可以使用浏览器中的HTML文件在浏览器中以(语义)语法高亮显示交互方式查看源代码./html格式目录。这些文件是通过运行以下命令生成的:

agda--html--html-dir=html src/index.agda

你可以先打开html/index.html.

查看特定模块M(M),打开html/M.html格式在web浏览器中。例如,打开html/示例。排序。并行.html查看模块示例。排序。平行.

安装

此实现小牛已使用以下工具进行测试:

  • Agda v2.6.3,带agda-stdlib型v2.0实验

安装说明见安装.md.

语言实现

成本单体参数化

小牛由参数化成本单胚 (ℂ,+,零,≤).形式定义,CostMonoid公司,在中给出代数。成本.定义平行费用幺半群 (ℂ, ⊕, 𝟘, ⊗, 𝟙, ≤)以及ParCostMonoid公司.

下面给出了一些常见的费用幺半群和并行费用幺半代数。成本。实例; 例如,ℕ-CostMonoid公司简单地跟踪顺序成本。请注意,每ParCostMonoid公司诱导CostMonoid公司通过加法子结构(ℂ,Ş,𝟘,≤).

核心语言

语言本身是通过以下文件实现的,这些文件按依赖关系检查顺序给出。

以下模块未参数化:

以下模块由参数化CostMonoid公司:

  • 小牛。步骤定义计算效果以及通过重写规则关联的连贯律。

以下模块由参数化ParCostMonoid公司:

  • 小牛。平行定义并行执行操作_∥_其成本结构由ParCostMonoid公司(即。,_⊗_).

类型

src/小腿/数据,我们提供常用的数据类型。

以下模块没有参数化,只是通过元+基本体:

以下模块定义自定义,小牛-用于成本分析的特定数据类型,并通过CostMonoid公司:

  • 小牛。数据。IsBoundedG(已绑定G)定义了成本约束的广义概念,IsBoundedG(已绑定G),其中绑定是类型为的程序F单元.此外,它还提供了用于证明常见计算形式有界性的引理。
  • 小牛。数据。IsBounded(已绑定)实例化IsBoundedG(已绑定G)用于窗体的成本边界阶跃(F单位)c(ret triv).
  • 小牛。数据。边界函数使用定义成本约束函数IsBounded(已绑定).
  • 小腿。数据。BigO公司通过IsBounded(已绑定).特别是,类型为给定A测量的via尺寸,f∈𝓞(g)(即“给定类型的输入A类和尺寸测量大小A类,如果在中𝓞(g))是输入大小的下限n’和常数乘数k个连同证据小时对于所有输入x个具有n’≤尺寸x,f倍以为界k个的倍数g(尺寸x),表示n’≤n⇒f[n]≤k g[n]通过h.

示例

我们在src/示例.

顺序算法

  • 模块简单
    • 程序的定义身份证件返回它的输入。
    • 成本约束计划的定义id/绑定,这与身份证件.
    • 定理id/is边界证明了这一点身份证件以为界id/绑定.
    • 定理身份/正确说明的扩展正确性身份证件作为…的必然结果id/is边界.
    • 定理id/渐近:给定nat被测-via(λn→n),id∈𝓞(λn→0)说明身份证件在中𝓞(0).
  • 模块硬
    • 程序的定义身份证件它通过归纳法重构其输入。
    • 成本约束计划的定义id/绑定,导致n个退货前费用n个.
    • 定理id/is边界证明了这一点身份证件以为界id/绑定.
    • 定理身份/正确说明的扩展正确性身份证件作为…的必然结果id/is边界.
    • 定理id/渐近:给定nat被测-via(λn→n),id∈𝓞(λn→n)声明身份证件在中𝓞(n),其中n个是输入编号。
  • 这是一个证据易用id硬.id在外延上是等价的,easy.id≡hard.id),作为身份/正确证据。

并行算法

  • 程序的定义总和它将树的元素相加,在执行每个加法操作时产生单位成本。在每个节点上,递归调用是并行计算的。
  • 成本约束计划的定义总和/界限,导致尺寸t,深度t通过值级函数返回树的总和之前的成本。
  • 定理总成本说明总和总和/界限是等效的。
  • 定理总和/界限说明总和t以为界总和/界限,作为总和/has-cost.
  • 模块速度慢
    • 程序的定义实验2它通过执行两个相同的递归调用,通过其输入计算二的指数。由于两个相同的递归调用是并行进行的,因此工作是指数级的,但跨度仍然是线性的。
    • 成本约束计划的定义expõ/绑定,引发2^n-1,n返回结果前的成本2 ^n个.
    • 定理expõ/有界证明了这一点实验2以为界exp⁄/绑定.
    • 定理exp⁄/校正说明的扩展正确性实验2作为…的必然结果exp⁄/is边界.
    • 定理exp/渐近:给定nat被测via(λn→n),exp⁄∈𝓞(λm→2^n,n)说明实验2在中𝓞(2^n,n).
  • 模块快速
    • 程序的定义实验2其通过标准递归算法通过其输入来计算二的幂。
    • 成本约束计划的定义exp⁄/绑定,引发n,n个返回结果前的成本2 ^n个.
    • 定理exp⁄/is边界证明了这一点实验2以为界exp⁄/绑定.
    • 定理exp⁄/校正说明的扩展正确性实验2作为…的必然结果exp⁄/is边界.
    • 定理expõ/渐近:给定通过(λn→n)测量的nat,expõ∈𝓞(λn→n,n)说明实验2在中𝓞(n,n).
  • 证明慢速膨胀快速爆炸在外延上是等价的,慢≡快:(slow.exp≡快.exp⁄).

混合算法

首先,我们开发了用于顺序排序和并行排序的通用定义和定理集合。

  • 示例。排序。可比
    • 记录可比描述可比较类型的要求,包括h-成本假设每次比较都受到单位成本的限制。这是排序的成本模型。
  • 示例。排序。核心
    • 排序正确性的谓词,基于已排序和置换关系agda-stdlib型.谓词IsSort排序声明分类是一种正确的排序算法。
    • 定理IsSort⇒≡,这表明任何两个正确的排序算法在扩展上是等价的。

这里,我们使用成本幺半群ℕ-CostMonoid公司,跟踪发生的连续步骤的总数。

  • 示例。排序。相继的。插入排序
    • 程序的定义分类实现插入排序。
    • 定理sort/correct:IsSort排序验证的正确性分类.
    • 定理排序≤排序/成本/已关闭说明分类l以为界分拣/成本/关闭l=长度l².
    • 定理排序/渐近:给定(列表A)测量via长度,排序∈𝓞(λn→n²)说明分类在中𝓞(n²),其中n个输入列表的长度。
  • 示例。排序。相继的。合并排序
    • 示例。排序。相继的。合并排序。拆分
      • 程序的定义分裂,它将列表拆分为两半。
      • 定理拆分/更正验证的正确性属性分裂.
      • 定理分割≤分割/成本说明拆分l以为界,因为将列表拆分为两半不需要进行比较。
    • 示例。排序。相继的。合并排序。合并
      • 程序的定义合并,它合并一对已排序的列表。
      • 定理合并/更正验证的正确性属性合并.
      • 定理合并≤合并/成本/关闭说明合并(l₁,l⁄)以为界长度lõ+长度lõ.
    • 程序的定义分类实现合并排序。
    • 定理sort/correct:IsSort排序验证的正确性分类.
    • 定理排序≤排序/成本/已关闭说明分类l以为界排序/成本/关闭l=⌈log⁄长度l⌉*长度l.
    • 定理排序/渐近:给定(列表A)测量via长度,排序∈𝓞(λn→n*⌈log⁄n⌉)说明分类在中𝓞(n*log⁄n⌉),其中n个输入列表的长度。

定理isort≡msort:(isort.sort≡msort.sort)声明插入排序排序合并排序排序在外延上是等价的。

数据结构

已摊销

摊销数据结构,通过共创.

迪卡尔

中介绍的示例贴花包含在示例。迪卡尔.

我们实施并分析基本双重的例子。

我们介绍分支失败不确定性的原语,并给出相应的例子。

  • 模块快速排序包含使用中的原语的非确定性快速排序算法示例。排序。相继的。核心.
  • 模块查找包括在边界外索引上失败的列表查找功能。
  • 模块普及包括一个普遍(非良性)不确定性的简单示例。

我们引入概率轻弹并给出相应的示例,说明子列表二项式分配。

我们介绍得到设置全局状态的原语,并显示一个简单的命令式程序,其成本范围涉及得到设置.

我们定义两次地图高阶函数,并在假设其输入成本的情况下对其进行分析。