2
(* Quelques preuves sur des programmes simples,
3
* juste histoire d'avoir un petit bench.
9
Global Variable x : Z ref.
10
Global Variable y : Z ref.
11
Global Variable z : Z ref.
12
Global Variable i : Z ref.
13
Global Variable j : Z ref.
14
Global Variable n : Z ref.
15
Global Variable m : Z ref.
18
Global Variable t : array N of Z.
20
(**********************************************************************)
26
fun (N:Z)(t:array N of Z)(i,j:Z) ->
27
{ `0 <= i < N` /\ `0 <= j < N` }
33
{ (exchange t t@ i j) }.
39
let rec downheap (N:Z)(t:array N of Z) : unit { variant `0` } =
40
(swap N t 0 0) { True }
43
(**********************************************************************)
45
Global Variable x : Z ref.
47
Correctness assign0 (x := 0) { `x=0` }.
50
(**********************************************************************)
52
Global Variable i : Z ref.
54
Correctness assign1 { `0 <= i` } (i := !i + 1) { `0 < i` }.
58
(**********************************************************************)
60
Global Variable i : Z ref.
62
Correctness if0 { `0 <= i` } (if !i>0 then i:=!i-1 else tt) { `0 <= i` }.
66
(**********************************************************************)
68
Global Variable i : Z ref.
70
Correctness assert0 { `0 <= i` } begin assert { `i=2` }; i:=!i-1 end { `i=1` }.
72
(**********************************************************************)
75
{ `0 <= i < N` /\ `0 <= j < N` }
78
x := t[!i]; t[!i] := t[!j]; t[!j] := !x;
79
assert { #t[i] = #t@B[j] /\ #t[j] = #t@B[i] }
86
(**********************************************************************)
89
* while x <= y do x := x+1 done { y < x }
92
Correctness incrementation
94
{ invariant True variant `(Zs y)-x` }
99
Exact (Zwf_well_founded `0`).
105
(************************************************************************)
109
while (Z_lt_ge_dec !i r) do
110
{ invariant True variant (Zminus (Zs r) i) } i := (Zs !i)
112
while (Z_lt_ge_dec r !j) do
113
{ invariant True variant (Zminus (Zs j) r) } j := (Zpred !j)
116
{ `j <= r` /\ `r <= i` }.
118
Exact (Zwf_well_founded `0`).
121
Exact (Zwf_well_founded `0`).
122
Unfold Zwf. Unfold Zpred. Omega.