内嵌函数

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

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

使用内置类型

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

装置类型

模块 阿格达。内置。单位

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

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

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

布尔值

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

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

数据布尔以下为: 设置 哪里假-真以下为:布尔{-#BUILTIN 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公司 以下为:国家国家国家国家国家分流器k m zero j=k个div辅助对象k m(成功)=div-helper公司(例如k)百万分之一潜水器k m(例如) (例如j) =div-helper k m n j公司{-#内置NATDIVSUCAUX div-helper#-}

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

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

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

第n部分(例如)≡div-helper公司0百万分之一模块n(成功)选择mod辅助对象0百万分之一

整数

模块 阿格达。内置。国际

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

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

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

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

原始的
  primShowInteger 以下为:国际字符串

浮子

模块 阿格达。内置。浮子

浮点数与浮动内置:

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

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

原始的
  primNatToFloat(原始国家到浮动)             以下为:国家浮子primFloatPlus              以下为:浮子浮子浮子primFloatMinus格式             以下为:浮子浮子浮子主要浮动时间             以下为:浮子浮子浮子primFloat取反            以下为:浮子浮子初级FloatDiv               以下为:浮子浮子浮子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打印    以下为:烧焦布尔主IsHexDigit 以下为:烧焦布尔primToUpper(原始到上部)    以下为:烧焦烧焦prim到Lower    以下为:烧焦烧焦primCharToNat(原始字符到国家)  以下为:烧焦国家primNatToChar  以下为:国家烧焦primShowChar   以下为:烧焦字符串

这些函数由中相应的Haskell函数实现数据。烧焦(chr公司对于原始字符ToNatprimNatToChar). 制作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(eq字符串) “foo” “foo”计算到只是 回流.另一个用例是消除计算上昂贵的等式证明替换为primTrustMe公司以下为:

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

人群水平

模块 阿格达。基本体

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

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

尺寸大小的类型

模块 阿格达。内置。大小

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

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

硬币

模块 阿格达。内置。硬币

以下内置项用于共生产定义:

假设
    以下为:  {} (A类以下为: 设置)  设置♯_ 以下为:  {} {A类以下为: 设置} A类∞AŞ  以下为:  {} {A类以下为: 设置} ∞AA类{-#构建无限∞#-}
{-#BUILTIN SHARP♯_#-}
{-#内置平面♭#-}

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

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),它允许您推理程序使用原始作用力,计算结果为回流什么时候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求值,这将是指数的,并且在运行时,由于未评估而导致空间泄漏 + 砰的一声。两者问题可以通过以下方式解决原始作用力以下为:

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