src/HOL/Boogie/Examples/Boogie_Dijkstra.thy
author bulwahn
Thu, 12 Jan 2012 10:19:33 +0100
changeset 46193 55a4769d0abe
parent 41601 fda8511006f9
child 47152 446cfc760ccf
permissions -rw-r--r--
adding exhaustive instances for type constructor set
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
     1
(*  Title:      HOL/Boogie/Examples/Boogie_Dijkstra.thy
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
     2
    Author:     Sascha Boehme, TU Muenchen
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
     3
*)
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
     4
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
     5
header {* Boogie example: Dijkstra's algorithm *}
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
     6
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
     7
theory Boogie_Dijkstra
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
     8
imports Boogie
40540
293f9f211be0 formal dependency on b2i files
boehmes
parents: 40514
diff changeset
     9
uses ("Boogie_Dijkstra.b2i")
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    10
begin
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    11
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    12
text {*
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    13
We prove correct the verification condition generated from the following
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    14
Boogie code:
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    15
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    16
\begin{verbatim}
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    17
type Vertex;
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    18
const G: [Vertex, Vertex] int;
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    19
axiom (forall x: Vertex, y: Vertex ::  x != y ==> 0 < G[x,y]);
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    20
axiom (forall x: Vertex, y: Vertex ::  x == y ==> G[x,y] == 0);
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    21
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    22
const Infinity: int;
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    23
axiom 0 < Infinity;
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    24
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    25
const Source: Vertex;
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    26
var SP: [Vertex] int;
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    27
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    28
procedure Dijkstra();
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    29
  modifies SP;
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    30
  ensures (SP[Source] == 0);
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    31
  ensures (forall z: Vertex, y: Vertex ::
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    32
    SP[y] < Infinity && G[y,z] < Infinity ==> SP[z] <= SP[y] + G[y,z]);
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    33
  ensures (forall z: Vertex :: z != Source && SP[z] < Infinity ==>
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    34
    (exists y: Vertex :: SP[y] < SP[z] && SP[z] == SP[y] + G[y,z]));
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    35
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    36
implementation Dijkstra()
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    37
{
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    38
  var v: Vertex;
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    39
  var Visited: [Vertex] bool;
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    40
  var oldSP: [Vertex] int;
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    41
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    42
  havoc SP;
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    43
  assume (forall x: Vertex :: x == Source ==> SP[x] == 0);
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    44
  assume (forall x: Vertex :: x != Source ==> SP[x] == Infinity);
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    45
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    46
  havoc Visited;
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    47
  assume (forall x: Vertex :: !Visited[x]);
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    48
            
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    49
  while ((exists x: Vertex :: !Visited[x] && SP[x] < Infinity))
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    50
    invariant (SP[Source] == 0);
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    51
    invariant (forall x: Vertex :: SP[x] >= 0);
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    52
    invariant (forall y: Vertex, z: Vertex :: 
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    53
      !Visited[z] && Visited[y] ==> SP[y] <= SP[z]);
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    54
    invariant (forall z: Vertex, y: Vertex ::
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    55
      Visited[y] && G[y,z] < Infinity ==> SP[z] <= SP[y] + G[y,z]);
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    56
    invariant (forall z: Vertex :: z != Source && SP[z] < Infinity ==>
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    57
      (exists y: Vertex :: SP[y] < SP[z] && Visited[y] && 
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    58
        SP[z] == SP[y] + G[y,z]));
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    59
  {
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    60
    havoc v;
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    61
    assume (!Visited[v]);
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    62
    assume (SP[v] < Infinity); 
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    63
    assume (forall x: Vertex :: !Visited[x] ==> SP[v] <= SP[x]);
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    64
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    65
    Visited[v] := true;
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    66
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    67
    oldSP := SP;
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    68
    havoc SP;
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    69
    assume (forall u: Vertex :: 
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    70
      G[v,u] < Infinity && oldSP[v] + G[v,u] < oldSP[u] ==> 
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    71
        SP[u] == oldSP[v] + G[v,u]);
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    72
    assume (forall u: Vertex :: 
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    73
      !(G[v,u] < Infinity && oldSP[v] + G[v,u] < oldSP[u]) ==> 
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    74
        SP[u] == oldSP[u]);
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    75
    assert (forall z: Vertex:: SP[z] <= oldSP[z]);
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    76
    assert (forall y: Vertex:: Visited[y] ==> SP[y] == oldSP[y]);
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    77
  }
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    78
}
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    79
\end{verbatim}
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    80
*}
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    81
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    82
40580
0592d3a39c08 require the b2i file ending in the boogie_open command (for consistency with the theory header)
boehmes
parents: 40540
diff changeset
    83
boogie_open "Boogie_Dijkstra.b2i"
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    84
40513
1204d268464f look for certificates relative to the theory
boehmes
parents: 40163
diff changeset
    85
declare [[smt_certificates="Boogie_Dijkstra.certs"]]
36081
70deefb6c093 renamed "smt_record" to "smt_fixed" (somewhat more expressive) and inverted its semantics
boehmes
parents: 34993
diff changeset
    86
declare [[smt_fixed=true]]
41601
fda8511006f9 made Z3 the default SMT solver again
boehmes
parents: 41432
diff changeset
    87
declare [[smt_oracle=false]]
34993
bf3b8462732b updated examples due to changes in the way SMT certificates are stored
boehmes
parents: 34068
diff changeset
    88
33445
f0c78a28e18e shorter names for variables and verification conditions,
boehmes
parents: 33419
diff changeset
    89
boogie_vc Dijkstra
34068
a78307d72e58 make assertion labels unique already when loading a verification condition,
boehmes
parents: 33445
diff changeset
    90
  by boogie
33419
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    91
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    92
boogie_end 
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    93
8ae45e87b992 added HOL-Boogie
boehmes
parents:
diff changeset
    94
end