Commit f9ed8bcc authored by Martin Clochard's avatar Martin Clochard

verifythis_2016_matrix_multiplication: change exists to even

parent 16684355
......@@ -3,72 +3,72 @@
"http://why3.lri.fr/why3session.dtd">
<why3session shape_version="4">
<prover id="0" name="CVC4" version="1.4" timelimit="5" steplimit="0" memlimit="1000"/>
<prover id="1" name="Alt-Ergo" version="1.01" timelimit="5" steplimit="0" memlimit="1000"/>
<prover id="2" name="Alt-Ergo" version="1.30" timelimit="5" steplimit="0" memlimit="1000"/>
<file name="../matrices.mlw">
<theory name="MatrixGen" sum="d41d8cd98f00b204e9800998ecf8427e">
</theory>
<theory name="Matrix" sum="862099dd531bba3a8ce8aca77f580ae7">
<goal name="set_def1">
<proof prover="1"><result status="valid" time="0.00" steps="9"/></proof>
<proof prover="2"><result status="valid" time="0.00" steps="10"/></proof>
</goal>
<goal name="set_def2">
<proof prover="1"><result status="valid" time="0.00" steps="11"/></proof>
<proof prover="2"><result status="valid" time="0.00" steps="12"/></proof>
</goal>
<goal name="set_def3">
<proof prover="1"><result status="valid" time="0.01" steps="13"/></proof>
<proof prover="2"><result status="valid" time="0.01" steps="14"/></proof>
</goal>
<goal name="set_def4">
<proof prover="1"><result status="valid" time="0.00" steps="22"/></proof>
<proof prover="2"><result status="valid" time="0.00" steps="22"/></proof>
</goal>
</theory>
<theory name="FixedMatrix" sum="81d1f6ecddc981db1f906002ad2c6515">
<goal name="rows_and_cols_nonnegative">
<proof prover="1"><result status="valid" time="0.00" steps="2"/></proof>
<proof prover="2"><result status="valid" time="0.00" steps="3"/></proof>
</goal>
</theory>
<theory name="SquareFixedMatrix" sum="8866fe956f3cb17788b7229e8763a520">
<goal name="r_and_c_nonnegative">
<proof prover="1"><result status="valid" time="0.00" steps="1"/></proof>
<proof prover="2"><result status="valid" time="0.00" steps="2"/></proof>
</goal>
</theory>
<theory name="MatrixArithmetic" sum="179a17c543d2ee8c5d1128db6e7ac5b9">
<goal name="zero_neutral">
<transf name="split_goal_wp">
<goal name="zero_neutral.1" expl="1.">
<proof prover="1"><result status="valid" time="0.02" steps="30"/></proof>
<proof prover="2"><result status="valid" time="0.02" steps="42"/></proof>
</goal>
<goal name="zero_neutral.2" expl="2.">
<proof prover="1"><result status="valid" time="0.02" steps="9"/></proof>
<proof prover="2"><result status="valid" time="0.02" steps="10"/></proof>
</goal>
</transf>
</goal>
<goal name="add_commutative">
<transf name="split_goal_wp">
<goal name="add_commutative.1" expl="1.">
<proof prover="1"><result status="valid" time="0.03" steps="46"/></proof>
<proof prover="2"><result status="valid" time="0.03" steps="73"/></proof>
</goal>
<goal name="add_commutative.2" expl="2.">
<proof prover="1"><result status="valid" time="0.01" steps="17"/></proof>
<proof prover="2"><result status="valid" time="0.01" steps="18"/></proof>
</goal>
</transf>
</goal>
<goal name="add_associative">
<transf name="split_goal_wp">
<goal name="add_associative.1" expl="1.">
<proof prover="1"><result status="valid" time="0.14" steps="301"/></proof>
<proof prover="2"><result status="valid" time="0.14" steps="499"/></proof>
</goal>
<goal name="add_associative.2" expl="2.">
<proof prover="1"><result status="valid" time="0.01" steps="24"/></proof>
<proof prover="2"><result status="valid" time="0.01" steps="25"/></proof>
</goal>
</transf>
</goal>
<goal name="add_opposite">
<transf name="split_goal_wp">
<goal name="add_opposite.1" expl="1.">
<proof prover="1"><result status="valid" time="0.12" steps="153"/></proof>
<proof prover="2"><result status="valid" time="0.12" steps="217"/></proof>
</goal>
<goal name="add_opposite.2" expl="2.">
<proof prover="1"><result status="valid" time="0.01" steps="14"/></proof>
<proof prover="2"><result status="valid" time="0.01" steps="15"/></proof>
</goal>
</transf>
</goal>
......@@ -81,91 +81,91 @@
<goal name="WP_parameter mul_assoc_get" expl="VC for mul_assoc_get">
<transf name="split_goal_wp">
<goal name="WP_parameter mul_assoc_get.1" expl="1. precondition">
<proof prover="1"><result status="valid" time="0.02" steps="21"/></proof>
<proof prover="2"><result status="valid" time="0.02" steps="22"/></proof>
</goal>
<goal name="WP_parameter mul_assoc_get.2" expl="2. precondition">
<proof prover="1"><result status="valid" time="3.14" steps="94"/></proof>
<proof prover="2"><result status="valid" time="0.04" steps="30"/></proof>
</goal>
<goal name="WP_parameter mul_assoc_get.3" expl="3. assertion">
<proof prover="1"><result status="valid" time="0.06" steps="37"/></proof>
<proof prover="2"><result status="valid" time="0.06" steps="52"/></proof>
</goal>
<goal name="WP_parameter mul_assoc_get.4" expl="4. precondition">
<proof prover="1"><result status="valid" time="0.05" steps="35"/></proof>
<proof prover="2"><result status="valid" time="0.05" steps="35"/></proof>
</goal>
<goal name="WP_parameter mul_assoc_get.5" expl="5. assertion">
<proof prover="1"><result status="valid" time="0.04" steps="34"/></proof>
<proof prover="2"><result status="valid" time="0.04" steps="34"/></proof>
</goal>
<goal name="WP_parameter mul_assoc_get.6" expl="6. postcondition">
<proof prover="1"><result status="valid" time="0.02" steps="11"/></proof>
<proof prover="2"><result status="valid" time="0.02" steps="12"/></proof>
</goal>
</transf>
</goal>
<goal name="mul_assoc">
<transf name="split_goal_wp">
<goal name="mul_assoc.1" expl="1.">
<proof prover="1"><result status="valid" time="0.02" steps="60"/></proof>
<proof prover="2"><result status="valid" time="0.02" steps="103"/></proof>
</goal>
<goal name="mul_assoc.2" expl="2.">
<proof prover="1"><result status="valid" time="0.01" steps="18"/></proof>
<proof prover="2"><result status="valid" time="0.01" steps="19"/></proof>
</goal>
</transf>
</goal>
<goal name="WP_parameter mul_distr_right_get" expl="VC for mul_distr_right_get">
<transf name="split_goal_wp">
<goal name="WP_parameter mul_distr_right_get.1" expl="1. assertion">
<proof prover="1"><result status="valid" time="0.06" steps="106"/></proof>
<proof prover="2"><result status="valid" time="0.06" steps="317"/></proof>
</goal>
<goal name="WP_parameter mul_distr_right_get.2" expl="2. precondition">
<proof prover="1"><result status="valid" time="0.10" steps="53"/></proof>
<proof prover="2"><result status="valid" time="0.10" steps="46"/></proof>
</goal>
<goal name="WP_parameter mul_distr_right_get.3" expl="3. postcondition">
<proof prover="1"><result status="valid" time="0.06" steps="61"/></proof>
<proof prover="2"><result status="valid" time="0.06" steps="112"/></proof>
</goal>
</transf>
</goal>
<goal name="mul_distr_right">
<transf name="split_goal_wp">
<goal name="mul_distr_right.1" expl="1.">
<proof prover="1"><result status="valid" time="0.05" steps="146"/></proof>
<proof prover="2"><result status="valid" time="0.05" steps="295"/></proof>
</goal>
<goal name="mul_distr_right.2" expl="2.">
<proof prover="1"><result status="valid" time="0.01" steps="22"/></proof>
<proof prover="2"><result status="valid" time="0.01" steps="23"/></proof>
</goal>
</transf>
</goal>
<goal name="WP_parameter mul_distr_left_get" expl="VC for mul_distr_left_get">
<transf name="split_goal_wp">
<goal name="WP_parameter mul_distr_left_get.1" expl="1. assertion">
<proof prover="1"><result status="valid" time="0.06" steps="110"/></proof>
<proof prover="2"><result status="valid" time="0.19" steps="329"/></proof>
</goal>
<goal name="WP_parameter mul_distr_left_get.2" expl="2. precondition">
<proof prover="1"><result status="valid" time="0.05" steps="40"/></proof>
<proof prover="2"><result status="valid" time="0.05" steps="46"/></proof>
</goal>
<goal name="WP_parameter mul_distr_left_get.3" expl="3. postcondition">
<proof prover="1"><result status="valid" time="0.05" steps="45"/></proof>
<proof prover="2"><result status="valid" time="0.05" steps="45"/></proof>
</goal>
</transf>
</goal>
<goal name="mul_distr_left">
<transf name="split_goal_wp">
<goal name="mul_distr_left.1" expl="1.">
<proof prover="1"><result status="valid" time="0.04" steps="144"/></proof>
<proof prover="2"><result status="valid" time="0.04" steps="289"/></proof>
</goal>
<goal name="mul_distr_left.2" expl="2.">
<proof prover="1"><result status="valid" time="0.01" steps="22"/></proof>
<proof prover="2"><result status="valid" time="0.01" steps="23"/></proof>
</goal>
</transf>
</goal>
<goal name="mul_zero_right">
<proof prover="1"><result status="valid" time="1.91" steps="394"/></proof>
<proof prover="2"><result status="valid" time="0.15" steps="315"/></proof>
</goal>
<goal name="mul_zero_left">
<proof prover="1"><result status="valid" time="1.65" steps="387"/></proof>
<proof prover="2"><result status="valid" time="0.16" steps="315"/></proof>
</goal>
<goal name="mul_opp">
<transf name="split_goal_wp">
<goal name="mul_opp.1" expl="1.">
<proof prover="1"><result status="valid" time="0.36" steps="394"/></proof>
<proof prover="2"><result status="valid" time="0.20" steps="502"/></proof>
</goal>
<goal name="mul_opp.2" expl="2.">
<proof prover="0"><result status="valid" time="0.08"/></proof>
......@@ -181,28 +181,28 @@
</theory>
<theory name="BlockMul" sum="a0d8b3f3a9391a77a23d88b4d4a63f23">
<goal name="WP_parameter block_mul_ij" expl="VC for block_mul_ij">
<proof prover="1"><result status="valid" time="1.25" steps="880"/></proof>
<proof prover="2"><result status="valid" time="0.47" steps="452"/></proof>
</goal>
<goal name="WP_parameter mul_split" expl="VC for mul_split">
<proof prover="1"><result status="valid" time="0.29" steps="218"/></proof>
<proof prover="2"><result status="valid" time="0.29" steps="363"/></proof>
</goal>
<goal name="WP_parameter mul_block_cell" expl="VC for mul_block_cell">
<transf name="split_goal_wp">
<goal name="WP_parameter mul_block_cell.1" expl="1. precondition">
<proof prover="1"><result status="valid" time="0.03" steps="27"/></proof>
<proof prover="2"><result status="valid" time="0.03" steps="28"/></proof>
</goal>
<goal name="WP_parameter mul_block_cell.2" expl="2. postcondition">
<proof prover="1"><result status="valid" time="0.12" steps="120"/></proof>
<proof prover="2"><result status="valid" time="0.12" steps="136"/></proof>
</goal>
</transf>
</goal>
<goal name="mul_block">
<transf name="split_goal_wp">
<goal name="mul_block.1" expl="1.">
<proof prover="1"><result status="valid" time="0.04" steps="65"/></proof>
<proof prover="2"><result status="valid" time="0.04" steps="108"/></proof>
</goal>
<goal name="mul_block.2" expl="2.">
<proof prover="1"><result status="valid" time="0.02" steps="24"/></proof>
<proof prover="2"><result status="valid" time="0.02" steps="25"/></proof>
</goal>
</transf>
</goal>
......
......@@ -16,7 +16,7 @@ module MatrixMultiplication
ensures { result.rows = a.rows /\ result.columns = b.columns }
ensures { matrix_product result a b }
= let rs = make (rows a) (columns b) 0 in
for i = 0 to rows a - 1 do
for i = 0 to a.rows - 1 do
invariant { forall i0 j0. i <= i0 < rows a /\ 0 <= j0 < columns b ->
rs.elts[i0][j0] = 0 }
invariant { forall i0 j0. 0 <= i0 < i /\ 0 <= j0 < columns b ->
......
......@@ -2,85 +2,85 @@
<!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.01" timelimit="5" steplimit="0" memlimit="1000"/>
<prover id="1" name="Alt-Ergo" version="1.30" timelimit="5" steplimit="0" memlimit="1000"/>
<file name="../naive.mlw">
<theory name="MatrixMultiplication" sum="888d777f6b0bead427ee1083245abb55">
<goal name="WP_parameter mult_naive" expl="VC for mult_naive">
<transf name="split_goal_wp">
<goal name="WP_parameter mult_naive.1" expl="1. precondition">
<proof prover="0"><result status="valid" time="0.01" steps="5"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="6"/></proof>
</goal>
<goal name="WP_parameter mult_naive.2" expl="2. postcondition">
<proof prover="0"><result status="valid" time="0.01" steps="10"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="11"/></proof>
</goal>
<goal name="WP_parameter mult_naive.3" expl="3. postcondition">
<proof prover="0"><result status="valid" time="0.01" steps="11"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="12"/></proof>
</goal>
<goal name="WP_parameter mult_naive.4" expl="4. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="15"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="16"/></proof>
</goal>
<goal name="WP_parameter mult_naive.5" expl="5. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="10"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="11"/></proof>
</goal>
<goal name="WP_parameter mult_naive.6" expl="6. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="18"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="19"/></proof>
</goal>
<goal name="WP_parameter mult_naive.7" expl="7. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="21"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="21"/></proof>
</goal>
<goal name="WP_parameter mult_naive.8" expl="8. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="18"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="18"/></proof>
</goal>
<goal name="WP_parameter mult_naive.9" expl="9. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="16"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="17"/></proof>
</goal>
<goal name="WP_parameter mult_naive.10" expl="10. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="16"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="17"/></proof>
</goal>
<goal name="WP_parameter mult_naive.11" expl="11. loop invariant init">
<proof prover="0"><result status="valid" time="0.01" steps="16"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="17"/></proof>
</goal>
<goal name="WP_parameter mult_naive.12" expl="12. index in array bounds">
<proof prover="0"><result status="valid" time="0.01" steps="19"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="20"/></proof>
</goal>
<goal name="WP_parameter mult_naive.13" expl="13. index in array bounds">
<proof prover="0"><result status="valid" time="0.01" steps="22"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="23"/></proof>
</goal>
<goal name="WP_parameter mult_naive.14" expl="14. type invariant">
<proof prover="0"><result status="valid" time="0.01" steps="20"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="21"/></proof>
</goal>
<goal name="WP_parameter mult_naive.15" expl="15. index in array bounds">
<proof prover="0"><result status="valid" time="0.01" steps="25"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="26"/></proof>
</goal>
<goal name="WP_parameter mult_naive.16" expl="16. index in array bounds">
<proof prover="0"><result status="valid" time="0.01" steps="21"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="22"/></proof>
</goal>
<goal name="WP_parameter mult_naive.17" expl="17. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.03" steps="38"/></proof>
<proof prover="1"><result status="valid" time="0.03" steps="41"/></proof>
</goal>
<goal name="WP_parameter mult_naive.18" expl="18. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.19" steps="73"/></proof>
<proof prover="1"><result status="valid" time="0.06" steps="56"/></proof>
</goal>
<goal name="WP_parameter mult_naive.19" expl="19. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.02" steps="23"/></proof>
<proof prover="1"><result status="valid" time="0.02" steps="24"/></proof>
</goal>
<goal name="WP_parameter mult_naive.20" expl="20. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="23"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="23"/></proof>
</goal>
<goal name="WP_parameter mult_naive.21" expl="21. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.01" steps="20"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="22"/></proof>
</goal>
<goal name="WP_parameter mult_naive.22" expl="22. loop invariant preservation">
<proof prover="0"><result status="valid" time="0.03" steps="46"/></proof>
<proof prover="1"><result status="valid" time="0.03" steps="40"/></proof>
</goal>
<goal name="WP_parameter mult_naive.23" expl="23. type invariant">
<proof prover="0"><result status="valid" time="0.01" steps="10"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="11"/></proof>
</goal>
<goal name="WP_parameter mult_naive.24" expl="24. postcondition">
<proof prover="0"><result status="valid" time="0.00" steps="10"/></proof>
<proof prover="1"><result status="valid" time="0.00" steps="11"/></proof>
</goal>
<goal name="WP_parameter mult_naive.25" expl="25. postcondition">
<proof prover="0"><result status="valid" time="0.01" steps="20"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="20"/></proof>
</goal>
</transf>
</goal>
......
......@@ -264,23 +264,20 @@ module MatrixMultiplication
use import int.EuclideanDivision
use import number.Parity
let rec strassen (a b: matrix int) (ghost flag:int) : matrix int
requires { a.mdl.F.cols = b.mdl.F.rows }
requires { flag >= 0 }
requires { flag = 0 ->
a.mdl.F.rows = 1 \/ a.mdl.F.cols = 1 \/ b.mdl.F.cols = 1 \/
exists k l m. a.mdl.F.rows = 2*k
/\ a.mdl.F.cols = 2*l
/\ b.mdl.F.cols = 2*m }
(even a.mdl.F.rows /\ even a.mdl.F.cols /\ even b.mdl.F.cols) }
ensures { result.mdl = mul a.mdl b.mdl }
ensures { result.mdl.F.rows = a.mdl.F.rows }
ensures { result.mdl.F.cols = b.mdl.F.cols }
variant { a.mdl.F.rows + a.mdl.F.cols + b.mdl.F.cols + 3 * flag, flag }
= let cut_off = abstract ensures { result >= 1 } 42 end in
let rw = a.rows in
let md = a.columns in
let cl = b.columns in
let (rw, md, cl)= (a.rows, a.columns, b.columns) in
assert { rw = a.mdl.F.rows /\ md = a.mdl.F.cols /\ cl = b.mdl.F.cols };
if rw <= cut_off || md <= cut_off || cl <= cut_off
then mul_naive a b else
......@@ -288,14 +285,12 @@ module MatrixMultiplication
requires { 0 <= n }
returns { (q,r) -> n = 2 * q + r /\ 0 <= r <= 1 /\ n + r = 2 * (q+r) }
= (div n 2,mod n 2) in
let (qr,rr) = div2 rw in
let (qm,rm) = div2 md in
let (qc,rc) = div2 cl in
let (qr, rr) = div2 rw in
let (qm, rm) = div2 md in
let (qc, rc) = div2 cl in
if rr <> 0 || rm <> 0 || rc <> 0
then begin (* Padding *)
let rw' = rw + rr in
let md' = md + rm in
let cl' = cl + rc in
let (rw', md', cl') = (rw + rr, md + rm, cl + rc) in
let ap = padding a rw' md' in
let bp = padding b md' cl' in
let m = strassen ap bp 0 in
......
......@@ -2,46 +2,46 @@
<!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.01" timelimit="5" steplimit="0" memlimit="1000"/>
<prover id="1" name="Alt-Ergo" version="1.30" timelimit="5" steplimit="0" memlimit="1000"/>
<file name="../sum_extended.mlw">
<theory name="Sum_extended" sum="cfab2f022b7b9478b4cc84f0f10fa2ed">
<goal name="WP_parameter sum_mult" expl="VC for sum_mult">
<proof prover="0"><result status="valid" time="0.05" steps="24"/></proof>
<proof prover="1"><result status="valid" time="0.05" steps="36"/></proof>
</goal>
<goal name="WP_parameter sum_add" expl="VC for sum_add">
<proof prover="0"><result status="valid" time="0.04" steps="37"/></proof>
<proof prover="1"><result status="valid" time="0.22" steps="260"/></proof>
</goal>
<goal name="WP_parameter fubini" expl="VC for fubini">
<transf name="split_goal_wp">
<goal name="WP_parameter fubini.1" expl="1. assertion">
<proof prover="0"><result status="valid" time="0.01" steps="4"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="4"/></proof>
</goal>
<goal name="WP_parameter fubini.2" expl="2. postcondition">
<proof prover="0"><result status="valid" time="0.01" steps="11"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="13"/></proof>
</goal>
<goal name="WP_parameter fubini.3" expl="3. variant decrease">
<proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
<proof prover="1"><result status="valid" time="0.00" steps="2"/></proof>
</goal>
<goal name="WP_parameter fubini.4" expl="4. precondition">
<proof prover="0"><result status="valid" time="0.01" steps="6"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="7"/></proof>
</goal>
<goal name="WP_parameter fubini.5" expl="5. assertion">
<transf name="split_goal_wp">
<goal name="WP_parameter fubini.5.1" expl="1. assertion">
<proof prover="0"><result status="valid" time="0.01" steps="14"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="12"/></proof>
</goal>
<goal name="WP_parameter fubini.5.2" expl="2. assertion">
<proof prover="0"><result status="valid" time="0.02" steps="27"/></proof>
<proof prover="1"><result status="valid" time="0.02" steps="49"/></proof>
</goal>
</transf>
</goal>
<goal name="WP_parameter fubini.6" expl="6. postcondition">
<proof prover="0"><result status="valid" time="0.01" steps="8"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="13"/></proof>
</goal>
</transf>
</goal>
<goal name="WP_parameter sum_ext" expl="VC for sum_ext">
<proof prover="0"><result status="valid" time="0.01" steps="17"/></proof>
<proof prover="1"><result status="valid" time="0.01" steps="28"/></proof>
</goal>
</theory>
</file>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment