Presburger Arithmetic and Its Use in Verification
Presburger Arithmetic and Its Use in Verification
Presburger Arithmetic and Its Use in Verification
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
APPENDIX B. SOURCE CODE OF EXPERIMENTS<br />
B.7 OmegaTestArray.fs<br />
module OmegaTestArray<br />
open System.Thread<strong>in</strong>g.Tasks<br />
open Utilities<br />
open Term<br />
// Input: a list of conjunctions <strong>and</strong> a list of disjunction pairs.<br />
// Output: do cartesian products on the <strong>in</strong>put.<br />
let cartesian (cons, diss) =<br />
let klls=[|for x <strong>in</strong> l do<br />
for xs <strong>in</strong> ls −> Array.append [|x|] xs |]<br />
Array.foldBack k diss [|cons|]<br />
exception OmegaTestFail<br />
type CoeffTerm = struct<br />
val coeff: <strong>in</strong>t<br />
val term: Term<br />
new (c, t) ={coeff = c; term = t}<br />
end<br />
let merge(outs, lowers: CoeffTerm [], uppers: CoeffTerm []) =<br />
let <strong>in</strong>s =[|for l <strong>in</strong> lowers do<br />
for u <strong>in</strong> uppers do<br />
if l.coeff =1||u.coeff =1then<br />
yield ((l.coeff ∗∗ u.term ++ u.coeff ∗∗ l.term) −− One)<br />
else raise OmegaTestFail|]<br />
Array.append <strong>in</strong>s outs<br />
let project(x, fs) =<br />
let outs =[|<br />
for t <strong>in</strong> fs do<br />
let c = f<strong>in</strong>dCoeff(t, x)<br />
if c =0then yield t<br />
|]<br />
let lowers =[|<br />
for t <strong>in</strong> fs do<br />
let c = f<strong>in</strong>dCoeff(t, x)<br />
if c >0then yield CoeffTerm(c, t)<br />
|]<br />
let uppers =[|<br />
for t <strong>in</strong> fs do<br />
let c = f<strong>in</strong>dCoeff(t, x)<br />
if c