Leon不能证明简单递归程序的正确性吗?

Leon不能证明简单递归程序的正确性吗?,leon,Leon,我在莱昂尝试过以下项目 object Test10 { def sum(n: Int): Int = ({ require(n >= 0) if (n == 0) 0 else sum(n-1)+1 })ensuring(res => res==n ) } 结果——成功 object Test10 { def sum(n: Int): Int = ({ require

我在莱昂尝试过以下项目

object Test10 {

     def sum(n: Int): Int = ({ 
        require(n >= 0)
        if (n == 0) 0
        else    sum(n-1)+1
    })ensuring(res => res==n )    

}
结果——成功

object Test10 {

     def sum(n: Int): Int = ({ 
        require(n >= 0)
        if (n == 0) 0
        else    sum(n-1)+n
    })ensuring(res => res==n*(n+1)/2 )

 }
结果--失败(未终止)


我是否犯了什么错误,为什么系统不能生产?有人能指导我吗?

第二个程序实际上是无效的。由于溢出,后置条件对于
n
的大值不正确。当总和溢出时,公式将不再适用

您可以尝试将
Int
替换为
BigInt
,这可能有效。由于非线性运算,这个问题也很难解决

Leon没有终止,因为它正在寻找一个反例(因为程序无效),并且必须展开公式直到到达溢出。当然,最好只找到反例并报告它,但由于Leon中使用的算法,这是一个限制

请注意,您的第一个程序是有效的,因为从来没有溢出