Presburger Arithmetic and Its Use in Verification
Presburger Arithmetic and Its Use in Verification
Presburger Arithmetic and Its Use in Verification
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
APPENDIX B. SOURCE CODE OF EXPERIMENTS<br />
// The formula is quantifier−free.<br />
let rec elimQuantifier x formula =<br />
match formula with<br />
| SAnd(f, vr) −> (f |> elimQuantifier x, vr) |>SAnd<br />
| SOr(f, vr) −> (f |> elimQuantifier x, vr) |>SOr<br />
| Or fs −> fs |> List.map (elimQuantifier x) |>Or<br />
| _ −> formula |> reduce |> elimVariable x<br />
// Elim<strong>in</strong>ate all quantifiers, one by one.<br />
let rec cooper formula =<br />
match formula with<br />
| Not f −> f |> cooper |> Not<br />
| And fs −> fs |> List.map cooper |> And<br />
| Or fs −> fs |> List.map cooper |> Or<br />
| SAnd(f, vr) −> (f |> cooper, vr) |>SAnd<br />
| SOr(f, vr) −> (f |> cooper, vr) |>SOr<br />
| E(xs, SOr(f, vr))<br />
−> SOr(cooper (E(xs, f)), vr)<br />
| E(xs, Or fs) −> fs |> List.map (fun f −> cooper (E(xs, f))) |> Or<br />
| E(xs, f) −> List.fold (fun acc x −> (elimQuantifier x acc)) (nnf (cooper f))<br />
xs<br />
| A(xs, SAnd(f, vr))<br />
−> SAnd(cooper (A(xs, f)), vr)<br />
| A(xs, And fs) −> fs |> List.map (fun f −> cooper (A(xs, f))) |> And<br />
| A(xs, f) −> Not (List.fold (fun acc x −> (elimQuantifier x acc)) (nnf (cooper<br />
(Not f))) xs)<br />
| _ −> formula<br />
let parMap func fs =<br />
let fs’ =List.map (fun f −> Task.Factory.StartNew(fun() −> func f)) fs<br />
Task.WaitAll(fs’)<br />
List.map (fun (t’: Task) −> t’.Result) fs’<br />
let rec elimQuantifierParallel x formula =<br />
//pr<strong>in</strong>tfn "var0=%s" x<br />
match formula with<br />
| SAnd(f, vr) −> (f |> elimQuantifierParallel x, vr) |>SAnd<br />
| SOr(f, vr) −> (f |> elimQuantifierParallel x, vr) |>SOr<br />
| Or fs −> //pr<strong>in</strong>tfn "elim.var=%s, fs=%i" x fs.Length<br />
fs |> parMap (elimQuantifier x) |>Or<br />
| _ −> formula |> reduce |> elimVariable x<br />
// Elim<strong>in</strong>ate all quantifiers, one by one.<br />
let rec cooperParallel formula =<br />
match formula with<br />
| Not f −> f |> cooperParallel |> Not<br />
| And fs −> fs |> List.map cooperParallel |> And<br />
| Or fs −> fs |> List.map cooperParallel |> Or<br />
82