【发布时间】:2021-07-14 00:35:37
【问题描述】:
我正在尝试在 Dafny 中实现和编译快速指数算法,但遇到了几个问题。
上下文:
- 所有代码都在下面;
- 快速指数 (
FastExp) 引理本身是迭代的; -
exp函数用于确保计算正确(该函数递归执行传统的指数函数); - 我不会讨论数学是如何完成的,或者它是否有效。这不是问题,数学是正确的。
现在,我遇到的主要问题:
- 我不知道在循环的decrease和invariants中放什么;
-
FastExp引理的后置条件“可能不成立”;
如果有人可以帮助我解决这个简单(我假设)的问题,我会很高兴。
提前谢谢你。
function isEven(a: int): bool
requires a >= 0;
{
if a == 0 then true
else if a == 1 then false
else isEven(a - 2)
}
function exp(x: int, n: int): int
requires n > 0;
{
if n == 1 then
x
else
x * exp(x, n-1)
}
lemma FastExp(x: int, n: int) returns (r: int)
requires n >= 0
ensures r == exp(x,n)
{
var expo:int := n;
var c:int := x;
var tempR:int := 1;
while expo > 0
invariant 0 <= expo
decreases expo
{
if isEven(expo) {
tempR := tempR * c;
}
c := c * c;
expo := expo / 2;
}
r := tempR;
}
【问题讨论】:
标签: loops dafny invariants loop-invariant