Silly example to help us practice thinking through a scenario with multiple collaborating/communicating participants.

- Suppose there are \(n\) children and one teacher
- The children have just come inside from playing, and \(k\ge 1\) of them have mud on their foreheads
- (\(k\) is not known to the children)

- The children are all perfectly rational and logical (:joy:)
- The children sit in a circle
- Everyone can see everyone else's forehead
- No one can see their own forehead

- The children cannot and do not communicate.
- Q: based on what they see and know, can any child tell if they have mud on their forehead?
- No.

- The teacher says we will play the following game:
- The teacher announces "someone has mud on their forehead"
- while True:
- everyone close their eyes
- raise your hand if you know you have mud on your forehead
- put your hands down
- open your eyes
- teacher announces results as follows:
- if exactly the right set of people raise their hand, everyone wins and game is over
- if at least one person raises their hand, but not exactly the right set, everyone loses and game is over
- if no one raises their hand, teacher announces that no one did, and game continues in next round

- We worked this out in class

- First, let's think about the case where \(k=1\)
- when the teacher announces "someone has mud", the muddy student gets new information! (everyone they can see does not have mud) so they raise their hand.

- When \(k=2\), in first round, nobody raises hand.
- But then teacher announces that no one raised hand, and
*that*gives them information.- From one of the muddy student's perspectives, we can see that there is only one other muddy student, so they know \(k=1\) or \(k=2\)
- So after that other student does not act in the first round (and because they know that other student is perfectly rational etc.), we can conclude that we are muddy.

- But then teacher announces that no one raised hand, and
- In general, game proceeds for \(k-1\) rounds where no one raises their hand, and then all muddy students raise their hand in the \(k\)-th round.

- When \(k>1\), the teacher's announcement does not tell any student any information they don't already know
- But the game doesn't work without the announcement
- "Paradox"

- The paradox is resolved by realizing that the announcement tells us something about what
*others*know.- Recall \(k=2\). After the announcement, if we are a muddy student, we know that the only muddy student we see would be able to raise their hand if \(k=1\).

- So knowledge about
*what other people know*is essential to the example

- Each node has their own local state
- They can send messages about their state to other nodes
- Other nodes can respond saying "I received your message"
- Now the original sender "knows that the receiver knows" about our state
- This kind of reasoning is pervasive.

- One hard thing about reasoning about distributed systems is separating the "bird's eye view" from the local view
- In single node programming, this distinction does not exist
- But this distinction is absolutely fundamental to distributed systems
- Unless we communicate, I have no idea what your local state is.
- Even if we do communicate, I only know what you tell me, and I only know that it was true when you sent the message.
- Partial information.