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.

B.2.<br />

TERM.FS<br />

B.2 Term.fs<br />

module Term<br />

open Microsoft.FSharp.Collections<br />

open Utilities<br />

type Term = struct<br />

val constant: <strong>in</strong>t<br />

val coeffs: <strong>in</strong>t [] // Order of fields matters<br />

val vars: str<strong>in</strong>g []<br />

new(c, vs, cs) ={constant = c; vars = vs; coeffs = cs}<br />

override t.ToStr<strong>in</strong>g() = "(" + str<strong>in</strong>g t.constant + ",␣[" + Array.fold2 (fun acc<br />

vc−> acc + "(" + str<strong>in</strong>g v + "," + str<strong>in</strong>g c + ")" + ",␣" ) "" t.vars t.<br />

coeffs + "])"<br />

end<br />

let newTerm (c, xs, cs) =Term(c, xs, cs)<br />

let term(c, x) =Term(0, [|x|], [|c|])<br />

let var x = term(1, x)<br />

let constTerm i = Term(i, [||],[||])<br />

let Zero = constTerm 0<br />

let One = constTerm 1<br />

let M<strong>in</strong>usOne = constTerm −1<br />

let rec merge(n1, n2, l1, l2, t1: Term, t2: Term, acc1: ResizeArray, acc2:<br />

ResizeArray) =<br />

if n1 =0then<br />

for i = l2−n2 to l2−1 do<br />

acc1.Add(t2.vars.[i])<br />

acc2.Add(t2.coeffs.[i])<br />

elif n2 =0then<br />

for i = l1−n1 to l1−1 do<br />

acc1.Add(t1.vars.[i])<br />

acc2.Add(t1.coeffs.[i])<br />

else<br />

let v1 = t1.vars.[l1−n1]<br />

let c1 = t1.coeffs.[l1−n1]<br />

let v2 = t2.vars.[l2−n2]<br />

let c2 = t2.coeffs.[l2−n2]<br />

if v1 = v2 then<br />

if c1 + c2 0 then<br />

acc1.Add(v1)<br />

acc2.Add(c1+c2)<br />

merge(n1−1, n2−1, l1, l2, t1, t2, acc1, acc2)<br />

elif v1 < v2 then<br />

if c1 0 then<br />

acc1.Add(v1)<br />

73

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

Saved successfully!

Ooh no, something went wrong!