class: center, middle # Artificial Intelligence ## My Research --- # My Research * I work on interactions between humans and AI agents * This includes communication and collaboration * I am also particularly interested in non-verbal communication * For most of my research I use games! --- # Recall: Grice's Maxims of Communication * The cooperative principle was divided into four maxims by H.P. Grice - The Maxim of Quality - The Maxim of Quantity - The Maxim of Relation - The Maxim of Manner --- class: medium # Intentionality * How do we deduce the meaning of speech acts? * Grice's maxims tell us that sentences that are uttered should be true, necessary, relevant, and unambiguous * To determine what makes a sentence necessary and relevant, we determine which goal the speaker might have * Intentionality refers to the assumption that actions are performed in service of a goal * If I say "It is hot in here" to someone by a window, my *goal* is most likely to cool down --- # Hanabi .left-column[
] .right-column[ * Cooperative card game * Cards in 5 colors, with ranks 1 to 5 * Players can't see their own cards * Communication is restricted ] --- class: medium # Hanabi * Players have to decide which card to play without knowing which cards they have * A player may give another player a *hint* * The number of hints is limited * Communication has to utilize this hints efficiently * Google Brain and Deep Mind have called Hanabi "a new frontier for AI Research" .cite[Nolan Bard et al. *The Hanabi Challenge: A New Frontier for AI Research*, arXiv:1902.00506, 2019] --- class: medium # Intentionality * Humans expect goal-directed behavior from intelligent entities, such as our agents * This means the agents should determine a goal, but also how to achieve it * For cooperation they then need to convey that plan to the human * Care must be taken to avoid giving ambiguous hints --- # Intentionality and Grice's Maxims * Each *hint* is a speech act * Speech act should serve goals * When the AI agent gives a hint, the human player will try to deduce this goal * The AI agent can use Grice's maxims to *predict* how each of its hints will likely be received --- # A Model of Belief * In order to predict what the player will do, the AI agent needs to model what they player believes * A speech act/hint changes this belief * The prediction model then matches the changed beliefs with potential goals in the game * The AI agent then forms their own goal, and only gives hints for which it predicts the player to follow the same goal --- # A Gricean Game * The game only allows hints that are true (maxim of quality) * Using its model of the player's beliefs, the agent avoids giving redundant hints (maxim of quantity) * A hint will only be given if it serves a goal (maxim of relation) * If a hint could serve multiple goals, it is not given (maxim of manner) --- class: medium # Intentionality * Humans expect goal-directed behavior from intelligent entities, such as our agents * This means the agents should determine a goal, but also how to achieve it * For cooperation they then need to convey that plan to the human * Care must be taken to avoid giving ambiguous hints --- # Results
.cite[**Markus Eger**, Chris Martens, and Marcela Alfaro Cordoba. *An intentional AI for Hanabi*, CIG 2017] --- class: medium # Non-Verbal communication * People communicate in a variety of ways * We have looked into timing, gaze and facial expressions * Timing: Longer thinking times may indicate uncertainty * Gaze: Where a player looks indicates what they are planning or considering * Facial Expressions: Happyness/Anger/Surprise may give information about hidden information --- # Timing in Hanabi * We developed an improved version of the Hanabi agent that measures how long the human player thinks * This information can be used to determine how certain they are about what to do * The agent uses this information to help with interpreting the human player's actions * We performed an online experiment to show that this can actually help --- # Timing in Hanabi Longer thinking times typically indicate less certainty
.cite[**Markus Eger**, et al. *Operationalizing Intentionality to Play Hanabi with Human Players*, 2020] --- # Timing in Hearthstone
--- # Gaze In Hanabi
--- # Recall: A Logic Joke Three logicians walk into a bar. The bar tender asks: "Three beers?" The first logician responds: "I don't know." The second logician responds: "I don't know." The third logician responds: "Yes." --- # Belief modeling * In Hanabi the agent had a simplistic model of what the human player already knows * In general, we want our agents to model the beliefs of other players in order to communicate effectively * One possible model is Dynamic Epistemic Logic --- # Dynamic Epistemic Logic: Possible Worlds * In Epistemic Logic the world state is represented using possible worlds * There is a world representing the ground truth * Additionally, each agent has a set of worlds that they consider possible (consistent with the information they have) * **Dynamic** Epistemic Logic then provides the formal means to express change of these beliefs --- # Dynamic Epistemic Logic: Logicians Example - If a logician knows that all three logicians want a beer, they say "yes" $$ ?(\Box_l \forall x\:\: \mathit{wb}(x)) \cdot \text{flip}\: \mathit{say}(l, \text{yes}) $$ - If they know that at least one logician does not want a beer, they say "no" $$ ?(\Box_l \exists x\:\: \neg \mathit{wb}(x)) \cdot \text{flip}\: \mathit{say}(l, \text{no}) $$ - Otherwise, they say "I don't know" $$ ?((\neg \Box_l \forall x\:\: \mathit{wb}(x)) \wedge (\neg \Box_l \exists x\:\: \neg \mathit{wb}(x)))\cdot \\\\ \text{flip}\: \mathit{say}(l, \text{idk}) $$ --- # An Example: One Night Ultimate Werewolf
.cite[**Markus Eger** and Chris Martens. *A Study of AI Agent Commitment in One Night Ultimate Werewolf with Human Players*, AIIDE 2019] --- # Action Encoding .tiny[ (?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(a,Werewolf) . flip role(tmp,Werewolf) + ?role(a,Rascal) . flip role(tmp,Rascal) + ?role(a,Villager) . flip role(tmp,Villager)) . (?role(a,Werewolf) . flip role(a,Werewolf) + ?role(a,Rascal) . flip role(a,Rascal) + ?role(a,Villager) . flip role(a,Villager) + ?!role(a,Werewolf) . ?!role(a,Rascal) . ?!role(a,Villager)) . (?role(c,Werewolf) . flip role(a,Werewolf) + ?role(c,Rascal) . flip role(a,Rascal) + ?role(c,Villager) . flip role(a,Villager)) . (?role(c,Werewolf) . flip role(c,Werewolf) + ?role(c,Rascal) . flip role(c,Rascal) + ?role(c,Villager) . flip role(c,Villager) + ?!role(c,Werewolf) . ?!role(c,Rascal) . ?!role(c,Villager)) . (?role(tmp,Werewolf) . flip role(c,Werewolf) + ?role(tmp,Rascal) . flip role(c,Rascal) + ?role(tmp,Villager) . flip role(c,Villager)) . (?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(a,Werewolf) . flip role(tmp,Werewolf) + ?role(a,Rascal) . flip role(tmp,Rascal) + ?role(a,Villager) . flip role(tmp,Villager)) . (?role(a,Werewolf) . flip role(a,Werewolf) + ?role(a,Rascal) . flip role(a,Rascal) + ?role(a,Villager) . flip role(a,Villager) + ?!role(a,Werewolf) . ?!role(a,Rascal) . ?!role(a,Villager)) . (?role(a,Werewolf) . flip role(a,Werewolf) + ?role(a,Rascal) . flip role(a,Rascal) + ?role(a,Villager) . flip role(a,Villager)) . (?role(a,Werewolf) . flip role(a,Werewolf) + ?role(a,Rascal) . flip role(a,Rascal) + ?role(a,Villager) . flip role(a,Villager) + ?!role(a,Werewolf) . ?!role(a,Rascal) . ?!role(a,Villager)) . (?role(tmp,Werewolf) . flip role(a,Werewolf) + ?role(tmp,Rascal) . flip role(a,Rascal) + ?role(tmp,Villager) . flip role(a,Villager)) + ?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(a,Werewolf) . flip role(tmp,Werewolf) + ?role(a,Rascal) . flip role(tmp,Rascal) + ?role(a,Villager) . flip role(tmp,Villager)) . (?role(a,Werewolf) . flip role(a,Werewolf) + ?role(a,Rascal) . flip role(a,Rascal) + ?role(a,Villager) . flip role(a,Villager) + ?!role(a,Werewolf) . ?!role(a,Rascal) . ?!role(a,Villager)) . (?role(b,Werewolf) . flip role(a,Werewolf) + ?role(b,Rascal) . flip role(a,Rascal) + ?role(b,Villager) . flip role(a,Villager)) . (?role(b,Werewolf) . flip role(b,Werewolf) + ?role(b,Rascal) . flip role(b,Rascal) + ?role(b,Villager) . flip role(b,Villager) + ?!role(b,Werewolf) . ?!role(b,Rascal) . ?!role(b,Villager)) . (?role(tmp,Werewolf) . flip role(b,Werewolf) + ?role(tmp,Rascal) . flip role(b,Rascal) + ?role(tmp,Villager) . flip role(b,Villager)) + ?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(a,Werewolf) . flip role(tmp,Werewolf) + ?role(a,Rascal) . flip role(tmp,Rascal) + ?role(a,Villager) . flip role(tmp,Villager)) . (?role(a,Werewolf) . flip role(a,Werewolf) + ?role(a,Rascal) . flip role(a,Rascal) + ?role(a,Villager) . flip role(a,Villager) + ?!role(a,Werewolf) . ?!role(a,Rascal) . ?!role(a,Villager)) . (?role(c,Werewolf) . flip role(a,Werewolf) + ?role(c,Rascal) . flip role(a,Rascal) + ?role(c,Villager) . flip role(a,Villager)) . (?role(c,Werewolf) . flip role(c,Werewolf) + ?role(c,Rascal) . flip role(c,Rascal) + ?role(c,Villager) . flip role(c,Villager) + ?!role(c,Werewolf) . ?!role(c,Rascal) . ?!role(c,Villager)) . (?role(tmp,Werewolf) . flip role(c,Werewolf) + ?role(tmp,Rascal) . flip role(c,Rascal) + ?role(tmp,Villager) . flip role(c,Villager)) + ?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(b,Werewolf) . flip role(tmp,Werewolf) + ?role(b,Rascal) . flip role(tmp,Rascal) + ?role(b,Villager) . flip role(tmp,Villager)) . (?role(b,Werewolf) . flip role(b,Werewolf) + ?role(b,Rascal) . flip role(b,Rascal) + ?role(b,Villager) . flip role(b,Villager) + ?!role(b,Werewolf) . ?!role(b,Rascal) . ?!role(b,Villager)) . (?role(a,Werewolf) . flip role(b,Werewolf) + ?role(a,Rascal) . flip role(b,Rascal) + ?role(a,Villager) . flip role(b,Villager)) . (?role(a,Werewolf) . flip role(a,Werewolf) + ?role(a,Rascal) . flip role(a,Rascal) + ?role(a,Villager) . flip role(a,Villager) + ?!role(a,Werewolf) . ?!role(a,Rascal) . ?!role(a,Villager)) . (?role(tmp,Werewolf) . flip role(a,Werewolf) + ?role(tmp,Rascal) . flip role(a,Rascal) + ?role(tmp,Villager) . flip role(a,Villager)) + ?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(b,Werewolf) . flip role(tmp,Werewolf) + ?role(b,Rascal) . flip role(tmp,Rascal) + ?role(b,Villager) . flip role(tmp,Villager)) . (?role(b,Werewolf) . flip role(b,Werewolf) + ?role(b,Rascal) . flip role(b,Rascal) + ?role(b,Villager) . flip role(b,Villager) + ?!role(b,Werewolf) . ?!role(b,Rascal) . ?!role(b,Villager)) . (?role(b,Werewolf) . flip role(b,Werewolf) + ?role(b,Rascal) . flip role(b,Rascal) + ?role(b,Villager) . flip role(b,Villager)) . (?role(b,Werewolf) . flip role(b,Werewolf) + ?role(b,Rascal) . flip role(b,Rascal) + ?role(b,Villager) . flip role(b,Villager) + ?!role(b,Werewolf) . ?!role(b,Rascal) . ?!role(b,Villager)) . (?role(tmp,Werewolf) . flip role(b,Werewolf) + ?role(tmp,Rascal) . flip role(b,Rascal) + ?role(tmp,Villager) . flip role(b,Villager)) + ?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(b,Werewolf) . flip role(tmp,Werewolf) + ?role(b,Rascal) . flip role(tmp,Rascal) + ?role(b,Villager) . flip role(tmp,Villager)) . (?role(b,Werewolf) . flip role(b,Werewolf) + ?role(b,Rascal) . flip role(b,Rascal) + ?role(b,Villager) . flip role(b,Villager) + ?!role(b,Werewolf) . ?!role(b,Rascal) . ?!role(b,Villager)) . (?role(c,Werewolf) . flip role(b,Werewolf) + ?role(c,Rascal) . flip role(b,Rascal) + ?role(c,Villager) . flip role(b,Villager)) . (?role(c,Werewolf) . flip role(c,Werewolf) + ?role(c,Rascal) . flip role(c,Rascal) + ?role(c,Villager) . flip role(c,Villager) + ?!role(c,Werewolf) . ?!role(c,Rascal) . ?!role(c,Villager)) . (?role(tmp,Werewolf) . flip role(c,Werewolf) + ?role(tmp,Rascal) . flip role(c,Rascal) + ?role(tmp,Villager) . flip role(c,Villager)) + ?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(c,Werewolf) . flip role(tmp,Werewolf) + ?role(c,Rascal) . flip role(tmp,Rascal) + ?role(c,Villager) . flip role(tmp,Villager)) . (?role(c,Werewolf) . flip role(c,Werewolf) + ?role(c,Rascal) . flip role(c,Rascal) + ?role(c,Villager) . flip role(c,Villager) + ?!role(c,Werewolf) . ?!role(c,Rascal) . ?!role(c,Villager)) . (?role(a,Werewolf) . flip role(c,Werewolf) + ?role(a,Rascal) . flip role(c,Rascal) + ?role(a,Villager) . flip role(c,Villager)) . (?role(a,Werewolf) . flip role(a,Werewolf) + ?role(a,Rascal) . flip role(a,Rascal) + ?role(a,Villager) . flip role(a,Villager) + ?!role(a,Werewolf) . ?!role(a,Rascal) . ?!role(a,Villager)) . (?role(tmp,Werewolf) . flip role(a,Werewolf) + ?role(tmp,Rascal) . flip role(a,Rascal) + ?role(tmp,Villager) . flip role(a,Villager)) + ?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(c,Werewolf) . flip role(tmp,Werewolf) + ?role(c,Rascal) . flip role(tmp,Rascal) + ?role(c,Villager) . flip role(tmp,Villager)) . (?role(c,Werewolf) . flip role(c,Werewolf) + ?role(c,Rascal) . flip role(c,Rascal) + ?role(c,Villager) . flip role(c,Villager) + ?!role(c,Werewolf) . ?!role(c,Rascal) . ?!role(c,Villager)) . (?role(b,Werewolf) . flip role(c,Werewolf) + ?role(b,Rascal) . flip role(c,Rascal) + ?role(b,Villager) . flip role(c,Villager)) . (?role(b,Werewolf) . flip role(b,Werewolf) + ?role(b,Rascal) . flip role(b,Rascal) + ?role(b,Villager) . flip role(b,Villager) + ?!role(b,Werewolf) . ?!role(b,Rascal) . ?!role(b,Villager)) . (?role(tmp,Werewolf) . flip role(b,Werewolf) + ?role(tmp,Rascal) . flip role(b,Rascal) + ?role(tmp,Villager) . flip role(b,Villager)) + ?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(c,Werewolf) . flip role(tmp,Werewolf) + ?role(c,Rascal) . flip role(tmp,Rascal) + ?role(c,Villager) . flip role(tmp,Villager)) . (?role(c,Werewolf) . flip role(c,Werewolf) + ?role(c,Rascal) . flip role(c,Rascal) + ?role(c,Villager) . flip role(c,Villager) + ?!role(c,Werewolf) . ?!role(c,Rascal) . ?!role(c,Villager)) . (?role(c,Werewolf) . flip role(c,Werewolf) + ?role(c,Rascal) . flip role(c,Rascal) + ?role(c,Villager) . flip role(c,Villager)) . (?role(c,Werewolf) . flip role(c,Werewolf) + ?role(c,Rascal) . flip role(c,Rascal) + ?role(c,Villager) . flip role(c,Villager) + ?!role(c,Werewolf) . ?!role(c,Rascal) . ?!role(c,Villager)) . (?role(tmp,Werewolf) . flip role(c,Werewolf) + ?role(tmp,Rascal) . flip role(c,Rascal) + ?role(tmp,Villager) . flip role(c,Villager)))^a . (?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(a,Werewolf) . flip role(tmp,Werewolf) + ?role(a,Rascal) . flip role(tmp,Rascal) + ?role(a,Villager) . flip role(tmp,Villager)) . (?role(a,Werewolf) . flip role(a,Werewolf) + ?role(a,Rascal) . flip role(a,Rascal) + ?role(a,Villager) . flip role(a,Villager) + ?!role(a,Werewolf) . ?!role(a,Rascal) . ?!role(a,Villager)) . (?role(a,Werewolf) . flip role(a,Werewolf) + ?role(a,Rascal) . flip role(a,Rascal) + ?role(a,Villager) . flip role(a,Villager)) . (?role(a,Werewolf) . flip role(a,Werewolf) + ?role(a,Rascal) . flip role(a,Rascal) + ?role(a,Villager) . flip role(a,Villager) + ?!role(a,Werewolf) . ?!role(a,Rascal) . ?!role(a,Villager)) . (?role(tmp,Werewolf) . flip role(a,Werewolf) + ?role(tmp,Rascal) . flip role(a,Rascal) + ?role(tmp,Villager) . flip role(a,Villager)) + ?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(a,Werewolf) . flip role(tmp,Werewolf) + ?role(a,Rascal) . flip role(tmp,Rascal) + ?role(a,Villager) . flip role(tmp,Villager)) . (?role(a,Werewolf) . flip role(a,Werewolf) + ?role(a,Rascal) . flip role(a,Rascal) + ?role(a,Villager) . flip role(a,Villager) + ?!role(a,Werewolf) . ?!role(a,Rascal) . ?!role(a,Villager)) . (?role(b,Werewolf) . flip role(a,Werewolf) + ?role(b,Rascal) . flip role(a,Rascal) + ?role(b,Villager) . flip role(a,Villager)) . (?role(b,Werewolf) . flip role(b,Werewolf) + ?role(b,Rascal) . flip role(b,Rascal) + ?role(b,Villager) . flip role(b,Villager) + ?!role(b,Werewolf) . ?!role(b,Rascal) . ?!role(b,Villager)) . (?role(tmp,Werewolf) . flip role(b,Werewolf) + ?role(tmp,Rascal) . flip role(b,Rascal) + ?role(tmp,Villager) . flip role(b,Villager)) + ?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(a,Werewolf) . flip role(tmp,Werewolf) + ?role(a,Rascal) . flip role(tmp,Rascal) + ?role(a,Villager) . flip role(tmp,Villager)) . (?role(a,Werewolf) . flip role(a,Werewolf) + ?role(a,Rascal) . flip role(a,Rascal) + ?role(a,Villager) . flip role(a,Villager) + ?!role(a,Werewolf) . ?!role(a,Rascal) . ?!role(a,Villager)) . (?role(c,Werewolf) . flip role(a,Werewolf) + ?role(c,Rascal) . flip role(a,Rascal) + ?role(c,Villager) . flip role(a,Villager)) . (?role(c,Werewolf) . flip role(c,Werewolf) + ?role(c,Rascal) . flip role(c,Rascal) + ?role(c,Villager) . flip role(c,Villager) + ?!role(c,Werewolf) . ?!role(c,Rascal) . ?!role(c,Villager)) . (?role(tmp,Werewolf) . flip role(c,Werewolf) + ?role(tmp,Rascal) . flip role(c,Rascal) + ?role(tmp,Villager) . flip role(c,Villager)) + ?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(b,Werewolf) . flip role(tmp,Werewolf) + ?role(b,Rascal) . flip role(tmp,Rascal) + ?role(b,Villager) . flip role(tmp,Villager)) . (?role(b,Werewolf) . flip role(b,Werewolf) + ?role(b,Rascal) . flip role(b,Rascal) + ?role(b,Villager) . flip role(b,Villager) + ?!role(b,Werewolf) . ?!role(b,Rascal) . ?!role(b,Villager)) . (?role(a,Werewolf) . flip role(b,Werewolf) + ?role(a,Rascal) . flip role(b,Rascal) + ?role(a,Villager) . flip role(b,Villager)) . (?role(a,Werewolf) . flip role(a,Werewolf) + ?role(a,Rascal) . flip role(a,Rascal) + ?role(a,Villager) . flip role(a,Villager) + ?!role(a,Werewolf) . ?!role(a,Rascal) . ?!role(a,Villager)) . (?role(tmp,Werewolf) . flip role(a,Werewolf) + ?role(tmp,Rascal) . flip role(a,Rascal) + ?role(tmp,Villager) . flip role(a,Villager)) + ?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(b,Werewolf) . flip role(tmp,Werewolf) + ?role(b,Rascal) . flip role(tmp,Rascal) + ?role(b,Villager) . flip role(tmp,Villager)) . (?role(b,Werewolf) . flip role(b,Werewolf) + ?role(b,Rascal) . flip role(b,Rascal) + ?role(b,Villager) . flip role(b,Villager) + ?!role(b,Werewolf) . ?!role(b,Rascal) . ?!role(b,Villager)) . (?role(b,Werewolf) . flip role(b,Werewolf) + ?role(b,Rascal) . flip role(b,Rascal) + ?role(b,Villager) . flip role(b,Villager)) . (?role(b,Werewolf) . flip role(b,Werewolf) + ?role(b,Rascal) . flip role(b,Rascal) + ?role(b,Villager) . flip role(b,Villager) + ?!role(b,Werewolf) . ?!role(b,Rascal) . ?!role(b,Villager)) . (?role(tmp,Werewolf) . flip role(b,Werewolf) + ?role(tmp,Rascal) . flip role(b,Rascal) + ?role(tmp,Villager) . flip role(b,Villager)) + ?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(b,Werewolf) . flip role(tmp,Werewolf) + ?role(b,Rascal) . flip role(tmp,Rascal) + ?role(b,Villager) . flip role(tmp,Villager)) . (?role(b,Werewolf) . flip role(b,Werewolf) + ?role(b,Rascal) . flip role(b,Rascal) + ?role(b,Villager) . flip role(b,Villager) + ?!role(b,Werewolf) . ?!role(b,Rascal) . ?!role(b,Villager)) . (?role(c,Werewolf) . flip role(b,Werewolf) + ?role(c,Rascal) . flip role(b,Rascal) + ?role(c,Villager) . flip role(b,Villager)) . (?role(c,Werewolf) . flip role(c,Werewolf) + ?role(c,Rascal) . flip role(c,Rascal) + ?role(c,Villager) . flip role(c,Villager) + ?!role(c,Werewolf) . ?!role(c,Rascal) . ?!role(c,Villager)) . (?role(tmp,Werewolf) . flip role(c,Werewolf) + ?role(tmp,Rascal) . flip role(c,Rascal) + ?role(tmp,Villager) . flip role(c,Villager)) + ?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(c,Werewolf) . flip role(tmp,Werewolf) + ?role(c,Rascal) . flip role(tmp,Rascal) + ?role(c,Villager) . flip role(tmp,Villager)) . (?role(c,Werewolf) . flip role(c,Werewolf) + ?role(c,Rascal) . flip role(c,Rascal) + ?role(c,Villager) . flip role(c,Villager) + ?!role(c,Werewolf) . ?!role(c,Rascal) . ?!role(c,Villager)) . (?role(a,Werewolf) . flip role(c,Werewolf) + ?role(a,Rascal) . flip role(c,Rascal) + ?role(a,Villager) . flip role(c,Villager)) . (?role(a,Werewolf) . flip role(a,Werewolf) + ?role(a,Rascal) . flip role(a,Rascal) + ?role(a,Villager) . flip role(a,Villager) + ?!role(a,Werewolf) . ?!role(a,Rascal) . ?!role(a,Villager)) . (?role(tmp,Werewolf) . flip role(a,Werewolf) + ?role(tmp,Rascal) . flip role(a,Rascal) + ?role(tmp,Villager) . flip role(a,Villager)) + ?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(c,Werewolf) . flip role(tmp,Werewolf) + ?role(c,Rascal) . flip role(tmp,Rascal) + ?role(c,Villager) . flip role(tmp,Villager)) . (?role(c,Werewolf) . flip role(c,Werewolf) + ?role(c,Rascal) . flip role(c,Rascal) + ?role(c,Villager) . flip role(c,Villager) + ?!role(c,Werewolf) . ?!role(c,Rascal) . ?!role(c,Villager)) . (?role(b,Werewolf) . flip role(c,Werewolf) + ?role(b,Rascal) . flip role(c,Rascal) + ?role(b,Villager) . flip role(c,Villager)) . (?role(b,Werewolf) . flip role(b,Werewolf) + ?role(b,Rascal) . flip role(b,Rascal) + ?role(b,Villager) . flip role(b,Villager) + ?!role(b,Werewolf) . ?!role(b,Rascal) . ?!role(b,Villager)) . (?role(tmp,Werewolf) . flip role(b,Werewolf) + ?role(tmp,Rascal) . flip role(b,Rascal) + ?role(tmp,Villager) . flip role(b,Villager)) + ?role(b,Rascal) . ?phase(game,TMPhase) . (?role(tmp,Werewolf) . flip role(tmp,Werewolf) + ?role(tmp,Rascal) . flip role(tmp,Rascal) + ?role(tmp,Villager) . flip role(tmp,Villager) + ?!role(tmp,Werewolf) . ?!role(tmp,Rascal) . ?!role(tmp,Villager)) . (?role(c,Werewolf) . flip role(tmp,Werewolf) + ?role(c,Rascal) . flip role(tmp,Rascal) + ?role(c,Villager) . flip role(tmp,Villager)) . (?role(c,Werewolf) . flip role(c,Werewolf) + ?role(c,Rascal) . flip role(c,Rascal) + ?role(c,Villager) . flip role(c,Villager) + ?!role(c,Werewolf) . ?!role(c,Rascal) . ?!role(c,Villager)) . (?role(c,Werewolf) . flip role(c,Werewolf) + ?role(c,Rascal) . flip role(c,Rascal) + ?role(c,Villager) . flip role(c,Villager)) . (?role(c,Werewolf) . flip role(c,Werewolf) + ?role(c,Rascal) . flip role(c,Rascal) + ?role(c,Villager) . flip role(c,Villager) + ?!role(c,Werewolf) . ?!role(c,Rascal) . ?!role(c,Villager)) . (?role(tmp,Werewolf) . flip role(c,Werewolf) + ?role(tmp,Rascal) . flip role(c,Rascal) + ?role(tmp,Villager) . flip role(c,Villager)))^c)*^b ] --- # Action Encoding
--- # Action Encoding in Ostari ```C causeRuckus(p(p): Players, t(p): Bool) { precondition initrole(p) == Rascal; if (t == True) { role(tmp) = role(left(p)); role(left(p)) = role(right(p)); role(right(p)) = role(tmp); } else { } } ``` The **Ostari** system can compile such actions to Dynamic Epistemic Logic, and then apply them to states. .cite[**Markus Eger** and Chris Martens. *Practical Specification of Belief Manipulation in Games.* AIIDE 2017] --- # Implicit Communication * In many applications the goals of the collaborator are not communicated explicitly * Humans relay their intentions in a wide variety of different ways * An AI agent needs to determine which goal the collaborator is pursuing from the observed actions --- # Pandemic
--- class: medium # Pandemic * In Pandemic, players need to collaborate to fight diseases * There is an inherent tension between spreading out to control outbreaks, and joining up to find cures * An AI agent that plays the game with human players needs to determine what their current goal is, and act accordingly .cite[Pablo Sauma Chacón and **Markus Eger**, *PAIndemic: A Planning Agent for Pandemic.*, AIIDE, 2020] --- class: medium # Human Plan Recognition * The process of determining what the collaborator is doing is also based on planning * This assumes "optimal" behavior and does not account for other preferences * The planning process may also not strictly "reach" a goal, but rather optimize to get as close as possible * AI agents need to take all of these possibilities into account --- # Other Projects * "Games" and "AI" are both giant fields of highly active research * I also work on things that are not directly "games" * For example, the game engine Unity is also very useful for visualizations of "serious" content * Intelligent behavior has a myriad of applications --- # SLOTHLab * You can find more information about my research on https://slothlab.info (update WIP) * SLOTH: **S**ymbolic **L**ogic and **O**perations for **T**ransactions with **H**umans * If you want to do research in AI and/or games, let me know --- class: medium # Reminder: Schedule * On Thursday, we will do another review for the final exam * The final exam is officially scheduled for May 20th * You will get the exam pdf on May 13th * Then you have an entire week to finish the exam * It is untimed, but designed to be solvable in 1h50min (official exam time) * I'll also open a zoom meeting during the official exam time for questions --- class: medium # Exam * Topics: Everything since exam 1 (Lecture 9 - 19, Planning - AI and Humans) * You can use the slides, videos, the book, etc. during the exam * Ask **me** if anything is unclear, not your classmates * The answers have to be **your own** --- # Conclusion * This was my first semester at CPP * It was a pleasure working with you! * I hope the class was interesting and educational --- # Feedback * Thank you to everyone that participated in the evaluation! * If you have any other concrete feedback on an assignment or the class content, do not hesitate to write it in the discord channel or via email * Today's quiz is also about improving the class quality * Good luck with all your future endeavors! Stay in touch!