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.4.<br />

PAGENERATOR.FS (EXCERPT)<br />

B.4 PAGenerator.fs (excerpt)<br />

// Generate PA Fragments for test<strong>in</strong>g Cooper algorithm<br />

module PAGenerator<br />

// Formulate pigeon hole pr<strong>in</strong>ciple <strong>in</strong> propositional logic (N pigeons <strong>and</strong> K holes)<br />

let rec tab n f =<br />

match n with<br />

| xwhenx []<br />

| _ −> fn:: tab (n−1) f<br />

// Pigeon i is <strong>in</strong> hole k<br />

let Xik= A( L ("x(" + str<strong>in</strong>g i + "," + str<strong>in</strong>g k + ")"), true)<br />

let Yik= A( C(Zero, var ("x" + str<strong>in</strong>g i + "_" + str<strong>in</strong>g k + ""), LE), true)<br />

let Zik= A( C(Zero, var ("x" + str<strong>in</strong>g i + "_" + str<strong>in</strong>g k + ""), EQ), true)<br />

let Tik= A( D(2, var ("x" + str<strong>in</strong>g i + "_" + str<strong>in</strong>g k + "")), true)<br />

// If pigeon i is <strong>in</strong> hole k so no one else is <strong>in</strong> hole k<br />

let Fpred(i, k) (N, K) =(pred i k) =>(And (tab N (fun i’ −> if i = i’ then TT else<br />

Not (pred i’ k))))<br />

// Apply F for all i <strong>and</strong> k<br />

let Fall pred (N, K) =And (tab N (fun i −> And (tab K (fun k −> Fpred(i, k) (N, K)))<br />

))<br />

// Pigeon i has assigned a hole<br />

let Gpredi(N, K) =Or (tab K (fun k −> pred i k))<br />

// All pigeons have been assigned holes<br />

let Gall pred (N, K) =And (tab N (fun i −> Gpredi(N, K)))<br />

// A pigeon is only <strong>in</strong> one hole<br />

let Hpred(i, k) (N, K) =(pred i k) =>(And (tab K (fun k’ −> if k = k’ then TT else<br />

Not (pred i k’))))<br />

// Every pigeon has exactly one hole<br />

let Hall pred (N, K) =And (tab N (fun i −> And (tab K (fun k −> Hpred(i, k) (N, K)))<br />

))<br />

let pigeon pred (N, K) =And [Fall pred (N, K) ;Gall pred (N, K) ;Hall pred (N, K)]<br />

let pigeonY = pigeon Y<br />

let pigeonZ = pigeon Z<br />

let pigeonT = pigeon T<br />

let generateFormula pigeonPred (N, K, Q) =<br />

let rec takeLast(ls, q) =<br />

if List.length ls

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

Saved successfully!

Ooh no, something went wrong!