代码之家  ›  专栏  ›  技术社区  ›  Cactus

构建数据。列表全部来自另一个数据。列表全部的

  •  1
  • Cactus  · 技术社区  · 7 年前

    假设我的范围如下:

    A : Set
    xs = [x1, x2, ..., xn] : List A
    f : A → Set
    

    然后我可以使用 Data.List.All 使类型包含 y1 : f x1 , y2 : f x2 , ..., yn : f xn :

    ys = [y1, y2, ..., yn] : All f xs
    

    我的问题是,假设我有另一个函数

    g : {x : A} → f x → Set
    

    AllAll g ys 这样我就可以 z1 : g {x1} y1 , z2 : g {x2} y2 , ..., zn : g {xn} yn 在某些方面 zs = [z1, ..., zn] : AllAll g ys ?

    澄清一下,以下是我自己将如何实施它;我的问题是我是否必须这样做,或者如果标准库中有什么东西(可能 数据列表全部的 本身?)我可以使用:

    data AllAll {A : Set} {f : A → Set} (g : {x : A} → f x → Set) : {xs : List A} → (ys : All f xs) → Set where
      [] : AllAll g []
      _∷_ : ∀ {x y xs ys} → g y → AllAll g ys → AllAll g {x ∷ xs} (y ∷ ys)
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   user2407038    7 年前

    你确实可以使用现有的 All 为了这个。首先定义一个“忘记”结构的函数 全部的 :

    open import Data.List
    open import Data.List.All
    open import Data.Product
    
    lower-All : ∀ {a p} {A : Set a} {P : A → Set p} {xs} → All P xs → List (∃ P)
    lower-All [] = []
    lower-All (x ∷ xs) = (_ , x) ∷ lower-All xs
    

    然后简单地用 全部的 自身:

    AllAll : ∀ {a x p} {X : Set x} {A : X → Set a} (P : ∀ {x} → A x → Set p) 
            → ∀ {xs} → All A xs → Set _
    AllAll P = λ xs → All (P ∘ proj₂) (lower-All xs)
    

    这样做的一个缺点是模式匹配 ys : AllAll P xs 您必须在 xs 第一取决于需要编写多少个函数来匹配哪个模式 AllAll 这种编码可能不太方便。一个好处是你可以免费获得额外的“嵌套”:

    AllAllAll : ∀ {l₀ l₁ l₂ l₃} 
       {A₀ : Set l₀}
       {A₁ : A₀ → Set l₁} 
       {A₂ : ∀ {x} → A₁ x → Set l₂}
       (A₃ : ∀ {x} {y : A₁ x} → A₂ y → Set l₃)
       → ∀ {xs₀} {xs₁ : All A₁ xs₀} (xs₂ : AllAll A₂ xs₁) → Set _
    AllAllAll P = AllAll P
    

    (尽管如果你发现自己需要这样一个怪物,也许可以考虑重构你的程序……)

    我留下来作为练习来证明这个版本和OP中的版本之间的同构。