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 ⟧₃ _ = ⊤
案例
另外,⟦_⟧₃如果删除第一个参数上的模式匹配,code>将进行类型检查
更新
不,这不是关于模式匹配消除,因为这个定义
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