此页面上的信息可能已过时。请参见官方用户手册获取有关Agda最新版本的信息。
语言概述
以下是对Agda语言主要特征的简要介绍。如果你以前从未使用过类似的语言,不要期望能理解一切。尽管如此,它还是应该给你一种语言的感觉。。。
以下内容直接取自旧文档。。。可能需要一些工作
功能
写入函数类型(x:A)->B
或A->B
对于非依赖函数。函数类型可以覆盖任意望远镜例如,多态等式的替代律类型
公式:(A:集合)->A->A->集合
可以表述为
(A:集合)(C:A->集合)(xy:A)->等式A x y->C x->C y
函数由lambda抽象构造,可以是类型化的,也可以是非类型化。例如,下面的两个表达式都有类型(A:设置)->A->A
(第二个表达式也会检查其他类型):
\(A:设置)(x:A)->x\A x->x
有关函数的详细信息
隐式参数
可以省略类型检查器可以自己找出的术语,替换为_
。如果类型检查器无法推断_
它将报告错误。例如,对于多态身份功能
id:(A:设置)->A->A
第一个参数可以从第二个参数的类型,所以我们可以写id _零
对于恒等函数在零
.
隐式函数空间用花括号而不是括号书写。例如,
_==_:{A:Set}->A->A->Setsubst:{A:Set}(C:A->Set){xy:A}->x==y->Cx->Cy
注意第一个参数如何_==_
保留为隐式。同样,我们也可以去掉隐式参数A类
,x个
、和年
在的应用程序中变电站
。要显式给出隐式参数,请用卷曲括起来支撑。以下两个表达式等效:
subst C eq cx子集{_}C{_}{_}eq cx
值得注意的是,隐式参数也将插入到应用程序,因此以下内容等效:
子集C子集C{_}{_}
获取type的函数{xy:A}->x==y->Cx->Cy
我们必须明确抽象结束x个
和年
:
\{x} {y}->子集C
隐式参数也可以通过名称引用,因此如果我们想给表达e(电子)
显式用于年
没有给出值x个
我们可以写
子集C{y=e}eq cx
构造隐式函数空间时,可以省略隐式参数,所以下面的两个表达式都是有效的类型表达式{A:集合}->A->A
:
\{A}x->x\x->x
对于函数空间何时可以隐式,没有任何限制。在内部,显式和隐式函数空间的处理方式相同。这意味着无法保证隐式参数会得到解决。当存在未解决的隐式参数时,类型检查器将给出错误指示哪个应用程序包含未解决的参数的消息。这种对隐式论证的自由方法的原因是限制了在我们保证问题得到解决的情况下使用隐式论证排除了实践中许多有用的案例。
关于隐式参数的更多信息
归纳数据类型和函数定义
函数可以通过给出类型和定义来引入。例如多态身份函数可以定义为
id:{A:Set}->A->Aid x=x
请注意隐式论证在左手边。如在lambda抽象可以通过将其括在花括号中显式给出:
id:{A:Set}->A->Aid{A}x=x
数据类型由引入数据
声明。例如,天然数字可以定义为
data Nat:设置位置零:自然例如:Nat->Nat
为了确保正常化,归纳事件必须严格为正数位置。例如,不允许使用以下数据类型:
数据错误:设置位置坏:(坏->坏)->坏
因为坏
在对构造函数。
可以使用模式匹配和结构递归。自然数的加法函数定义为
_+_:自然->自然->自然零+米=米suc n+m=suc(n+m)
这个运算符窗体可用于左侧和右侧在这里可以看到。
数据类型可以通过参数望远镜进行参数化。这些是写的在构造函数上的数据类型和范围的名称之后。
数据列表(A:Set):设置位置[]:列表A_::_:A->列表A->列表A
这将介绍构造函数
[]:{A:Set}->列表A_::_:{A:Set}->A->列表A->列表A
我们还可以定义数据类型族。对于例如,自然数上的族n个
证明n个
是均匀的。
data IsEven:Nat->设置位置evenZ:IsEven为零evenSS:(n:Nat)->IsEven n->IsEver(suc(suc n))
注意第一个的左侧和右侧之间的差异:
.左侧显示的类型是构造函数的参数和范围。这些必须在构造函数的返回类型中保持不变。类型右边是不在施工人员范围内的指标,和在构造函数返回类型中接受任意值。
什么时候?模式匹配关于归纳族的一个元素,我们得到了信息关于索引。收件人区分由模式匹配确定的模式部分(无法访问的模式)和构成实际模式的部分匹配时,不可访问的模式以点作为前缀。在例如,我们可以证明两个偶数之和也是偶数。
偶数+:(n m:Nat)->IsEven n->IsEver m->IsEvan(n+m)偶数+.0m偶数Z em=em偶数+。(suc(sucn))m(均匀SS n en)em=evenSS(n+m)(偶数+n m en em)
该证明是通过对以下证明的递归进行的n个
是均匀的。上的模式匹配这个证明将迫使n个
因此n个
是前缀为点,表示它们不是模式匹配的一部分。在这种情况下,我们可以n个
和米
隐式并将证明写为
偶数+:{nm:Nat}->IsEven n->IsEven m->IsEver(n+m)偶数+evenZ em=em偶数+(evenSS n en)em=evenSS _(偶数+en em)
关于归纳数据类型的更多信息
模式匹配
介绍
本页解释由模式匹配定义的函数的简化行为。考虑以下两个小于函数在自然数上的实现。
data Bool:设置位置真:布尔false:布尔data Nat:设置位置零:自然成功:国家->国家--第一次实施_<1_:Nat->Nat->Bool(国家)零<1 suc m=真suc n<1 suc m=n<1 m_<1零=假--第二次实施_<2_:Nat->Nat->Bool(国家)_<2零=假零<2 suc m=真suc n<2 suc m=n<2 m
也许令人惊讶的是(因为这两个实现具有相同的非重叠子句),_<1_和_<2_没有相同的约简行为。对于空档n个
我们有这个n<1零
不会减少,而n<2零
减少到假
。原因如下所述。
案例树等价
函数的定义方程组等价于案例树,方程的顺序决定了哪一个。对于_<1_
等效案例树是
n<1 m=第n种情况零->第m种情况suc m->真零->假suc n->第m种情况例如m->n<m零->假
而对于_<2
n<2 m=第m种情况零->假suc m->第n种情况零->真suc n->n<2 m
看看案例树,很明显,在第一个案例中n<零
不会减少到假
对于中性点n个
,但在第二种情况下会。模式匹配总是从第一个子句中最左边的构造函数模式开始。对于_<1_
这是第一个论点,而对于_<2_
这是第二个论点。
操作视图
下面是另一种更具操作性的方式来观察正在发生的事情。当通过模式匹配减少函数的应用程序时,从上而下逐一尝试子句。对于每个子句,参数将从左到右与相应的模式进行匹配。如果存在不匹配,则尝试下一个子句。如果存在非决定性匹配(例如,根据构造函数模式匹配中性项),则应用程序不会减少。对于_<1_
我们不知道n个
比赛零
否则,减价将暂停。
贝里的多数功能
在非决定性匹配的第一个标志处暂停缩减的原因是保持与案例树的对应。考虑Berry的多数功能:
data Bool:设置位置tt:布尔ff:布尔maj tt tt=tt最大tt ff x=xmaj ff x tt=xmaj x tt ff=xmaj ff ff=F
这里,所有子句都是不相交的,但没有案例树将所有等式作为定义等式传递。按照上面给出的模式匹配规则,您会发现,使用此定义,您可以获得除maj x tt ff=x
.
关于模式匹配的更多信息