内嵌函数

Agda型检查器知道并对许多不同的概念。最突出的是自然数,它有一个特殊的表示为Haskell整数并支持快速算术。表面然而,这些概念的语法并不是固定的,所以为了使用特殊的自然数的处理(例如)您定义了一个适当的数据类型,然后使用建筑杂注。

一些内置类型支持没有相应Agda的基元函数定义。这些函数使用原始的关键字依据给出他们的类型签名。

使用内置类型

虽然可以定义您自己版本的内置类型和绑定他们使用建筑杂注,建议使用阿格达。内置模块。安装Agda和所以总是可用的。例如,内置自然数定义于阿格达。内置。国家. The标准库agda-prelude公司从这些模块重新导出定义。

装置类型

模块 阿格达。内置。单位

单元类型绑定到内置单位如下所示:

记录: 设置 哪里
{-#内置单元⊤#-}

由于一些基本操作,Agda需要了解单元类型在中反射型检查单子返回值在单位类型中。

布尔值

模块 阿格达。内置。布尔 哪里

内置布尔值使用布尔(BOOLEAN),真的错误的内置:

数据布尔: 设置 哪里假-真:布尔{-#BUILTIN BOOL BOOL#-}内置BOOL BOOL#-}
{-#构建为真#-}
{-#BUILTIN FALSE错误#-}

注意,与自然数不同,您需要绑定构造函数分别进行。原因是Agda无法分辨哪个构造函数应该对应于true,哪个对应于false,因为您可以自由命名它们你喜欢什么都行。

绑定布尔类型的唯一效果是可以使用原语返回布尔值的函数,例如内置NATEQUALS公司.

自然数

模块 阿格达。内置。国家

内置自然数使用天然的内置如下:

数据国家: 设置 哪里
   :国家苏克  :国家国家{-#构建自然自然#-}

数据类型和构造函数的名称可以自由选择,但数据类型的形状需要与上面给出的形状匹配(模的顺序为施工人员)。请注意,构造函数不需要显式绑定。

如上所述绑定内置自然数具有以下效果:

  • 使用自然数文字启用。默认情况下,自然数文字的类型为国家,但是它可能是过载包括其他类型嗯。
  • 闭合自然数在编译时表示为Haskell整数。
  • 编译器后端编译自然数目标语言中的适当数字类型。
  • 已启用绑定下面描述的内置自然数函数。

自然数函数

自然数上有许多内置函数。这些很特别因为它们既有Agda定义又有原始实现。这个基本实现用于评估应用程序是否符合闭合条件,以及否则使用Agda定义。这让您可以证明函数,同时仍然享有良好的编译时求值性能。这个内置函数如下:

_+_ :国家国家国家零+米=抽吸n+m=苏克(n+m)
{-#构建NATPLUS _+_#-}

_-_ :国家国家国家n-零=n个零吸尘器=suc n-吸尘器=n-米{-#构建NATMINUS _-_#-}

_*_ :国家国家国家零*米=例如n*m= (n*米)+米{-#构建NATTIMES_*_#-}

_==_ :国家国家布尔===真的例如==例如=n个==_==_={-#构建本质_==_#-}

_<_ :国家国家布尔_<零=零<suc_=真的吸尘器n<吸尘器m=n<米{-#构建自然_<_#-}

div-helper公司 :国家国家国家国家国家div辅助对象k m零j=k个潜水器k m(例如)=div-helper公司(成功)百万分之一潜水器k m(例如) (例如j) =div-helper k m n j公司{-#内置NATDIVSUCAUX div-helper#-}

模范助手 :国家国家国家国家国家mod-helper k m零j=k个mod-helper千米(例如)=模范助手0百万分之一mod-helper千米(例如) (例如j) =mod助手(例如k)m n j月{-#内置NATMODSUCAUX mod-helper#-}

检查Agda定义以确保它们真正定义相应的内置函数。定义不需要精确例如,上面给出的加法和乘法可以定义为递归任一参数,您可以在乘法的递归情况。

这个NATDIVSUCAUX公司NATMODSUCAUX公司是内置的绑定助手函数定义自然数除法和模运算,并满足属性

第n部分(例如)≡div-helper公司0百万分之一模式n(例如)≡模范助手0百万分之一

整数

模块 阿格达。内置。国际

内置整数与整数内置于具有两个构造函数:一个用于正数,一个用于负数。内置组件对于施工人员来说INTEGERPOS公司INTEGERNEGSUC公司.

数据国际: 设置 哪里
  销售时点情报系统    :国家国际尼格苏克 :国家国际{-#构建整数整数#-}
{-#内置集成位置#-}
{-#内置INTEGERNEGSUC negsuc#-}

在这里尼格苏克 n个表示整数-n个 - 1不同于自然数字,在编译时没有特殊的整数表示,因为与Haskell整数相比,使用数据类型的开销不是大。

内置整数支持以下基本操作(给定合适的绑定字符串):

原始的
  primShowInteger(原始显示整数) :国际字符串

浮子

模块 阿格达。内置。浮子

浮点数与浮动内置:

假设浮子: 设置
{-#内置浮动#-}

这使您可以使用浮点文字.浮点由类型检查器表示为IEEE 754二进制64双精度浮点,有限制只有一个NaN值。以下内容基本函数可用(具有适当的绑定国家,布尔,字符串国际):

原始的
  primNatToFloat(原始国家到浮动)             :国家浮子primFloatPlus              :浮子浮子浮子primFloatMinus格式             :浮子浮子浮子主要浮动时间             :浮子浮子浮子primFloat取反            :浮子浮子primFloatDiv               :浮子浮子浮子primFloatEquality(primFloat相等)          :浮子浮子布尔primFloat数值相等 :浮子浮子布尔primFloat无数字     :浮子浮子布尔primRound(原始圆形)                  :浮子国际原始楼层                  :浮子国际prim天花板                :浮子国际主要支出                    :浮子浮子primLog(原始日志)                    :浮子浮子primSin(primSin)                    :浮子浮子primCos公司                    :浮子浮子primTan(棕褐色)                    :浮子浮子PrimA蛋白酶                   :浮子浮子primACos公司                   :浮子浮子primATan公司                   :浮子浮子primATan2号机组                  :浮子浮子浮子primShowFloat(主显示浮动)              :浮子字符串

这个primFloatEquality(primFloat相等)原语用于可判定命题平等。在保存时启用带证据的比较始终适用以下法律:

  • primFloatEquality(primFloat相等) NaN公司 NaN公司收益真的.
  • primFloatEquality(primFloat相等) NaN公司 (primFloatNegate NaN)收益真的.
  • primFloatEquality(primFloat相等) 0 -0.0收益.

对于数值比较,请使用primFloat数值相等primFloat无数字基元。这些由具有以下行为和例外情况:

  • primFloat数值相等 0 -0.0收益真的.
  • primFloat数值相等 NaN公司 NaN公司收益.
  • primFloat无数字 NaN公司 NaN公司收益.
  • primFloat无数字 (primFloatNegate NaN) (primFloatNegate NaN)收益.
  • primFloat无数字 NaN公司 (primFloatNegate NaN)收益.
  • primFloat无数字 (primFloatNegate NaN) NaN公司收益.
  • primFloat无数字种类NaN公司除了负无穷大以外,都在下面。
  • primFloat无数字 -0.0 0收益.

警告

不要使用primFloat数值相等建立可决策的命题平等。这样做会使Agda不一致,请参阅问题#2169.

列表

模块 阿格达。内置。列表

内置列表使用列表,欺骗内置:

数据列表{} (A类: 设置) : 设置哪里
  []  :列表A_∷_ : (x个:A类) (X轴:列表A) 列表A{-#构建列表列表#-}
{-#BUILTIN NIL[]#-}
{-#建筑CONS_б_#-}
中缀 5_∷_

尽管阿格达可以很容易地分辨出哪一个构造函数是哪一个是欺骗你还是要把它们分开装订。

与布尔值一样,绑定列表内置的是让使用基本函数处理列表,例如primStringToListprimStringFromList.

字符

模块 阿格达。内置。烧焦

字符类型与绑定字符内置:

假设烧焦: 设置
{-#内置字符#-}

绑定字符类型可以使用字符字面常数。以下基本函数为在字符上可用(给定合适的绑定布尔,国家字符串):

原始的
  primIs下限    :烧焦布尔primIs数字    :烧焦布尔原始IsAlpha    :烧焦布尔primIsSpace(主IsSpace)    :烧焦布尔primIsAscii公司    :烧焦布尔主IsLatin1   :烧焦布尔primIsPrint打印    :烧焦布尔primIsHex数字 :烧焦布尔primToUpper(原始到上部)    :烧焦烧焦prim到Lower    :烧焦烧焦primCharToNat(原始字符到国家)  :烧焦国家primNatToChar  :国家烧焦原始显示字符   :烧焦字符串

这些函数由中相应的Haskell函数实现数据。烧焦(chr公司对于primCharToNat(原始字符到国家)primNatToChar)。制造primNatToChar全部的chr公司应用于自然数模0x110000个.

模块 阿格达。内置。字符串

字符串类型与绑定字符串内置:

假设字符串: 设置
{-#内置字符串#-}

绑定字符串类型可以使用字符串。以下基本函数为在字符串上可用(为布尔,烧焦列表):

假设primStringToList:字符串列表字符假设primStringFromList:列表字符字符串假设primStringAppend(primString附加):字符串字符串字符串假设primStringEquality(primString相等):字符串字符串布尔假设primShowString:字符串字符串

字符串文字可以是过载.

平等

模块 阿格达。内置。平等

标识类型可以绑定到内置平等如下所示:

中缀 4_≡_数据_≡_{} {A类: 设置} (x个:A类) :A类 设置哪里
  回流 :x≡x{-#构建等式_≡_#-}
{-#内置REFL ref#-}

这让你可以使用类型证明左侧(lhs) 相对湿度在中重写建设.

primTrustMe公司

模块 阿格达。内置。TrustMe公司

绑定内置相等类型还可以启用primTrustMe公司基本体:

原始的
  primTrustMe公司 :  {} {A类: 设置} {x年:A类} x选y

从类型中可以看出,primTrustMe公司必须极其小心地使用以避免不一致。它与假设的不同之处在于,如果x个实际上定义上是相等的,primTrustMe公司减少到回流.一次性使用primTrustMe公司是提升基本布尔等式在内置类型上,如字符串返回证明的东西对象:

eqString(eq字符串) : (a b类:字符串) 也许 吧(a≡b)eqString a b=if primStringEquality a b那就先信任我其他什么都没有

根据这个定义eqString(设备字符串) “foo” “foo”计算到只是 回流.另一个用例是删除计算成本高昂的等式证明和替换为primTrustMe公司:

擦除相等 :  {} {A类: 设置} {x年:A类} x≡yx≡y擦除相等_=primTrustMe公司

人群水平

模块 阿格达。基本体

人群水平也使用声明建筑实用主义者。阿格达。内置模块阿格达。基本体模块是自动导入的,因此无法更改级别内置项。对于参考这些是绑定:

假设
  水平 : 设置
  lzero(零度) :水平lsuc公司  :水平水平_⊔_   :水平水平水平
{-#构建级别#-}
{-#构建级别零lzero#-}
{-#构建级别SUC lsuc#-}
{-#建筑标高最大值_⊔_#-}

尺寸大小的类型

模块 阿格达。内置。大小

内置的调整大小的类型不同于其他内置,其中名称由建筑杂注。因此,到绑定大小原语,这样就足以写入:

{-#内置大小Univ大小Univ#-}  --SizeUniv:SizeUniv公司
{-#内置尺寸尺寸#-}  --尺寸:SizeUniv
{-#内置大小<_#-}  --尺寸<_:。。大小SizeUniv公司
{-#内置大小↑_       #-}  --  ↑_       : 大小大小
{-#构建大小信息ω#-}  --ω:尺寸
{-#内置最大尺寸_  --_:尺寸大小大小

硬币

模块 阿格达。内置。硬币

以下内置组件用于共性定义:

假设
    :  {} (A类: 设置)  设置♯_ :  {} {A类: 设置} A类∞A  :  {} {A类: 设置} ∞AA类{-#内置无穷大∞#-}
{-#内置锐器♯_ #-}
{-#平铺建筑♭  #-}

请参见硬币了解更多信息。

IO(输入输出)

模块 阿格达。内置。IO(输入输出)

绑定内置IO(输入输出)类型是让Agda检查这个主要的函数的类型正确(请参见编译器).

假设IO(输入输出): 设置  设置
{-#内置IO IO#-}

文字重载

模块 阿格达。内置。FromNat公司
模块 阿格达。内置。从Neg
模块 阿格达。内置。来自字符串

机器用于重载文字使用转换函数的内置程序。

反思

模块 阿格达。内置。反思

反射机制具有用于表示Agda程序的内置类型。请参见反思以获取详细说明。

正在重写

实验性的和完全不安全的重写机(不是重写构造)具有内置重新写入对于重写关系:

假设_↦_:  {} {A类: 设置} A类A类 设置{-#内置重写_↦_ #-}

没有阿格达。内置重写关系的模块,因为不同重写实验通常需要不同的关系。

严格性

模块 阿格达。内置。严格

有两种原语用于控制求值顺序:

原始的
  primForce公司      :  {a b类} {A类: 设置} {B类:A类 设置b条} (x个:A类)  (x个B个x) B个xprimForce引理 :  {a b类} {A类: 设置} {B类:A类 设置b条} (x个:A类) ((f): x个B个x) primForce x f≡f x

哪里_≡_内置等式。编译时primForce公司 x个 (f)计算结果为(f) x个什么时候x个处于弱头正常形式(whnf),即:以下之一:

  • 构造函数应用程序
  • 文字
  • lambda抽象
  • 类型构造函数应用程序(数据或记录类型)
  • 函数类型
  • 宇宙(设置 _)

类似地primForce引理 x个 (f),它允许您推理程序使用primForce公司,计算结果为回流什么时候x个以whnf表示。在运行时,primForce公司 e(电子) (f)由GHC和UHC编制后端) x个 = e(电子) 在里面 序列 x个 (f) x).

例如,考虑以下函数:

--pow'n a=a 2
功率 :国家国家国家pow'zero电源0=功率'(例如)=电源(a+a)

在编译时,由于call-by-name求值,这将是指数的,并且在运行时,由于未评估而导致空间泄漏 + 砰的一声。两者问题可以通过以下方式解决primForce公司:

中缀 0_$!__$!_ :  {a b类} {A类: 设置} {B类:A类 设置b条}  (x个B个x)  x个B个xf$!x个=primForce x f(初始力x f)--功率n a=a2
功率 :国家国家国家功率零点a=功率(例如)=pow n$!(动力$!)!a+a