Computer Science School of Computing Clemson University Discrete Math and Reasoning about Software Correctness Murali Sitaraman

Slides:



Advertisements
Similar presentations
Copyright © 2006 The McGraw-Hill Companies, Inc. Programming Languages 2nd edition Tucker and Noonan Chapter 18 Program Correctness To treat programming.
Advertisements

Automated Theorem Proving Lecture 1. Program verification is undecidable! Given program P and specification S, does P satisfy S?
This research is funded in part the U. S. National Science Foundation grant CCR DEET for Component-Based Software Murali Sitaraman, Durga P. Gandi.
Control Structures Ranga Rodrigo. Control Structures in Brief C++ or JavaEiffel if-elseif-elseif-else-end caseinspect for, while, do-whilefrom-until-loop-end.
Semantics Static semantics Dynamic semantics attribute grammars
Computer Science School of Computing Clemson University Introduction to Mathematical Reasoning Jason Hallstrom and Murali Sitaraman Clemson University.
Addressing the Challenges of Current Software. Questions to Address Why? What? Where? How?
Reasoning About Code; Hoare Logic, continued
David Evans CS655: Programming Languages University of Virginia Computer Science Lecture 19: Minding Ps & Qs: Axiomatic.
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.
1 Semantic Description of Programming languages. 2 Static versus Dynamic Semantics n Static Semantics represents legal forms of programs that cannot be.
Weakest pre-conditions and towards machine consistency Saima Zareen.
CS 355 – Programming Languages
Self-Reference - Induction Cmput Lecture 7 Department of Computing Science University of Alberta ©Duane Szafron 1999 Some code in this lecture is.
Copyright © 2006 The McGraw-Hill Companies, Inc. Programming Languages 2nd edition Tucker and Noonan Chapter 18 Program Correctness To treat programming.
CS 330 Programming Languages 09 / 16 / 2008 Instructor: Michael Eckmann.
CS5371 Theory of Computation Lecture 8: Automata Theory VI (PDA, PDA = CFG)
Describing Syntax and Semantics
Mathematics throughout the CS Curriculum Support by NSF #
CC0002NI – Computer Programming Computer Programming Er. Saroj Sharan Regmi Week 7.
Computer Science School of Computing Clemson University Specification and Reasoning in SE Projects Using a Web IDE Charles T. Cook (Clemson) Svetlana V.
Computer Science School of Computing Clemson University Mathematical Reasoning across the Curriculum Software Development Foundations and Software Engineering.
Lecture 16 March 22, 2011 Formal Methods CS 315 Spring Adapted from slides provided by Jason Hallstrom and Murali Sitaraman (Clemson)
Introduction Ellen Walker CPSC 201 Data Structures Hiram College.
Reading and Writing Mathematical Proofs
1 Program Correctness CIS 375 Bruce R. Maxim UM-Dearborn.
© by Kenneth H. Rosen, Discrete Mathematics & its Applications, Sixth Edition, Mc Graw-Hill, 2007 Chapter 4 (Part 3): Mathematical Reasoning, Induction.
Lecture 17 March 24, 2011 Formal Methods 2 CS 315 Spring Adapted from slides provided by Jason Hallstrom and Murali Sitaraman (Clemson)
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.
1 Formal Semantics of Programming Languages “Program testing can be used to show the presence of bugs, but never to show their absence!” --Dijkstra.
Computer Science Department Data Structure & Algorithms Lecture 8 Recursion.
Computer Science School of Computing Clemson University Discrete Math and Reasoning about Software Correctness Joseph E. Hollingsworth
Reasoning about programs March CSE 403, Winter 2011, Brun.
Chapter 3 Part II Describing Syntax and Semantics.
1 CSCD 326 Data Structures I Software Design. 2 The Software Life Cycle 1. Specification 2. Design 3. Risk Analysis 4. Verification 5. Coding 6. Testing.
COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen.
This research is funded in part by grant CCR from the U. S. National Science Foundation. Profiles: A Compositional Mechanism for Performance Specification.
Disciplined Software Engineering Lecture #12 Software Engineering Institute Carnegie Mellon University Pittsburgh, PA Sponsored by the U.S. Department.
Copyright © 1994 Carnegie Mellon University Disciplined Software Engineering - Lecture 1 1 Disciplined Software Engineering Lecture #12 Software Engineering.
1 Software Correctness Proofs CIS 376 Bruce R. Maxim UM-Dearborn.
Static Techniques for V&V. Hierarchy of V&V techniques Static Analysis V&V Dynamic Techniques Model Checking Simulation Symbolic Execution Testing Informal.
Computer Science School of Computing Clemson University Mathematical Reasoning with Objects.
Loop Invariants and Binary Search Chapter 4.4, 5.1.
CSC3315 (Spring 2009)1 CSC 3315 Languages & Compilers Hamid Harroud School of Science and Engineering, Akhawayn University
Integrating Math Units and Proof Checking for Specification and Verification SAVCBS Workshop 2008 SIGSOFT 2008 / FSE 16 November 9th, 2008 Hampton Smith.
Lecture 18 March 29, 2011 Formal Methods 3 CS 315 Spring Adapted from slides provided by Jason Hallstrom and Murali Sitaraman (Clemson)
Chapter 15 Running Time Analysis. Topics Orders of Magnitude and Big-Oh Notation Running Time Analysis of Algorithms –Counting Statements –Evaluating.
CORRECTNESS ISSUES AND LOOP INVARIANTS Lecture 8 CS2110 – Fall 2014.
Computer Science School of Computing Clemson University Reasoning with Queues and Web Interface Demo.
Chapter 4 (Part 3): Mathematical Reasoning, Induction & Recursion
Modular Alternatives to Testing
GC211Data Structure Lecture2 Sara Alhajjam.
Component Implementations Using RESOLVE
Formal Specification of Java Interfaces
Reasoning About Code.
Reasoning about code CSE 331 University of Washington.
Introduction to Components and Specifications Using RESOLVE
Lecture 5 Floyd-Hoare Style Verification
Axiomatic semantics Points to discuss: The assignment statement
Programming Languages 2nd edition Tucker and Noonan
Formal Specification of Interfaces
Introduction to Components and Specifications Using RESOLVE
Mathematical Reasoning
More Mathematical Reasoning (Conditional Statements)
Mathematical Reasoning with Data Abstractions
Programming Languages and Compilers (CS 421)
Programming Languages 2nd edition Tucker and Noonan
Formal Methods Lecture 16 March 22, 2011 CS 315 Spring 2011
Presentation transcript:

Computer Science School of Computing Clemson University Discrete Math and Reasoning about Software Correctness Murali Sitaraman This research is funded in part by NSF grants CCF , CCF ‐ , DUE , and DUE

Computer Science School of Computing Clemson University Lecture 1 Intro to Program Correctness

School of Computing Clemson University Overview  Software correctness proofs  Connections between software correctness and discrete math foundations

School of Computing Clemson University Discrete Math  Typical discrete math proof set up  P  Q  Same as Assume P Confirm Q

School of Computing Clemson University Software Correctness  Code is correct if it meets its specifications.  Specification of an operation involves pre- and post-conditions, which are logical assertions  Basic set up Assume pre-conditions Code Confirm post-conditions

School of Computing Clemson University Software Correctness  Pre-conditions are givens or facts that you can assume  Post-conditions are guarantees or obligations that you must confirm (prove)  Basic set up Assume pre-conditions Code Confirm post-conditions

School of Computing Clemson University Software Correctness  Assuming the pre-conditions, if you execute the code that follows, would you be able to confirm the logical assertions at the end of the code?  For now: Assume that nothing goes wrong during the execution of the code.

School of Computing Clemson University Example #1: Is Code Correct?  Example #1 (b is a Boolean variable) Assume b; b := not b;// := is assignment Confirm b;  C code corresponding to the above Assume b; b = !b; // = is assignment Confirm b;  We will use := for assignment, etc.

School of Computing Clemson University Example #1: Is Code Correct?  Example #1 (b is a Boolean variable) Assume b; b := not b; Confirm b;  The code above means: Assume b = true; b := not b; Confirm b = true;

School of Computing Clemson University Example #2: Is Code Correct?  Example #1 (b is a Boolean variable) Assume b; b := not b; Confirm not b;  Same as: Assume b = true; b := not b; Confirm b = false;

School of Computing Clemson University Correctness: A Method  Example #1 (I is an Integer variable) Assume true; I := 0; Confirm I = 17;  Replace the value of I in the Confirm assertion with the “effect” of the code and remove the code  Above code becomes Assume true; Confirm 0 = 17;

School of Computing Clemson University Correctness: Method Continued  Above code becomes Assume true; Confirm 0 = 17;  Same as true  0 = 17;  Same as true  false;  Same as not true  false;  Same as false;

School of Computing Clemson University Correctness: A Method  Example #1 (I is an Integer variable) Assume true; I := 0; Confirm I = 17;  After many transformations, above code becomes false;  Code is incorrect

School of Computing Clemson University Correctness: A General Method  Example (I is an Integer variable) Assume … ; …-- some code I := J;-- last statement Confirm I = 17;  Replace the value of I and reduce to: Assume … ; …-- some code Confirm J = 17;  Repeat the process till there are no more statements

School of Computing Clemson University Correctness: Method  Code is reduced to a logical assertion (starting with the last statement in the method used here)  Code is correct if and only if the logical assertion is provable  We will use various techniques and results from discrete math to complete the proofs

School of Computing Clemson University A Slightly Larger Example  Software is correct if it meets its specifications.  Is the following code segment correct? Assume all variables are Integers. Assume I = #I and J = #J; Temp := I; I := J; J := Temp; Confirm I = #J and J = #I;

School of Computing Clemson University Proof in 2 Parts  Part 1: Assume I = #I and J = #J; Temp := I; I := J; J := Temp; Confirm I = #J;  Part 2: Assume I = #I and J = #J; Temp := I; I := J; J := Temp; Confirm J = #I;

School of Computing Clemson University Proof of Part 1 Assume I = #I and J = #J; Temp := I; I := J; J := Temp; Confirm I = #J;  Replace J in the Confirm assertion with the effect of the highlighted statement

School of Computing Clemson University Simplify Assume I = #I and J = #J; … J := Temp; Confirm I = #J;  becomes (there is no J to be replaced in the confirm assertion!) Assume I = #I and J = #J; Temp := I; I := J; Confirm I = #J;

School of Computing Clemson University Simplify again Assume I = #I and J = #J; Temp := I; I := J; Confirm I = #J;  Becomes (replacing I with J) Assume I = #I and J = #J; Temp := I; Confirm J = #J;

School of Computing Clemson University Simplify one more time Assume I = #I and J = #J; Temp := I; Confirm J = #J;  Becomes (no change in the confirm assertion, because there is no Temp) Assume I = #I and J = #J; Confirm J = #J;

School of Computing Clemson University Correctness Established  Simplify one more time. Assume I = #I and J = #J; Confirm J = #J;  The above is the same as: (I = #I and J = #J)  (J = #J);  true, because P and Q  Q;

School of Computing Clemson University Proof of Part 2 Assume I = #I and J = #J; Temp := I; I := J; J := Temp; Confirm J = #I;  Replace J in the Confirm assertion with the effect of the highlighted statement

School of Computing Clemson University Simplify Assume I = #I and J = #J; … J := Temp; Confirm J = #I;  Becomes (J is replaced with Temp in the confirm assertion) Assume I = #I and J = #J; Temp := I; I := J; Confirm Temp = #I;

School of Computing Clemson University Simplify again Assume I = #I and J = #J; Temp := I; I := J; Confirm Temp = #I;  becomes (no I in confirm assertion) Assume I = #I and J = #J; Temp := I; Confirm Temp = #I;

School of Computing Clemson University Simplify one more time Assume I = #I and J = #J; Temp := I; Confirm Temp = #I;  Becomes (Temp is replaced with I in the confirm assertion) Assume I = #I and J = #J; Confirm I = #I;

School of Computing Clemson University Correctness Established  Simplify one more time. Assume I = #I and J = #J; Confirm I = #I;  The above is the same as: (I = #I and J = #J)  (I = #I);  true, because P and Q  P;

School of Computing Clemson University Correctness Summary  What did we just do?  Mathematically prove that a piece of code is correct using integer theory and logic.  The process is mechanical. You can do both parts in the proof simultaneously; we did it separately to make it easier.  This is unlike testing where we can only show presence of errors, but not their absence.

School of Computing Clemson University Demonstration  Demo site:  Click on Components Tab at the top  Click on Facilities in the Finder  Click on Int_Swap_Example_Fac  Comment out operations Exchange2 and Main and their procedure using (* … *)  Click on Verify

School of Computing Clemson University Demonstration  Specifications have the form Operation …  requires pre-conditions  ensures post-conditions  Given a piece of code to implement the above specification, we get: Assume pre-conditions Code Confirm post-conditions  This is the starting point

School of Computing Clemson University Demonstration  Specification Operation Exchange (updates I, J: Integer);  ensures I = #J and J = #I;  Values of parameters I and J are updated or modified by the operation  Operation has no requires clause (pre- condition)  In the ensures clause (post-condition), #I and #J denote input values

School of Computing Clemson University Demonstration  Specification Operation Exchange (updates I, J: Integer);  ensures I = #J and J = #I;  Implementation code (procedure) Temp := I; I := J; J := Temp;  Putting it together get: Assume true;-- no pre-conditions Code Confirm I = #J and J = #I;

School of Computing Clemson University Demonstration  Actually putting it together get: Assume I = #I and J = #J; --system knows! Assume true;--no pre-conditions Code Confirm I = #J and J = #I;  So we have (same as our exercise in class): Assume I = #I and J = #J; --system knows! Temp := I; I := J; J := Temp; Confirm I = #J and J = #I;

School of Computing Clemson University Demonstration Summary  Correctness proofs can be automated  It is mostly tedious work  Need an integrated specification- programming language like RESOLVE  There are many specifications languages, just like there are many programming languages ANNA, B, Dafny, Eiffel, JML,…VDM, Z All of them use discrete math notations!

School of Computing Clemson University Arithmetic Example  Example (Ans, I, and J are Integers) Assume true; Ans := J - I; Confirm Ans := I - J;  Is the code correct?  Why or why not?

School of Computing Clemson University Example: Is Code Correct?  Example (Ans, I, and J are Integers) Assume true; Ans := J - I; Confirm Ans = I - J;  Is the code correct?  Substituting J - I for Ans, we have Assume true; Confirm J – I = I – J;  After more transformations: false //universal statement

School of Computing Clemson University Another Arithmetic Example  Example (Ans, I, and J are Integers) Assume true; Ans := J + I; Confirm Ans := I + J;  Is the code correct?  Why or why not?

School of Computing Clemson University Example: Is Code Correct?  Example (Ans, I, and J are Integers) Assume true; Ans := J + I; Confirm Ans = I + J;  Is the code correct?  Substituting J + I for Ans, we have Assume true; Confirm J + I = I + J;  After more transformations: true // + is commutative!

School of Computing Clemson University Take Home Exercise #1: Prove  Assume all variables are Integers. Assume I = #I and J = #J; I := I + J; J := I - J; I := I - J; Confirm I = #J and J = #I;  Do it in two steps. Confirm I = #J Confirm J = #I

Computer Science School of Computing Clemson University Lecture 2 Computational bounds and correctness with objects other than Integers

School of Computing Clemson University From Before: Is Code Correct?  Example (Ans, I, and J are Integers) Assume true; Ans := J + I; Confirm Ans = I + J;  Is the code correct?  Substituting J + I for Ans, we have Assume true; Confirm J + I = I + J;  After more transformations: true // + is commutative!

School of Computing Clemson University Example Demonstration  Try the arithmetic example at the demo site  Type this in; comment out other ops; click verify and continue with slides! Operation Ans(eval I, J: Integer): Integer; ensures Ans = I + J; Procedure Ans := J + I; -- same as return(J + I); end;  Are we able to prove it automatically?  Why or why not?

School of Computing Clemson University Computational vs. Math Integers  Cannot verify because assignment could cause an overflow or underflow!  We really need to confirm two things! Assume true; Confirm min_int <= (I + J) and (I + J) <= max_int; -- pre-condition for adding Ans := J + I; Confirm Ans = I + J;  System knows! It puts in the confirm assertion before assignment.

School of Computing Clemson University Computational vs. Math Integers  To verify we need to include a bounds pre-condition! Try this. Operation Ans(eval I, J: Integer): Integer; requires min_int <= (I + J) and (I + J) <= max_int; ensures Ans = I + J; Procedure Ans := J + I; end;

School of Computing Clemson University Computational vs. Math Integers  This is provable because now we get: Assume min_int <= (I + J) and (I + J) <= max_int; Confirm min_int <= (I + J) and (I + J) <= max_int; Ans := J + I; Confirm Ans = I + J;

School of Computing Clemson University Computational vs. Math Integers  This is provable because now we get: Assume min_int <= (I + J) and (I + J) <= max_int; -- pre-condition Confirm min_int <= (I + J) and (I + J) <= max_int; -- system knows Ans := J + I;-- code Confirm Ans = I + J;-- post-condition

School of Computing Clemson University Exercise: Part 1, Step 1  Assume I = #I and J = #J; I := I + J; J := I - J; I := I - J; Confirm I = #J;  becomes Assume I = #I and J = #J; I := I + J; J := I - J; Confirm I - J = #J;

School of Computing Clemson University Take Home Exercise #1: Prove  You know how to do the rest!  What all do we have to confirm (prove) to show correctness of this code?  Here’s the exercise. Assume I = #I and J = #J; I := I + J; J := I - J; I := I - J; Confirm I = #J and J = #I;

School of Computing Clemson University Take Home Exercise #1: Prove  What all do we have to confirm (prove) to show correctness of this code?  5 verification conditions (VCs)! Assume I = #I and J = #J; Confirm …-- system knows I := I + J; Confirm …-- system knows J := I - J; Confirm …-- system knows I := I - J; Confirm I = #J and J = #I; -- 2 here

School of Computing Clemson University Take Home Exercise: Demo  Good exercise, but too tedious to work this out by hand.  Comment out procedures Exchange and Main using (* … *)  Click on the VC tab, not the verify tab!  See 4 blue icons (labeled VC) pop to the left; there are 5 VCs (one VC icon corresponds to 2)  Click on the VC button to the left of ensures and look at VC 0_4

School of Computing Clemson University Exercise, Example VC  Verification Condition VC 0_4 Ensures Clause of Exchange2: Int_Swap_Example_Fac.fa(20)  Goal:((I + J) - ((I + J) - J)) = J  Given: (min_int <= 0) (0 < max_int) (Last_Char_Num > 0) (min_int <= J) and (J <= max_int) (min_int <= I) and (I <= max_int)

School of Computing Clemson University VC is the same as implication  Verification Condition VC 0_4 Ensures Clause of Exchange2: Int_Swap_Example_Fac.fa(20) (min_int <= 0) and (0 < max_int) and (Last_Char_Num > 0) and (min_int <= J) and (J <= max_int) and (min_int <= I) and (I <= max_int)  ((I + J) - ((I + J) - J)) = J

School of Computing Clemson University Exercise, Example VC  Verification Condition VC 0_5 Ensures Clause of Exchange2: Int_Swap_Example_Fac.fa(20)  Goal: ((I + J) - J) = I  Given: (min_int <= 0) (0 < max_int) (Last_Char_Num > 0) (min_int <= J) and (J <= max_int) (min_int <= I) and (I <= max_int)

School of Computing Clemson University Exercise, Unprovable VC  Verification Condition VC 0_1 Requires Clause of Sum in Procedure Exchange2: Int_Swap_Example_Fac.fa(22)  Goal: (min_int <= (I + J)) and ((I + J) <= max_int)  Given: (min_int <= 0) (0 < max_int) (Last_Char_Num > 0) (min_int <= J) and (J <= max_int) (min_int <= I) and (I <= max_int)

School of Computing Clemson University Exercise, Remaining VCs  Verification Condition VC 0_2 Requires Clause of Difference in Procedure Exchange2: Int_Swap_Example_Fac.fa(23)  Verification Condition VC 0_3 Requires Clause of Difference in Procedure Exchange2: Int_Swap_Example_Fac.fa(24)  Are the above provable?  Don’t click on the verify button (the timer is set short so even provable things won’t verify!)

School of Computing Clemson University Demonstration Summary  Correctness proofs can be automated  It is mostly tedious work  System knows and uses all kinds of results from discrete math  Proof search might time out, so not all correct code might be proved automatically, but no wrong code would be proved!

School of Computing Clemson University Discussion and Demo  Math integers vs. computational integers  Assume and confirm assertions come from requires and ensures clauses of operations  Mechanical “proof” rules exist for all programming constructs, including if statements, while statements, objects, pointers, etc.  They all have discrete math foundations.  Demo site:

School of Computing Clemson University More Complex Examples  Remaining Lecture: How do we deal with programs dealing with objects and operation calls on objects, beyond simple types like Integers  Future Lecture 3: How do we prove correctness of non-trivial code involving loops and recursion (Hint: induction)

School of Computing Clemson University Discrete Math and Math Modeling  Discrete structures, such as numbers, sets, etc., are used in mathematical modeling of software  Example using another discrete structure: Mathematical strings  Strings are useful to specify and reason about CS structures, such as stacks, queues, lists, etc.

School of Computing Clemson University Discrete Structure: Math Strings  Unlike sets, strings have order Example: Str(Z) for String of integers  Notations Empty string (written empty_string or ) Concatenation ( alpha o beta ) Length ( |alpha| ) String containing one entry ( )

School of Computing Clemson University Stacks and Queues  Stacks and Queues of entries can be mathematically viewed as “strings of entries”  Their operations can be specified using string notations

School of Computing Clemson University Stack Operations  Example operation specifications Operation Push (updates S: Stack, …) requires |S| < Max_Depth; ensures S = o #S; Operation Pop (updates S: Stack, …) requires |S| > 0; ensures … Operation Depth (S: Stack): Integer ensures Depth = |S|;

School of Computing Clemson University Demonstration   Click on Components Tab at the top  Click on Concepts in the Finder  Select Stack_Template from the list  Select Enhancements  Select Do_Nothing_Capability  Select Realizations  Select Do_Nothing_Realiz  Click on Verify

School of Computing Clemson University Do_Nothing, Example VC  VC 0_2 Requires Clause of Push in Procedure Do_Nothing: Do_Nothing_Realiz.rb(6)  Goal:(|S'| + 1) <= Max_Depth;  Given: (|S| <= Max_Depth) (|S| > 0) S = ( o S')  Here, S and S’ are values of Stack S in two different states

School of Computing Clemson University Discussion  How many VCs (verification conditions) are there?  Why?  Proofs of these VCs involve discrete structure results involving mathematical strings Theorem: x: , | | = 1; Theorem: , : Str(), | o | = || + ||;

School of Computing Clemson University Take Home Exercise #2  Do the string theory tutorial at this site ching/tutor/mathematics/StringTheory/ BegPart1.htm ching/tutor/mathematics/StringTheory/ BegPart1.htm Do the exercises at the end of the tutorial

Computer Science School of Computing Clemson University Lecture 3 Induction and Correctness of Programs with Loops and Recursion

School of Computing Clemson University Example int sum(int j, int k) // requires j >= 0 // ensures result = j + k { if (j == 0) { return k; } else { j--; int r = sum(j, k); return r + 1; }

School of Computing Clemson University Reasoning Pattern  Similar to an inductive proof  Base case (e.g., j == 0)  Reason code works for the base case  Recursive case (e.g., j != 0)  Assume that the recursive call j--; r = sum(j, k) works  Reason that the code works for the case of j  Show assumption is legit, i.e., show termination

School of Computing Clemson University Recursion: Base case int sum(int j, int k) // requires j >= 0 // ensures result = j + k { if (j == 0) { return k; // Assume: (j = 0) ^ (result = k) // Confirm ensures: result = 0 + k } else {... }

School of Computing Clemson University Recursion: Inductive Assumption int sum(int j, int k) // requires j >= 0 // ensures result = j + k { if (j == 0) {... } else { j--; int r = sum(j, k); // Assume: r = (j – 1) + k return r + 1; }

School of Computing Clemson University Recursion: Inductive Proof Step int sum(int j, int k) // requires j >= 0 // ensures result = j + k {if (j == 0) {... } else { j--; int r = sum(j, k); return r + 1; // Assume: (r = (j – 1) + k) ^ //(result = r + 1) // Confirm ensures: result = j + k }

School of Computing Clemson University Reasoning: Recursive Case  For the inductive proof to be legit, the inductive assumption must be legit  This requires showing that an argument passed to the recursive call is strictly smaller  This is the proof of termination  To prove termination automatically, programmers need to provide a progress metric ( j decreases in the example)

School of Computing Clemson University Discrete Math and Specifications  Discrete structures, such as numbers, sets, etc., are used in mathematical modeling of software  Example using another discrete structure: Mathematical strings  Strings are useful to specify and reason about CS structures, such as stacks, queues, lists, etc.

School of Computing Clemson University Queue Flip Demonstration  Click on Components Tab at the top  Click on Concepts in the Finder  Select Queue_Template from the list  Select Enhancements  Select Flipping_Capability  Select Realizations  Select Recursive_Flipping_Realiz  Click on Verify

School of Computing Clemson University Discussion  Discuss select VCs

School of Computing Clemson University Theorems from string theory  Various theorems from string theory are necessary to prove software correctness  VCs in proving correctness of recursive realization  Ex. Theorem: string reversal theorem: , : Str(), Reverse( o ) = Reverse() o Reverse();

School of Computing Clemson University Reasoning about iterative code  Also appeals to induction  Loops need to include an “invariant” and a progress metric for termination  Invariant is established for the base case (i.e., before the loop is entered)  Invariant is assumed at the beginning of an iteration and confirmed at the beginning of the next  Also needs a progress metric and a proof of termination

School of Computing Clemson University Stack Flip Realization  Click on Components Tab at the top  Click on Concepts in the Finder  Select Stack_Template from the list  Select Enhancements  Select Flipping_Capability  Select Realizations  Select Obvious_Flip_Realiz  Click on Verify

School of Computing Clemson University Discussion  Discuss select VCs

School of Computing Clemson University Summary  Discrete math foundations are central for developing correct software.  Modern programming languages are being enhanced with specification language counterparts to facilitate verification of software correctness  Example spec/programming language combinations include RESOLVE