mirror of
https://github.com/AdaCore/why3.git
synced 2026-02-12 12:34:55 -08:00
40 lines
1.1 KiB
Plaintext
40 lines
1.1 KiB
Plaintext
|
|
module MutRec
|
||
|
|
use int.Int
|
||
|
|
use int.EuclideanDivision
|
||
|
|
use mach.java.lang.ArithmeticException
|
||
|
|
use mach.java.lang.String
|
||
|
|
use mach.java.lang.Integer
|
||
|
|
use mach.java.util.Random
|
||
|
|
use mach.java.lang.Array
|
||
|
|
|
||
|
|
let rec even (number : integer) : bool
|
||
|
|
ensures { result <-> mod number 2 = 0 }
|
||
|
|
variant { if number < 0 then -number else number }
|
||
|
|
=
|
||
|
|
if number = 0 then true
|
||
|
|
else if number < 0 then odd (number + 1)
|
||
|
|
else odd (number - 1)
|
||
|
|
with odd (number : integer) : bool
|
||
|
|
ensures { result <-> mod number 2 = 1 }
|
||
|
|
variant { if number < 0 then -number else number }
|
||
|
|
=
|
||
|
|
if number = 0 then false
|
||
|
|
else if number < 0 then even (number + 1)
|
||
|
|
else even (number - 1)
|
||
|
|
|
||
|
|
|
||
|
|
let main (array string) : unit =
|
||
|
|
try
|
||
|
|
let rnd = Random.create () in
|
||
|
|
for i = 0:integer to 100:integer do
|
||
|
|
let b = Random.next_bounded_int rnd 72 in
|
||
|
|
if (b % 2 = 0 && odd b) || (b % 2 = 1 && even b) then
|
||
|
|
raise ArithmeticException.E
|
||
|
|
done
|
||
|
|
with
|
||
|
|
| IllegalArgumentException.E -> absurd
|
||
|
|
| ArithmeticException.E -> absurd
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|