<div dir="ltr"><div>I'm designing a turn-based text game similar to the <a href="https://github.com/Anniepoo/prolog-examples/blob/master/newdetective.pl" target="_blank">detective puzzle problems</a> that people sometimes write in Prolog. The difference is that the player must solve the mystery (not Prolog) and that the suspects continue to act, e.g. lie to the player, kill again, flee, etc. I'd welcome suggestions on how to approach the subsystems described below in a manner that leverages Mercury's strengths. I'd also welcome references to academic journal articles that might be helpful.<br></div><div><br></div><div>I'm hoping that Mercury will provide a common approach to maintaining game state, character knowledge, action planning, and parsing and generating dialogue. In the past, these have been completely separate systems that I needed to convert between, which became very difficult to maintain. C# will provide and manage all the GUI elements and act as a container for Mercury to run on Android and iOs devices.</div><div><br></div><div>The pseudocode below is probably more like <a href="https://en.wikipedia.org/wiki/Planning_Domain_Definition_Language">PDDL</a> than Prolog, but hopefully my intentions are clear.<br></div><div></div><div><br></div><div><i><b>Game State</b></i></div><div><i>% Create characters</i></div><div>person(adam)</div><div>person(bob)</div><div>person(carl)</div><div>person(dan)<br></div><div><i>% Assign character status</i></div><div>dead(dan)<br></div><div><b></b></div><div><b></b></div><div><b></b></div><div><i>% Define the world</i><br></div><div><b></b></div><div>room(salon)</div><div>room(bedroom)</div><div>room(hallway)</div><div><i>% Place characters</i></div><div>location(adam,salon)</div><div>location(bob,salon)</div><div>location(carl,hallway)</div><div>location(dan,bedroom)<br></div><div><i>% Define network for navigation</i><br></div><div>connected(salon,hallway)</div><div>connected(bedroom,hallway)</div><div>connected(X,Y) :- connected(Y,X)</div><div><i>% Define some past events (things that actually occurred, regardless if anyone saw them)</i></div><div>attack(bob,dan,bedroom)<br></div><div><br></div><div><br></div><div><b>Character Knowledge</b></div><div><i>% bob knows what he did</i><br></div><div>saw(bob,attack(bob,dan,bedroom)</div><div>heard(bob,attack(bob,dan,bedroom)</div><div><i>% adam heard what dan did</i><br></div><div><b></b></div><div>heard(adam,attack(bob,dan,bedroom))<br></div><div><b></b></div><div><br></div><div><br></div><div><b>Action Planning</b></div><div>I'm familiar with planners like <a href="https://www.fast-downward.org/">Fast Downward</a>, which given a current state, a goal state, and a set of possible actions very quickly string together the necessary actions to get from the current to the goal state. Ivan Bratko's <i>Programming for Artificial Intelligence</i> describes Prolog programs with this functionality. Each action is defined with a set of prerequisites (what must be already true to apply the action) and effects (what will be true after the action occurs). Is there a more Mercury specific implementation, maybe something that involves constraint programming? Eventually, I'd like to add temporality/scheduling and beliefs (e.g. adam may have heard bob attack dan, but he erroneously believes that he heard carl). <br></div><div><br></div><div>move(Person,Room1,Room2)</div><div>     preq: location(Person,Room1), connected(Room1,Room2)</div><div>     effect: not(location(Person,Room1), location(Person,Room2)<br></div><div><br></div><div><br></div><div><b>Parsing and Generating Dialogue </b><br></div><div>The GUI will offer the user a set of words that can be translated into a Mercury query, for example "What did you hear" asked to bob, would become "heard(bob,X)." Additional code would prevent bob from implicating himself in a crime. Perhaps DCG would be helpful in translating query results back into plain English?</div><div><br></div><div><br></div><div>I'm definitely open to ideas and advice. Thanks for reading.</div><div><br></div><div>-david<br></div></div>