package chat; import java.io.*; import java.net.*; import java.util.*; /*@ predicate member(Member member) = member.nick |-> ?nick &*& member.writer |-> ?writer &*& writer != null &*& Writer(writer.getClass())(writer, _); lemma void member_distinct(Member m1,Member m2) requires member(m1) &*& member(m2); ensures member(m1) &*& member(m2) &*& m1 != m2; { open member(m1); open member(m2); close member(m2); close member(m1); } lemma void foreach_member_not_contains(list<Member> members, Member member) requires foreach(members, @member) &*& member(member); ensures foreach(members, @member) &*& member(member) &*& !mem<Object>(member, members); { switch (members) { case nil: case cons(m, ms): open foreach(members, @member); member_distinct(m, member); foreach_member_not_contains(ms, member); close foreach(members, @member); } } @*/ class Member { String nick; Writer writer; public Member(String nick, Writer writer) //@ requires writer != null &*& Writer(writer.getClass())(writer, _); //@ ensures member(this); { this.nick = nick; this.writer = writer; //@ close member(this); } }