Graph algorithm 达夫尼-令人费解的违反后条件

Graph algorithm 达夫尼-令人费解的违反后条件,graph-algorithm,formal-verification,dafny,Graph Algorithm,Formal Verification,Dafny,所以我在Dijkstra算法的一个实现中有一个类顶点和类边,我正试图完成它。看起来是这样的: class Vertex{ var id : int ; var wfs : int ; var pred: int ; constructor Init() modifies this { this.wfs :=-1; this.pred := -1; } } class Edge{ var source : int; var des

所以我在Dijkstra算法的一个实现中有一个类顶点和类边,我正试图完成它。看起来是这样的:

class Vertex{
  var id  : int ;
  var wfs : int ;       
  var pred: int ; 

  constructor Init()
  modifies this
  {
  this.wfs :=-1;
  this.pred := -1;
  } 
}

class Edge{
  var source : int;
  var dest: int;
  var weight : int;
}
method getVertexwfs(v: Vertex) returns (i: int)
  requires isValid() && hasVertex(v) && v != null
  requires hasVertex(v) ==> 0 <= v.id < d.Length && v in vertices
  ensures  exists s :: 0 <= s < d.Length && d[s] == i 
  {
   var x: int := 0;
    while (x < d.Length)
     invariant  hasVertex(v)
     invariant hasVertex(v) ==> 0 <= v.id < d.Length
     invariant v in vertices && 0 <= v.id < d.Length
        {
            if(v.id == x){ i := d[x]; }
            x := x + 1 ;
        }
   //return i;
  }
还有一个图形类,如下所示:

class Graph{
  var vertices : set<Vertex>
  var edges : set<Edge>
  var d : array<int>
}
getVertexwfs()方法的后条件被违反,尽管我坚持函数的先决条件是v存在于图中,这意味着v的ID是d边界中的索引

我是否遗漏了Dafny发现返回整数未赋值的情况

为什么违反了先决条件


非常感谢您的帮助。

getVertexwfs
中,我觉得我一定错过了什么。为什么后置条件不能是d[v.id]==i?为什么主体不能是
i:=d[v.id]。循环似乎没有做任何有趣的事情;它只是不必要地从0搜索到
v.id

另外,在
hasVertex
中,您只需在顶点中写入
v即可。这相当于你所拥有的

最后,在
isValid
中,需要在量词周围加括号,如
(对于顶点中的所有m | m::m!=null&&0
predicate isValid()
  reads this, this.edges, this.vertices
  {
  d != null && |vertices| > 0 && |edges| > 0 &&
  d.Length == |vertices| &&
  forall m | m in vertices :: (m != null && 0 <= m.id < d.Length ) &&
  forall m , n | m in vertices && n in vertices && m != n :: (m != null && n 
!= null && m.id != n.id) &&
  forall e | e in edges :: e != null && 0 <= e.source <= e.dest < d.Length &&
  forall e | e in edges :: !exists d | d in edges :: d != e &&  d.source == e.source && d.dest == e.dest
  }
predicate method hasVertex(v: Vertex)
  requires isValid()
  reads this, this.vertices, this.edges
  {
  vertices * {v} == {v}
  }