将索引的 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)
我有一个允许无效实例的记录类型,因为它们可能来自外部源。例如
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)