gpt4 book ai didi

proof - 有限多重集作为 Cubical Agda 中的 HIT

转载 作者:行者123 更新时间:2023-12-01 07:47:56 24 4
gpt4 key购买 nike

在 Cubical Agda 的标准库中,有 finite multisets我在下面复制了其优雅的定义:

{-# OPTIONS --cubical --safe #-}

open import Cubical.Foundations.Prelude

infixr 20 _∷_

data FMSet (A : Set) : Set where
[] : FMSet A
_∷_ : (x : A) → (xs : FMSet A) → FMSet A
comm : ∀ x y xs → x ∷ y ∷ xs ≡ y ∷ x ∷ xs
trunc : isSet (FMSet A)

_++_ : ∀ {A : Set} -> FMSet A → FMSet A → FMSet A
[] ++ ys = ys
(x ∷ xs) ++ ys = x ∷ (xs ++ ys)
comm x y xs i ++ ys = comm x y (xs ++ ys) i
trunc xs1 xs2 p q i j ++ ys =
trunc (xs1 ++ ys) (xs2 ++ ys) (cong (_++ ys) p) (cong (_++ ys) q) i j

证明 []是一个右中性元素,使用抽象引理 FMSetElimProp.f我不明白。因此,我试图直接证明,但我被卡住了。这是我的尝试:
unitr-++ : ∀ {A : Set} (ys : FMSet A) → ys ++ [] ≡ ys
unitr-++ [] = refl
unitr-++ (y ∷ ys) = cong ((y ∷_)) (unitr-++ ys)
unitr-++ (comm x y xs i) = cong₂ {!comm x y!} (unitr-++ xs) refl
unitr-++ (trunc xs1 xs2 p q i j) = {!!}

我在正确的轨道上吗?我怎样才能完成这个证明?

最佳答案

回答这个问题的两个 SO 问题是 this one for comm this one for trunc .和你一样,我也遇到过同样的挫折:如果所有这些类型都是 Set s,为什么我需要写任何东西,更不用说复杂的东西了,来证明一些2路径?!?!

所以,首先,从第一个链接的答案开始,让我们从

comm x y xs i ++ ys = ?

并询问 Agda 孔的类型。

Goal: comm x y (xs ++ []) i ≡ comm x y xs i



嗯,这听起来很有希望,因为我们知道 comm x y (xs ++ []) ≡ comm x y xs只需 xs + [] ≡ xs感应地。所以,让我们问一下,这到底会给我们带来什么。把 cong (comm x y) (unitr-++ xs)并询问它的类型:

Have:

PathP
(λ i → x ∷ y ∷ unitr-++ xs i ≡ y ∷ x ∷ unitr-++ xs i)
(comm x y (xs ++ [])) (comm x y xs)


然后@Saizan 的回答指示我们生成 Square正是这些面孔:
isSet→isSet' trunc
(comm x y (xs ++ []))
(comm x y xs)
(λ j → x ∷ y ∷ unitr-++ xs i)
(λ j → y ∷ x ∷ unitr-++ xs i)

并在其上选择正确的内部点,给我们填充我们的洞:
unitr-++ (comm x y xs i) j = isSet→isSet' trunc
(comm x y (xs ++ []))
(comm x y xs)
(λ j → x ∷ y ∷ unitr-++ xs j)
(λ j → y ∷ x ∷ unitr-++ xs j)
j i

对于第二个缺少的子句,即在
unitr-++ (trunc xs1 xs2 p q i j) 

按照链接答案的建议,我们可以向 Agda 询问我们想要构建的立方体的面:
r : Cube ? ? ? ? ? ?
r = cong (cong unitr-++) (trunc xs1 xs2 p q)

通过使用 C-c C-s在所有六个面孔中,Agda 告诉我们:
r : Cube (λ i j → trunc xs1 xs2 p q i j ++ [])
(λ i j → unitr-++ xs1 j)
(λ i j → unitr-++ xs2 j)
(λ i j → trunc xs1 xs2 p q i j)
(λ i j → unitr-++ (p i) j)
(λ i j → unitr-++ (q i) j)

所以现在我们确切地知道要构造哪个立方体(使用 Set s 也是 Groupoid s 的事实,正如 hLevelSuc 2 _ 所见证的那样):
unitr-++ (trunc xs1 xs2 p q i j) = isGroupoid→isGroupoid' (hLevelSuc 2 _ trunc)
(λ i j → trunc xs1 xs2 p q i j ++ [])
(λ i j → unitr-++ xs1 j)
(λ i j → unitr-++ xs2 j)
(λ i j → trunc xs1 xs2 p q i j)
(λ i j → unitr-++ (p i) j)
(λ i j → unitr-++ (q i) j)
i
j

现在,一方面,我们可以很高兴我们已经完成了,但另一方面,我们很生气,因为这个答案都是“看看这个另一个答案,然后做那个”,“看看这个另一个答案并完全做到这一点”,但可以肯定的是,如果您可以完全做到这一点,即使您的类型、函数和函数属性与我提出原始问题时的不同,那么应该是抽象到这里,对吧?

那个是什么 FMSetElimProp 做。它实现了上述所有这些机制,对于 FMSet具体来说,但对于所有功能和这些功能的所有属性,一举两得。所以你不必看这个答案和两个链接的答案,然后一遍又一遍地做所有这些,实际上最后它不应该有任何区别,因为所有构建的路径都是路径等效的反正。

关于proof - 有限多重集作为 Cubical Agda 中的 HIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58154559/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com