证明自然数 (n) 为零

Proof a Natural (n) is Zero

我正在努力学习 idris 范式,但仍在努力。这里我有一个函数 isZero,它需要一些自然的 Nat 和 returns True 或 False。

我的问题是非相关案例。

namespace Numbers

  data Nat : Type where
    Zero : Numbers.Nat
    Successor : Numbers.Nat -> Numbers.Nat

  isZero: Numbers.Nat -> Prelude.Bool.Bool
  isZero Zero = True
  isZero _ = False

  isNotZero: Numbers.Nat -> Prelude.Bool.Bool
  isNotZero Zero = False
  isNotZero _ = True

  proofNIsZero : (n : Numbers.Nat) -> isZero n = Bool.True
  proofNIsZero Zero = Refl
  proofNIsZero (Successor _) = ?rhs

很显然,任何 Nat 的某些继承者都不能为零。但我的挣扎在于证明。 ?rhs 孔的类型是

--------------------------------------
rhs : False = True

试图导航我认为应该(并且有一天会)简单的东西已经导致 uninhabitedVoidabsurdimpossible。 None 其中我可以消除歧义。

也许这些就是密钥 - 但我无法破译!

我正在回答,因为我认为我认为可能上述证明没有正确说明。我添加了声明 n = Zero 的语句,它允许 isZero n = Bool.True 具有意义。 n = Zero 继承为 prf 并允许我声明 absurd prf 因为 isZero n = Bool.True 如果 nSuccessor 某些 [=19] 则不能成立=].

  Uninhabited (Successor _ = Zero) where
    uninhabited Refl impossible

  proofNIsZero : (n : Numbers.Nat) -> n = Zero -> isZero n = Bool.True
  proofNIsZero Zero prf = Refl
  proofNIsZero (Successor _) prf = absurd prf

是否有另一种方法或方式来考虑定义这些以避免陷入陷阱?