type stack T { s : seq T; axioms: { true } push(t:T) { s' = s \. <> } { s \neq << >> } pop() { s = { s' } \. <> } }; slide: The specification of a stack
template implementation class as { int t; T a[MAX]; public: as() { t = 0; } void push(T e) { require(t0); return a[--t]; } invariant: 0 <= t && t < MAX; }; slide: The realization of a stack
<< %a, %r, %x >>
%s <= %t
%x(x.m(a)) = %p_{m}
stack <= bag
put(i): require size( b.elems ) < b.bound promise b' = << b. elems \uplus { i }, b.bound >> push(i): require length( s.items ) < s.limit promise s' = << s.items \. i, s.limit >> slide: Behavioral subtypes -- example
stack -> bag