Initial commit
This commit is contained in:
commit
15f3c79181
4 changed files with 90 additions and 0 deletions
3
README.md
Normal file
3
README.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# whynot-research
|
||||||
|
|
||||||
|
Tests in WhyML
|
50
whyml/gcd.why
Normal file
50
whyml/gcd.why
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
(*
|
||||||
|
* gcd.whyml
|
||||||
|
* WhyML implementation of byteback test `algorithm/GCD`
|
||||||
|
*)
|
||||||
|
|
||||||
|
module GCD
|
||||||
|
use int.Int
|
||||||
|
use ref.Ref
|
||||||
|
|
||||||
|
exception IllegalArgumentException
|
||||||
|
|
||||||
|
let rec function gcd_recursive (a b : int) : int
|
||||||
|
variant { a + b }
|
||||||
|
=
|
||||||
|
if a = b then
|
||||||
|
a
|
||||||
|
else if a > b then
|
||||||
|
gcd_recursive (a - b) b
|
||||||
|
else
|
||||||
|
gcd_recursive a (b - a)
|
||||||
|
|
||||||
|
predicate arguments_are_negative (a b : int) =
|
||||||
|
a <= 0 || b <= 0
|
||||||
|
|
||||||
|
predicate result_is_gcd (a b r : int) =
|
||||||
|
(not (arguments_are_negative a b)) -> (r = gcd_recursive a b)
|
||||||
|
|
||||||
|
let apply (a b : int) : int
|
||||||
|
raises { IllegalArgumentException -> arguments_are_negative a b }
|
||||||
|
ensures { result_is_gcd a b result }
|
||||||
|
(* `result` holds return value *)
|
||||||
|
=
|
||||||
|
if a <= 0 || b <= 0 then
|
||||||
|
raise IllegalArgumentException;
|
||||||
|
let ref r: int = a in
|
||||||
|
let ref x: int = b in
|
||||||
|
|
||||||
|
while r <> x do
|
||||||
|
invariant { r > 0 && x > 0 }
|
||||||
|
invariant { gcd_recursive r x = gcd_recursive a b }
|
||||||
|
variant { r + x } (* not needed for byteback *)
|
||||||
|
|
||||||
|
if r > x then
|
||||||
|
r <- r - x
|
||||||
|
else
|
||||||
|
x <- x - r;
|
||||||
|
done;
|
||||||
|
|
||||||
|
r
|
||||||
|
end
|
10
whyml/hello.why
Normal file
10
whyml/hello.why
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
theory HelloProof
|
||||||
|
goal G1: true
|
||||||
|
goal G4: false
|
||||||
|
goal G2: (true -> true) /\ (true \/ false)
|
||||||
|
use int.Int
|
||||||
|
goal G3: forall x:int. x * x >= 0
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
27
whyml/selection_sort.why
Normal file
27
whyml/selection_sort.why
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
module SelectionSort
|
||||||
|
use int.Int
|
||||||
|
use array.Array
|
||||||
|
use array.IntArraySorted
|
||||||
|
use array.ArraySwap
|
||||||
|
use array.ArrayPermut
|
||||||
|
|
||||||
|
let selection_sort (xs: array int)
|
||||||
|
ensures { sorted xs }
|
||||||
|
ensures { permut_all (old xs) xs } =
|
||||||
|
|
||||||
|
let ref min = 0 in
|
||||||
|
for i = 0 to length xs - 1 do
|
||||||
|
invariant { sorted_sub xs 0 i }
|
||||||
|
invariant { permut_all (old xs) xs }
|
||||||
|
invariant { forall k1 k2: int. 0 <= k1 < i <= k2 < length xs -> xs[k1] <= xs[k2] }
|
||||||
|
|
||||||
|
min <- i;
|
||||||
|
for j = i + 1 to length xs - 1 do
|
||||||
|
invariant { i <= min < j }
|
||||||
|
invariant { forall k:int . i <= k < j -> xs[min] <= xs[k] }
|
||||||
|
|
||||||
|
if xs[j] < xs[min] then min <- j
|
||||||
|
done;
|
||||||
|
swap xs min i;
|
||||||
|
done
|
||||||
|
end
|
Loading…
Reference in a new issue