adts, representation invariants and abstraction functions
DESCRIPTION
ADTs, Representation Invariants and Abstraction Functions. Based on material by Michael Ernst, University of Washington. Announcements. Exam1 on Friday Closed book/phone/laptop, 1 cheat page allowed Reasoning about code, Specifications, ADTs (a little) - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/1.jpg)
Abstraction Functions
![Page 2: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/2.jpg)
Announcements
Exam 1 on Friday October 6th Closed book/phone/laptop 2 cheat pages allowed (handwritten or typed)
1 double-sided sheet or 2 single-sided Reasoning about code, Specifications, ADTs I will post review slides and practice tests off
Announcements page by Tuesday
HW3 still due Tuesday2
![Page 3: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/3.jpg)
Announcements
HW0: grades and feedback in Submitty HW1: finalizing grades
Quizzes 1-3 Graded Will be available in Submitty Rainbow Grades We will go over quiz problems to prep for test
Fall 17 CSCI 2600, A Milanova 3
![Page 4: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/4.jpg)
Quiz 3 Problem
Which one is stronger? A B Neither
Spec A: Spec B:
PA: arg ≥ 1 PB: arg ≥ 0
QA: 0 ≤ result ≤ 10 QB: 0 ≤ result ≤ 15
What’s a minimal change in B to make it stronger? One example: change QB: 0 ≤ result ≤ 10
What’s a minimal change in A to make it stronger? One example: change PA: arg ≥ 0
4
![Page 5: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/5.jpg)
Slightly different problem
Spec A
PA: arg ≥ 1
QA: 0 ≤ result ≤ 10
Spec B
PB: arg ≥ 0
QB: 0 ≤ result ≤ 5 if arg ≥ 1 0 ≤ result ≤ 15 otherwise Fall 17 CSCI 2600, A Milanova 5
![Page 6: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/6.jpg)
Outline
Reasoning about ADTs Representation invariants (rep invariants) Representation exposure
Checking rep invariants
Abstraction functions
Review and practice problemsFall 17 CSCI 2600, A Milanova 6
![Page 7: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/7.jpg)
Connecting Implementation to Specification
Representation invariant: Object boolean Indicates whether data representation is well-
formed. Only well-formed representations are meaningful
Defines the set of valid values Abstraction function: Object abstract value
What the data representation really means E.g., array [2, 3, -1] represents –x2 + 3x + 2
How the data structure is to be interpreted
Fall 17 CSCI 2600, A Milanova (based on slides by Michael Ernst) 7
![Page 8: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/8.jpg)
Rep Invariant Excludes Meaningless Concrete Values
Disallows meaningless values E.g., a RightTriangle cannot have base = -2
Ensures fields are properly synchronized volume and contents in BallContainer amount and transactions list in Account degree and coeffs array in Poly
Ensures specific data structure constraints A Tree cannot have cycles
Other correctness constraints 0 <= index < names.length, names!=null
8
![Page 9: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/9.jpg)
Checking Rep Invariant checkRep() or repOK() Checking “no duplicates” rep invariant of IntSetprivate void checkRep() { for (int i=0; i<data.size; i++) if (data.indexOf(data.elementAt(i)) != i) throw RuntimeException(“duplicates!”);}
Always check if rep invariant holds when debugging
Leave checks anyway, if they are inexpensive
9
![Page 10: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/10.jpg)
Practice Defensive Programming
Assume that you will make mistakes Write code to catch them
On method entry Check rep invariant (i.e., call checkRep()) Check preconditions (requires clause)
On method exit Check rep invariant (call checkRep()) Check postconditions
Checking rep invariant helps find bugs Reasoning about rep invariant helps avoid bugsFall 17 CSCI 2600, A Milanova (based on notes by Michael Ernst) 10
![Page 11: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/11.jpg)
Outline
Reasoning about ADTs Representation invariants (rep invariants) Representation exposure Checking rep invariants
Abstraction functions
Review and practice problems
Fall 17 CSCI 2600, A Milanova 11
![Page 12: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/12.jpg)
Abstraction Function: rep abstract value
The abstraction function maps valid concrete data representation to the abstract value it represents
AF: Object abstract value
The abstraction function lets us reason about behavior from the client perspective
Fall 17 CSCI 2600, A Milanova (based on a slide by Michael Ernst) 12
![Page 13: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/13.jpg)
Abstraction Function Example
class Poly {
// Rep invariant: …
private int[] coeffs;
private int degree;
// Abstraction function: coeffs [a0,a1,…adegree]
// represents polynomial
// adegreexdegree + … + a1x + a0
// E.g., array [-2,1,3] 3x2 + x - 2
// Empty array represents the 0 polynomial
…
Fall 17 CSCI 2600, A Milanova 13
The valid rep is the domain of the
AF
The valid rep is the domain of the
AF
The polynomial, described in terms of (abstract) specification fields, is the range of
the AF
The polynomial, described in terms of (abstract) specification fields, is the range of
the AF
![Page 14: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/14.jpg)
Another Abstraction Function Example
class IntSet {
// Rep invariant:
// data contains no nulls and no duplicates
private List<Integer> data;
// Abstraction function: List [a1,a2,…an]
// represents the set { a1, a2, … an }.
// Empty list represents {}.
…
public IntSet() …
Fall 17 CSCI 2600, A Milanova 14
![Page 15: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/15.jpg)
Abstraction Function: mapping rep to abstract value
Abstraction function: Object abstract value I.e., the object’s rep maps to abstract value
IntSet e.g.: list [2, 3, 1] { 1, 2, 3 } Many concrete reps map to the same abstract
value IntSet e.g.: [2, 3, 1] { 1, 2, 3 } and
[3, 1, 2] { 1, 2, 3 } and [1, 2, 3] { 1, 2, 3 }
Not a function in the opposite direction One abstract value maps to many objects
Fall 17 CSCI 2600, A Milanova 15
![Page 16: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/16.jpg)
The IntSet Implementationclass IntSet { // Rep invariant: // data has no nulls and no duplicates private List<Integer> data = new ArrayList<Integer>(); public void add(int x) { if (!contains(x)) data.add(x); } public void remove(int x) { data.remove(new Integer(x)); } public boolean contains(int x) { return data.contains(x) } public int size() { return data.size(); }}
16
The representation
(the rep)
The representation
(the rep)
![Page 17: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/17.jpg)
Another (Implementation of) IntSet
What if we dropped the “no duplicates” constraint from the rep invariant
class IntSet {
// Rep invariant: data contains no nulls
private List<Integer> data;
… Can we still represent the concept of the IntSet? (Remember, an IntSet is a mutable set of integers with no duplicates.)
Fall 17 CSCI 2600, A Milanova 17
![Page 18: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/18.jpg)
Yes. But we must change the abstraction function
class IntSet {
// Rep invariant: data contains no nulls
private List<Integer> data;
// Abstraction function: List data // represents the smallest set // { a1, a2, … an } such that each ai is
// in data. Empty list represents {}.
…
public IntSet() …
Fall 17 CSCI 2600, A Milanova 18
![Page 19: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/19.jpg)
Another IntSet
class IntSet {
// Rep invariant: data contains no nulls
private List<Integer> data;
…[1,1,2,3] { 1, 2, 3 }[1,2,3,1] { 1, 2, 3 }
etc.
There are many objects that correspond to the same abstract valueFall 17 CSCI 2600, A Milanova 19
![Page 20: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/20.jpg)
Another IntSet
We must change the implementation of the concrete operations as well
What is the implication for add(int x) and remove(int x)? For size()?
add(int x) no longer needs to check contains(x). Why?
remove(int x) must remove all occurrences of x in data. Why?
What about size()? What else?Fall 17 CSCI 2600, A Milanova 20
![Page 21: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/21.jpg)
Correctness
Abstraction function allows us to reason about correctness of the implementation
Fall 17 CSCI 2600, A Milanova 21
Concrete object Concrete object’
Abstract value Abstract value’
AF: AF:
Abstract operation:
Concrete operation(i.e., our implementation of operation):
![Page 22: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/22.jpg)
IntSet Example
Fall 17 CSCI 2600, A Milanova 22
[2,1,1,2,3]
AF: AF:
abstract remove(1):this – { 1 }
Concrete remove(1)
[2,2,3]
{ 1,2,3 } { 2,3 }
Creating concrete object: Establish rep invariant Establish abstraction function
After every operation: Maintains rep invariant Maintains abstraction function
![Page 23: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/23.jpg)
Aside: the Rep Invariant
Which implementation is betterclass IntSet { // Rep invariant: // data has no nulls and no duplicates … // methods establish, maintain invariant, // maintain consistency w.r.t. original AF
orclass IntSet { // Rep invariant: data has no nulls … // methods maintain this weaker invariant, // maintain consistency w.r.t. to new AF
23
![Page 24: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/24.jpg)
Aside: the Rep Invariant
Often the rep invariant simplifies the abstraction function (specifically, it simplifies the domain of the abstraction function)
Consequently, rep invariant simplifies implementation and reasoning!
Fall 17 CSCI 2600, A Milanova 24
![Page 25: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/25.jpg)
Benevolent Side Effects
Another implementation of IntSet.contains:public boolean contains(int x) { int i = data.indexOf(x); if (i == -1) return false; // move-to front optimization // speeds up repeated membership tests Integer y = data.elementAt(0); data.set(0,x); data.set(i,y);} Mutates rep, but does not change abstract value!
Fall 17 CSCI 2600, A Milanova (based on slide by Michael Ernst) 25
![Page 26: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/26.jpg)
ADT is a Specification
Specification of contains remains
// returns: (x in this)
boolean contains(int x);
The specification reflects modification/effects on abstract state (i.e., specification fields), not concrete state (i.e., representation fields)!
Fall 17 CSCI 2600, A Milanova 26
![Page 27: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/27.jpg)
Another Example: String.hashCode()
// returns: the hashCode value of this stringpublic int hashCode() { int h = this.hash; // rep. field hash if (h == 0) { // caches the hashcode char[] val = value; int len = count; for (int i = 0; i < len; i++) { h = 31*h + val[i]; } this.hash = h; // modifies rep. field } return h;}
Fall 17 CSCI 2600, A Milanova 27
![Page 28: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/28.jpg)
Writing an Abstraction Function
The domain is all representations that satisfy the rep invariant Rep invariant simplifies the AF by restricting its
domain The range is the set of abstract values
Denoted with specification fields and derived spec fields Relatively easy for mathematical concepts like sets Trickier for “real-world” ADTs (e.g., Person, Meeting)
Specification fields and derived specification fields help describe abstract values
Fall 17 CSCI 2600, A Milanova (based on slide by Michael Ernst) 28
![Page 29: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/29.jpg)
Specification Fields
Describe abstract values. Think of the abstract value as if it were an object with fields
E.g., math concept of a LineSegment start-point and end-point are
specification fields length is a derived specification field
Can be derived from spec fields but it’s useful to have
Range of AF and specs of operations are in terms of specification fields
29
![Page 30: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/30.jpg)
Specification Fields
Often abstract values aren’t clean mathematical objects E.g., concept of Customer, Meeting, Item Define those in terms of specification fields: e.g.,
a Meeting can be specified with specification fields date, location, attendees
In general, specification fields (the specification) are different from the representation fields (the implementation)
Fall 17 CSCI 2600, A Milanova 30
![Page 31: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/31.jpg)
ADTs and Java Language Features
Java classes Make operations of the ADT public methods Make other operations private Clients can only access the ADT operations
Java interfaces Clients only see the ADT operations, nothing else Multiple implementations, no code in common Cannot include creators (constructors) or fields
Fall 17 CSCI 2600, A Milanova (based on slide by Michael Ernst) 31
![Page 32: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/32.jpg)
ADTs and Java Language Features
Both classes and interfaces can apply Write and rely upon careful ADT specifications
When coding, prefer interface types over specific class types
E.g., we used List<Integer> data not ArrayList<Integer> data
to declare the rep field. Why?
Fall 17 CSCI 2600, A Milanova 32
![Page 33: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/33.jpg)
Implementing an ADT: Summary
Rep invariant Defines the set of valid objects (concrete values)
Abstraction function Defines, for each valid object, which abstract
value it represents Together they modularize the implementation
Can reason about operations in isolation Neither is part of the ADT abstraction!!!
Fall 17 CSCI 2600, A Milanova (slide by Michael Ernst) 33
![Page 34: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/34.jpg)
Implementing an ADT: Summary
In practice Always write a rep invariant!
Write an abstraction function when you need it Write a precise but informal abstraction function A formal one is hard to write, and often not that useful As always with specs: we look for the balance
between what is “formal enough to do reasoning” and what is “humanly readable and useful”
Fall 17 CSCI 2600, A Milanova (slide by Michael Ernst) 34
![Page 35: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/35.jpg)
Exercise
The mathematical concept of the LineSegment
Choose spec fields (abstraction)
Choose rep fields Write rep invariant Write abstraction function
Fall 17 CSCI 2600, A Milanova 35
![Page 36: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/36.jpg)
LineSegment Solution (sketch)
Abstraction:
LineSegment {
@specfield start_point
@specfield end_point
…
}
Fall 17 CSCI 2600, A Milanova 36
![Page 37: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/37.jpg)
LineSegment Solution (sketch)
Implementation:
class LineSegment {
float x1, y1;
float x2, y2;
// Rep invariant: !(x1==x2 && y1==y2)
// AF: {x1,y1,x2,y2} represents the // line segment with start_point (x1,y1) // and end_point (x2,y2)
}37
![Page 38: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/38.jpg)
LineSegment Solution (sketch)
Stronger rep invariant to simplify AF and implementation:
class LineSegment {
float x1, y1;
float x2, y2;
// Rep invariant: (x1,y1) is lexicographically // smaller than (x2,y2) i.e., // (x1 < x2) || (x1 == x2 && y1 < y2)
// AF: … }38
![Page 39: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/39.jpg)
Exercise
Suppose we decided to represent our polynomial with a list of terms:
private List<Terms> terms; Write the abstraction function
Use e(terms[i]) to refer to exponent of ith term Use c(terms[i]) to refer to coefficient of ith term
Be concise and precise
39
![Page 40: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/40.jpg)
Review Problems: IntMap Specification
The Overview:
/** An IntMap is a mapping from integers to integers.
* It implements a subset of the functionality of Map<int,int>.
* All operations are exactly as specified in the documentation
* for Map.
*
* IntMap can be thought of as a set of key-value pairs:
*
* @specfield pairs = { <k1, v1>, <k2, v2>, <k3, v3>, ... }
*/
Fall 17 CSCI 2600, A Milanova (spec by Michael Ernst) 40
![Page 41: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/41.jpg)
Review Problems: IntMap Specification
interface IntMap {
/** Associates specified value with specified key in this map. */
bool put(int key, int val);
/** Removes the mapping for the key from this map if it is present. */
int remove(int key);
/** Returns true if this map contains a mapping for the specified key. */
bool containsKey(int key);
/** Returns the value to which specified key is mapped, or 0 if this map contains no mapping for the key. */
int get(int key);
}
41Fall 17 CSCI 2600, A Milanova (spec by Michael Ernst)
![Page 42: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/42.jpg)
Review Problems: IntStack Specification
/**
* An IntStack represents a stack of ints.
* It implements a subset of the functionality of Stack<int>.
* All operations are exactly as specified in the documentation
* for Stack.
*
* IntStack can be thought of as an ordered list of ints:
*
* @specfield stack = [a_0, a_1, a_2, ..., a_k]
*/
42Fall 17 CSCI 2600, A Milanova (spec by Michael Ernst)
![Page 43: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/43.jpg)
Review Problems: IntStack Specification
interface IntStack {
/** Pushes an item onto the top of this stack.
* If stack_pre = [a_0, a_1, a_2, ..., a_(k-1), a_k]
* then stack_post = [a_0, a_1, a_2, ..., a_(k-1), a_k, val].
*/
void push(int val);
/**
* Removes the int at the top of this stack and returns that int.
* If stack_pre = [a_0, a_1, a_2, ..., a_(k-1), a_k]
* then stack_post = [a_0, a_1, a_2, ..., a_(k-1)]
* and the return value is a_k.
*/
int pop();
}
43
![Page 44: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/44.jpg)
Review Problems: Rep Invariants and Abstraction Functions
Willy Wazoo wants to write an IntMap but only knows how to use an IntStack!
So he starts like this before he gets stuck
class WillysIntMap implements IntMap {
private IntStack theRep;
… Help Willy write the rep invariant and abstraction
functionFall 17 CSCI 2600, A Milanova (problem due to Mike Ernst) 44
![Page 45: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/45.jpg)
WillysIntMap Solution (Sketch)
Rep Invariant:theRep != nulltheRep.size is even[a_0,a_2,…,a_(theRep.size-2)] subset of stack rep contains no duplicates
AF: [a_0,a_1,...,a_(k-1), a_k] stack represents IntMap { <a_0,a_1>,...,<a_(k-1),a_k> }
Fall 17 CSCI 2600, A Milanova 45
![Page 46: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/46.jpg)
Review Problems
Now help Willy implement an IntStack with an IntMap
class WillysIntStack implements IntStack {
private IntMap theRep;
private int size;
…
Write a rep invariant and abstraction function
Fall 17 CSCI 2600, A Milanova 46
![Page 47: ADTs, Representation Invariants and Abstraction Functions](https://reader035.vdocument.in/reader035/viewer/2022081503/56813e24550346895da8035a/html5/thumbnails/47.jpg)
WillysIntStack Solution (Sketch)
RI:theRep != nulltheRep.size = sizetheRep.keySet = {1,2,…,size}
AF: IntMap { <1,a_1>,...,<size,a_size> } represents stack [a_1, a_2, ... a_size]
Fall 17 CSCI 2600, A Milanova 47