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

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

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

Saved successfully!

Ooh no, something went wrong!