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.
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