proof - 证明自然 (n) 为零
问题描述
我正在尝试学习 idris 范式,但仍在苦苦挣扎。这里我有一个函数 isZero,它接受一些自然的 Nat 并返回 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
试图导航我认为应该(并且有一天会)简单的东西导致了uninhabited
,Void
和. 我无法消除任何歧义。 absurd
impossible
也许那些是钥匙——但我无法破译!
解决方案
我正在回答,因为我认为我认为上述证明没有正确说明。我添加了 asserted 的语句n = Zero
,它允许isZero n = Bool.True
具有意义。继承n = Zero
asprf
并允许我声明absurd prf
as在某些情况下isZero n = Bool.True
不成立。n
Successor
Nat
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
是否有另一种方法或方式来考虑将这些定义为不陷入陷阱?
推荐阅读
- excel - 运行时错误“-2147221080 (800401a8)”:自动化错误
- android - 使用声明为“Bundle”对象的空变量初始化“intent.extras”
- angular - 使用 Angular 5 在 Outlook 日历中创建事件
- c# - 验证 JSON 中键值对中的值
- php - 未定义的偏移量,即使它已定义
- java - 如何使地图视图从当前位置获取?
- html - 从.net核心到角度的硬编码路径
- arrays - 从数组对象中获取值 - Woocommerce
- php - Laravel forge 失去与 SQL 的连接
- sas - SAS sftp 使用 LF 分隔符而不是 CRLF 发送文件