Merge 将已排序列表与已调整大小的类型合并
假设我们有一个排序列表的数据类型,带有与证据无关的排序见证。我们将使用Agda的实验大小的类型特性,这样我们就有希望在数据类型上获得一些递归函数,以通过Agda的终止检查器Merge 将已排序列表与已调整大小的类型合并,merge,sortedlist,termination,agda,Merge,Sortedlist,Termination,Agda,假设我们有一个排序列表的数据类型,带有与证据无关的排序见证。我们将使用Agda的实验大小的类型特性,这样我们就有希望在数据类型上获得一些递归函数,以通过Agda的终止检查器 {-# OPTIONS --sized-types #-} open import Relation.Binary open import Relation.Binary.PropositionalEquality as P module ListMerge {Interestingly enough, your
{-# OPTIONS --sized-types #-}
open import Relation.Binary
open import Relation.Binary.PropositionalEquality as P
module ListMerge
{Interestingly enough, your first version is actually correct. I mentioned that Agda enables few extra rules considering Size
, one of them being ↑ ∞ ≡ ∞
. By the way, you can confirm it via:
↑inf : ↑ ∞ ≡ ∞
↑inf = refl
{-#选项--大小类型#-}
打开导入关系。二进制
打开导入关系.Binary.propositionalQuality作为P
模块列表合并
{有趣的是,您的第一个版本实际上是正确的。我提到,考虑到Size
,Agda启用了一些额外的规则,其中之一就是↑ ∞ ≡ ∞代码>。顺便说一下,您可以通过以下方式进行确认:
Γ ⊢ x : A Γ ⊢ A <: B
────────────────────── (sub)
Γ ⊢ x : B
好吧,这让我研究了其他规则是什么。我在Andreas Abel关于大小类型的幻灯片中找到了其余规则(可以找到):
↑ ∞ ≡ ∞代码>
i≤ ↑ 我≤ ∞代码>
T{i}首先,我不知道这是否与这个问题有关,我只是了解了Agda的存在。我只想提到,在Coq中,合并的终止需要一个特殊的技巧,例如,如果你用la重建xs
和ys
,你可以使你的merge′
工作更大的尺寸,类似于promote:∀ {lui}→ 分类列表l u{i}→ 分类列表l u{∞}代码>。我确实对此感到好奇(尽管它看起来有点疯狂,现在仍然如此:)。我想有人会确定,promote本质上是id
,这可能会使对校对的影响可控。谢谢,我会在有机会的时候看看这个。我有机会尝试一下你的建议,使用FiniteMap
类型和unionWith
函数。它似乎工作得很好,所以我添加了我对我的上一个问题给出了一个基于大小类型的新答案。对于这个问题,我建议提升你的评论来回答;这可能会让它更明显。哦,我确实将预期的规则解释为包容/包容,但我认为当它不起作用时,我误解了一些东西。嗯,这当然是个好消息(谢谢你花时间来发现这个问题)。我会更新我的其他答案。