达芙妮优化证明时间问题

时间:2019-06-07 11:57:42

标签: performance theorem-proving dafny

我正在尝试减少验证时间,通过实验,我遇到了一些我不理解的怪异情况。

该方法有点庞大,但我将尝试仅选择相关代码:

  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秒。

奇怪的情况:

  1. 如果我在返回前添加另一个assert valid();,则需要50秒而不是24秒。这是为什么?在此上方有一个assert valid();,它们之间没有任何变化。

  2. 如果我在退货前添加if (true) { return result; },则需要300秒。如果我添加if (result.SAT?) { return result; },则需要100秒。我很困惑,为什么两个与发文条件无关的简单ifs会对证明时间产生如此大的影响。

您推荐我使用哪些工具/方法来优化验证时间?

0 个答案:

没有答案