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.

B.5.<br />

COOPER.FS (EXCERPT)<br />

| SAnd(f, vr) −> (f |> cooperParallel, vr) |>SAnd<br />

| SOr(f, vr) −> (f |> cooperParallel, vr) |>SOr<br />

| E(xs, SOr(f, vr))<br />

−> SOr(cooperParallel (E(xs, f)), vr)<br />

| E(xs, Or fs) −> //pr<strong>in</strong>tfn "EOr.xs=%i, fs=%i" xs.Length fs.Length<br />

fs |> parMap (fun f −> cooperParallel (E(xs, f))) |> Or<br />

| E(xs, f) −> List.fold (fun acc x −> (elimQuantifierParallel x acc)) (nnf (<br />

cooperParallel f)) xs<br />

| A(xs, SAnd(f, vr))<br />

−> SAnd(cooperParallel (A(xs, f)), vr)<br />

| A(xs, And fs) −> //pr<strong>in</strong>tfn "AAnd.xs=%i, fs=%i" xs.Length fs.Length<br />

fs |> parMap (fun f −> cooperParallel (A(xs, f))) |> And<br />

| A(xs, f) −> Not (List.fold (fun acc x −> (elimQuantifierParallel x acc)) (<br />

nnf (cooperParallel (Not f))) xs)<br />

| _ −> formula<br />

let elimQuantifiers = cooper >> reduce<br />

let elimQuantifiersParallel = cooperParallel >> reduce<br />

//<br />

// Evaluation part<br />

//<br />

let cartesian lss =<br />

let klls=[for x <strong>in</strong> l do<br />

for xs <strong>in</strong> ls −> x::xs ]<br />

List.foldBack k lss [[]]<br />

let genRangeArray vr =<br />

vr |> List.map (fun (v, r) −> List.<strong>in</strong>it r (fun i −> (v, i))) |> cartesian |><br />

List.toArray<br />

// Substitute a list of variables <strong>and</strong> associated values to a formula<br />

// Suppose the formula is quantifier−free<br />

let rec evalFormula xts formula =<br />

match formula with<br />

| C(t, ct) −> match subst (t, xts) with<br />

| t’ −> if isConstTerm t’ then<br />

let c = getConst t’<br />

match ct, c with<br />

| EQ, 0−> TT<br />

| UEQ, xwhenx 0 −> TT<br />

| GT, xwhenx>0−> TT<br />

| _, _ −> FF<br />

else <strong>in</strong>validArg "evalFormula" (str<strong>in</strong>g xts)<br />

| D(i, t) −> match subst (t, xts) with<br />

| t’ −> if isConstTerm t’ then<br />

let c = getConst t’<br />

if i %| c then TT else FF<br />

83

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

Saved successfully!

Ooh no, something went wrong!