loop invariants part 1
play

Loop Invariants: Part 1 7 January 2019 OSU CSE 1 Reasoning About - PowerPoint PPT Presentation

Loop Invariants: Part 1 7 January 2019 OSU CSE 1 Reasoning About Method Calls What a method call does is described by its contract Precondition: a property that is true before the call is made Postcondition: a property that is true


  1. Loop Invariants: Part 1 7 January 2019 OSU CSE 1

  2. Reasoning About Method Calls • What a method call does is described by its contract – Precondition: a property that is true before the call is made – Postcondition: a property that is true after the call returns 7 January 2019 OSU CSE 2

  3. Reasoning About Loops • What a while loop does is described by its loop invariant – Invariant: a property that is true every time the code reaches a certain point—in the case of a loop invariant, the loop condition test 7 January 2019 OSU CSE 3

  4. Reasoning About Loops • What a while loop does is described by its loop invariant – Invariant: a property that is true every time the code reaches a certain point—in the case of a loop invariant, the loop condition test Why is a loop treated differently than a method call? Simply put, experience shows this is a good way to think about loops. 7 January 2019 OSU CSE 4

  5. Reasoning About Loops • What a while loop does is described by its loop invariant – Invariant: a property that is true every time the code reaches a certain point—in the case of a loop invariant, the loop condition test Just while loops? Yes; the same idea can be applied to for loops, but some modifications are required. 7 January 2019 OSU CSE 5

  6. Reasoning About Loops • What a while loop does is described by its loop invariant – Invariant: a property that is true every time the code reaches a certain point—in the case of a loop invariant, the loop condition test Since a loop invariant is true every time through the loop, it says what does not change ; hence it really says what the loop does not do . 7 January 2019 OSU CSE 6

  7. while Statement Control Flow false while (test) { test loop-body true } loop-body 7 January 2019 OSU CSE 7

  8. while Statement Control Flow The loop invariant is a property that is true both here, just before the loop begins... false while (test) { test loop-body true } loop-body 7 January 2019 OSU CSE 8

  9. while Statement Control Flow ... and here, just after every execution of the loop body. false while (test) { test loop-body true } loop-body 7 January 2019 OSU CSE 9

  10. Example #1 void append(Queue<T> q) • Concatenates (“appends”) q to the end of this . • Updates: this • Clears: q • Ensures: this = # this * #q 7 January 2019 OSU CSE 10

  11. Example #1: Method Body while (q.length() > 0) { T x = q.dequeue(); this .enqueue(x); } 7 January 2019 OSU CSE 11

  12. Example #1: Method Body while (q.length() > 0) { T x = q.dequeue(); this .enqueue(x); } What is true every time we test the loop condition? Lots of things... such as? 7 January 2019 OSU CSE 12

  13. this = < 1, 2, 3 > q = < 4, 5, 6 > while (q.length() > 0) { T x = q.dequeue(); this .enqueue(x); } 7 January 2019 OSU CSE 13

  14. this = < 1, 2, 3 > q = < 4, 5, 6 > while (q.length() > 0) { What is true the first time we T x = q.dequeue(); test the loop condition? Lots of things... such as? this .enqueue(x); } 7 January 2019 OSU CSE 14

  15. this = < 1, 2, 3 > q = < 4, 5, 6 > while (q.length() > 0) { this = < 1, 2, 3 > q = < 4, 5, 6 > T x = q.dequeue(); this = < 1, 2, 3 > q = < 5, 6 > x = 4 this .enqueue(x); this = < 1, 2, 3, 4 > q = < 5, 6 > x = 4 } 7 January 2019 OSU CSE 15

  16. this = < 1, 2, 3 > q = < 4, 5, 6 > while (q.length() > 0) { this = < 1, 2, 3 > q = < 4, 5, 6 > What is true the first and T x = q.dequeue(); second times we test the loop condition? this = < 1, 2, 3 > q = < 5, 6 > Fewer things... such as? x = 4 this .enqueue(x); this = < 1, 2, 3, 4 > q = < 5, 6 > x = 4 } 7 January 2019 OSU CSE 16

  17. this = < 1, 2, 3 > q = < 4, 5, 6 > while (q.length() > 0) { this = < 1, 2, 3 > q = < 4, 5, 6 > The value of x is not involved T x = q.dequeue(); in the loop invariant because there is no x when we first hit this = < 1, 2, 3 > q = < 5, 6 > the loop! x = 4 this .enqueue(x); this = < 1, 2, 3, 4 > q = < 5, 6 > x = 4 } 7 January 2019 OSU CSE 17

  18. this = < 1, 2, 3 > q = < 4, 5, 6 > while (q.length() > 0) { this = < 1, 2, 3, 4 > q = < 5, 6 > T x = q.dequeue(); this = < 1, 2, 3, 4 > q = < 6 > x = 5 this .enqueue(x); this = < 1, 2, 3, 4, 5 > q = < 6 > x = 5 } 7 January 2019 OSU CSE 18

  19. this = < 1, 2, 3 > q = < 4, 5, 6 > while (q.length() > 0) { this = < 1, 2, 3, 4 > q = < 5, 6 > What is true the first, second, T x = q.dequeue(); and third times we test the loop condition? this = < 1, 2, 3, 4 > q = < 6 > Fewer things still... such as? x = 5 this .enqueue(x); this = < 1, 2, 3, 4, 5 > q = < 6 > x = 5 } 7 January 2019 OSU CSE 19

  20. this = < 1, 2, 3 > q = < 4, 5, 6 > while (q.length() > 0) { this = < 1, 2, 3, 4, 5 > q = < 6 > T x = q.dequeue(); this = < 1, 2, 3, 4, 5 > q = < > x = 6 this .enqueue(x); this = < 1, 2, 3, 4, 5, 6 > q = < > x = 6 } 7 January 2019 OSU CSE 20

  21. this = < 1, 2, 3 > q = < 4, 5, 6 > while (q.length() > 0) { this = < 1, 2, 3, 4, 5 > q = < 6 > What is true the first, second, T x = q.dequeue(); third, and fourth times we test the loop condition? this = < 1, 2, 3, 4, 5 > q = < > Fewer things still... such as? x = 6 this .enqueue(x); this = < 1, 2, 3, 4, 5, 6 > q = < > x = 6 } 7 January 2019 OSU CSE 21

  22. this = < 1, 2, 3 > q = < 4, 5, 6 > while (q.length() > 0) { this = < 1, 2, 3, 4, 5 > q = < 6 > Whatever is true the last time T x = q.dequeue(); we test the loop condition is also true here, after the loop this = < 1, 2, 3, 4, 5 > q = < > finally terminates. x = 6 this .enqueue(x); this = < 1, 2, 3, 4, 5, 6 > q = < > x = 6 } 7 January 2019 OSU CSE 22

  23. Some Things That Do Not Change • “The lengths of the strings are non- negative” does not change – | this | >= 0 and |q| >= 0 does not change – True, but this literally goes without saying; the length of any string is always non-negative – It is no more useful than saying, e.g., “ 17 < 42 does not change”, because it is a mathematical fact, not something about this loop in particular 7 January 2019 OSU CSE 23

  24. Some Things That Do Not Change • “The sum of the lengths of the strings” does not change – | this | + |q| does not change – True, and a useful observation about this particular loop; but one can say more 7 January 2019 OSU CSE 24

  25. Some Things That Do Not Change • “The concatentation of the strings” does not change – this * q does not change – True, and a stronger useful observation about this loop because it implies the previous observation about the sum of the lengths • In other words, if this * q does not change, then | this | + |q| also does not change; but not vice versa 7 January 2019 OSU CSE 25

  26. How To Express an Invariant • How do we say “the concatenation of the strings does not change”? – We need to talk about both: • The current values of the variables • The original values of the variables, just before the loop condition was first tested (variable names prefixed with # ) this * q = # this * #q 7 January 2019 OSU CSE 26

  27. Example #1: Method Body /** * @updates this , q * @maintains * this * q = # this * #q */ while (q.length() > 0) { T x = q.dequeue(); this .enqueue(x); } 7 January 2019 OSU CSE 27

  28. Example #1: Method Body /** * @updates this , q * @maintains * this * q = # this * #q */ This Javadoc tag while (q.length() > 0) { introduces the list of T x = q.dequeue(); variables whose values this .enqueue(x); might change in some iteration. } 7 January 2019 OSU CSE 28

  29. Example #1: Method Body /** * @updates this , q * @maintains * this * q = # this * #q */ Any variable in scope that is while (q.length() > 0) { not listed as an updates- T x = q.dequeue(); mode variable is, by default, this .enqueue(x); a restores-mode variable, meaning the loop body does } not change its value. 7 January 2019 OSU CSE 29

  30. Example #1: Method Body /** * @updates this , q * @maintains * this * q = # this * #q */ This Javadoc tag while (q.length() > 0) { introduces the claim that T x = q.dequeue(); the following loop this .enqueue(x); “maintains” the property, i.e., it is a loop invariant. } 7 January 2019 OSU CSE 30

  31. Example #1: Method Body /** * @updates this , q * @maintains * this * q = # this * #q */ while (q.length() > 0) { T x = q.dequeue(); this .enqueue(x); } 7 January 2019 OSU CSE 31

  32. Using a Loop Invariant • If you have a strong enough loop invariant, you can trace over a loop in a single step, and predict the values of the variables when it terminates—without tracing through the loop body even once 7 January 2019 OSU CSE 32

  33. Example #1: Method Body /** * @updates this , q * @maintains * this * q = # this * #q */ Pretend you cannot while (q.length() > 0) { see the loop body. ... Can you still trace } over this loop? 7 January 2019 OSU CSE 33

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend