Functional Program Verification

36
1 Functional Program Verification CS 4311 A. M. Stavely, Toward Zero Defect Programming, Addison- Wesley, 1999. Y. Cheon and M. Vela, A Tutorial on Functional Program Verification, Technical Report 10-26, Dept. of Computer Science, University of Texas at El Paso, El Paso, TX, September 2010

description

Functional Program Verification. CS 4311 A. M. Stavely, Toward Zero Defect Programming, Addison-Wesley, 1999. Y. Cheon and M. Vela, A Tutorial on Functional Program Verification , Technical Report 10-26, Dept. of Computer Science, University of Texas at El Paso, El Paso, TX, September 2010. - PowerPoint PPT Presentation

Transcript of Functional Program Verification

Page 1: Functional Program Verification

11111

Functional Program Verification

CS 4311

A. M. Stavely, Toward Zero Defect Programming, Addison-Wesley, 1999.Y. Cheon and M. Vela, A Tutorial on Functional Program Verification,

Technical Report 10-26, Dept. of Computer Science, University of Texas at El Paso, El Paso, TX, September 2010

Page 2: Functional Program Verification

222

Outline Non-testing techniques for V&V Overview of functional verification Program as functions Intended functions Verification

Assignment statement Sequential composition Conditional statement Iterative statement

Page 3: Functional Program Verification

33

Non-testing Techniques for V&V

(Pairs, 2 minutes) V&V Definitions and examples from the class project?

Sec. 13.4 of Vliet 2008(Manual Testing Techniques)

Page 4: Functional Program Verification

44

Non-testing Techniques for V&V

(Pairs, 2 minutes) V&V Definitions and examples?

Code reviews Reading

If you can’t read it, neither can the people maintaining it Walkthrough

Team effort (group of 3-5, e.g., designer, moderator, secretary) Manual simulation lead by designer Focus on discovering faults, not on fixing them

Inspection Looking for specific faults (e.g., using check lists) E.g., uninitialized variables

Sec. 13.4 of Vliet 2008(Manual Testing Techniques)

Page 5: Functional Program Verification

55

Non-testing V&V (Cont.)

Correctness proof Hoare logic Functional program verification

Model checking Correct by construction

Refinement calculus Model driven development

Sec. 13.4 of Vliet 2008(Manual Testing Techniques)

Page 6: Functional Program Verification

66

Overview of Functional Verification

Key ideas View programs as mathematical functions Write specifications as mathematical functions Compare two functions for correctness verification

Characteristics Based on sets and functions <-> logic (Hoare) Forward reasoning <-> backward reasoning Match informal reasoning

Page 7: Functional Program Verification

77

Programs as Functions

Values of x and y after execution?

// pre-state: {(x,10), (y,20)}x = x + y;y = x – y;x = x – y;// post-state: {(x,?), (y,?)}

Page 8: Functional Program Verification

88

Programs as Functions

Values of x and y after execution?

// pre-state: {(x,10), (y,20)}x = x + y;y = x – y;x = x – y;// post-state: {(x,?), (y,?)}

State changing function (or state transformer) Function on program states Map one program state to another {(x,3), (y,5)}

…{(x,6), (y,4)}

pre-state

{(x,5), (y,3)}…

{(x,4), (y,6)}

post-state

Page 9: Functional Program Verification

99

Concurrent Assignment Notation for express state changing functions

[x1, x2, …, xn := e1, e2, …, en]

Evaluate ei’s in the pre-state at the same time Assign them to xi’s at the same time The values of other state variables remain the same (frame

axiom).

// [x, y := y, x]x = x + y;y = x – y;x = x – y;

Page 10: Functional Program Verification

1010

Conditional Concurrent Assignment

Different functions based on some conditions

[x > 0 -> sign := 1 | x < 0 -> sign := -1 | else -> sign := 0]

Conditions evaluated sequentially from the first to the last in the pre-state

Keyword “else” interpreted as “true”

[n > maxSize -> n := maxSize | else -> I]

[n > 0 -> avg := sum / n | else -> undefined]

Identity function

Partial function

Page 11: Functional Program Verification

1111

Exercise Write a (conditional) concurrent assignment to describe

the function computed by the following code.

if (n > maxSize) { n = maxSize;}avg = sum / n;

Page 12: Functional Program Verification

1212

Intended Functions

Intended function: function describing our intention of code Specification for the code

Code function: function computed by code Actual behavior implemented by the code

// [sum, i := sum + j=1a.length-1a[j], anything]

while (i < a.length) { sum += a[i]; i++; }

Don’t care about the

final value.

Page 13: Functional Program Verification

1313

Exercise Write intended functions for the following code

(a) sum = sum + a; avg = sum / n;

(b) if (a[i] == k) { l = i; }

(c) while (i < a.length) {if (a[i] == k) {

l = i;}i++;

}

Page 14: Functional Program Verification

1414

Annotating Code Why?

To facilitate correctness verification How?

Annotate every section of code with intended function

// f0: [r := largest value in a] // f1 : [r, i := a[0], 1] r = a[0]

int i = 1;

// f2 : [r, i := max of r and largest in a[i..], anything]while (i < a.length) {

// f3 : [r, i := max of r and a[i], i+1] if (a[i] > r) { r = a[i]; }

i++; }

Page 15: Functional Program Verification

1515

Exercise

Annotate the following code with intended functions

c = 0;int i = 0;while (i < a.length) { if (a[i] == n) { c++; } i++;}

Page 16: Functional Program Verification

161616

Outline Non-testing techniques for V&V Overview of functional verification Program as functions Intended functions Verification

Assignment statement Sequential composition Conditional statement Iterative statement

Page 17: Functional Program Verification

17

Functional Verification Process

1. Write specifications of code as functions, called intended functions

2. Calculate functions computed by code, called code functions

3. Compare code functions (p) with intended functions (f), i.e., p is correct with respect to ( ) ⊑f if: dom p dom f p(x) = f(x) for every x dom f

Why notdom p = dom f ?

Page 18: Functional Program Verification

18

Verification of

Assignment Statement

Often straightforward Often identical code and intended functions

// [x := x + 1]x = x + 1;

// [n > 0 -> avg := sum / n]avg = sum / n;

More work done by code

Page 19: Functional Program Verification

19

Verification of

Sequential Composition

Compose code functions

// [n > 0 -> sum, avg := sum + a, (sum + a) / n] sum = sum + a; avg = sum / n;

[sum := sum + a]; [n 0 -> avg := sum / n] [n 0 -> sum, avg := sum + a; (sum + a) /

n] ⊑ [n > 0 -> sum, avg := sum + a; (sum + a) / n]

Page 20: Functional Program Verification

20

Trace Table Calculate code function by tracing state changes

made by statements

statement x y z

x = x + 1 x+1

y = 2 * x 2*(x+1)

z = x + y (x+1) + 2*(x+1)

x = x + 1 x+2

x = 3 * x 3*(x+2)

x = x + 1;

y = 2 * x;

z = x + y;

x = x + 1;

x = 3 * x;

[x, y, z := 3*(x+2), 2*(x+1), (x+1) + 2*(x+1)]

Page 21: Functional Program Verification

2121

Exercise Use a trace table to calculate the function computed by

the following code.

rate = 0.5;years++;interest = balance * rate / 100;balance = balance + interest;

Page 22: Functional Program Verification

22

Modular Verification

Can use intended functions in place of code functions for verification

// [f0] // [f1]

S1

// [f2] S2

Proof obligations f1; f2 f⊑ 0

S1 is correct with respect to f1 (S1 f⊑ 1) S2 is correct with respect to f2 (S2 f⊑ 2)

Page 23: Functional Program Verification

23

Verification of

Conditional Statement Calculate code functions using conditional trace tables

statement condition p b

p = a * r a * r

if (a < b) a < b

b = b - a b - a

p = a * r a * r

if (a < b) a >= b

b = b - p b – (a * r)

p = a * r;

if (a < b)

b = b – a;

else

b = b – p;

[a < b -> p, b := a * r, b – a

| a >= b -> p, b := a *r, b – (a*r)]

Page 24: Functional Program Verification

24

Verification of

Conditional Statement (Cont.) Case analysis on conditions

// [f]

if (B) S1 else S2

Proof obligations When B holds, S1 is correct with respect to f (B S1 f)⊑

When B doesn’t hold, S2 is correct with respect to f ( B S2 f)⊑

Page 25: Functional Program Verification

25

Example

Proof by case analysis When x > y

x – y |x - y|, thus [z != 0 -> r := (x - y)/z] f When !(x > y)

y – x |x - y|, thus [z != 0 -> r := (y - x)/z] f

Therefore, if … else … f⊑

// f: [z != 0 -> r := |x - y| / z]if (x > y) r = (x - y) / z; else r = (y - x) / z;

Page 26: Functional Program Verification

2626

Exercise

Derive proof obligations for an if statement without an else part.

// [f]if (B) S

Page 27: Functional Program Verification

2727

Exercise Write an intended function for the following code and

prove the correctness of the code with respect to the intended function

if (n > maxSize) { n = maxSize;

} sum = sum + a; avg = sum / n;

Page 28: Functional Program Verification

28

Verification of

Iteration Statement No known way of calculating code function, so proof by induction

// [f] while (B) S

Proof obligations B doesn’t hold, identity function is correct with respect to f (B I f)⊑ If B holds, S followed by f is correct with respect to f (B S;f f)⊑ Termination for total correctness

Loop variant: expression with value increased/decreased on iterations

// [f] if (B) { S while (B) S }

// [f] if (B) { S [f] }

Assuming f is correct

Page 29: Functional Program Verification

29

Example

Proof obligations Termination: loop variant, a.length - i Basis: (i < a.length) I f1⊑ Induction: i < a.length f2; f1 f1 and refinement of f2⊑

Proof of basisf1 ≡ [sum, i := sum + j=i

a.length-1a[j], anything]

≡ [sum, i := sum + 0, anything] (because i >= a.length)

≡ [sum, i := sum, anything]

⊒ [sum, i := sum, i] = I

// f1: [sum, i := sum + j=ia.length-1a[j], anything]

while (i < a.length) { // f2: [sum, i := sum + a[i], i+1]

sum += a[i]; i++; }

Page 30: Functional Program Verification

30

Example

Proof induction step

i < a.length f2; f1 f1⊑

f2; f1 ≡ [sum, i := sum + a[i], i + 1];

[sum, i := sum + j=ia.length-1a[j], anything]

≡ [sum, i := sum + a[i] + j=i+1a.length-1a[j], anything]

≡ [sum, i := sum + j=ia.length-1a[j], anything]

≡ f1

// f1: [sum, i := sum + j=ia.length-1a[j], anything]

while (i < a.length) { // f2: [sum, i := sum + a[i], i+1]

sum += a[i]; i++; }

Page 31: Functional Program Verification

3131

Exercise Prove the termination of the following loop.

while (low <= high) {

int mid = (low + high) / 2;

if (a[mid] < x)

low = mid + 1;

else if (a[mid] > x)

high = mid - 1;

else

high = low - 1;

}

Page 32: Functional Program Verification

32

Initialized Loops

Loop seldom used in isolation Preceded by initialization Together compute something useful Loop’s function more general

// [f0] // [f1] S1

// [f2] while (B) { // [f3] S2 }

Proof obligations f1; f2 f0⊑ S1 f1⊑ while (B) S2 f2, requiring⊑

Termination Basis Step: B I f2⊑ Induction: B S2;f2 f2⊑

Page 33: Functional Program Verification

33

Example // f0: [r := largest value in a] // f1 : [r, i := a[0], 1] r = a[0]

int i = 1;

// f2 : [r, i := max of r and largest in a[i..], ?]while (i < a.length) {

// f3 : [r, i := max of r and a[i], i+1] if (a[i] > r) { r = a[i]; }

i++; }

Proof obligations f1; f2 ⊑ f0

Refinement of f1

Refinement of f2 Termination of the loop Basis: (i < a.length) I ⊑ f2 Induction: i < a.length f3; f2 ⊑ f2

Refinement of f3

Page 34: Functional Program Verification

34

Example (Cont.)

Proof of f1; f2 ⊑ f0

f1; f2 [r, i := a[0], 1];

[r, i := max of r and largest in a[i..], ?]

[r, i := max a[0] and largest in a[1..], ?]

[r, i := largest value in a, ?]

⊑ [r := largest value in a]

f0

See handout for other proofs.

Page 35: Functional Program Verification

3535

Exercise Write intended functions for the following while loops in isolation.

(a) while (i < a.length) { if (a[i] > 0) {

sum += a[i]; } i++; }

(b) while (n > 1) { n = n – 2;

}

Page 36: Functional Program Verification

3636

Exercise Prove the correctness of the following code.

// [r := n!]r = 1;int i = n;while (i > 1) { r = r * i; i--;}