Задача
У меня есть простая коиндуктивная запись с одним полем типа суммы.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
.Не исправляет.