在 Agda 中,我如何证明 cons after uncons over coinductive list(a.k.a Stream) 是身份?

How can i prove that cons after uncons over coinductive list(a.k.a Stream) are identity, in Agda?

我正在通过 https://agda.readthedocs.io/en/v2.6.0.1/language/coinduction.html 研究余归纳和共模。 我以为我理解了文章代码,所以我决定做下面的命题。

cons-uncons-id : ∀ {A} (xs : Stream A) → cons (uncons xs) ≈ xs

我觉得这个命题和文章的问题很像,也可以证明,但是我证明不好。 Here是我写的代码

我觉得可以用cons-uncons-id (tl xs)细化,因为类型和merge-split-id很像,但是Agda不接受

这是我自己想到的一个问题,所以我觉得是对的,当然也有误解的可能。 然而,自然而然地,反对者和反对者将return保持原样。

如果你能证明它而不被误解,请告诉我你如何证明它。

能解释一下为什么不能像merge-split-id一样证明吗?

此致,谢谢!

您只需要 的自定义 refl

refl-≈ : ∀ {A} {xs : Stream A} → xs ≈ xs
hd-≈ refl-≈ = refl
tl-≈ refl-≈ = refl-≈

cons-uncons-id : ∀ {A} (xs : Stream A) → cons (uncons xs) ≈ xs
hd-≈ (cons-uncons-id _ ) = refl
tl-≈ (cons-uncons-id xs) = refl-≈

您不能使用与 merge-split-id 相同的策略的原因是 consuncons 函数不会递归整个流(即它们在第一个元素)。这实际上使得 cons-uncons-id 引理更容易证明,在某种意义上,因为你只需要证明第一个元素是相等的,然后剩下的就是自反性。