共创记录
可以定义无限列表(或流)的类型某些类型的元素A类
如下:,
记录流(A类: 设置) : 设置 哪里
共性的
领域
高清 :A类热释光 :流A
对于归纳记录类型,我们必须引入关键字共性的
在定义构成记录的字段之前。
值得注意的是,不必给出明确的记录类型的构造函数流 A类
.
我们还可以定义一对流 A类
作为一个创造记录。
记录_≈_{A类: 设置} (X轴:流A) (年:流A) : 设置 哪里
共性的
领域
hd-≈ :hd-xs≡hd-ystl-≈ :tl-xs≈tl-ys
使用共模式我们可以定义一对函数在流
这样就返回了一个流
元素位于偶数位置和其他位于奇数位置的元素。
即使 : ∀ {A类} →流A→流A高清(偶数x) =高清x热释光(偶数x) =即使(热释光(tl x公司))
古怪的 : ∀ {A类} →流A→流A奇数x=即使(热释光x)
分裂 : ∀ {A类} →流A→流A×流A拆分xs=偶数xs,奇数xs
并合并一对流
通过交错它们的元素。
合并 : ∀ {A类} →流A×流A→流A高清(合并(fst、snd)) =高清fst热释光(合并(fst、snd)) =合并(snd、tl、fst)
最后,我们可以证明分裂是合并的左逆。
合并拆分id : ∀ {A类} (X轴:流A) →合并(拆分xs)≈xshd-≈(合并拆分id_) =回流tl-≈(合并-拆分-id xs) =合并拆分id(tl-xs公司)
旧硬币
注释
这是Agda中支持共创的旧方法。建议您使用共创记录而不是。
要使用coinduction,建议您从标准库。然后可以通过使用延迟运算符标记共导事件来定义共导类型∞
:
数据有限公司ℕ: 设置 哪里
零 :有限公司ℕ苏克 :∞Coℕ→有限公司ℕ
类型∞ A类
可以看作是类型的暂停计算A类
。它具有延迟和强制功能:
♯_ : ∀ {一} {A类: 设置一} →A类→∞A♭ : ∀ {一} {A类: 设置一} →∞A→A类
共导类型的值可以使用同位词来构造,它不需要终止,但必须是有效的。作为生产力的近似值,终止检查器要求共递归定义由共导构造函数保护。例如,无限“自然数”可以定义如下:
inf公司 :有限公司ℕinf公司=苏克(♯ inf公司)
保护同余校验与变尺寸终止校验相结合,从而允许归纳类型和共导类型的有趣组合。例如,我们可以定义流处理器的类型,以及一些函数:
--无限的流。
数据流(A类: 设置) : 设置 哪里
_∷_ : (x个:A类) (X轴:∞(流A)) →流A--流处理器SP A B使用元素A并生成
--元素B。它之前只能消耗有限数量的a
--产生B。
数据服务提供商(A和B: 设置) : 设置 哪里
得到 : ((f):A类→SP A B) →SP A B放 : (b条:B类) (特殊用途:∞(SP A B)) →SP A B--eat函数由流入流B的外同余函数定义
--和SP A B上的内部递归。
吃 : ∀ {A和B} →SP A B→流A→B流吃(得到f) (a|作为) =吃(财务报表) (♭ 作为)吃(放置b sp)作为=b‰♯ 吃(♭ 特殊用途)作为--流处理器的组成。
_∘_ : ∀ {A、B、C} →特殊用途B C→特殊用途→标准普尔A C得到f₁ ∘ 放置x sp₂=(f)₁ x∘♭ 特殊用途₂放置x sp₁ ∘ 特殊用途₂=放置x(♯(Ş特殊用途₁ ∘ 特殊用途₂))特殊用途₁ ∘ 得到f₂=得到(λx→特殊用途₁ ∘ (f)₂ x个)
也可以定义“共生性家族”。建议不要使用延迟构造函数(♯_
)在构造函数的索引表达式中。不鼓励使用以下关于共性“自然数”之间相等的定义:
数据_≈’_:有限公司ℕ→有限公司ℕ→ 设置 哪里
零 :0≈'zero苏克 : ∀ {百万牛顿} →∞(m≈'n) →苏克(♯ 米)≈'suc(♯ n个)
建议定义如下:
数据_≈_:有限公司ℕ→有限公司ℕ→ 设置 哪里
零 :0≈0苏克 : ∀ {百万牛顿} →∞(♭ m≈♭ n个) →suc m≈suc n
当前共生产类型的实现带有一些限制.