recursion - 在使用乘积与向量时保持仿函数的积极性

标签 recursion types agda

在下面的代码中,μ₁的定义被Agda接受为严格正仿函数,这是有道理的。如果我通过产品喜结连理,如μ2,它仍然被接受。但是,如果我尝试通过向量(如 μ₃ 中所示),它就不再被接受。

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 μ₃.

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

最佳答案

我主要是猜测。 _×_ 是一个记录Vec 是一个数据。当 _×_ 被定义为 data 时,Agda 拒绝 μ2:

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

那么一切就OK了(你的μ2有点误导,因为F上也没有模式匹配)。在第二种情况下,Agda 只是规范化表达式,因为第一个参数没有模式匹配,而第二个参数位于 WHNF 中,因此完全消除了 ⟦_⟧₃。但我不知道,Agda如何解决第一个案例。我想是临时的。

你的μ2类型检查,因为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)

The clause above is internally translated into the following one:

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

也被拒绝了。

关于recursion - 在使用乘积与向量时保持仿函数的积极性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30135543/

相关文章:

types - FSharp 根据谓词定义类型

agda - 如何使用 Agda 标准库 monoid 求解器的示例

equality - 命题等式的可判定性

配对列表到列表 PROLOG 的列表

Java : Is there a way to automatically cast a return value?

C# : I have problem with createing implement interface object

agda - 是否可以在没有函数外延性的情况下证明 Agda 中范畴范畴(以仿函数作为态射)的存在性?

recursion - 如何使用 Clojure 语言的子集在 lambda 演算中实现递归函数?

带列表的 Python 递归返回 None

java - 跟踪递归方法