Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 9bcb4076 authored by Jean-Christophe Filliâtre's avatar Jean-Christophe Filliâtre
Browse files

added solutions for VerifyThis 2017

parent af08d5c4
No related branches found
No related tags found
No related merge requests found
Showing
with 1879 additions and 3 deletions
(* VerifyThis 2017 challenge 2
(**
Maximum-sum submatrix (2D version of Kadane's algorithm)
{1 VerifyThis @ ETAPS 2017 competition
Challenge 2: Maximum-sum submatrix}
See https://formal.iti.kit.edu/ulbrich/verifythis2017/
Author: Jean-Christophe Filliâtre (CNRS)
*)
(* note: this is a 2D-version of maximum-sum subarray, for which several
verified implementations can be found in maximum_subarray.mlw,
including Kadane's linear algorithm *)
module Kadane2D
use import int.Int
......
......@@ -5,7 +5,7 @@
<prover id="0" name="Alt-Ergo" version="1.30" timelimit="5" steplimit="0" memlimit="1000"/>
<prover id="1" name="CVC4" version="1.4" timelimit="5" steplimit="0" memlimit="1000"/>
<prover id="2" name="Z3" version="4.4.0" timelimit="5" steplimit="0" memlimit="1000"/>
<file name="../kadane_2d.mlw">
<file name="../verifythis_2017_maximum_sum_submatrix.mlw">
<theory name="Kadane2D" sum="09fbb7ac5139de301e5efc628ae0287e">
<goal name="VC maximum_submatrix" expl="VC for maximum_submatrix">
<transf name="split_goal_wp">
......
(**
{1 VerifyThis @ ETAPS 2017 competition
Challenge 3: Odd-Even Transposition Sort}
See https://formal.iti.kit.edu/ulbrich/verifythis2017/
Author: Jean-Christophe Filliâtre (CNRS)
*)
(* note: this is only a solution for the sequential (single processor) version
of the challenge *)
module Challenge3
use import int.Int
use import int.Sum
use import int.NumOf
use import int.ComputerDivision
use import ref.Refint
use import array.Array
use import array.IntArraySorted
use import array.ArraySwap
use import array.ArrayPermut
(* odd-sorted up to n exclusive *)
predicate odd_sorted (a: array int) (n: int) =
forall i. 0 <= i -> 2*i + 2 < n -> a[2*i+1] <= a[2*i+2]
(* even-sorted up to n exclusive *)
predicate even_sorted (a: array int) (n: int) =
forall i. 0 <= i -> 2*i + 1 < n -> a[2*i] <= a[2*i+1]
let lemma odd_even_sorted (a: array int) (n: int)
requires { 0 <= n <= length a }
requires { odd_sorted a n }
requires { even_sorted a n }
ensures { sorted_sub a 0 n }
= if n > 0 && length a > 0 then
for i = 1 to n - 1 do
invariant { sorted_sub a 0 i }
assert { forall j. 0 <= j < i -> a[j] <= a[i]
by a[i-1] <= a[i]
by i-1 = 2 * div (i-1) 2 \/
i-1 = 2 * div (i-1) 2 + 1 }
done
(* to prove termination, we count the total number of inversions *)
predicate inversion (a: array int) (i j: int) =
a[i] > a[j]
function inversions_for (a: array int) (i: int) : int =
numof (inversion a i) i (length a)
function inversions (a: array int) : int =
sum (inversions_for a) 0 (length a)
(* the key lemma to prove termination: whenever we swap two consecutive
values that are ill-sorted, the total number of inversions decreases *)
let lemma exchange_inversion (a1 a2: array int) (i0: int)
requires { 0 <= i0 < length a1 - 1 }
requires { a1[i0] > a1[i0 + 1] }
requires { exchange a1 a2 i0 (i0 + 1) }
ensures { inversions a2 < inversions a1 }
= assert { inversion a1 i0 (i0+1) };
assert { not (inversion a2 i0 (i0+1)) };
assert { forall i. 0 <= i < i0 ->
inversions_for a2 i = inversions_for a1 i
by numof (inversion a2 i) i (length a2)
= numof (inversion a2 i) i i0
+ numof (inversion a2 i) i0 (i0+1)
+ numof (inversion a2 i) (i0+1) (i0+2)
+ numof (inversion a2 i) (i0+2) (length a2)
/\ numof (inversion a1 i) i (length a1)
= numof (inversion a1 i) i i0
+ numof (inversion a1 i) i0 (i0+1)
+ numof (inversion a1 i) (i0+1) (i0+2)
+ numof (inversion a1 i) (i0+2) (length a1)
/\ numof (inversion a2 i) i0 (i0+1)
= numof (inversion a1 i) (i0+1) (i0+2)
/\ numof (inversion a2 i) (i0+1) (i0+2)
= numof (inversion a1 i) i0 (i0+1)
/\ numof (inversion a2 i) i i0 = numof (inversion a1 i) i i0
/\ numof (inversion a2 i) (i0+2) (length a2)
= numof (inversion a1 i) (i0+2) (length a1)
};
assert { forall i. i0 + 1 < i < length a1 ->
inversions_for a2 i = inversions_for a1 i };
assert { inversions_for a2 i0 = inversions_for a1 (i0+1)
by numof (inversion a1 (i0+1)) (i0+2) (length a1)
= numof (inversion a2 i0 ) (i0+2) (length a1) };
assert { 1 + inversions_for a2 (i0+1) = inversions_for a1 i0
by numof (inversion a1 i0) i0 (length a1)
= numof (inversion a1 i0) (i0+1) (length a1)
= 1 + numof (inversion a1 i0) (i0+2) (length a1) };
let sum_decomp (a: array int) (i j k: int)
requires { 0 <= i <= j <= k <= length a = length a1 }
ensures { sum (inversions_for a) i k =
sum (inversions_for a) i j + sum (inversions_for a) j k }
= () in
let decomp (a: array int)
requires { length a = length a1 }
ensures { inversions a = sum (inversions_for a) 0 i0
+ inversions_for a i0
+ inversions_for a (i0+1)
+ sum (inversions_for a) (i0+2) (length a) }
= sum_decomp a 0 i0 (length a);
sum_decomp a i0 (i0+1) (length a);
sum_decomp a (i0+1) (i0+2) (length a);
in
decomp a1; decomp a2;
()
(* note: program variable "sorted" renamed into "is_sorted"
(clash with library predicate "sorted" on arrays) *)
let odd_even_transposition_sort (a: array int)
ensures { sorted a }
ensures { permut_all (old a) a }
= let is_sorted = ref false in
while not !is_sorted do
invariant { permut_all (old a) a }
invariant { !is_sorted -> sorted a }
variant { if !is_sorted then 0 else 1, inversions a }
is_sorted := true;
let i = ref 1 in
let ghost half_i = ref 0 in
label L in
while !i < length a - 1 do
invariant { 0 <= !half_i /\ 0 <= !i = 2 * !half_i + 1 }
invariant { permut_all (old a) a }
invariant { odd_sorted a !i }
invariant { if !is_sorted then inversions a = inversions (a at L)
else inversions a < inversions (a at L) }
variant { length a - !i }
if a[!i] > a[!i+1] then begin
swap a !i (!i+1);
is_sorted := false;
end;
i := !i + 2;
ghost half_i := !half_i + 1
done;
assert { odd_sorted a (length a) };
i := 0;
ghost half_i := 0;
while !i < length a - 1 do
invariant { 0 <= !half_i /\ 0 <= !i = 2 * !half_i }
invariant { 0 <= !i }
invariant { permut_all (old a) a }
invariant { !is_sorted -> odd_sorted a (length a) }
invariant { even_sorted a !i }
invariant { if !is_sorted then inversions a = inversions (a at L)
else inversions a < inversions (a at L) }
invariant { !is_sorted \/ inversions a < inversions (a at L) }
variant { length a - !i }
if a[!i] > a[!i+1] then begin
swap a !i (!i+1);
is_sorted := false;
end;
i := !i + 2;
ghost half_i := !half_i + 1
done;
assert { !is_sorted -> even_sorted a (length a) }
done
end
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN"
"http://why3.lri.fr/why3session.dtd">
<why3session shape_version="4">
<prover id="0" name="Alt-Ergo" version="1.30" timelimit="5" steplimit="0" memlimit="1000"/>
<prover id="1" name="CVC4" version="1.4" timelimit="5" steplimit="0" memlimit="1000"/>
<prover id="2" name="Z3" version="4.4.0" timelimit="5" steplimit="0" memlimit="1000"/>
<file name="../verifythis_2017_odd_even_transposition_sort.mlw">
<theory name="Challenge3" sum="8cc63513fbd356eee4e515b0627da335">
<goal name="VC odd_even_sorted" expl="VC for odd_even_sorted">
<transf name="split_goal_wp">
<goal name="VC odd_even_sorted.1" expl="1. loop bounds">
<proof prover="0"><result status="valid" time="0.01" steps="7"/></proof>
</goal>
<goal name="VC odd_even_sorted.2" expl="2. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="9"/></proof>
</goal>
<goal name="VC odd_even_sorted.3" expl="3. assertion">
<transf name="split_goal_wp">
<goal name="VC odd_even_sorted.3.1" expl="1. assertion">
<proof prover="0"><result status="valid" time="0.02" steps="18"/></proof>
</goal>
<goal name="VC odd_even_sorted.3.2" expl="2. VC for odd_even_sorted">
<proof prover="0"><result status="valid" time="0.02" steps="27"/></proof>
</goal>
<goal name="VC odd_even_sorted.3.3" expl="3. VC for odd_even_sorted">
<proof prover="0"><result status="valid" time="0.01" steps="19"/></proof>
</goal>
</transf>
</goal>
<goal name="VC odd_even_sorted.4" expl="4. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="21"/></proof>
</goal>
<goal name="VC odd_even_sorted.5" expl="5. postcondition">
<proof prover="0"><result status="valid" time="0.01" steps="13"/></proof>
</goal>
</transf>
</goal>
<goal name="VC exchange_inversion" expl="VC for exchange_inversion">
<transf name="split_goal_wp">
<goal name="VC exchange_inversion.1" expl="1. assertion">
<proof prover="0"><result status="valid" time="0.01" steps="6"/></proof>
</goal>
<goal name="VC exchange_inversion.2" expl="2. assertion">
<proof prover="0"><result status="valid" time="0.01" steps="18"/></proof>
</goal>
<goal name="VC exchange_inversion.3" expl="3. assertion">
<transf name="split_goal_wp">
<goal name="VC exchange_inversion.3.1" expl="1. assertion">
<proof prover="1"><result status="valid" time="1.33"/></proof>
<proof prover="2"><result status="valid" time="0.05"/></proof>
</goal>
<goal name="VC exchange_inversion.3.2" expl="2. assertion">
<proof prover="2"><result status="valid" time="0.05"/></proof>
</goal>
<goal name="VC exchange_inversion.3.3" expl="3. assertion">
<proof prover="0"><result status="valid" time="1.32" steps="1133"/></proof>
</goal>
<goal name="VC exchange_inversion.3.4" expl="4. assertion">
<proof prover="0"><result status="valid" time="0.63" steps="636"/></proof>
</goal>
<goal name="VC exchange_inversion.3.5" expl="5. assertion">
<proof prover="2" timelimit="35"><result status="valid" time="3.30"/></proof>
</goal>
<goal name="VC exchange_inversion.3.6" expl="6. assertion">
<proof prover="2"><result status="valid" time="0.34"/></proof>
</goal>
<goal name="VC exchange_inversion.3.7" expl="7. VC for exchange_inversion">
<transf name="introduce_premises">
<goal name="VC exchange_inversion.3.7.1" expl="1. VC for exchange_inversion">
<transf name="inline_goal">
<goal name="VC exchange_inversion.3.7.1.1" expl="1. VC for exchange_inversion">
<proof prover="2"><result status="valid" time="0.05"/></proof>
</goal>
</transf>
</goal>
</transf>
</goal>
</transf>
</goal>
<goal name="VC exchange_inversion.4" expl="4. assertion">
<proof prover="2"><result status="valid" time="0.97"/></proof>
</goal>
<goal name="VC exchange_inversion.5" expl="5. assertion">
<transf name="split_goal_wp">
<goal name="VC exchange_inversion.5.1" expl="1. VC for exchange_inversion">
<proof prover="2"><result status="valid" time="0.38"/></proof>
</goal>
<goal name="VC exchange_inversion.5.2" expl="2. VC for exchange_inversion">
<proof prover="0"><result status="valid" time="1.77" steps="852"/></proof>
</goal>
</transf>
</goal>
<goal name="VC exchange_inversion.6" expl="6. assertion">
<transf name="split_goal_wp">
<goal name="VC exchange_inversion.6.1" expl="1. VC for exchange_inversion">
<proof prover="0"><result status="valid" time="0.08" steps="156"/></proof>
</goal>
<goal name="VC exchange_inversion.6.2" expl="2. VC for exchange_inversion">
<proof prover="0"><result status="valid" time="0.02" steps="45"/></proof>
</goal>
<goal name="VC exchange_inversion.6.3" expl="3. VC for exchange_inversion">
<proof prover="2"><result status="valid" time="0.21"/></proof>
</goal>
</transf>
</goal>
<goal name="VC exchange_inversion.7" expl="7. postcondition">
<proof prover="0"><result status="valid" time="0.02" steps="18"/></proof>
</goal>
<goal name="VC exchange_inversion.8" expl="8. precondition">
<proof prover="0"><result status="valid" time="0.02" steps="10"/></proof>
</goal>
<goal name="VC exchange_inversion.9" expl="9. precondition">
<proof prover="0"><result status="valid" time="0.01" steps="11"/></proof>
</goal>
<goal name="VC exchange_inversion.10" expl="10. precondition">
<proof prover="0"><result status="valid" time="0.01" steps="12"/></proof>
</goal>
<goal name="VC exchange_inversion.11" expl="11. postcondition">
<proof prover="0"><result status="valid" time="0.13" steps="44"/></proof>
</goal>
<goal name="VC exchange_inversion.12" expl="12. precondition">
<proof prover="0"><result status="valid" time="0.01" steps="1"/></proof>
</goal>
<goal name="VC exchange_inversion.13" expl="13. precondition">
<proof prover="0"><result status="valid" time="0.01" steps="11"/></proof>
</goal>
<goal name="VC exchange_inversion.14" expl="14. postcondition">
<proof prover="2"><result status="valid" time="1.21"/></proof>
</goal>
</transf>
</goal>
<goal name="VC odd_even_transposition_sort" expl="VC for odd_even_transposition_sort">
<transf name="split_goal_wp">
<goal name="VC odd_even_transposition_sort.1" expl="1. loop invariant init">
<proof prover="0"><result status="valid" time="0.00" steps="4"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.2" expl="2. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="1"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.3" expl="3. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="5"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.4" expl="4. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="5"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.5" expl="5. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="6"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.6" expl="6. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="5"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.7" expl="7. index in array bounds">
<proof prover="0"><result status="valid" time="0.01" steps="12"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.8" expl="8. index in array bounds">
<proof prover="0"><result status="valid" time="0.01" steps="12"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.9" expl="9. precondition">
<proof prover="0"><result status="valid" time="0.02" steps="16"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.10" expl="10. loop variant decrease">
<proof prover="0"><result status="valid" time="0.01" steps="18"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.11" expl="11. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="18"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.12" expl="12. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.12" steps="168"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.13" expl="13. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.08" steps="134"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.14" expl="14. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="109"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.15" expl="15. loop variant decrease">
<proof prover="0"><result status="valid" time="0.01" steps="15"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.16" expl="16. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="15"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.17" expl="17. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="15"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.18" expl="18. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="24"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.19" expl="19. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="24"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.20" expl="20. assertion">
<proof prover="0"><result status="valid" time="0.01" steps="21"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.21" expl="21. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="15"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.22" expl="22. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="15"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.23" expl="23. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="15"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.24" expl="24. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="16"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.25" expl="25. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="16"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.26" expl="26. loop invariant init">
<proof prover="0"><result status="valid" time="0.02" steps="24"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.27" expl="27. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="22"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.28" expl="28. index in array bounds">
<proof prover="0"><result status="valid" time="0.01" steps="22"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.29" expl="29. index in array bounds">
<proof prover="0"><result status="valid" time="0.01" steps="22"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.30" expl="30. precondition">
<proof prover="0"><result status="valid" time="0.01" steps="28"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.31" expl="31. loop variant decrease">
<proof prover="0"><result status="valid" time="0.01" steps="28"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.32" expl="32. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="28"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.33" expl="33. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="28"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.34" expl="34. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.13" steps="223"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.35" expl="35. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="28"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.36" expl="36. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.35" steps="231"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.37" expl="37. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.04" steps="219"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.38" expl="38. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.08" steps="175"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.39" expl="39. loop variant decrease">
<proof prover="0"><result status="valid" time="0.01" steps="25"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.40" expl="40. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="25"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.41" expl="41. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="25"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.42" expl="42. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.07" steps="25"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.43" expl="43. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="27"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.44" expl="44. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.02" steps="36"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.45" expl="45. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="37"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.46" expl="46. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.02" steps="25"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.47" expl="47. assertion">
<proof prover="0"><result status="valid" time="0.02" steps="35"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.48" expl="48. loop variant decrease">
<proof prover="2"><result status="valid" time="0.09"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.49" expl="49. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.07" steps="22"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.50" expl="50. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.03" steps="59"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.51" expl="51. postcondition">
<proof prover="0"><result status="valid" time="0.01" steps="5"/></proof>
</goal>
<goal name="VC odd_even_transposition_sort.52" expl="52. postcondition">
<proof prover="0"><result status="valid" time="0.01" steps="5"/></proof>
</goal>
</transf>
</goal>
</theory>
</file>
</why3session>
File added
(**
{1 VerifyThis @ ETAPS 2017 competition
Challenge 1: Pair Insertion Sort}
See https://formal.iti.kit.edu/ulbrich/verifythis2017/
Author: Jean-Christophe Filliâtre (CNRS)
*)
module Challenge1
use import int.Int
use import ref.Refint
use import array.Array
use import array.ArrayPermut
let pair_insertion_sort (a: array int)
ensures { forall k l. 0 <= k <= l < length a -> a[k] <= a[l] }
ensures { permut_all (old a) a }
= let i = ref 0 in (* i is running index (inc by 2 every iteration)*)
while !i < length a - 1 do
invariant { 0 <= !i <= length a }
invariant { forall k l. 0 <= k <= l < !i -> a[k] <= a[l] }
invariant { permut_all (old a) a }
variant { length a - !i }
let x = ref a[!i] in (* let x and y hold the next to elements in A *)
let y = ref a[!i + 1] in
if !x < !y then (* ensure that x is not smaller than y *)
begin let tmp = !x in x := !y; y := tmp end (* swap x and y *)
else begin
label L in
assert { exchange (a at L) a[(!i-1)+1 <- !y][(!i-1)+2 <- !x]
((!i-1)+1) ((!i-1)+2) }
end;
let j = ref (!i - 1) in
(* j is the index used to find the insertion point *)
while !j >= 0 && a[!j] > !x do (* find the insertion point for x *)
invariant { -1 <= !j < !i }
invariant { forall k l.
0 <= k <= l <= !j -> a[k] <= a[l] }
invariant { forall k l.
0 <= k <= !j -> !j+2 < l < !i+2 -> a[k] <= a[l] }
invariant { forall k l.
!j+2 < k <= l < !i+2 -> a[k] <= a[l] }
invariant { forall l.
!j+2 < l < !i+2 -> !x < a[l] }
invariant { permut_all (old a) a[!j+1 <- !y][!j+2 <- !x] }
variant { !j }
label L in
a[!j + 2] <- a[!j]; (* shift existing content by 2 *)
assert { exchange (a at L)[!j+2 <- !x] a[!j <- !x] !j (!j + 2) };
assert { exchange (a at L)[!j+1 <- !y][!j+2 <- !x]
a[!j+1 <- !y][!j <- !x] !j (!j + 2) };
assert { exchange (a at L)[!j+1 <- !y][!j+2 <- a[!j]][!j <- !x]
a[!j <- !y][!j+1 <- !x][!j+2 <- a[!j]] !j (!j + 1) };
j := !j - 1
done;
a[!j + 2] <- !x; (* store x at its insertion place *)
(* A[j+1] is an available space now *)
while !j >= 0 && a[!j] > !y do (* #ind the insertion point for y *)
invariant { -1 <= !j < !i }
invariant { forall k l.
0 <= k <= l <= !j -> a[k] <= a[l] }
invariant { forall k l.
0 <= k <= !j -> !j+1 < l < !i+2 -> a[k] <= a[l] }
invariant { forall k l.
!j+1 < k <= l < !i+2 -> a[k] <= a[l] }
invariant { forall l.
!j+1 < l < !i+2 -> !y <= a[l] }
invariant { permut_all (old a) a[!j+1 <- !y] }
variant { !j }
label L in
a[!j + 1] <- a[!j]; (* shift existing content by 1 *)
assert { exchange (a at L)[!j+1 <- !y] a[!j <- !y] !j (!j + 1) };
j := !j - 1
done;
a[!j + 1] <- !y; (* store y at its insertion place *)
i := !i + 2
done;
if !i = length a - 1 then begin (* if length(A) is odd, an extra *)
let y = a[!i] in (* single insertion is needed for *)
let j = ref (!i - 1) in (* the last element *)
while !j >= 0 && a[!j] > y do
invariant { -1 <= !j < !i }
invariant { forall k l.
0 <= k <= l <= !j -> a[k] <= a[l] }
invariant { forall k l.
0 <= k <= !j -> !j+1 < l < length a -> a[k] <= a[l] }
invariant { forall k l.
!j+1 < k <= l < length a -> a[k] <= a[l] }
invariant { forall l.
!j+1 < l < length a -> y < a[l] }
invariant { permut_all (old a) a[!j+1 <- y] }
variant { !j }
label L in
a[!j+1] <- a[!j];
assert { exchange (a at L)[!j+1 <- y] a[!j <- y] !j (!j + 1) };
j := !j - 1
done;
a[!j + 1] <- y
end
end
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN"
"http://why3.lri.fr/why3session.dtd">
<why3session shape_version="4">
<prover id="0" name="Alt-Ergo" version="1.30" timelimit="5" steplimit="0" memlimit="1000"/>
<prover id="2" name="Z3" version="4.4.0" timelimit="5" steplimit="0" memlimit="1000"/>
<prover id="4" name="CVC3" version="2.4.1" timelimit="5" steplimit="0" memlimit="1000"/>
<file name="../verifythis_2017_pair_insertion_sort.mlw" expanded="true">
<theory name="Challenge1" sum="3a2fe30dbaa20316b038a7cfccece9d7" expanded="true">
<goal name="VC pair_insertion_sort" expl="VC for pair_insertion_sort" expanded="true">
<transf name="split_goal_wp" expanded="true">
<goal name="VC pair_insertion_sort.1" expl="1. loop invariant init">
<proof prover="0"><result status="valid" time="0.00" steps="2"/></proof>
</goal>
<goal name="VC pair_insertion_sort.2" expl="2. loop invariant init">
<proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
</goal>
<goal name="VC pair_insertion_sort.3" expl="3. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="4"/></proof>
</goal>
<goal name="VC pair_insertion_sort.4" expl="4. index in array bounds">
<proof prover="0"><result status="valid" time="0.00" steps="6"/></proof>
</goal>
<goal name="VC pair_insertion_sort.5" expl="5. index in array bounds">
<proof prover="0"><result status="valid" time="0.00" steps="6"/></proof>
</goal>
<goal name="VC pair_insertion_sort.6" expl="6. loop invariant init">
<proof prover="0"><result status="valid" time="0.00" steps="9"/></proof>
</goal>
<goal name="VC pair_insertion_sort.7" expl="7. loop invariant init">
<proof prover="0"><result status="valid" time="0.00" steps="16"/></proof>
</goal>
<goal name="VC pair_insertion_sort.8" expl="8. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="11"/></proof>
</goal>
<goal name="VC pair_insertion_sort.9" expl="9. loop invariant init">
<proof prover="0"><result status="valid" time="0.00" steps="9"/></proof>
</goal>
<goal name="VC pair_insertion_sort.10" expl="10. loop invariant init">
<proof prover="0"><result status="valid" time="0.00" steps="9"/></proof>
</goal>
<goal name="VC pair_insertion_sort.11" expl="11. loop invariant init">
<proof prover="0"><result status="valid" time="0.30" steps="274"/></proof>
</goal>
<goal name="VC pair_insertion_sort.12" expl="12. index in array bounds">
<proof prover="0"><result status="valid" time="0.00" steps="14"/></proof>
</goal>
<goal name="VC pair_insertion_sort.13" expl="13. index in array bounds">
<proof prover="0"><result status="valid" time="0.00" steps="15"/></proof>
</goal>
<goal name="VC pair_insertion_sort.14" expl="14. index in array bounds">
<proof prover="0"><result status="valid" time="0.00" steps="15"/></proof>
</goal>
<goal name="VC pair_insertion_sort.15" expl="15. assertion">
<proof prover="0"><result status="valid" time="0.01" steps="43"/></proof>
</goal>
<goal name="VC pair_insertion_sort.16" expl="16. assertion">
<proof prover="0"><result status="valid" time="0.05" steps="115"/></proof>
</goal>
<goal name="VC pair_insertion_sort.17" expl="17. assertion">
<proof prover="0"><result status="valid" time="0.36" steps="490"/></proof>
</goal>
<goal name="VC pair_insertion_sort.18" expl="18. loop variant decrease">
<proof prover="0"><result status="valid" time="0.00" steps="21"/></proof>
</goal>
<goal name="VC pair_insertion_sort.19" expl="19. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="21"/></proof>
</goal>
<goal name="VC pair_insertion_sort.20" expl="20. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.14" steps="175"/></proof>
</goal>
<goal name="VC pair_insertion_sort.21" expl="21. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.47" steps="314"/></proof>
</goal>
<goal name="VC pair_insertion_sort.22" expl="22. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.18" steps="268"/></proof>
</goal>
<goal name="VC pair_insertion_sort.23" expl="23. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="149"/></proof>
</goal>
<goal name="VC pair_insertion_sort.24" expl="24. loop invariant preservation" expanded="true">
<proof prover="4"><result status="valid" time="0.11"/></proof>
</goal>
<goal name="VC pair_insertion_sort.25" expl="25. index in array bounds">
<proof prover="0"><result status="valid" time="0.01" steps="13"/></proof>
</goal>
<goal name="VC pair_insertion_sort.26" expl="26. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="15"/></proof>
</goal>
<goal name="VC pair_insertion_sort.27" expl="27. loop invariant init">
<proof prover="0"><result status="valid" time="0.03" steps="69"/></proof>
</goal>
<goal name="VC pair_insertion_sort.28" expl="28. loop invariant init">
<proof prover="0"><result status="valid" time="0.04" steps="82"/></proof>
</goal>
<goal name="VC pair_insertion_sort.29" expl="29. loop invariant init">
<proof prover="0"><result status="valid" time="0.08" steps="162"/></proof>
</goal>
<goal name="VC pair_insertion_sort.30" expl="30. loop invariant init" expanded="true">
<proof prover="0"><result status="valid" time="0.01" steps="79"/></proof>
</goal>
<goal name="VC pair_insertion_sort.31" expl="31. loop invariant init">
<proof prover="0"><result status="valid" time="0.38" steps="468"/></proof>
</goal>
<goal name="VC pair_insertion_sort.32" expl="32. index in array bounds">
<proof prover="0"><result status="valid" time="0.01" steps="20"/></proof>
</goal>
<goal name="VC pair_insertion_sort.33" expl="33. index in array bounds">
<proof prover="0"><result status="valid" time="0.01" steps="21"/></proof>
</goal>
<goal name="VC pair_insertion_sort.34" expl="34. index in array bounds">
<proof prover="0"><result status="valid" time="0.01" steps="21"/></proof>
</goal>
<goal name="VC pair_insertion_sort.35" expl="35. assertion">
<proof prover="0"><result status="valid" time="0.02" steps="57"/></proof>
</goal>
<goal name="VC pair_insertion_sort.36" expl="36. loop variant decrease">
<proof prover="0"><result status="valid" time="0.01" steps="25"/></proof>
</goal>
<goal name="VC pair_insertion_sort.37" expl="37. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="25"/></proof>
</goal>
<goal name="VC pair_insertion_sort.38" expl="38. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.04" steps="122"/></proof>
</goal>
<goal name="VC pair_insertion_sort.39" expl="39. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.26" steps="227"/></proof>
</goal>
<goal name="VC pair_insertion_sort.40" expl="40. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.16" steps="185"/></proof>
</goal>
<goal name="VC pair_insertion_sort.41" expl="41. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.02" steps="108"/></proof>
</goal>
<goal name="VC pair_insertion_sort.42" expl="42. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.48" steps="389"/></proof>
</goal>
<goal name="VC pair_insertion_sort.43" expl="43. index in array bounds">
<proof prover="0"><result status="valid" time="0.01" steps="19"/></proof>
</goal>
<goal name="VC pair_insertion_sort.44" expl="44. loop variant decrease">
<proof prover="0"><result status="valid" time="0.01" steps="22"/></proof>
</goal>
<goal name="VC pair_insertion_sort.45" expl="45. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="22"/></proof>
</goal>
<goal name="VC pair_insertion_sort.46" expl="46. loop invariant preservation" expanded="true">
<proof prover="0"><result status="valid" time="0.14" steps="260"/></proof>
</goal>
<goal name="VC pair_insertion_sort.47" expl="47. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.02" steps="32"/></proof>
</goal>
<goal name="VC pair_insertion_sort.48" expl="48. assertion" expanded="true">
<proof prover="0"><result status="valid" time="0.02" steps="40"/></proof>
</goal>
<goal name="VC pair_insertion_sort.49" expl="49. loop invariant init">
<proof prover="0"><result status="valid" time="0.00" steps="8"/></proof>
</goal>
<goal name="VC pair_insertion_sort.50" expl="50. loop invariant init">
<proof prover="0"><result status="valid" time="0.00" steps="17"/></proof>
</goal>
<goal name="VC pair_insertion_sort.51" expl="51. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="10"/></proof>
</goal>
<goal name="VC pair_insertion_sort.52" expl="52. loop invariant init">
<proof prover="0"><result status="valid" time="0.00" steps="8"/></proof>
</goal>
<goal name="VC pair_insertion_sort.53" expl="53. loop invariant init">
<proof prover="0"><result status="valid" time="0.00" steps="8"/></proof>
</goal>
<goal name="VC pair_insertion_sort.54" expl="54. loop invariant init" expanded="true">
<proof prover="0"><result status="valid" time="0.20" steps="199"/></proof>
</goal>
<goal name="VC pair_insertion_sort.55" expl="55. index in array bounds">
<proof prover="0"><result status="valid" time="0.00" steps="13"/></proof>
</goal>
<goal name="VC pair_insertion_sort.56" expl="56. index in array bounds">
<proof prover="0"><result status="valid" time="0.00" steps="14"/></proof>
</goal>
<goal name="VC pair_insertion_sort.57" expl="57. index in array bounds">
<proof prover="0"><result status="valid" time="0.00" steps="14"/></proof>
</goal>
<goal name="VC pair_insertion_sort.58" expl="58. assertion">
<proof prover="2"><result status="valid" time="0.02"/></proof>
</goal>
<goal name="VC pair_insertion_sort.59" expl="59. assertion">
<proof prover="0"><result status="valid" time="0.04" steps="170"/></proof>
</goal>
<goal name="VC pair_insertion_sort.60" expl="60. assertion">
<proof prover="0"><result status="valid" time="0.47" steps="531"/></proof>
</goal>
<goal name="VC pair_insertion_sort.61" expl="61. loop variant decrease">
<proof prover="0"><result status="valid" time="0.01" steps="20"/></proof>
<proof prover="2"><result status="valid" time="0.02"/></proof>
</goal>
<goal name="VC pair_insertion_sort.62" expl="62. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.00" steps="20"/></proof>
<proof prover="2"><result status="valid" time="0.02"/></proof>
</goal>
<goal name="VC pair_insertion_sort.63" expl="63. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.16" steps="217"/></proof>
<proof prover="2"><result status="valid" time="0.02"/></proof>
</goal>
<goal name="VC pair_insertion_sort.64" expl="64. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.59" steps="400"/></proof>
<proof prover="2"><result status="valid" time="0.48"/></proof>
</goal>
<goal name="VC pair_insertion_sort.65" expl="65. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.26" steps="343"/></proof>
<proof prover="2"><result status="valid" time="0.59"/></proof>
</goal>
<goal name="VC pair_insertion_sort.66" expl="66. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.12" steps="185"/></proof>
<proof prover="2"><result status="valid" time="0.06"/></proof>
</goal>
<goal name="VC pair_insertion_sort.67" expl="67. loop invariant preservation" expanded="true">
<proof prover="4"><result status="valid" time="0.10"/></proof>
</goal>
<goal name="VC pair_insertion_sort.68" expl="68. index in array bounds">
<proof prover="0"><result status="valid" time="0.00" steps="12"/></proof>
</goal>
<goal name="VC pair_insertion_sort.69" expl="69. loop invariant init">
<proof prover="0"><result status="valid" time="0.00" steps="14"/></proof>
</goal>
<goal name="VC pair_insertion_sort.70" expl="70. loop invariant init">
<proof prover="0"><result status="valid" time="0.02" steps="94"/></proof>
</goal>
<goal name="VC pair_insertion_sort.71" expl="71. loop invariant init">
<proof prover="0"><result status="valid" time="0.04" steps="156"/></proof>
</goal>
<goal name="VC pair_insertion_sort.72" expl="72. loop invariant init">
<proof prover="0"><result status="valid" time="0.20" steps="299"/></proof>
</goal>
<goal name="VC pair_insertion_sort.73" expl="73. loop invariant init">
<proof prover="0"><result status="valid" time="0.02" steps="174"/></proof>
</goal>
<goal name="VC pair_insertion_sort.74" expl="74. loop invariant init">
<proof prover="0"><result status="valid" time="0.63" steps="746"/></proof>
</goal>
<goal name="VC pair_insertion_sort.75" expl="75. index in array bounds">
<proof prover="0"><result status="valid" time="0.01" steps="19"/></proof>
</goal>
<goal name="VC pair_insertion_sort.76" expl="76. index in array bounds">
<proof prover="0"><result status="valid" time="0.01" steps="20"/></proof>
</goal>
<goal name="VC pair_insertion_sort.77" expl="77. index in array bounds">
<proof prover="0"><result status="valid" time="0.01" steps="20"/></proof>
</goal>
<goal name="VC pair_insertion_sort.78" expl="78. assertion">
<proof prover="0"><result status="valid" time="0.02" steps="74"/></proof>
</goal>
<goal name="VC pair_insertion_sort.79" expl="79. loop variant decrease">
<proof prover="0"><result status="valid" time="0.01" steps="24"/></proof>
</goal>
<goal name="VC pair_insertion_sort.80" expl="80. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.00" steps="24"/></proof>
</goal>
<goal name="VC pair_insertion_sort.81" expl="81. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.16" steps="164"/></proof>
</goal>
<goal name="VC pair_insertion_sort.82" expl="82. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.25" steps="309"/></proof>
</goal>
<goal name="VC pair_insertion_sort.83" expl="83. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.18" steps="260"/></proof>
</goal>
<goal name="VC pair_insertion_sort.84" expl="84. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.04" steps="144"/></proof>
</goal>
<goal name="VC pair_insertion_sort.85" expl="85. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.74" steps="453"/></proof>
</goal>
<goal name="VC pair_insertion_sort.86" expl="86. index in array bounds">
<proof prover="0"><result status="valid" time="0.01" steps="18"/></proof>
</goal>
<goal name="VC pair_insertion_sort.87" expl="87. loop variant decrease">
<proof prover="0"><result status="valid" time="0.00" steps="21"/></proof>
</goal>
<goal name="VC pair_insertion_sort.88" expl="88. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="21"/></proof>
</goal>
<goal name="VC pair_insertion_sort.89" expl="89. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.24" steps="430"/></proof>
</goal>
<goal name="VC pair_insertion_sort.90" expl="90. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.02" steps="39"/></proof>
</goal>
<goal name="VC pair_insertion_sort.91" expl="91. index in array bounds">
<proof prover="0"><result status="valid" time="0.00" steps="7"/></proof>
</goal>
<goal name="VC pair_insertion_sort.92" expl="92. loop invariant init">
<proof prover="0"><result status="valid" time="0.00" steps="7"/></proof>
</goal>
<goal name="VC pair_insertion_sort.93" expl="93. loop invariant init">
<proof prover="0"><result status="valid" time="0.00" steps="14"/></proof>
</goal>
<goal name="VC pair_insertion_sort.94" expl="94. loop invariant init">
<proof prover="0"><result status="valid" time="0.00" steps="9"/></proof>
</goal>
<goal name="VC pair_insertion_sort.95" expl="95. loop invariant init">
<proof prover="0"><result status="valid" time="0.00" steps="7"/></proof>
</goal>
<goal name="VC pair_insertion_sort.96" expl="96. loop invariant init">
<proof prover="0"><result status="valid" time="0.00" steps="7"/></proof>
</goal>
<goal name="VC pair_insertion_sort.97" expl="97. loop invariant init">
<proof prover="0"><result status="valid" time="0.17" steps="234"/></proof>
</goal>
<goal name="VC pair_insertion_sort.98" expl="98. index in array bounds">
<proof prover="0"><result status="valid" time="0.00" steps="12"/></proof>
</goal>
<goal name="VC pair_insertion_sort.99" expl="99. index in array bounds">
<proof prover="0"><result status="valid" time="0.00" steps="13"/></proof>
</goal>
<goal name="VC pair_insertion_sort.100" expl="100. index in array bounds">
<proof prover="0"><result status="valid" time="0.00" steps="13"/></proof>
</goal>
<goal name="VC pair_insertion_sort.101" expl="101. assertion">
<proof prover="0"><result status="valid" time="0.01" steps="36"/></proof>
</goal>
<goal name="VC pair_insertion_sort.102" expl="102. loop variant decrease">
<proof prover="0"><result status="valid" time="0.00" steps="17"/></proof>
</goal>
<goal name="VC pair_insertion_sort.103" expl="103. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="17"/></proof>
</goal>
<goal name="VC pair_insertion_sort.104" expl="104. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.02" steps="91"/></proof>
</goal>
<goal name="VC pair_insertion_sort.105" expl="105. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.17" steps="177"/></proof>
</goal>
<goal name="VC pair_insertion_sort.106" expl="106. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.03" steps="144"/></proof>
</goal>
<goal name="VC pair_insertion_sort.107" expl="107. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="77"/></proof>
</goal>
<goal name="VC pair_insertion_sort.108" expl="108. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.18" steps="253"/></proof>
</goal>
<goal name="VC pair_insertion_sort.109" expl="109. index in array bounds">
<proof prover="0"><result status="valid" time="0.00" steps="11"/></proof>
</goal>
<goal name="VC pair_insertion_sort.110" expl="110. postcondition">
<proof prover="0"><result status="valid" time="0.07" steps="149"/></proof>
</goal>
<goal name="VC pair_insertion_sort.111" expl="111. postcondition">
<proof prover="0"><result status="valid" time="0.01" steps="20"/></proof>
</goal>
<goal name="VC pair_insertion_sort.112" expl="112. postcondition">
<proof prover="0"><result status="valid" time="0.00" steps="14"/></proof>
</goal>
<goal name="VC pair_insertion_sort.113" expl="113. postcondition">
<proof prover="0"><result status="valid" time="0.01" steps="7"/></proof>
</goal>
</transf>
</goal>
</theory>
</file>
</why3session>
File added
(**
{1 VerifyThis @ ETAPS 2017 competition
Challenge 4: Tree Buffer}
See https://formal.iti.kit.edu/ulbrich/verifythis2017/
Author: Jean-Christophe Filliâtre (CNRS)
*)
(* default implementation *)
module Spec
use export int.Int
use export list.List
type buf 'a = { h: int; xs: list 'a }
let rec function take (n: int) (l: list 'a) : list 'a =
match l with
| Nil -> Nil
| Cons x xs -> if n = 0 then Nil
else Cons x (take (n-1) xs) end
let function empty (h: int) : buf 'a =
{ h = h; xs = Nil }
let function add (x: 'a) (b: buf 'a) : buf 'a =
{ b with xs = Cons x b.xs }
let function get (b: buf 'a) : list 'a =
take b.h b.xs
(* the following lemma is useful to verify both Caterpillar and
RealTime implementations below *)
use import list.Append
use import list.Length
let rec lemma take_lemma (l1 l2 l3: list 'a) (n: int)
requires { 0 <= n <= length l1 }
ensures { take n (l1 ++ l2) = take n (l1 ++ l3) }
variant { l1 }
= match l1 with Nil -> ()
| Cons _ ll1 -> if n > 0 then take_lemma ll1 l2 l3 (n-1) end
end
(* task 1 *)
module Caterpillar
use import Spec
use import list.Append
use import list.Length
type cat 'a = {
ch: int;
xs: list 'a;
xs_len: int;
ys: list 'a;
ghost b: buf 'a; (* the model is the default implementation *)
} invariant {
b.h = ch /\
xs_len = length xs < ch /\
forall len. 0 <= len <= ch -> take len (xs ++ ys) = take len b.xs
}
(* for the three operations, the postcondition uses the default
implementation *)
let cat_empty (h: int) : cat 'a
requires { 0 < h }
ensures { result.b = empty h }
= { ch = h; xs = Nil; xs_len = 0; ys = Nil;
b = empty h }
let cat_add (x: 'a) (c: cat 'a) : cat 'a
ensures { result.b = add x c.b }
= if c.xs_len = c.ch - 1 then
{ c with xs = Nil; xs_len = 0; ys = Cons x c.xs;
b = add x c.b }
else
{ c with xs = Cons x c.xs; xs_len = 1 + c.xs_len;
b = add x c.b }
let cat_get (c: cat 'a) : list 'a
ensures { result = get c.b }
= take c.ch (c.xs ++ c.ys)
end
(* task 2 *)
(* important note: Why3 assumes a garbage collector and so it makes
little sense to implement the real time solution in Why3.
Yet I stayed close to the C++ code, with a queue to_delete where
lists are added when discarded and then destroyed progressively
(at most two conses at a time) in process_queue.
The C++ code seems to be missing the insertion into to_delete,
which I added to rt_add; see my comment below.
*)
module RealTime
use import Spec
use import list.Append
use import list.Length
(* For technical reasons, the global queue cannot contain
polymorphic values, to we assume values to be of some
abstract type "elt". Anyway, the C++ code assumes integer
elements. *)
type elt
(* not different from the Caterpillar implementation
replacing 'a with elt everywhere *)
type rt = {
ch: int;
xs: list elt;
xs_len: int;
ys: list elt;
ghost b: buf elt; (* the model is the default implementation *)
} invariant {
b.h = ch /\
xs_len = length xs < ch /\
forall len. 0 <= len <= ch -> take len (xs ++ ys) = take len b.xs
}
(* garbage collection *)
use queue.Queue as Q
(* note: when translating Why3 to OCaml, this module is mapped
to OCaml's Queue module, where push and pop are O(1) *)
val to_delete: Q.t (list elt)
let de_allocate (l: list elt)
= match l with Nil -> () | Cons _ xs -> Q.push xs to_delete end
let process_queue ()
= try
if not (Q.is_empty to_delete) then de_allocate (Q.pop to_delete);
if not (Q.is_empty to_delete) then de_allocate (Q.pop to_delete)
with Q.Empty -> absurd end
(* no difference wrt Caterpillar *)
let rt_empty (h: int) : rt
requires { 0 < h }
ensures { result.b = empty h }
= { ch = h; xs = Nil; xs_len = 0; ys = Nil;
b = empty h }
(* no difference wrt Caterpillar *)
let rt_get (c: rt) : list elt
ensures { result = get c.b }
= take c.ch (c.xs ++ c.ys)
(* this is where we introduce explicit garbage collection
1. process_queue is called first (as in the C++ code)
2. when ys is discarded, it is added to the queue (which
seems to be missing in the C++ code) *)
let rt_add (x: elt) (c: rt) : rt
ensures { result.b = add x c.b }
= process_queue ();
if c.xs_len = c.ch - 1 then begin
Q.push c.ys to_delete;
{ c with xs = Nil; xs_len = 0; ys = Cons x c.xs;
b = add x c.b }
end else
{ c with xs = Cons x c.xs; xs_len = 1 + c.xs_len;
b = add x c.b }
end
;;; generated by SMT-LIB2 driver
;;; SMT-LIB2 driver: bit-vectors, common part
;;; SMT-LIB2: integer arithmetic
(declare-sort uni 0)
(declare-sort ty 0)
(declare-fun sort (ty uni) Bool)
(declare-fun witness (ty) uni)
;; witness_sort
(assert (forall ((a ty)) (sort a (witness a))))
(declare-fun int () ty)
(declare-fun real () ty)
(declare-fun bool () ty)
(declare-fun match_bool (ty Bool uni uni) uni)
;; match_bool_sort
(assert
(forall ((a ty))
(forall ((x Bool) (x1 uni) (x2 uni)) (sort a (match_bool a x x1 x2)))))
;; match_bool_True
(assert
(forall ((a ty))
(forall ((z uni) (z1 uni)) (=> (sort a z) (= (match_bool a true z z1) z)))))
;; match_bool_False
(assert
(forall ((a ty))
(forall ((z uni) (z1 uni))
(=> (sort a z1) (= (match_bool a false z z1) z1)))))
(declare-fun index_bool (Bool) Int)
;; index_bool_True
(assert (= (index_bool true) 0))
;; index_bool_False
(assert (= (index_bool false) 1))
;; bool_inversion
(assert (forall ((u Bool)) (or (= u true) (= u false))))
(declare-sort tuple0 0)
(declare-fun tuple01 () ty)
(declare-fun Tuple0 () tuple0)
;; tuple0_inversion
(assert (forall ((u tuple0)) (= u Tuple0)))
;; CompatOrderMult
(assert
(forall ((x Int) (y Int) (z Int))
(=> (<= x y) (=> (<= 0 z) (<= (* x z) (* y z))))))
(declare-sort list 1)
(declare-fun list1 (ty) ty)
(declare-fun Nil (ty) uni)
;; Nil_sort
(assert (forall ((a ty)) (sort (list1 a) (Nil a))))
(declare-sort a 0)
(declare-fun a1 () ty)
(declare-fun Cons (ty uni uni) uni)
;; Cons_sort
(assert
(forall ((a2 ty))
(forall ((x uni) (x1 uni)) (sort (list1 a2) (Cons a2 x x1)))))
(declare-fun Cons1 (a (list a)) (list a))
(declare-fun match_list (ty ty uni uni uni) uni)
;; match_list_sort
(assert
(forall ((a2 ty) (a3 ty))
(forall ((x uni) (x1 uni) (x2 uni)) (sort a3 (match_list a3 a2 x x1 x2)))))
;; match_list_Nil
(assert
(forall ((a2 ty) (a3 ty))
(forall ((z uni) (z1 uni))
(=> (sort a3 z) (= (match_list a3 a2 (Nil a2) z z1) z)))))
(declare-fun t2tb ((list a)) uni)
;; t2tb_sort
(assert (forall ((x (list a))) (sort (list1 a1) (t2tb x))))
(declare-fun tb2t (uni) (list a))
;; BridgeL
(assert
(forall ((i (list a))) (! (= (tb2t (t2tb i)) i) :pattern ((t2tb i)) )))
;; BridgeR
(assert
(forall ((j uni)) (! (= (t2tb (tb2t j)) j) :pattern ((t2tb (tb2t j))) )))
;; match_list_Cons
(assert
(forall ((a2 ty))
(forall ((z uni) (z1 uni) (u a) (u1 (list a)))
(=> (sort a2 z1) (= (match_list a2 a1 (t2tb (Cons1 u u1)) z z1) z1)))))
;; match_list_Cons
(assert
(forall ((a2 ty) (a3 ty))
(forall ((z uni) (z1 uni) (u uni) (u1 uni))
(=> (sort a3 z1) (= (match_list a3 a2 (Cons a2 u u1) z z1) z1)))))
(declare-fun index_list (ty uni) Int)
;; index_list_Nil
(assert (forall ((a2 ty)) (= (index_list a2 (Nil a2)) 0)))
;; index_list_Cons
(assert
(forall ((u a) (u1 (list a)))
(! (= (index_list a1 (t2tb (Cons1 u u1))) 1) :pattern ((Cons1 u u1)) )))
;; index_list_Cons
(assert
(forall ((a2 ty))
(forall ((u uni) (u1 uni))
(! (= (index_list a2 (Cons a2 u u1)) 1) :pattern ((Cons a2 u u1)) ))))
(declare-fun Cons_proj_1 (ty uni) uni)
;; Cons_proj_1_sort
(assert (forall ((a2 ty)) (forall ((x uni)) (sort a2 (Cons_proj_1 a2 x)))))
(declare-fun t2tb1 (a) uni)
;; t2tb_sort
(assert (forall ((x a)) (sort a1 (t2tb1 x))))
(declare-fun tb2t1 (uni) a)
;; BridgeL
(assert (forall ((i a)) (! (= (tb2t1 (t2tb1 i)) i) :pattern ((t2tb1 i)) )))
;; BridgeR
(assert
(forall ((j uni))
(! (=> (sort a1 j) (= (t2tb1 (tb2t1 j)) j)) :pattern ((t2tb1 (tb2t1 j))) )))
;; Cons_proj_1_def
(assert
(forall ((u a) (u1 (list a)))
(= (tb2t1 (Cons_proj_1 a1 (t2tb (Cons1 u u1)))) u)))
;; Cons_proj_1_def
(assert
(forall ((a2 ty))
(forall ((u uni) (u1 uni))
(=> (sort a2 u) (= (Cons_proj_1 a2 (Cons a2 u u1)) u)))))
(declare-fun Cons_proj_2 (ty uni) uni)
;; Cons_proj_2_sort
(assert
(forall ((a2 ty)) (forall ((x uni)) (sort (list1 a2) (Cons_proj_2 a2 x)))))
;; Cons_proj_2_def
(assert
(forall ((u a) (u1 (list a)))
(= (tb2t (Cons_proj_2 a1 (t2tb (Cons1 u u1)))) u1)))
;; Cons_proj_2_def
(assert
(forall ((a2 ty))
(forall ((u uni) (u1 uni)) (= (Cons_proj_2 a2 (Cons a2 u u1)) u1))))
;; list_inversion
(assert
(forall ((u (list a)))
(or (= u (tb2t (Nil a1)))
(= u (Cons1 (tb2t1 (Cons_proj_1 a1 (t2tb u)))
(tb2t (Cons_proj_2 a1 (t2tb u))))))))
;; list_inversion
(assert
(forall ((a2 ty))
(forall ((u uni))
(or (= u (Nil a2)) (= u (Cons a2 (Cons_proj_1 a2 u) (Cons_proj_2 a2 u)))))))
(declare-fun is_nil (ty uni) Bool)
;; is_nil_def
(assert
(and (is_nil a1 (Nil a1))
(forall ((x a) (x1 (list a))) (not (is_nil a1 (t2tb (Cons1 x x1)))))))
;; is_nil_def
(assert
(forall ((a2 ty))
(and (is_nil a2 (Nil a2))
(forall ((x uni) (x1 uni)) (not (is_nil a2 (Cons a2 x x1)))))))
;; is_nil_spec
(assert
(forall ((a2 ty)) (forall ((l uni)) (= (is_nil a2 l) (= l (Nil a2))))))
(declare-sort buf 1)
(declare-fun buf1 (ty) ty)
(declare-fun mk_buf (ty Int uni) uni)
;; mk buf_sort
(assert
(forall ((a2 ty))
(forall ((x Int) (x1 uni)) (sort (buf1 a2) (mk_buf a2 x x1)))))
(declare-fun h (ty uni) Int)
;; h_def
(assert
(forall ((a2 ty))
(forall ((u Int) (u1 uni)) (= (h a2 (mk_buf a2 u u1)) u))))
(declare-fun xs (ty uni) uni)
;; xs_sort
(assert (forall ((a2 ty)) (forall ((x uni)) (sort (list1 a2) (xs a2 x)))))
;; xs_def
(assert
(forall ((a2 ty))
(forall ((u Int) (u1 uni)) (= (xs a2 (mk_buf a2 u u1)) u1))))
;; buf_inversion
(assert
(forall ((a2 ty)) (forall ((u uni)) (= u (mk_buf a2 (h a2 u) (xs a2 u))))))
(declare-fun take (ty Int uni) uni)
;; take_sort
(assert
(forall ((a2 ty))
(forall ((x Int) (x1 uni)) (sort (list1 a2) (take a2 x x1)))))
(declare-fun take1 (Int (list a)) (list a))
;; take_def
(assert
(forall ((n Int))
(and (= (take1 n (tb2t (Nil a1))) (tb2t (Nil a1)))
(forall ((x a) (xs1 (list a)))
(let ((l (Cons1 x xs1)))
(ite (= n 0) (= (take1 n l) (tb2t (Nil a1)))
(= (take1 n l) (Cons1 x (take1 (- n 1) xs1)))))))))
;; take_def
(assert
(forall ((a2 ty))
(forall ((n Int))
(and (= (take a2 n (Nil a2)) (Nil a2))
(forall ((x uni) (xs1 uni))
(let ((l (Cons a2 x xs1)))
(ite (= n 0) (= (take a2 n l) (Nil a2))
(= (take a2 n l) (Cons a2 x (take a2 (- n 1) xs1))))))))))
(declare-fun add (ty uni uni) uni)
;; add_sort
(assert
(forall ((a2 ty))
(forall ((x uni) (x1 uni)) (sort (buf1 a2) (add a2 x x1)))))
(declare-fun t2tb2 ((buf a)) uni)
;; t2tb_sort
(assert (forall ((x (buf a))) (sort (buf1 a1) (t2tb2 x))))
(declare-fun tb2t2 (uni) (buf a))
;; BridgeL
(assert
(forall ((i (buf a))) (! (= (tb2t2 (t2tb2 i)) i) :pattern ((t2tb2 i)) )))
;; BridgeR
(assert
(forall ((j uni))
(! (= (t2tb2 (tb2t2 j)) j) :pattern ((t2tb2 (tb2t2 j))) )))
;; add_def
(assert
(forall ((x a) (b (buf a)))
(= (tb2t2 (add a1 (t2tb1 x) (t2tb2 b))) (tb2t2
(mk_buf a1 (h a1 (t2tb2 b))
(t2tb
(Cons1 x (tb2t (xs a1 (t2tb2 b))))))))))
;; add_def
(assert
(forall ((a2 ty))
(forall ((x uni) (b uni))
(= (add a2 x b) (mk_buf a2 (h a2 b) (Cons a2 x (xs a2 b)))))))
(declare-fun get (ty uni) uni)
;; get_sort
(assert (forall ((a2 ty)) (forall ((x uni)) (sort (list1 a2) (get a2 x)))))
;; get_def
(assert
(forall ((b (buf a)))
(= (tb2t (get a1 (t2tb2 b))) (take1 (h a1 (t2tb2 b))
(tb2t (xs a1 (t2tb2 b)))))))
;; get_def
(assert
(forall ((a2 ty))
(forall ((b uni)) (= (get a2 b) (take a2 (h a2 b) (xs a2 b))))))
(declare-fun infix_plpl (ty uni uni) uni)
;; infix ++_sort
(assert
(forall ((a2 ty))
(forall ((x uni) (x1 uni)) (sort (list1 a2) (infix_plpl a2 x x1)))))
(declare-fun infix_plpl1 ((list a) (list a)) (list a))
;; infix ++_def
(assert
(forall ((l2 (list a)))
(and (= (infix_plpl1 (tb2t (Nil a1)) l2) l2)
(forall ((x1 a) (r1 (list a)))
(= (infix_plpl1 (Cons1 x1 r1) l2) (Cons1 x1 (infix_plpl1 r1 l2)))))))
;; infix ++_def
(assert
(forall ((a2 ty))
(forall ((l2 uni))
(and (= (infix_plpl a2 (Nil a2) l2) l2)
(forall ((x1 uni) (r1 uni))
(= (infix_plpl a2 (Cons a2 x1 r1) l2) (Cons a2 x1 (infix_plpl a2 r1 l2))))))))
;; Append_assoc
(assert
(forall ((l1 (list a)) (l2 (list a)) (l3 (list a)))
(= (infix_plpl1 l1 (infix_plpl1 l2 l3)) (infix_plpl1 (infix_plpl1 l1 l2)
l3))))
;; Append_assoc
(assert
(forall ((a2 ty))
(forall ((l1 uni) (l2 uni) (l3 uni))
(= (infix_plpl a2 l1 (infix_plpl a2 l2 l3)) (infix_plpl a2
(infix_plpl a2 l1 l2) l3)))))
;; Append_l_nil
(assert (forall ((l (list a))) (= (infix_plpl1 l (tb2t (Nil a1))) l)))
;; Append_l_nil
(assert
(forall ((a2 ty)) (forall ((l uni)) (= (infix_plpl a2 l (Nil a2)) l))))
(declare-fun length (ty uni) Int)
(declare-fun length1 ((list a)) Int)
;; length_def
(assert
(and (= (length1 (tb2t (Nil a1))) 0)
(forall ((x a) (x1 (list a)))
(= (length1 (Cons1 x x1)) (+ 1 (length1 x1))))))
;; length_def
(assert
(forall ((a2 ty))
(and (= (length a2 (Nil a2)) 0)
(forall ((x uni) (x1 uni))
(= (length a2 (Cons a2 x x1)) (+ 1 (length a2 x1)))))))
;; Length_nonnegative
(assert (forall ((l (list a))) (<= 0 (length1 l))))
;; Length_nonnegative
(assert (forall ((a2 ty)) (forall ((l uni)) (<= 0 (length a2 l)))))
;; Length_nil
(assert
(forall ((l (list a))) (= (= (length1 l) 0) (= l (tb2t (Nil a1))))))
;; Length_nil
(assert
(forall ((a2 ty))
(forall ((l uni)) (= (= (length a2 l) 0) (= l (Nil a2))))))
;; Append_length
(assert
(forall ((l1 (list a)) (l2 (list a)))
(= (length1 (infix_plpl1 l1 l2)) (+ (length1 l1) (length1 l2)))))
;; Append_length
(assert
(forall ((a2 ty))
(forall ((l1 uni) (l2 uni))
(= (length a2 (infix_plpl a2 l1 l2)) (+ (length a2 l1) (length a2 l2))))))
(declare-fun mem (ty uni uni) Bool)
;; mem_def
(assert
(forall ((x a))
(and (not (mem a1 (t2tb1 x) (Nil a1)))
(forall ((y a) (r (list a)))
(= (mem a1 (t2tb1 x) (t2tb (Cons1 y r)))
(or (= x y) (mem a1 (t2tb1 x) (t2tb r))))))))
;; mem_def
(assert
(forall ((a2 ty))
(forall ((x uni))
(=> (sort a2 x)
(and (not (mem a2 x (Nil a2)))
(forall ((y uni) (r uni))
(=> (sort a2 y) (= (mem a2 x (Cons a2 y r)) (or (= x y) (mem a2 x r))))))))))
;; mem_append
(assert
(forall ((x a) (l1 (list a)) (l2 (list a)))
(= (mem a1 (t2tb1 x) (t2tb (infix_plpl1 l1 l2)))
(or (mem a1 (t2tb1 x) (t2tb l1)) (mem a1 (t2tb1 x) (t2tb l2))))))
;; mem_append
(assert
(forall ((a2 ty))
(forall ((x uni) (l1 uni) (l2 uni))
(= (mem a2 x (infix_plpl a2 l1 l2)) (or (mem a2 x l1) (mem a2 x l2))))))
;; mem_decomp
(assert
(forall ((x a) (l (list a)))
(=> (mem a1 (t2tb1 x) (t2tb l))
(exists ((l1 (list a)) (l2 (list a))) (= l (infix_plpl1 l1 (Cons1 x l2)))))))
;; mem_decomp
(assert
(forall ((a2 ty))
(forall ((x uni) (l uni))
(=> (mem a2 x l)
(exists ((l1 uni) (l2 uni))
(and (sort (list1 a2) l1)
(and (sort (list1 a2) l2) (= l (infix_plpl a2 l1 (Cons a2 x l2))))))))))
(assert
;; VC_take_lemma
;; File "challenge4/../challenge4.mlw", line 31, characters 16-26
(not
(forall ((l1 (list a)) (l2 (list a)) (l3 (list a)) (n Int))
(=> (and (<= 0 n) (<= n (length1 l1)))
(=> (exists ((x a) (x1 (list a))) (and (= l1 (Cons1 x x1)) (not (< 0 n))))
(= (take1 n (infix_plpl1 l1 l2)) (take1 n (infix_plpl1 l1 l3))))))))
(check-sat)
(* this is the prelude for Alt-Ergo, version >= 0.95.2 *)
(* this is a prelude for Alt-Ergo integer arithmetic *)
logic match_bool : bool, 'a, 'a -> 'a
axiom match_bool_True :
(forall z:'a. forall z1:'a. (match_bool(true, z, z1) = z))
axiom match_bool_False :
(forall z:'a. forall z1:'a. (match_bool(false, z, z1) = z1))
axiom CompatOrderMult :
(forall x:int. forall y:int. forall z:int. ((x <= y) -> ((0 <= z) ->
((x * z) <= (y * z)))))
type 'a list
logic Nil : 'a list
logic Cons : 'a, 'a list -> 'a list
logic match_list : 'a list, 'a1, 'a1 -> 'a1
axiom match_list_Nil :
(forall z:'a. forall z1:'a. (match_list((Nil : 'a1 list), z, z1) = z))
axiom match_list_Cons :
(forall z:'a. forall z1:'a. forall u:'a1. forall u1:'a1 list.
(match_list(Cons(u, u1), z, z1) = z1))
logic index_list : 'a list -> int
axiom index_list_Nil : (index_list((Nil : 'a list)) = 0)
axiom index_list_Cons :
(forall u:'a. forall u1:'a list [Cons(u, u1)]. (index_list(Cons(u,
u1)) = 1))
logic Cons_proj_1 : 'a list -> 'a
axiom Cons_proj_1_def :
(forall u:'a. forall u1:'a list. (Cons_proj_1(Cons(u, u1)) = u))
logic Cons_proj_2 : 'a list -> 'a list
axiom Cons_proj_2_def :
(forall u:'a. forall u1:'a list. (Cons_proj_2(Cons(u, u1)) = u1))
axiom list_inversion :
(forall u:'a list. ((u = (Nil : 'a list)) or (u = Cons(Cons_proj_1(u),
Cons_proj_2(u)))))
predicate is_nil(l: 'a list) =
(forall x:'a. forall x1:'a list. (not (l = Cons(x, x1))))
axiom is_nil_spec : (forall l:'a list. (is_nil(l) -> (l = (Nil : 'a list))))
axiom is_nil_spec1 : (forall l:'a list. ((l = (Nil : 'a list)) -> is_nil(l)))
type 'a buf = { h : int; xs : 'a list
}
logic take : int, 'a list -> 'a list
axiom take_def : (forall n:int. (take(n, (Nil : 'a list)) = (Nil : 'a list)))
axiom take_def1 :
(forall n:int.
(forall x:'a. forall xs1:'a list. ((n = 0) -> (take(n, Cons(x,
xs1)) = (Nil : 'a list)))))
axiom take_def2 :
(forall n:int.
(forall x:'a. forall xs1:'a list. ((not (n = 0)) -> (take(n, Cons(x,
xs1)) = Cons(x, take((n - 1), xs1))))))
function add(x: 'a, b: 'a buf) : 'a buf = { h = (b).h; xs = Cons(x, (b).xs) }
function get(b: 'a buf) : 'a list = take((b).h, (b).xs)
logic infix_plpl : 'a list, 'a list -> 'a list
axiom infix_plpl_def :
(forall l2:'a list. (infix_plpl((Nil : 'a list), l2) = l2))
axiom infix_plpl_def1 :
(forall l2:'a list.
(forall x1:'a. forall r1:'a list. (infix_plpl(Cons(x1, r1), l2) = Cons(x1,
infix_plpl(r1, l2)))))
axiom Append_assoc :
(forall l1:'a list. forall l2:'a list. forall l3:'a list. (infix_plpl(l1,
infix_plpl(l2, l3)) = infix_plpl(infix_plpl(l1, l2), l3)))
axiom Append_l_nil : (forall l:'a list. (infix_plpl(l, (Nil : 'a list)) = l))
logic length : 'a list -> int
axiom length_def : (length((Nil : 'a list)) = 0)
axiom length_def1 :
(forall x:'a. forall x1:'a list. (length(Cons(x, x1)) = (1 + length(x1))))
axiom Length_nonnegative : (forall l:'a list. (0 <= length(l)))
axiom Length_nil :
(forall l:'a list. ((length(l) = 0) -> (l = (Nil : 'a list))))
axiom Length_nil1 :
(forall l:'a list. ((l = (Nil : 'a list)) -> (length(l) = 0)))
axiom Append_length :
(forall l1:'a list. forall l2:'a list. (length(infix_plpl(l1,
l2)) = (length(l1) + length(l2))))
logic mem : 'a, 'a list -> prop
axiom mem_def : (forall x:'a. (not mem(x, (Nil : 'a list))))
axiom mem_def1 :
(forall x:'a.
(forall y:'a. forall r:'a list. (mem(x, Cons(y, r)) -> ((x = y) or mem(x,
r)))))
axiom mem_def2 :
(forall x:'a.
(forall y:'a. forall r:'a list. (((x = y) or mem(x, r)) -> mem(x, Cons(y,
r)))))
axiom mem_append :
(forall x:'a. forall l1:'a list. forall l2:'a list. (mem(x, infix_plpl(l1,
l2)) -> (mem(x, l1) or mem(x, l2))))
axiom mem_append1 :
(forall x:'a. forall l1:'a list. forall l2:'a list. ((mem(x, l1) or mem(x,
l2)) -> mem(x, infix_plpl(l1, l2))))
axiom mem_decomp :
(forall x:'a. forall l:'a list. (mem(x, l) ->
(exists l1:'a list. exists l2:'a list. (l = infix_plpl(l1, Cons(x, l2))))))
goal VC_take_lemma :
(forall l1:'a list. forall l2:'a list. forall l3:'a list. forall n:int.
(((0 <= n) and (n <= length(l1))) ->
((exists x:'a. exists x1:'a list. ((l1 = Cons(x, x1)) and (not (0 < n)))) ->
(take(n, infix_plpl(l1, l2)) = take(n, infix_plpl(l1, l3))))))
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN"
"http://why3.lri.fr/why3session.dtd">
<why3session shape_version="4">
<prover id="0" name="Alt-Ergo" version="1.30" timelimit="5" steplimit="0" memlimit="1000"/>
<prover id="1" name="CVC4" version="1.4" timelimit="5" steplimit="0" memlimit="1000"/>
<prover id="2" name="Eprover" version="1.8-001" timelimit="5" steplimit="0" memlimit="1000"/>
<prover id="3" name="Z3" version="4.4.0" timelimit="5" steplimit="0" memlimit="1000"/>
<file name="../verifythis_2017_tree_buffer.mlw" expanded="true">
<theory name="Spec" sum="6ee3c869c821f40375f941acf3f4e979" expanded="true">
<goal name="VC take" expl="VC for take">
<proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
</goal>
<goal name="VC empty" expl="VC for empty">
<proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
</goal>
<goal name="VC add" expl="VC for add">
<proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
</goal>
<goal name="VC get" expl="VC for get">
<proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
</goal>
<goal name="VC take_lemma" expl="VC for take_lemma" expanded="true">
<transf name="split_goal_wp" expanded="true">
<goal name="VC take_lemma.1" expl="1. variant decrease">
<proof prover="0"><result status="valid" time="0.01" steps="10"/></proof>
<proof prover="3"><result status="valid" time="0.02"/></proof>
</goal>
<goal name="VC take_lemma.2" expl="2. precondition" expanded="true">
<proof prover="0"><result status="valid" time="0.01" steps="9"/></proof>
<proof prover="3"><result status="valid" time="0.02"/></proof>
</goal>
<goal name="VC take_lemma.3" expl="3. postcondition" expanded="true">
<proof prover="2"><result status="valid" time="0.01"/></proof>
</goal>
<goal name="VC take_lemma.4" expl="4. postcondition" expanded="true">
<proof prover="0" edited="challenge4-Spec-VC_take_lemma_1.why"><result status="valid" time="0.01" steps="31"/></proof>
<proof prover="3"><result status="valid" time="0.55"/></proof>
</goal>
<goal name="VC take_lemma.5" expl="5. postcondition">
<proof prover="0"><result status="valid" time="0.01" steps="34"/></proof>
</goal>
</transf>
</goal>
</theory>
<theory name="Caterpillar" sum="eba84aa0f955121ba78cd33d3744e86e">
<goal name="VC cat_empty" expl="VC for cat_empty">
<proof prover="0"><result status="valid" time="0.01" steps="7"/></proof>
</goal>
<goal name="VC cat_add" expl="VC for cat_add">
<transf name="split_goal_wp">
<goal name="VC cat_add.1" expl="1. precondition">
<transf name="split_goal_wp">
<goal name="VC cat_add.1.1" expl="1. VC for cat_add">
<proof prover="0"><result status="valid" time="0.01" steps="4"/></proof>
</goal>
<goal name="VC cat_add.1.2" expl="2. VC for cat_add">
<proof prover="0"><result status="valid" time="0.01" steps="3"/></proof>
</goal>
<goal name="VC cat_add.1.3" expl="3. VC for cat_add">
<proof prover="0"><result status="valid" time="0.01" steps="9"/></proof>
</goal>
<goal name="VC cat_add.1.4" expl="4. VC for cat_add">
<proof prover="1"><result status="valid" time="0.09"/></proof>
</goal>
</transf>
</goal>
<goal name="VC cat_add.2" expl="2. precondition">
<transf name="split_goal_wp">
<goal name="VC cat_add.2.1" expl="1. VC for cat_add">
<proof prover="0"><result status="valid" time="0.01" steps="4"/></proof>
</goal>
<goal name="VC cat_add.2.2" expl="2. VC for cat_add">
<proof prover="0"><result status="valid" time="0.00" steps="10"/></proof>
</goal>
<goal name="VC cat_add.2.3" expl="3. VC for cat_add">
<proof prover="0"><result status="valid" time="0.01" steps="10"/></proof>
</goal>
<goal name="VC cat_add.2.4" expl="4. VC for cat_add">
<transf name="introduce_premises">
<goal name="VC cat_add.2.4.1" expl="1. VC for cat_add">
<transf name="inline_goal">
<goal name="VC cat_add.2.4.1.1" expl="1. VC for cat_add">
<proof prover="0"><result status="valid" time="0.01" steps="57"/></proof>
</goal>
</transf>
</goal>
</transf>
</goal>
</transf>
</goal>
<goal name="VC cat_add.3" expl="3. postcondition">
<proof prover="0"><result status="valid" time="0.01" steps="7"/></proof>
</goal>
<goal name="VC cat_add.4" expl="4. postcondition">
<proof prover="0"><result status="valid" time="0.01" steps="7"/></proof>
</goal>
</transf>
</goal>
<goal name="VC cat_get" expl="VC for cat_get">
<proof prover="0"><result status="valid" time="0.00" steps="7"/></proof>
</goal>
</theory>
<theory name="RealTime" sum="00e61eed22cc47e8251787bc39d77b2d" expanded="true">
<goal name="VC de_allocate" expl="VC for de_allocate">
<proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
</goal>
<goal name="VC process_queue" expl="VC for process_queue">
<proof prover="0"><result status="valid" time="0.01" steps="4"/></proof>
</goal>
<goal name="VC rt_empty" expl="VC for rt_empty">
<proof prover="0"><result status="valid" time="0.01" steps="7"/></proof>
</goal>
<goal name="VC rt_get" expl="VC for rt_get">
<proof prover="0"><result status="valid" time="0.01" steps="7"/></proof>
</goal>
<goal name="VC rt_add" expl="VC for rt_add">
<transf name="split_goal_wp">
<goal name="VC rt_add.1" expl="1. precondition">
<transf name="split_goal_wp">
<goal name="VC rt_add.1.1" expl="1. VC for rt_add">
<proof prover="0"><result status="valid" time="0.00" steps="5"/></proof>
</goal>
<goal name="VC rt_add.1.2" expl="2. VC for rt_add">
<proof prover="0"><result status="valid" time="0.01" steps="4"/></proof>
</goal>
<goal name="VC rt_add.1.3" expl="3. VC for rt_add">
<proof prover="0"><result status="valid" time="0.01" steps="17"/></proof>
</goal>
<goal name="VC rt_add.1.4" expl="4. VC for rt_add">
<proof prover="1"><result status="valid" time="0.17"/></proof>
<proof prover="2"><result status="timeout" time="5.00"/></proof>
</goal>
</transf>
</goal>
<goal name="VC rt_add.2" expl="2. postcondition">
<proof prover="0"><result status="valid" time="0.01" steps="8"/></proof>
</goal>
<goal name="VC rt_add.3" expl="3. precondition">
<proof prover="0"><result status="valid" time="0.03" steps="117"/></proof>
</goal>
<goal name="VC rt_add.4" expl="4. postcondition">
<proof prover="0"><result status="valid" time="0.01" steps="7"/></proof>
</goal>
</transf>
</goal>
</theory>
</file>
</why3session>
File added
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment