Idris 为什么';与';块会破坏此函数的整体性吗?

Idris 为什么';与';块会破坏此函数的整体性吗?,idris,termination,totality,Idris,Termination,Totality,我试着用自然数的一半的底来计算奇偶性: data IsEven : Nat -> Nat -> Type where Times2 : (n : Nat) -> IsEven (n + n) n data IsOdd : Nat -> Nat -> Type where Times2Plus1 : (n : Nat) -> IsOdd (S (n + n)) n parity : (n : Nat) -> Either (Exists

我试着用自然数的一半的底来计算奇偶性:

data IsEven : Nat -> Nat -> Type where
    Times2 : (n : Nat) -> IsEven (n + n) n

data IsOdd : Nat -> Nat -> Type where
    Times2Plus1 : (n : Nat) -> IsOdd (S (n + n)) n

parity : (n : Nat) -> Either (Exists (IsEven n)) (Exists (IsOdd n))
我试着使用
奇偶校验的明显实现:

parity Z = Left $ Evidence _ $ Times2 0
parity (S Z) = Right $ Evidence _ $ Times2Plus1 0
parity (S (S n)) with (parity n)
  parity (S (S (k + k))) | Left (Evidence _ (Times2 k)) =
      Left $ rewrite plusSuccRightSucc k k in Evidence _ $ Times2 (S k)
  parity (S (S (S ((k + k))))) | Right (Evidence _ (Times2Plus1 k)) =
      Right $ rewrite plusSuccRightSucc k k in Evidence _ $ Times2Plus1 (S k)
这台打字机按预期进行检查和工作。但是,如果我试图将
奇偶校验
标记为
总计
,Idris开始抱怨:

 parity is possibly not total due to: with block in parity
我在
奇偶校验
中看到的唯一
块是从
奇偶校验(S(sn))
奇偶校验n
的递归调用,但这显然是有根据的,因为
n
在结构上小于
S(sn)


我如何说服Idris奇偶校验是完全的?

对我来说这看起来像一个bug,因为以下基于
案例的解决方案通过了总体检查:

total
parity : (n : Nat) -> Either (Exists (IsEven n)) (Exists (IsOdd n))
parity Z = Left $ Evidence _ $ Times2 0
parity (S Z) = Right $ Evidence _ $ Times2Plus1 0
parity (S (S k)) =
  case (parity k) of
    Left (Evidence k (Times2 k)) =>
      Left $ rewrite plusSuccRightSucc k k in Evidence _ $ Times2 (S k)
    Right (Evidence k (Times2Plus1 k)) =>
      Right $ rewrite plusSuccRightSucc k k in Evidence _ $ Times2Plus1 (S k)

我可以确认这个变通方法适用于我在原始问题中的问题——但在其他情况下,带
不能总是重写为
案例
,对吗?我在想模式匹配会细化其他参数的类型的情况。对!这里有一个相关的问题:。我们很幸运,我们在上下文中有证据。嗯,那么,这是否意味着我应该尝试用
s手动展开这些
,看看是否有效;仍然没有通过总体检查。。。所以我想我现在陷入了僵局。你是说你还有其他更大的例子吗?我在GitHub上打开了。