Hoare’s Correctness Triplets Dijkstra’s Predicate Transformers

Slides:



Advertisements
Similar presentations
Automated Theorem Proving Lecture 1. Program verification is undecidable! Given program P and specification S, does P satisfy S?
Advertisements

In this episode of The Verification Corner, Rustan Leino talks about Loop Invariants. He gives a brief summary of the theoretical foundations and shows.
ICE1341 Programming Languages Spring 2005 Lecture #6 Lecture #6 In-Young Ko iko.AT. icu.ac.kr iko.AT. icu.ac.kr Information and Communications University.
Reasoning About Code; Hoare Logic, continued
Rigorous Software Development CSCI-GA Instructor: Thomas Wies Spring 2012 Lecture 11.
David Evans CS655: Programming Languages University of Virginia Computer Science Lecture 19: Minding Ps & Qs: Axiomatic.
Axiomatic Verification I Prepared by Stephen M. Thebaut, Ph.D. University of Florida Software Testing and Verification Lecture 17.
Partial correctness © Marcelo d’Amorim 2010.
Axiomatic Semantics The meaning of a program is defined by a formal system that allows one to deduce true properties of that program. No specific meaning.
Copyright © 2006 Addison-Wesley. All rights reserved.1-1 ICS 410: Programming Languages Chapter 3 : Describing Syntax and Semantics Axiomatic Semantics.
ISBN Chapter 3 Describing Syntax and Semantics.
Copyright © 2006 Addison-Wesley. All rights reserved. 3.5 Dynamic Semantics Meanings of expressions, statements, and program units Static semantics – type.
1 Discrete Structures Lecture 29 Predicates and Programming Read Ch
Predicate Transformers
Program Proving Notes Ellen L. Walker.
1 Semantic Description of Programming languages. 2 Static versus Dynamic Semantics n Static Semantics represents legal forms of programs that cannot be.
1/22 Programs : Semantics and Verification Charngki PSWLAB Programs: Semantics and Verification Mordechai Ben-Ari Mathematical Logic for Computer.
CS 355 – Programming Languages
ESC Java. Static Analysis Spectrum Power Cost Type checking Data-flow analysis Model checking Program verification AutomatedManual ESC.
Discrete Mathematics Lecture 4 Harper Langston New York University.
Axiomatic Semantics Dr. M Al-Mulhem ICS
Discrete Structures Chapter 2 Part B Mathematical Induction
Copyright © 2006 The McGraw-Hill Companies, Inc. Programming Languages 2nd edition Tucker and Noonan Chapter 18 Program Correctness To treat programming.
Dr. Muhammed Al-Mulhem 1ICS ICS 535 Design and Implementation of Programming Languages Part 1 Fundamentals (Chapter 4) Axiomatic Semantics ICS 535.
Software Verification Bertrand Meyer Chair of Software Engineering Lecture 2: Axiomatic semantics.
Describing Syntax and Semantics
Lecture 4 Discrete Mathematics Harper Langston. Algorithms Algorithm is step-by-step method for performing some action Cost of statements execution –Simple.
Floyd Hoare Logic. Semantics A programming language specification consists of a syntactic description and a semantic description. Syntactic description:symbols.
Proving Program Correctness The Axiomatic Approach.
Reading and Writing Mathematical Proofs
1 Program Correctness CIS 375 Bruce R. Maxim UM-Dearborn.
1 Inference Rules and Proofs (Z); Program Specification and Verification Inference Rules and Proofs (Z); Program Specification and Verification.
CSI 3125, Axiomatic Semantics, page 1 Axiomatic semantics The assignment statement Statement composition The "if-then-else" statement The "while" statement.
ISBN Chapter 3 Describing Semantics -Attribute Grammars -Dynamic Semantics.
CS 363 Comparative Programming Languages Semantics.
Program Analysis and Verification Spring 2014 Program Analysis and Verification Lecture 4: Axiomatic Semantics I Roman Manevich Ben-Gurion University.
Chapter 3 Part II Describing Syntax and Semantics.
Semantics In Text: Chapter 3.
COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen.
An Axiomatic Basis for Computer Programming Robert Stewart.
13 Aug 2013 Program Verification. Proofs about Programs Why make you study logic? Why make you do proofs? Because we want to prove properties of programs.
Program Analysis and Verification Spring 2015 Program Analysis and Verification Lecture 4: Axiomatic Semantics I Roman Manevich Ben-Gurion University.
Dr. Naveed Riaz Design and Analysis of Algorithms 1 1 Formal Methods in Software Engineering Lecture # 26.
Cs7100(Prasad)L18-9WP1 Axiomatic Semantics Predicate Transformers.
CSC3315 (Spring 2009)1 CSC 3315 Languages & Compilers Hamid Harroud School of Science and Engineering, Akhawayn University
C HAPTER 3 Describing Syntax and Semantics. D YNAMIC S EMANTICS Describing syntax is relatively simple There is no single widely acceptable notation or.
Foundations of Discrete Mathematics Chapter 1 By Dr. Dalia M. Gil, Ph.D.
Axiomatic Verification II Prepared by Stephen M. Thebaut, Ph.D. University of Florida Software Testing and Verification Lecture Notes 18.
Reasoning About Code.
Chapter 3 The Real Numbers.
Lecture 5 Floyd-Hoare Style Verification
Axiomatic semantics Points to discuss: The assignment statement
Programming Languages and Compilers (CS 421)
Programming Languages 2nd edition Tucker and Noonan
Axiomatic Verification II
Semantics In Text: Chapter 3.
Axiomatic Verification II
Axiomatic Verification I
Formal Methods in software development
Predicate Transformers
Formal Methods in software development
Axiomatic Verification I
Program correctness Axiomatic semantics
Lecture 2: Axiomatic semantics
CIS 720 Lecture 3.
CIS 720 Lecture 3.
Programming Languages 2nd edition Tucker and Noonan
COP4020 Programming Languages
Program Correctness an introduction.
Presentation transcript:

Hoare’s Correctness Triplets Dijkstra’s Predicate Transformers Axiomatic Semantics Hoare’s Correctness Triplets Dijkstra’s Predicate Transformers Calculating with programs : Reasoning reduced to symbol manipulation. Helps determine precise Boundary conditions. Formalizing intuitions. Other approaches: Denotational Semantics: Real meaning in terms of functions on N. Equivalence: f(x) = f(x) + 1 f(x) = if f(x) ==1 then 0 else 1 unsatisfiable (“non-sense”) f(x) = f(x) f(x) = if f(x) ==1 then 1 else f(x) multiple solutions (“no information”) McCarthy’s 91-function Operational Semantics: Abstract interpreter based

gcd-lcm algorithm w/ invariant {PRE: (x = n) and (y = m)} u := x; v := y; while {INV: 2*m*n = x*v + y*u} (x <> y) do if x > y then x := x - y; u := u + v else y := y - x; v := v + u fi od {POST:(x = gcd(m, n)) and (lcm(m, n) = (u+v) div 2)} cs784(tk/pm)

Goal of a program = IO Relation Problem Specification Properties satisfied by the input and expected of the output (usually described using “assertions”). E.g., Sorting problem Input : Sequence of numbers Output: Permutation of input that is ordered. View Point All other properties are ignored. Timing behavior Resource consumption … cs784(tk/pm)

ax·i·om n.1. A self-evident or universally recognized truth; a maxim 2. An established rule, principle, or law. 3. A self-evident principle or one that is accepted as true without proof as the basis for argument; a postulate. From a dictionary cs784(tk/pm)

Axiomatic Semantics Capture the semantics of the elements of the PL as axioms Capture the semantics of composition as a rule of inference. Apply the standard rules/logic of inference. Consider termination separately. cs784(tk/pm)

States and Assertions States: Variables mapped to Values Includes all variables Files etc. are considered “global” variables. No notion of value-undefined variables At a given moment in execution An assertion is a logic formula involving program variables, arithmetic/boolean operations, etc. All assertions are attached to a control point. Assertions: States mapped to Boolean Boolean connectives: and, or, not, implies, … For-all, There-exists Special predicates defined just for use in assertions (not for use in the program). cs784(tk/pm)

Hoare’s Logic Hoare Triplets: {P} S {Q} P, pre-condition assertion; S, statements of a PL; Q, post-condition assertion If S begins executing in a state satisfying P, upon completion of S, the resulting state satisfies Q. {P} S {Q} has no relevance if S is begun otherwise. A Hoare triplet is either true or false. Never undefined. The entire {P}S{Q} is considered true if the resulting state satisfies Q if and when S terminates. If not, the entire {P}S{Q} is false. cs784(tk/pm)

Hoare Triplet Examples true triplets {x = 11 } x := 0 { x = 0 } we can give a weaker precondition {x = 0 } x := x + 1 { x = 1 } {y = 0} if x <> y then x:= y fi { x = 0 } {false } x := 0 { x = 111 } correct because “we cannot begin” no state satisfies false post condition can be any thing you dream {true} while true do od {x = 0} true is the weakest of all predicates correct because control never reaches post {false} while true do od {x = 0} false is the strongest of all predicates false triplet {true} if x < 0 then x:= -x fi { x > 0 } 1. False = empty set of states. Precondition unsatisfiable, so Hoare triple trivially valid. 2. Strong precondition 4. Nontermination. 5. Multipath program : Else null statement; 6. Partially correct because the IF-part of definition not met, so there are no guarantees from THEN. 7. Modify the precondition to get a valid triple. Material Implication : IF sun rises in the west THEN there will be snow in July in Mexico City. cs784(tk/pm)

Weaker/Stronger An assertion R is said to be weaker than assertion P if the truth of P implies the truth of R written: P→R equivalently not P or R. For arbitrary A, B we have: A and B → B This general idea is from Propositional Calculus n > 0 is of course weaker than n = 1, but this follows from Number Theory. cs784(tk/pm)

Weaker/Stronger Q’ stronger P’ weaker Q’  Q P  P’ States States P’ Q The program transforms a state into another state. (point to point map) Assertions characterize a collection of states. cs784(tk/pm)

Partial vs Total Correctness Are P and S such that termination is guaranteed? S is partially correct for P and Q iff whenever the execution terminates, the resulting state satisfies Q. S is totally correct for P and Q iff the execution is guaranteed to terminate, and the resulting state satisfies Q. Logical Implication : IF false THEN (1 = 2) is valid. cs784(tk/pm)

Hoare Triplet Examples Totally correct (hence, partially correct) {x = 11} x := 0 {x = 0} {x = 0} x := x + 1 {x = 1} {y = 0}if x <> y then x:= y fi {x = 0} {false} while true do S od {x = 0} {false} x := 0 {x = 111} Not totally correct, but partially correct {true} while true do S od {x = 0} Not partially correct {true} if x < 0 then x:= -x fi {x > 0} False = empty set of states. Precondition unsatisfiable, so Hoare triple trivially valid. 1a. Unecessarily Strong precondition 1d and 2. Nontermination. 3. Multipath program : Else null statement; 6. Partially correct because the IF-part of definition not met, so there are no guarantees from THEN. 7. Modify the precondition to get a valid triple. Material Implication : IF sun rises in the west THEN there will be snow in July in Mexico City. cs784(tk/pm)

Assignment axiom {Q(e)} x := e {Q(x)} Q(x) has free occurrences of x. Q(e): every free x in Q replaced with e Assumption: e has no side effects. Caveats If x is not a “whole” variable (e.g., a[2]), we need to work harder. PL is assumed to not facilitate aliasing. cs784(tk/pm)

Inference Rules Rules are written as Can also be stated as: Hypotheses: H1, H2, H3 ------------------------------ Conclusion: C1 Can also be stated as: H1 and H2 and H3 implies C1 Given H1, H2, and H3, we can conclude C1. cs784(tk/pm)

Soundness and Completeness Soundness is about “validity” Completeness is about “deducibililty” Ideally in a formal system, we should have both. Godel’s Incompleteness Theorem: Cannot have both Inference Rules ought to be sound What we proved/ inferred/ deduced is valid Examples of Unsound Rules A and B and C  not B x > y implies x > y+1 (in the context of numbers) All the rules we present from now on are sound cs784(tk/pm)

Rule of Consequence Suppose: {P’} S {Q’}, P=>P’, Q’=>Q Conclude: {P} S {Q} Replace precondition by a stronger one postcondition by a weaker one cs784(tk/pm)

Statement Composition Rule {P} S1 {R}, {R} S2 {Q} ------------------------------ {P} S1;S2 {Q} Using Rule of Consequence {P} S1 {R1}, R1  R2, {R2} S2 {Q} ----------------------------- {P} S1;S2 {Q} Reasoning turned into symbol manipulation : Substitution. Confusing with constructs such as: {??} x == x++ * 5 { x = y } cs784(tk/pm)

if-then-else-fi Hoare’s Triplets {P and B} S1 {Q} {P and not B} S2 {Q} ------------------------------------- {P} if B then S1 else S2 fi {Q} We assumed that B is side-effect free Execution of B does not alter state cs784(tk/pm)

Invariants An invariant is an assertion whose truth-value does not change Recall: All assertions are attached to a control point. An Example: x > y The values of x and y may or may not change each time control reaches that point. But suppose the > relationship remains true. Then x > y is an invariant Focus on what is essential for the problem at hand rather than the weakest conditiion. Invariant = truth preserved. cs784(tk/pm)

Loop Invariants Semantics of while-loop {I and B} S {I} ------------------------------------------- {I} while B do S od {I and not B} Termination of while-loop is not included in the above. We assumed that B is side-effect free. cs784(tk/pm)

Data Invariants Well-defined OOP classes Public methods ought to have a pre- and post-conditions defined There is a common portion across all public methods That common portion is known as the data invariant of the class. cs784(tk/pm)

while-loop: Hoare’s Approach Wish to prove: {P} while B do S od {Q} Given: P, B, S and Q Not given: a loop invariant I The I is expected to be true just before testing B To prove {P} while B do S od {Q}, discover a strong enough loop invariant I so that P => I {I and B} S {I} I and not B => Q We used the Rule of Consequence twice Focus on what is essential for the problem at hand rather than the weakest conditiion. Invariant = truth preserved. cs784(tk/pm)

A while-loop example { n > 0 and x = 1 and y = 1} while (n > y) do y := y + 1; x := x*y od {x = n!} Choosing invariant requires insight and is goal driven. Invariant must hold in the loop. So cannot have (n = y) or (x = n!) etc n > 0 implies n >= 1 because n is of type natural-number cs784(tk/pm)

while-loop: Choose the Invariant Invariant I should be such that I and not B  Q I and not (n > y)  (x = n!) Choose (n ≥ y and x = y!) as our I Precondition  Invariant n > 0 and x=1 and y=1  n ≥ 1 and 1=1! Choosing invariant requires insight and is goal driven. Invariant must hold in the loop. So cannot have (n = y) or (x = n!) etc n > 0 implies n >= 1 because n is of type natural-number cs784(tk/pm)

while-loop: Verify Invariant I === n ≥ y and x = y! Verify: {I and n > y} y:= y + 1; x:=x*y {I} {I and n > y} y:= y + 1 {n ≥ y and x*y = y!} {I and n > y} y:= y + 1 {n ≥ y and x= (y-1)!} (I and n > y)  (n ≥ y+1 and x= (y+1-1)!) (I and n > y)  (n > y and x= y!) (n ≥ y and x = y! and n > y)  (n > y and x= y!) QED Hoare’s triplets, but also using wp(). cs784(tk/pm)

while-loop: I and not B  Q I === n ≥ y and x = y! n ≥ y and x = y! and not (n > y)  x = n! n = y and x = y!  x = n! QED Hoare’s triplets, but also using wp(). cs784(tk/pm)

while-loop: Termination Termination is not part of Hoare’s Triplets General technique: Find a quantity that decreases in every iteration. And, has a lower bound The quantity may or may not be computed by the algorithm For our example: Consider n – y values of y: 1, 2, …, n-1, n values of n - y: n-1, n-2, …, 1, 0 Hoare’s triplets, but also using wp(). cs784(tk/pm)

Weakest Preconditions We want to determine minimally what must be true immediately before executing S so that assertion Q is true after S terminates. S is guaranteed to terminate The Weakest-Precondition of S is a mathematical function mapping any post condition Q to the "weakest" precondition Pw. Pw is a condition on the initial state ensuring that execution of S terminates in a final state satisfying R. Among all such conditions Pw is the weakest wp(S, Q) = Pw cs784(tk/pm)

Dijkstra’s wp(S, Q) Let Pw = wp(S, Q) Def of wp(S, Q): Weakest precondition such that if S is started in a state satisfying Pw, S is guaranteed to terminate and Q holds in the resulting state. Consider all predicates Pi so that {Pi}S{Q}. Discard any Pi that does not guarantee termination of S. Among the Pi remaining, choose the weakest. This is Pw. {P} S {Q} versus P => wp(S, Q) {Pw} S {Q} is true. But, the semantics of {Pw} S {Q} does not include termination. If P => wp(S, Q) then {P}S{Q} also, and furthermore S terminates. cs784(tk/pm)

Properties of wp Law of the Excluded Miracle wp(S, false) = false Distributivity of Conjunction wp(S, P and Q) = wp(S,P) and wp(S,Q) Law of Monotonicity (Q→R) → (wp(S,Q)→wp(S,R)) Distributivity of Disjunction wp(S,P) or wp(S, Q) → wp(S,P or Q) cs784(tk/pm)

Predicate Transformers Assignment wp(x := e, Q(x)) = Q(e) Composition wp(S1;S2, Q) = wp(S1, wp(S2,Q)) For programs without loops (and recursion), Hoare’s and Dijkstra’s approach converge. Hoare’s approach generates triples while Dijkstra’s approach tries to capture the semantics Unaddressed Questions: Why weakest precondition rather than strongest post-condition? Expressiveness in FOL for while? Application: Distributed computing program proofs. cs784(tk/pm)

A Correctness Proof {x=0 and y=0} x:=x+1;y:=y+1 {x = y} wp(x:=x+1;y:=y+1, x = y) wp(x:=x+1, wp(y:=y+1, x = y)) === wp(x:=x+1, x = y+1) === x+1 = y+1 === x = y x = 0 and y = 0  x = y use a better example === at the meta level, = part of assertion language syntax cs784(tk/pm)

if-then-else-fi in Dijkstra’s wp wp(if B then S1 else S2 fi, Q) === (B  wp(S1,Q)) and (not B  wp(S2,Q)) === (B and wp(S1,Q)) or (not B and wp(S2,Q)) cs784(tk/pm)

wp-semantics of while-loops DO == while B do S od IF == if B then S fi Let k stand for the number of iterations of S Clearly, k >= 0 If k > 0, while B do S od is the same as: if B then S fi; while B do S od cs784(tk/pm)

while-loop: wp Approach wp(DO, Q) = P0 or there-exists k > 0: Pk States satisfying Pi cause i-iterations of while-loop before halting in a state in Q. Pi defined inductively P0 = not B and Q … cs784(tk/pm)

wp(DO, Q) There exists a k, k ≥ 0, such that H(k, Q) H is defined as follows H(0, Q) = not B and Q H(k, Q) = H(0, Q) or wp(IF, H(k-1, Q)) cs784(tk/pm)

Example (same as before) { n>0 and x=1 and y=1} while (n > y) do y := y + 1; x := x*y od {x = n!} cs784(tk/pm)

Example: while-loop correctness Pre === n>0 and x=1 and y=1 P0 === y >= n and x = n! Pk === B and wp(S, Pk-1) P1 === y > n and y+1>=n and x*(y+1) = n! Pk === y=n-k and x=(n-k)! Weakest Precondition: W === there exists k >= 0 such that P0 or Pk Verification : For k = n-1: Pre => W cs784(tk/pm)

Induction Proof Hypothesis : Pk = (y=n-k and x=(n-k)!) Pk+1 = B and wp(S,Pk) = y<n and (y+1 = n-k) and (x*(y+1)=(n-k)!) = y<n and (y = n-k-1) and (x = (n-k-1)!) = y<n and (y = n- k+1) and (x = (n- k+1)!) = (y = n - k+1) and (x = (n - k+1)!) Examples of Valid preconditions: { n = 4 and y = 2 and x = 2 } (k = 2) { n = 5 and x = 5! and y = 6} (no iteration) cs784(tk/pm)

Detailed Work wp(y:=y+1;x:=x*y, x=y!and n>=y) = wp(y:=y+1, x*y=y! and n>=y) = wp(y:=y+1, x=(y-1)! and n>=y) = x=(y+1-1)! and n>=y+1) = x=y! and n>y cs784(tk/pm)

gcd-lcm algorithm w/ invariant {PRE: (x = n) and (y = m)} u := x; v := y; while {INV: 2*m*n = x*v + y*u} (x <> y) do if x > y then x := x - y; u := u + v else y := y - x; v := v + u fi od {POST:(x = gcd(m, n)) and (lcm(m, n) = (u+v) div 2)} cs784(tk/pm)

gcd-lcm algorithm proof PRE implies Loop Invariant (x = n) and (y = m) implies 2*m*n = x*v + y*u {Invariant and B} Loop-Body {Invariant} {2*n*m = x*v + y*u and x <> y} loop-body {2*n*m = x*v + y*u} Invariant and not B implies POST 2*n*m = x*v + y*u and x == y implies (x = gcd(n,m)) and (lcm(n,m) = (u+v) div 2) cs784(tk/pm)

gcd-lcm algorithm proof Invariant and not B implies POST 2*m*n = x*v + y*u and x == y implies (x = gcd(m, n)) and (lcm(m, n) = (u+v) div 2) Simplifying 2*m*n = x*(u + v) and x == y implies (x = gcd(m, n)) and (lcm(m, n) = (u+v) div 2) cs784(tk/pm)

gcd-lcm algorithm proof Simplifying 2*m*n = x*(u + v) and x == y implies (x = gcd(m, n)) and (x*lcm(m, n) = m*n) cs784(tk/pm)

Some Properties of lcm-gcd gcd() and lcm() are symmetric gcd(m, n) = gcd(n, m) lcm(m, n) = lcm(n, m) gcd(m, n) = gcd(m + k*n, n) where k is a natural number. gcd(m, n) * lcm(m, n) = m * n cs784(tk/pm)