Files
why3/examples/programs/decrease1.mlw

44 lines
1.2 KiB
Plaintext
Raw Normal View History

2011-05-15 22:41:28 +02:00
(*
We look for the first occurrence of zero in an array of integers.
The values have the following property: they never decrease by more than one.
The code makes use of that property to speed up the search.
*)
module Decrease1
use import int.Int
use import module stdlib.Ref
use import module stdlib.Array
logic decrease1 (a: array int) =
forall i: int. 0 <= i < length a - 1 -> a[i+1] >= a[i] - 1
lemma decrease1_induction:
forall a: array int. decrease1 a ->
forall i j: int. 0 <= i <= j < length a -> a[j] >= a[i] + i - j
exception Found int
let search (a: array int) =
{ decrease1 a }
let i = ref 0 in
while !i < length a do
2011-05-16 11:11:10 +02:00
invariant { 0 <= i and
forall j: int. 0 <= j < i -> j < length a -> a[j] <> 0 }
2011-05-15 22:41:28 +02:00
variant { length a - i }
if get a !i = 0 then raise (Found !i);
if get a !i > 0 then i := !i + get a !i else i := !i + 1
done
{ forall j: int. 0 <= j < length a -> a[j] <> 0 }
| Found -> { 0 <= result < length a and a[result] = 0 and
2011-05-16 11:11:10 +02:00
forall j: int. 0 <= j < result -> a[j] <> 0 }
2011-05-15 22:41:28 +02:00
end
(*
Local Variables:
compile-command: "unset LANG; make -C ../.. examples/programs/decrease1.gui"
End:
*)