cop4020 programming languages introduction to axiomatic semantics prof. robert van engelen

26
COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

Upload: edgar-dickerson

Post on 13-Dec-2015

231 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020Programming Languages

Introduction to Axiomatic Semantics

Prof. Robert van Engelen

Page 2: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 204/18/23

Assertions and Preconditions

Assertions are used by programmers to verify run-time execution An assertion is a logical formula to verify the state of variables

and data to ensure safe continuation A failed assertion should stop the program Assertions are placed by programmers explicitly in code

assert (len>0);mean = sum/len;

Preconditions state the necessary conditions for “safe” execution Programmer decides which conditions apply at a program point Testing too few does not make the program safe

Page 3: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 304/18/23

Axiomatic Semantics and Preconditions What if we want to guarantee that the program always

produces the correct output assuming that the initial assertion passes?

Axiomatic semantics:axiomatic proof that a program produces a machine state described by a postcondition if the precondition on the initial state holds (initial assertion passes)

Example:assert (len > 0); // given this passesmean = sum/len; assert (mean > 0); // is this always true?

answer: no, cannot be provencan be proven when we change precondition

to (len>0 && sum>0)

Page 4: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 404/18/23

Preconditions, Postconditions and Partial Correctness Triple notation: place conditions before and after a

command C:

{ Precondition } C { Postcondition }

We say that C is partially correct with respect to the <precondition,postcondition> specification, provided that The command C is executed in a machine state that makes the

precondition true If the command terminates, then we guarantee that the resulting

machine state makes the postcondition true

Total correctness requires termination

Page 5: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 504/18/23

Assignment Axiom

If we view conditions in assertions as logical predicates, the assignment axiom can be stated

{ P(E) } V := E { P(V) }

that is, if we state a property of V after the assignment, then the property must hold for expression E before the assignment

We can use substitution to derive the precondition given a postcondition formula P: this is the assignment axiom:

{ P[VE] } V := E { P }

where P[VE] denotes the substitution of V by E in P

Page 6: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 604/18/23

Examples for Assignments

{ k = 5 } k := k + 1 { k = 6 }(k = 6)[kk+1] (k+1 = 6) (k = 5)

{ j = 3 and k = 4 } j := j + k { j = 7 and k = 4 }(j = 7 and k = 4)[jj+k] (j+k = 7 and k = 4) (j = 3 and k = 4)

{ true } x := 2 { x = 2 }(x = 2)[x2] (2 = 2) (true)

{ a > 0 } a := a - 1 { a > 0 }(a > 0)[aa - 1] (a - 1 > 0) (a > 0) Assuming a is int !

{ false } y := 1 { y = 2 } No state can satisfy precondition !This is still proven partially

correct !

Page 7: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 704/18/23

Validity of Assignment Axiom

At first glance it seems that working backwards from a postcondition is more complicated than necessary and we are tempted to incorrectly assume we can use

{ true } V := E { V = E }

However, consider

{ true } m := m + 1 { m = m + 1}

and we find that { m = m + 1 } { false } this is wrong

assignment

equality

Page 8: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 804/18/23

Statement Composition: Sequence Axiom The sequence axiom:

{ P } C1 { Q } C2 { R }

Q is a postcondition of C1 and a precondition for C2

Written as a rule of inference

{ P } C1 { Q } { Q } C2 { R }

{ P } C1 ; C2 { R }

Page 9: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 904/18/23

Example Sequencing

We usually write the sequencing vertical and insert the inferred conditions between the statements:{ i > 0 } k := i + 1;{ k > 0 and j = j } { k > 0 } i := j;{ k > 0 and i = j }

The rule of inference:

{ i > 0 } k := i + 1 { k > 0 } { k > 0 } i := j { k > 0 and i = j }

{ i > 0 } k := i + 1; i := j { k > 0 and i = j }

(k > 0 and i = j)[ij]

(k > 0)[ki + 1]

Page 10: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 1004/18/23

Skip Axiom

The ‘skip’ statement is a no-op

{ P } skip { P }

pre- and postconditions are identical

Page 11: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 1104/18/23

If-then-else Axiom

The if-then-else axiom written vertically:{ P } if B then

{ P and B } C1

{ Q } else

{ P and not B } C2

{ Q } end if{ Q }

Page 12: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 1204/18/23

If-then-else Axiom

And as an inference rule:

{ P and B } C1 { Q } { P and not B } C2 { Q }

{ P } if B then C1 else C2 end if { Q }

Page 13: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 1304/18/23

The if-then-else Weakest Precondition Rule We can derive the weakest precondition P of and if-then-else using:

P (not B or P1) and (B or P2)

where P1 is the precondition of C1 given postcondition Q and P2 is the precondition of C2 given postcondition Q

Example:{ ( x < 0 or x > 0) and (x > 0 or true) } { true } if x > 0 then

{ x > 0 } y := x

else{ 0 > 0 } { true } y := 0

end if{ y > 0 }

1. Compute preconditionsP1 and P2 of C1 and C2

2. Compute precondition P given P1 and P2

Page 14: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 1404/18/23

Precondition Strengthening

Logical implication ( or ) means

stronger condition weaker condition(more restrictive) (less restrictive)

For example: x = y and y = 0 y = 0 x 0 x = 0 or x < 0 or x > 0 x = 0 x > 0 x = y true false x = y2

Page 15: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 1504/18/23

Using Precondition Strengthening

We can always make a precondition stronger than necessary to complete a proof

For example, suppose we know that x > 0 and y = 2 at the start of the program:{ x > 0 and y = 2} { x > 0} y := x{ y = x and y > 0 }

(y = x and y > 0)[yx] (x = x and x > 0)

Page 16: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 1604/18/23

Loops and Loop Invariants

A loop-invariant condition is a logical formula that is true before the loop, in the loop, and after the loop

A familiar example: grocery shopping The invariant is:

groceries needed = groceries on list + groceries in cart

cart := empty;{ groceries needed = groceries on list + groceries in cart }

{ groceries needed = groceries on list } while list not empty do

{ groceries needed = groceries on list + groceries in cart and not empty list }add grocery to cart;take grocery off list;{ groceries needed = groceries on list + groceries in cart }

end do;{ groceries needed = groceries on list + groceries in cart and empty list }

{ groceries needed = groceries in cart }

Page 17: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 1704/18/23

While-loop Axiom

The while-loop axiom uses a loop invariant I, which must be determined

Invariant cannot generally be automatically computed and must be “guessed” by an experienced programmer{ I } while B do

{ I and B } C{ I }

end do{ I and not B }

Page 18: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 1804/18/23

While-loop Example (1) Loop invariant I (f*k! = n! and k > 0)

{ n > 0 }

k := n;

f := 1;

while k > 0 do

f := f*k;

k := k-1;

end do

{ f = n! }

Prove that this algorithm is correct given precondition n>0 and postcondition f=n!

Page 19: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 1904/18/23

While-loop Example (2) Loop invariant I (f*k! = n! and k > 0)

{ n > 0 }

k := n;

f := 1;{ f*k! = n! and k > 0 }while k > 0 do

{ f*k! = n! and k > 0 and k > 0 }

f := f*k;

k := k-1;{ f*k! = n! and k > 0 }

end do{ f*k! = n! and k > 0 and k < 0 }

{ f = n! }

Add while-loop preconditions and postconditions based on the invariant

Page 20: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 2004/18/23

While-loop Example (3) Loop invariant I (f*k! = n! and k > 0)

{ n > 0 }

k := n;{ 1*k! = n! and k > 0 }f := 1;{ f*k! = n! and k > 0 }while k > 0 do

{ f*k! = n! and k > 0 and k > 0 }

f := f*k;{ f*(k-1)! = n! and k-1 > 0 } k := k-1;{ f*k! = n! and k > 0 }

end do{ f*k! = n! and k > 0 and k < 0 }

{ f = n! }

Use assignment axioms

Page 21: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 2104/18/23

While-loop Example (4) Loop invariant I (f*k! = n! and k > 0)

{ n > 0 }{ n! = n! and n > 0 }k := n;{ 1*k! = n! and k > 0 }f := 1;{ f*k! = n! and k > 0 }while k > 0 do

{ f*k! = n! and k > 0 and k > 0 }{ f*k*(k-1)! = n! and k-1 > 0 } f := f*k;{ f*(k-1)! = n! and k-1 > 0 } k := k-1;{ f*k! = n! and k > 0 }

end do{ f*k! = n! and k > 0 and k < 0 }

{ f = n! }

Use assignment axioms

Page 22: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 2204/18/23

While-loop Example (5) Loop invariant I (f*k! = n! and k > 0)

{ n > 0 } { n! = n! and n > 0 } { n > 0 } k := n;{ 1*k! = n! and k > 0 }f := 1;{ f*k! = n! and k > 0 }while k > 0 do

{ f*k! = n! and k > 0 and k > 0 } { f*k*(k-1)! = n! and k-1 > 0 } f := f*k;{ f*(k-1)! = n! and k-1 > 0 } k := k-1;{ f*k! = n! and k > 0 }

end do{ f*k! = n! and k > 0 and k < 0 }

{ f = n! }

Use precondition strengthening to prove the correctness of implications

Page 23: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 2304/18/23

While-loop Example (6) Loop invariant I (f*k! = n! and k > 0)

{ n > 0 } { n! = n! and n > 0 } { n > 0 } k := n;{ 1*k! = n! and k > 0 }f := 1;{ f*k! = n! and k > 0 }while k > 0 do

{ f*k! = n! and k > 0 and k > 0 } { f*k*(k-1)! = n! and k-1 > 0 } f := f*k;{ f*(k-1)! = n! and k-1 > 0 } k := k-1;{ f*k! = n! and k > 0 }

end do{ f*k! = n! and k > 0 and k < 0 } { f*k! = n! and k = 0 } { f = n! }

Use simplification and logical implications to complete the proof

Page 24: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 2404/18/23

Using Axiomatic Semantic Rules to find Bugs A postcondition specification can by any logical formula A specification that states the input-output requirements

of an algorithm is needed to prove correctness A specification that tests a violation can aid in debugging

For example

if (n < 0) then p = 2;else p = n+1;k = m / (p-1);// Div error when p = 1

{ (n > 0 or true) and (n < 0 or n ≠ 0) } { true } if (n < 0) then { true } p = 2; else { n ≠ 0 } p = n+1;{ p ≠ 1 }k = m / (p-1);

Means: p = 1 never possible

Page 25: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

COP4020 Spring 2011 2504/18/23

Proof of Correctness of the Euclidian Algorithm Loop invariant I ( gcd(x,y) = gcd(a,b) )

{ true } { gcd(a,b) = gcd(a,b) } x := a;{ gcd(x,b) = gcd(a,b) } y := b;{ gcd(x,y) = gcd(a,b) } while x ≠ y do

{ gcd(x,y) = gcd(a,b) and x ≠ y } { (x > y or gcd(x,y-x) = gcd(a,b)) and (x ≤ y or gcd(x-y,y) = gcd(a,b)) } if x ≤ y then

{ gcd(x,y-x) = gcd(a,b) } y := y – x

else{ gcd(x-y,y) = gcd(a,b) } x := x – y

end if{ gcd(x,y) = gcd(a,b) }

end do{ gcd(x,y) = gcd(a,b) and x = y } { x = gcd(a,b) }

Use the fact that:gcd(x-y,y) = gcd(x,y) if x > ygcd(x,y-x) = gcd(x,y) if x < yx = gcd(x,x)

Page 26: COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen

Concluding Remarks

Formal treatment of program correctness sharpens our reasoning skills “why does this program work or fail?”

Convincingly demonstrated with small programs Formal reasoning of nontrivial programs is complex and

even with support of automated reasoning systems we cannot solve many complex correctness problems

Formal reasoning with axiomatic semantics can be found in logic design (hardware), security protocol verification, and distributed system correctness analysis

COP4020 Spring 2011 2604/18/23