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

时间:2018-09-06 15:49:27

标签: agda

下面的deq函数为Dec返回一个Name实例,该实例可以包含一个字符串,或者为Name加上两个构造函数之一。

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 -> ⊥转换为F a ≡ F b -> ⊥的构造函数F,那么我们可以简化此定义。另外,如果我们可以使用lambda进行内联模式匹配,我们也可以对其进行改进,但是为此,我们需要使用类型来注释lambda输入。有什么办法可以改善这个定义?

0 个答案:

没有答案