A member keeps every reader's invariant #
ReadersOK: every reader of a member is filed under its own stream and satisfies Inv for some
history. Every call on a member keeps it, given well-formed walk reports (Event.WF).
A reader filed under m reads m's stream and keeps what is true of some history.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
p keeps every reader OK.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Keeping is closed under the state monad #
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.Keeps.set
{g' : Group}
(h' : ReadersOK g'.readers)
:
Keeps (MonadStateOf.set g')
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.Keeps.frame
{f : Group → Group}
(hf : ∀ (g : Group), (f g).readers = g.readers)
:
Keeps (_root_.modify f)
Readers #
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.ReadersOK.erase
{d : Common.Dict Key Reader}
(hd : ReadersOK d)
(k : Key)
:
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.Good.congr
{m : Key}
{r r' : Reader}
(h : Good m r)
(hs : r'.stream = r.stream)
(hp : r'.passed = r.passed)
(hk : r'.kept = r.kept)
(hl : r'.lost = r.lost)
(hla : r'.last = r.last)
:
Good m r'
Inv depends only on what a reader keeps, so a reader that keeps the same is as good.
def
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.WalkWF
(skipped : List Index)
(steps : ℕ)
:
What a driver reports of a walk is possible: it kept no more boxes than it stepped past.
Equations
- Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.WalkWF skipped steps = (skipped.length ≤ steps)
Instances For
Each function of a member #
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.keeps_follow
(rc : ByteArray)
(s : Index)
:
Keeps (Group.follow rc s)
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.keeps_setReader
{r : Reader}
(hr : Good r.stream r)
:
Keeps (Group.setReader r)
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.keeps_beginRoster
(m i : Key)
:
Keeps (Group.beginRoster m i)
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.keeps_started
(m : Key)
(i : Index)
:
Keeps (Group.started m i)
modify of a function that leaves readers alone.
Equations
- One or more equations did not get rendered due to their size.
Instances For
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.keeps_noteOwn
(i : Key)
(b : Index)
(n : Key)
:
Keeps (Group.noteOwn i b n)
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.keeps_noteAwaited
(i : Key)
(b : Index)
(n : Key)
:
Keeps (Group.noteAwaited i b n)
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.keeps_noteNew
(i : Key)
(b : Index)
(intro : Introduction)
:
Keeps (Group.noteNew i b intro)
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.keeps_introduced
(i : Key)
(b : Index)
(intro : Introduction)
:
Keeps (Group.introduced i b intro)
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.keeps_deliver
(s : Key)
(b : Index)
(msg : Message)
:
Keeps (Group.deliver s b msg)
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.keeps_ingest
(s : Key)
(b : Index)
(msg : Message)
:
Keeps (Group.ingest s b msg)
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.keeps_boxRead
(s : Key)
(b : Index)
(res : ReadResult)
(n : Option Index)
:
Keeps (Group.boxRead s b res n)
Writing #
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.keeps_written
(t : ℕ)
(b : Index)
(pt : Option Payload)
:
Keeps (Group.written t b pt)
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.keeps_stage
(m : Message)
(p : Pending)
:
Keeps (Group.stage m p)
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.keeps_withAcks
(m : Message)
(p : Pending)
:
Keeps (Group.withAcks m p)
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.keeps_introduction
(name : String)
(rc : ByteArray)
:
Keeps (Group.introduction name rc)
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.keeps_introduceNow
(name : String)
(rc : ByteArray)
:
Keeps (Group.introduceNow name rc)
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.keeps_invite
(name : String)
(rc : ByteArray)
(c : Bool)
:
Keeps (Group.invite name rc c)
Membership and time #
Every call on a member #
What a driver reports is possible: a walk kept no more boxes than it stepped past.
Equations
- (Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.Event.walked stream target skipped steps).WF = Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.WalkWF skipped steps
- x✝.WF = True
Instances For
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.handle_keeps
{e : Event}
(hwf : e.WF)
:
Keeps (Group.handle e)
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.observe_keeps
(s : Key)
(b : Index)
(msg : Option Message)
(n : Index)
:
Keeps (Group.observe s b msg n)
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.written_keeps
(t : ℕ)
(b : Index)
(pt : Option Payload)
:
Keeps (Group.written t b pt)
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.introduceNow_keeps
(name : String)
(rc : ByteArray)
:
Keeps (Group.introduceNow name rc)
Starting #
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.found_ok
(rc : ByteArray)
(fs : List ByteArray)
(policy : Retention)
(w : ℕ)
:
ReadersOK (Group.found rc fs policy w).readers
theorem
Cryptlib.Protocols.GroupComm.GroupChatKatzenqt1.Member.joined_ok
(rc : ByteArray)
(reply : JoinReply)
(policy : Retention)
(w : ℕ)
:
ReadersOK (Group.joined rc reply policy w).readers
Acknowledgements sent #
A member as calls on it can leave it, from its start.
- found (rc : ByteArray) (fs : List ByteArray) (policy : Retention) (w : ℕ) : Reachable (Group.found rc fs policy w)
- joined (rc : ByteArray) (reply : JoinReply) (policy : Retention) (w : ℕ) : Reachable (Group.joined rc reply policy w)
- handle {g : Group} (e : Event) : e.WF → Reachable g → Reachable (StateT.run (Group.handle e) g).2
- observe {g : Group} (s : Key) (b : Index) (msg : Option Message) (n : Index) : Reachable g → Reachable (StateT.run (Group.observe s b msg n) g).2
- compose {g : Group} (c : Option ByteArray) : Reachable g → Reachable (StateT.run (Group.compose c) g).2
- written {g : Group} (t : ℕ) (b : Index) (pt : Option Payload) : Reachable g → Reachable (StateT.run (Group.written t b pt) g).2
- abandoned {g : Group} (t : ℕ) : Reachable g → Reachable (StateT.run (Group.abandoned t) g).2
- beginInduction {g : Group} : Reachable g → Reachable (StateT.run Group.beginInduction g).2
- introduceNow {g : Group} (name : String) (rc : ByteArray) : Reachable g → Reachable (StateT.run (Group.introduceNow name rc) g).2
- cancelInduction {g : Group} : Reachable g → Reachable (StateT.run Group.cancelInduction g).2
- remove {g : Group} (m : Key) : Reachable g → Reachable (StateT.run (Group.remove m) g).2
- policy
{g : Group}
(p : Retention)
: Reachable g →
Reachable
{ readCap := g.readCap, policy := p, recheck := g.recheck, rosters := g.rosters, readers := g.readers,
sent := g.sent, ledger := g.ledger, epoch := g.epoch, pool := g.pool, tip := g.tip, deriving_ := g.deriving_,
outbox := g.outbox, pending := g.pending, tokens := g.tokens, unnumbered := g.unnumbered,
introducedAt := g.introducedAt, joinedThrough := g.joinedThrough, awaitingStart := g.awaitingStart,
received := g.received }
The client changes its retention policy, as a user's disappearing messages setting does.