Recursion 通过乘积与向量时保持函子的正性

Recursion 通过乘积与向量时保持函子的正性,recursion,types,agda,Recursion,Types,Agda,在下面的代码中,μ的定义₁被Agda接受为严格正函子,这是有道理的。如果我通过产品打结,如μ₂,它仍然被接受。然而,如果我试图通过向量,如μ₃,它不再被接受 data F : Set where X : F ⟦_⟧₁ : F → Set → Set ⟦ X ⟧₁ A = A data μ₁ (f : F) : Set where Fix₁ : ⟦ f ⟧₁ (μ₁ f) → μ₁ f open import Data.Product ⟦_⟧₂ : F → (Set × Set)

在下面的代码中,
μ的定义₁被Agda接受为严格正函子,这是有道理的。如果我通过产品打结,如
μ₂,它仍然被接受。然而,如果我试图通过向量,如
μ₃,它不再被接受

data F : Set where
  X : F

⟦_⟧₁ : F → Set → Set
⟦ X ⟧₁ A = A

data μ₁ (f : F) : Set where
  Fix₁ : ⟦ f ⟧₁ (μ₁ f) → μ₁ f

open import Data.Product

⟦_⟧₂ : F → (Set × Set) → Set
⟦ X₁ ⟧₂ (A , _) = A

open import Data.Unit

data μ₂ (f : F) : Set where
  Fix₂ : ⟦ f ⟧₂ (μ₂ f , ⊤) → μ₂ f

open import Data.Nat
open import Data.Vec

⟦_⟧₃ : ∀ {n} → F → Vec Set (suc n) → Set
⟦ X ⟧₃ (A ∷ _) = A

data μ₃ (f : F) : Set where
  Fix₃ : ⟦ f ⟧₃ [ μ₃ f ] → μ₃ f
μ的错误消息₃

μ₃ is not strictly positive, because it occurs
in the third argument to ⟦_⟧₃
in the type of the constructor Fix₃
in the definition of μ₃.

μ之间的根本区别是什么₂
μ₃?有没有办法得到像
μ这样的东西₃工作?

我基本上是在猜测<代码>是一条
记录
Vec
是一条
数据
。Agda拒绝
μ₂,当
\u×\ u
被定义为
数据时:

data Pair (A B : Set₁) : Set₁
  where pair : A -> B -> Pair A B

⟦_⟧₃ : F → Pair Set Set → Set
⟦ X ⟧₃ (pair A _) = A

data μ₃ (f : F) : Set where     
  Fix₃ : ⟦ f ⟧₃ (pair (μ₃ f) ⊤) → μ₃ f
结果为“
μ”₃不是严格意义上的正,因为它发生在。但是如果您定义
⟦_⟧₃作为

⟦_⟧₃ : F → Pair Set Set → Set
⟦ X ⟧₃ _ = ⊤

然后一切正常(你的
μ₂
有点误导,因为
F
上也没有模式匹配。在第二种情况下,Agda只是规范化表达式,因为第一个参数上没有模式匹配,第二个参数在WHNF中,所以
⟦_⟧₃已完全消除。但我不知道,阿格达是如何解决第一个案子的。我想是临时的

你的
μ₂类型检查,因为:

上述条款内部翻译为以下内容:

map f g p = (f (Σ.proj₁ p) , g (Σ.proj₂ p))
所以这就像

⟦_⟧₃ : F → Pair Set Set → Set
⟦ X ⟧₃ _ = ⊤
案例

另外,
⟦_⟧₃将进行类型检查

更新

不,这不是关于模式匹配消除,因为这个定义

data Pair (A B : Set₁) : Set₁
  where pair : A -> B -> Pair A B

fst : ∀ {A B} -> Pair A B -> A
fst (pair x y) = x

⟦_⟧₃ : F → Pair Set Set → Set
⟦ X ⟧₃ p = fst p

data μ₃ (f : F) : Set where     
  Fix₃ : ⟦ f ⟧₃ (pair (μ₃ f) ⊤) → μ₃ f

也被拒绝。

对于我的真实(非最小)用例,
⟦_⟧₃
非常需要在其参数上进行模式匹配(因为
F
有多个构造函数)@Cactus,我认为您不应该接受我的答案。这甚至不是一个答案。
⟦_⟧₃ : F → Pair Set Set → Set
⟦ X ⟧₃ _ = ⊤
data Pair (A B : Set₁) : Set₁
  where pair : A -> B -> Pair A B

fst : ∀ {A B} -> Pair A B -> A
fst (pair x y) = x

⟦_⟧₃ : F → Pair Set Set → Set
⟦ X ⟧₃ p = fst p

data μ₃ (f : F) : Set where     
  Fix₃ : ⟦ f ⟧₃ (pair (μ₃ f) ⊤) → μ₃ f