Rol*_*oly 9 equality algebraic-data-types agda
是否有可能定义一个简单的相等的句法概念(类似于GHC可能自动派生为EqHaskell 98类型的实例),而无需明确证明每个数据构造函数是单射的,或者做类似的事情,例如定义撤销每个构造函数和使用cong?
换句话说,是否有可能更直接地利用数据构造函数的注入性,而不是必须为每个构造函数引入一个辅助函数?
以下以自然数为例.
module Eq where
open import Function
open import Relation.Binary
open import Relation.Binary.PropositionalEquality
open import Relation.Nullary
data ? : Set where
zero : ?
suc : ? ? ?
-- How to eliminate these injectivity proofs?
suc-injective : ? {n m} ? suc n ? suc m ? n ? m
suc-injective refl = refl
_?_ : Decidable {A = ?} _?_
zero ? suc _ = no (? ())
suc _ ? zero = no (? ())
zero ? zero = yes refl
suc n ? suc m with n ? m
suc n ? suc .n | yes refl = yes refl
... | no n?m = no (n?m ? suc-injective)
Run Code Online (Sandbox Code Playgroud)
可以替换suc-injective为cong (? { zero ? zero ; (suc x) ? x }),即通过定义一个反转的函数suc,但是仍然需要每个构造函数的一个辅助函数的样板,并且这样的函数由于需要是完全的而有些难以定义.
(通常需要注意的是缺少明显适用的东西.)
| 归档时间: |
|
| 查看次数: |
439 次 |
| 最近记录: |