以下代码旨在描述类似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
很快。那么怎么回事?