通过产品与向量进行时保持仿函数积极性

时间:2015-05-09 03:13:13

标签: 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) → 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 μ₃.

μ₂μ₃之间的根本区别是什么?有没有办法让μ₃工作?

1 个答案:

答案 0 :(得分:2)

我大多猜测。 _×_recordVecdata。当μ₂被定义为_×_时,Agda拒绝data

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 → Pair Set Set → Set
⟦ _ ⟧₃ (pair A _) = A

然后一切正常(您的μ₂有点误导,因为F上也没有模式匹配)。在第二种情况下,Agda只是将表达式规范化,因为第一个参数上没有模式匹配,第二个参数在WHNF中,所以⟦_⟧₃完全被消除。但我不知道,Agda如何解决第一起案件。我想是一些特别的东西。

您的μ₂类型检查,因为Agda eliminates pattern matching on records

map : {A B : Set} {P : A → Set} {Q : B → Set}
      (f : A → B) → (∀ {x} → P x → Q (f x)) →
      Σ A P → Σ B Q
map f g (x , y) = (f x , g y)
     

上述条款内部翻译成以下条款:

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

也被拒绝了。