Leon无法证明Simple Recursive程序的正确性?

时间:2016-06-27 03:16:15

标签: 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(n >= 0)
        if (n == 0) 0
        else    sum(n-1)+n
    })ensuring(res => res==n*(n+1)/2 )

 }

结果 - 失败(未终止)

我是否犯了任何错误,为什么系统无法生成?有人可以指导我吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

请注意,您的第一个程序是valid,因为永远不会有溢出。