Agda的类型检查器爆炸

时间:2019-02-11 05:52:22

标签: agda

以下代码旨在描述类似C / C ++的枚举,尽管枚举应该包含的只是几个不同的选择,但它们可能占用4个字节。

open import Prelude.Bool
open import Prelude.Nat
open import Agda.Builtin.Nat
open import Agda.Builtin.Equality
open import Numeric.Nat.Pow renaming (_^′_ to _^_)

data Enum : Set where
  makeEnum : (size : Nat) → (variants : Nat) → 
             .{{ _ : (variants < size) ≡ true }} → Enum

five : Enum
five = makeEnum (2 ^ 32) 5

data Expr : (t : Enum) → Set where
  constant : (x : Nat) → Expr five

到目前为止,一切都很好。一切类型检查都很好。但是添加以下几行

func : ∀ {t} → Expr t → Bool
func (constant x) = false

似乎没有做任何事情,导致类型检查器无法终止,并且所有系统资源都已耗尽。

除了实例参数外,我什么都看不到,但这似乎并不符合Agda能够解决以下问题并进行类型检查的事实

5<2³² : (5 < 2 ^ 32) ≡ true
5<2³² = refl

很快。那么怎么回事?

1 个答案:

答案 0 :(得分:0)

问题是Jesper Cockx的answered。事实证明,这是一个编译器错误,它将在下一版的Agda中修复。

更新:该错误已在master分支中修复。