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

Functional programming 具有不同类型索引的相互归纳描述?,functional-programming,agda,dependent-type,theorem-proving,type-theory,Functional Programming,Agda,Dependent Type,Theorem Proving,Type Theory,我使用描述,就像它们被描述一样,作为一种编码归纳数据类型形状的方式。但是,我一直在研究如何表示归纳类型: 相互感应 有不同的指数 例如,假设我们有这样的东西,我们订购不同的类型: data Foo : Set where N : ℕ -> Foo P : (Foo × Foo) -> Foo data <N : ℕ -> ℕ -> Set where <0 : (n : ℕ) -> <N zero n <suc : (m

我使用描述,就像它们被描述一样,作为一种编码归纳数据类型形状的方式。但是,我一直在研究如何表示归纳类型:

  • 相互感应
  • 有不同的指数
  • 例如,假设我们有这样的东西,我们订购不同的类型:

    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)
    
    data Foo:设置位置
    N:ℕ -> 福
    P:(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))
    
    Ix=((Foo×Foo)×(Foo×Foo))⊎ (Foo×Foo)
    数据Set
    数据集
    
    您可能会发现有用的数据。您所有的
    @AndrásKovács Oops,都是一个错误。现在修复。为什么索引
    Ix
    by
    Sort
    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))
    
    <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 _) = ⊥