29.04.2014 Views

Presburger Arithmetic and Its Use in Verification

Presburger Arithmetic and Its Use in Verification

Presburger Arithmetic and Its Use in Verification

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!