如何使用标准库改进Agda功能?

如何使用标准库改进Agda功能?,agda,Agda,下面的deq函数返回Name的Dec实例,该实例包含一个字符串,或者在名称的前面加上两个构造函数中的一个 data Name : Set where Str : String -> Name Cp0 : Name -> Name Cp1 : Name -> Name deq : (a : Name) -> (b : Name) -> Dec (a ≡ b) deq (Str a) (Str b) with iseq a b deq (Str a) (S

下面的
deq
函数返回
Name
Dec
实例,该实例包含一个字符串,或者在
名称的前面加上两个构造函数中的一个

data Name : Set where
  Str : String -> Name
  Cp0 : Name -> Name
  Cp1 : Name -> Name

deq : (a : Name) -> (b : Name) -> Dec (a ≡ b)
deq (Str a) (Str b) with iseq a b
deq (Str a) (Str b) | yes p = yes (cong Str p)
deq (Str a) (Str b) | no ¬p = no f
  where f : (Str a ≡ Str b) -> ⊥
        f refl = ¬p refl
deq (Str a) (Cp0 b) = no (λ ())
deq (Str a) (Cp1 b) = no (λ ())
deq (Cp0 a) (Str b) = no (λ ())
deq (Cp0 a) (Cp0 b) with deq a b
deq (Cp0 a) (Cp0 b) | yes p = yes (cong Cp0 p)
deq (Cp0 a) (Cp0 b) | no ¬p = no f
  where f : (Cp0 a ≡ Cp0 b) -> ⊥
        f refl = ¬p refl
deq (Cp0 a) (Cp1 b) = no (λ ())
deq (Cp1 a) (Str b) = no (λ ())
deq (Cp1 a) (Cp0 b) = no (λ ())
deq (Cp1 a) (Cp1 b) with deq a b
deq (Cp1 a) (Cp1 b) | yes p = yes (cong Cp1 p)
deq (Cp1 a) (Cp1 b) | no ¬p = no f
  where f : (Cp1 a ≡ Cp1 b) -> ⊥
        f refl = ¬p refl

但在这里,有几个子句很尴尬,因为它们需要
where
。标准库是否有一个
cong
等价物,允许我们将
a≡ b->⊥进入
fa≡ F b->⊥
对于构造函数
F
,则我们可以缩短此定义。此外,如果我们可以内联使用lambdas进行模式匹配,我们也可以对其进行改进,但为此,我们需要使用类型对lambda输入进行注释。有没有办法改进这个定义

这个问题突然出现了。简言之,我从未看到任何进步。不过,您可以改进其他方面,比如使用可判定等式组合符来简化
deq
的定义。我有很多(
decSum
decProd
是如何使用它们的例子)。或者你可以简化你的生活,使用反射机制导出可判定等式,或者使用反射机制导出可判定等式,但1)能力不如Ulf的2)与标准库兼容。为您的
Name
生成
Eq
实例是
openimportgeneric.Main隐藏(Name;NameEq);实例名称Eq:Eq名称;unquoteDef NameEq=deriveEqTo NameEq(quote Name)
。您可以通过写入
noλ{refl来摆脱
where
s→ 确实是这样。我想知道它是否一直是这样工作的,或者模式匹配lambda在某个时候得到了改进。哦,所以我的尝试没有成功的原因是
(λrefl→ p refl)
实际上不是模式匹配,您需要
{}
。该死