gpt4 book ai didi

recursion - Idris:尝试为 Nat 重新实现 fromInteger 时,完整性检查失败

转载 作者:行者123 更新时间:2023-12-02 23:04:10 26 4
gpt4 key购买 nike

我有以下代码:

module Test
data Nat' = S' Nat' | Z'
Num Nat' where
x * y = ?hole
x + y = ?hole
fromInteger x = if x < 1 then Z' else S' (fromInteger (x - 1))

我收到有关最后一行的错误消息:

Test.idr:6:5:
Prelude.Interfaces.Test.Nat' implementation of Prelude.Interfaces.Num, method fromInteger is
possibly not total due to recursive path Prelude.Interfaces.Test.Nat' implementation of
Prelude.Interfaces.Num, method fromInteger --> Prelude.Interfaces.Test.Nat' implementation of
Prelude.Interfaces.Num, method fromInteger

该函数应该始终给出结果,因为最终 fromInteger 的参数将变得足够小以选择第一种情况。但 idris 似乎并不明白这一点。这个函数有什么问题,如何修复这个错误?

最佳答案

n - 1结构上不小于n,要看到这一点,只需观察Integer不小于感应型。因此,您需要使用像 assert_smaller 这样的技巧让完整性检查器相信您的函数实际上是完整的(请参阅 Idris tutorial ):

这是它的current定义:

 assert_smaller : (x : a) -> (y : b) -> b
assert_smaller x y = y

It simply evaluates to its second argument, but also asserts to the totality checker that y is structurally smaller than x.

这是 Idris 在其标准库中使用的内容(请参阅 here )来解决您的问题:

fromIntegerNat : Integer -> Nat
fromIntegerNat 0 = Z
fromIntegerNat n =
if (n > 0) then
S (fromIntegerNat (assert_smaller n (n - 1)))
else
Z

关于recursion - Idris:尝试为 Nat 重新实现 fromInteger 时,完整性检查失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43933438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com