将索引的 Agda 数据类型转换为记录

Convert indexed Agda data type to record

我有一个允许无效实例的记录类型,因为它们可能来自外部源。例如

record Foo : Set where
    fields
        x : Nat
        y : Nat
        z : Nat

现在我有一个验证器,它 returns 证明给定的 Foo 符合某些命题。证明的类型可以是例如:

data IsValidFoo : Foo → Set where
    validFoo : (foo : Foo) → Even (Foo.x foo) → (Foo.y foo) < (Foo.z foo) → IsValidFoo foo

validateFoo : (foo : Foo) → Maybe (IsValidFoo foo)
…

我希望能够按名称访问 IsValidFoo 中的各个证明,并考虑将 IsValidFoo 转换为记录类型。如果我希望它的类型保持 IsValidFoo : Foo → Set?

,这甚至可能吗?如何实现?

当然,这可以通过将 IsValidFoo 定义为在 foo : Foo 上参数化的记录类型来实现:

open import Agda.Builtin.Nat hiding (_<_)

postulate
  _<_ : Nat → Nat → Set
  Even : Nat → Set
  Maybe : Set → Set

record Foo : Set where
  field
    x : Nat
    y : Nat
    z : Nat

record IsValidFoo (foo : Foo) : Set where
  constructor validFoo
  field
    even-x : Even (Foo.x foo)
    y<z    : (Foo.y foo) < (Foo.z foo)

validateFoo : (foo : Foo) → Maybe (IsValidFoo foo)