簡體   English   中英

我的dafny方法有什么問題。 簡單方法后置條件可能不成立

[英]What wrong with my dafny method. simple method postcondition might not hold

我是Dafny的新手,我正嘗試在不使用*的情況下向5 * m-3 * n計算機編寫代碼。

有人可以告訴我我的代碼有什么問題嗎? 我認為這是不變的和減少的。

method CalcTerm(m: int, n: nat) returns (res: int)
  ensures res == 5*m-3*n;
{
  var m1: nat := abs(m);
  var n1: nat := n;
  res := 0;

  while (m1!=0)
    invariant m1>=0
    decreases m1
  {
    res := res+5;
    m1 := m1-1;
  }

  if (m<0) { res := -res; }

  while (n1!=0)
    invariant n1 >= 0
    decreases n1
  {
    res := res-3;
    n1 := n1-1;
  }
}

但它一直在說:

A postcondition might not hold on this return path. 29  2

沒錯,問題與循環不變量有關。 我建議閱讀斷言和循環不變性指南的兩個部分。

Dafny 使用其不變式來“總結”循環的效果。 因此,在方法中的第二個循環之后,Dafny將僅知道n1 >= 0且該循環已終止,因此實際上n1 == 0 這些信息不足以證明您的后置條件:您需要一個更強的不變性。 這可能會幫助您取得進步

invariant res == 5 * m - 3 * (n - n1)

這個不變量根據到目前為止已執行的循環迭代次數( n - n1 )計算res的值。 如果將此不變量添加到第二個循環中,則會得到一個新錯誤(進度!),該錯誤可能在輸入時不成立。 這意味着Dafny能夠證明您的后置條件,但在第一個循環完成后無法確定新的不變式為真。 再次是因為第一個循環的不變性太弱了。

也許這為您提供了足夠的信息,以嘗試自己為第一個循環提出另一個不變式。 如果您遇到困難,請隨時在此處提出更多問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM