【发布时间】:2019-07-16 07:26:59
【问题描述】:
在下面的代码中(试图解决“软件基础”[列表章节]中的一个练习),Idris 报告了countSingleton_rhs 的一个非常复杂的类型。该类型包含一个复杂的表达式,其核心是:case decEq x x of ...。
module CountSingleton
data NatList : Type where
Nil : NatList
(::) : Nat -> NatList -> NatList
-- count occurrences of a value in a list
count : (v : Nat) -> (s : NatList) -> Nat
count _ [] = Z
count Z (Z :: ns) = S (count Z ns)
count Z (_ :: ns) = count Z ns
count j@(S _) (Z :: ns) = count j ns
count (S j) ((S k) :: ns) =
case decEq j k of
Yes Refl => S (count (S j) ns)
No _ => count (S j) ns
-- to prove
countSingleton : (v : Nat) -> (count v [v]) = S Z
countSingleton Z = Refl
countSingleton (S k) = ?countSingleton_rhs
为什么 Idris 不将 decEq x x 简化为 Yes Refl?
有没有更好的方法来实现count 来避免这种行为?
为了取得进展,我可以做些什么来简化/重写类型?
【问题讨论】:
标签: idris