【发布时间】:2019-04-02 04:47:15
【问题描述】:
问题
我有一个简单的共归纳记录,其中包含一个 sum 类型的字段。 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 产生Agda version 2.6.0-7ae3882。我只使用默认选项进行编译。
-v term:100 的输出在这里:https://gist.github.com/emilyhorsman/f6562489b82624a5644ed78b21366239
尝试的解决方案
- 使用
Agda version 2.5.4.2。无法修复。 - 使用
--termination-depth=10。无法修复。
【问题讨论】:
标签: agda coinduction