gpt4 book ai didi

functional-programming - 具有不同类型索引的互归纳描述?

转载 作者:行者123 更新时间:2023-12-04 10:13:35 26 4
gpt4 key购买 nike

我正在使用描述,就像它们被描述的一样 here ,作为对归纳数据类型的形状进行编码的一种方式。但是,我坚持如何表示归纳类型:

  • 互感
  • 有不同的索引

  • 例如,假设我们有这样的东西,我们订购不同的类型:
    data Foo : Set where
    N : ℕ -> Foo
    P : (Foo × Foo) -> Foo

    data <N : ℕ -> ℕ -> Set where
    <0 : (n : ℕ) -> <N zero n
    <suc : (m n : ℕ) -> <N m n -> <N (suc m) (suc n)

    data <P : (Foo × Foo) -> (Foo × Foo) -> Set
    data <F : Foo -> Foo -> Set

    data <P where
    <Pair : (x1 x2 y1 y2 : Foo) -> <F x1 y1 -> <F x2 y2 -> <P (x1 , x2) (y1 , y2)

    data <F where
    <FN : ∀ (a b : ℕ) -> <N a b -> <F (N a) (N b)
    <FP : ∀ (p1 p2 : (Foo × Foo) ) -> <P p1 p2 -> <F (P p1) (P p2)

    也就是说,我们有一种在叶子上带有 nat 的二叉树。我们在树之间有一个偏序,我们以通常的方式比较 nat,我们通过比较它们各自的子树来比较节点对。

    注意如何 <F<P是相互依赖的。当然,我们可以内联它来制作 <F<P一种类型,我试图避免这种情况,对于 <P 的情况更复杂。

    我想知道的是: 上面的偏序类型可以用描述来表达吗?

    我什至试图将上述类型描述为索引仿函数的不动点。通常我们有一个索引类型 (I : Set)并且仿函数的类型为 (X : I -> Set) -> I -> Set .但是我们不能同时让“Foo”和“Foo × Foo”成为我们的 I 值。是否有一些技巧可以让我们使用 I = Foo ⊎ (Foo × Foo) ?

    最佳答案

    取所有指数的总和:

    Ix = ((Foo × Foo) × (Foo × Foo)) ⊎ (Foo × Foo)

    data <P : Ix -> Set
    data <F : Ix -> Set

    data <P where
    <Pair : (x1 x2 y1 y2 : Foo) -> <F (inj₂(x1 , y1)) -> <F (inj₂(x2 , y2))
    -> <P (inj₁((x1 , x2), (y1 , y2)))

    data <F where
    <FN : ∀ (a b : ℕ) -> <N a b -> <F (inj₂(N a , N b))
    <FP : ∀ (p1 p2 : (Foo × Foo) ) -> <P (inj₁(p1 , p2)) -> <F (inj₂(P p1 , P p2))

    我们可以稍微整理一下索引,并以一种更容易被索引仿函数描述的形式来写东西:
    data Ix : Set where
    <P : Foo × Foo → Foo × Foo → Ix
    <F : Foo → Foo → Ix

    data T : Ix → Set where
    <Pair : ∀ x1 x2 y1 y2 → T (<F x1 y1) → T (<F x2 y2)
    → T (<P (x1 , x2) (y1 , y2))
    <FN : ∀ (a b : ℕ) → <N a b → T (<F (N a) (N b))
    <FP : ∀ p1 p2 → T (<P p1 p2) → T (<F (P p1) (P p2))

    我注意到 <P<F可以递归定义,因此这里不需要归纳。
    <F : Foo → Foo → Set
    <F (N n) (N n') = <N n n'
    <F (P (x , y)) (P (x' , y')) = <F x x' × <F y y'
    <F (N _) (P _) = ⊥
    <F (P _) (N _) = ⊥

    关于functional-programming - 具有不同类型索引的互归纳描述?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61198795/

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