agda - 抽象调用站点后终止检查器失败

标签 agda coinduction

问题

我有一个简单的 coductive 记录,其中包含一个总和类型的字段。 Unit给了我们一个简单的类型来玩。

open import Data.Maybe
open import Data.Sum

data Unit : Set where
  unit : Unit

record Stream : Set where
  coinductive
  field
    step : Unit ⊎ Stream

open Stream

作品
valid通过终止检查器:
valid : Maybe Unit → Stream
step (valid x) = inj₂ (valid x)

休息时间

但是说我想消除Maybe Unit成员,只有在我有 just 时才递归.
invalid₀ : Maybe Unit → Stream
step (invalid₀ x) = maybe (λ _ → inj₂ (invalid₀ x)) (inj₁ unit) x

现在终止检查器不高兴了!
Termination checking failed for the following functions:
  invalid₀
Problematic calls:
  invalid₀ x

为什么这不满足终止检查器?有没有办法解决这个问题,或者我的概念理解不正确?

背景
agda --version yield Agda version 2.6.0-7ae3882 .我只使用默认选项进行编译。
-v term:100的输出在这里:https://gist.github.com/emilyhorsman/f6562489b82624a5644ed78b21366239

尝试的解决方案
  • 使用 Agda version 2.5.4.2 .不修复。
  • 使用 --termination-depth=10 .不修复。
  • 最佳答案

    您可以使用 sized types这里。

    open import Data.Maybe
    open import Data.Sum
    open import Size
    
    data Unit : Set where
      unit : Unit
    
    record Stream {i : Size} : Set where
      coinductive
      field
        step : {j : Size< i} → Unit ⊎ Stream {j}
    
    open Stream
    
    valid : Maybe Unit → Stream
    step (valid x) = inj₂ (valid x)
    
    invalid₀ : {i : Size} → Maybe Unit → Stream {i}
    step (invalid₀ x) = maybe (λ _ → inj₂ (invalid₀ x)) (inj₁ unit) x
    
    _ : step (invalid₀ (nothing)) ≡ inj₁ unit
    _ = refl
    
    _ : step (invalid₀ (just unit)) ≡ inj₂ (invalid₀ (just unit))
    _ = refl
    

    更明确地说明 Size invalid₀ 定义中的参数:
    step (invalid₀ {i} x) {j} = maybe (λ _ → inj₂ (invalid₀ {j} x)) (inj₁ unit) x
    

    哪里j有类型 Size< i ,所以递归调用 invalid₀位于“较小”Size .

    请注意 valid ,不需要任何“帮助”来通过终止检查,不需要推理 Size的。

    关于agda - 抽象调用站点后终止检查器失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55467128/

    相关文章:

    type-inference - 为什么我不能定义以下 CoFixpoint?

    functional-programming - 协助Agda的终止检查器

    abstract - Agda 标准库 - 为什么更多属性没有标记为抽象?

    list - 无限的列表是否合理?

    haskell - 如何有效地将归纳类型转换为互归纳类型(无需递归)?

    coq - 我可以证明 "coinductive principles"关于共感类型吗?

    installation - 加载Agda标准库

    agda - 信任我有多危险?

    generic-programming - 我可以从这种签名类型创建原始数据类型吗?

    coq - 共导和依赖类型