我正在尝试减少验证时间,通过实验,我遇到了一些我不理解的怪异情况。
该方法有点庞大,但我将尝试仅选择相关代码:
method solve() returns (isSatisfiable : SAT_UNSAT)
requires valid();
requires formula.stack.size > 0 ==> |formula.stack.stack[formula.stack.size-1]| > 0;
requires formula.stack.size <= formula.stack.stack.Length;
modifies formula.truthAssignment, formula.stack, formula.stack.stack,
formula.trueLiteralsCount, formula.falseLiteralsCount,
formula.satisfiedClauses;
ensures valid();
ensures old(formula.stack) == formula.stack;
ensures old(formula.stack.size) == formula.stack.size;
ensures old(formula.stack.stack) == formula.stack.stack;
ensures old(formula.stack.stack.Length) == formula.stack.stack.Length;
ensures forall i :: 0 <= i < formula.stack.stack.Length ==>
formula.stack.stack[i] == old(formula.stack.stack[i]);
ensures old(formula.stack.contents) == formula.stack.contents;
ensures formula.stack.size > 0 ==>
|formula.stack.stack[formula.stack.size-1]| > 0;
decreases *;
{
.....
assert valid();
assert old(formula.stack) == formula.stack;
assert old(formula.stack.size) == formula.stack.size;
assert old(formula.stack.stack) == formula.stack.stack;
assert old(formula.stack.stack.Length) == formula.stack.stack.Length;
assert forall i :: 0 <= i < formula.stack.stack.Length ==>
formula.stack.stack[i] == old(formula.stack.stack[i]);
assert old(formula.stack.contents) == formula.stack.contents;
assert formula.stack.size > 0 ==>
|formula.stack.stack[formula.stack.size-1]| > 0;
return result;
}
这种形式的证明需要24秒。
奇怪的情况:
如果我在返回前添加另一个assert valid();
,则需要50秒而不是24秒。这是为什么?在此上方有一个assert valid();
,它们之间没有任何变化。
如果我在退货前添加if (true) { return result; }
,则需要300秒。如果我添加if (result.SAT?) { return result; }
,则需要100秒。我很困惑,为什么两个与发文条件无关的简单ifs会对证明时间产生如此大的影响。
您推荐我使用哪些工具/方法来优化验证时间?