在 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
相同的策略的原因是 cons
和 uncons
函数不会递归整个流(即它们在第一个元素)。这实际上使得 cons-uncons-id
引理更容易证明,在某种意义上,因为你只需要证明第一个元素是相等的,然后剩下的就是自反性。
我正在通过 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
相同的策略的原因是 cons
和 uncons
函数不会递归整个流(即它们在第一个元素)。这实际上使得 cons-uncons-id
引理更容易证明,在某种意义上,因为你只需要证明第一个元素是相等的,然后剩下的就是自反性。