I’m combining C#, SWI-Prolog (possibly with sCASP), and external PDDL planners. Before using Prolog, I generated the PDDL via C#. But, since game state is going to be stored as a Prolog database, it might be better to store actions in the same database and generate PDDL only when highly optimized planning is necessary. I saw logicmoo’s PDDL support, but I don’t understand the implementation and my issue remains unanswered after 10 days. So, I’m investigating my own solution. An action might be defined in Prolog like:
action(walk,AGENT,FROM,TO). parameters(walk,[agent(AGENT),place(FROM),place(TO)]). precondition(walk,[not(dead(AGENT)),loc(AGENT,FROM),adjacent(FROM,TO,flat),not(=(FROM,TO))]. effect(walk,[loc(AGENT,TO),not(loc(AGENT,FROM)),increase(total-cost,20 - strength(AGENT)].
Maybe positive and negative preconditions and effects should be listed separately so it is easier to know whether they require assert or retract? Then the database might be queried:
can_act(action(walk,john,kitchen,livingroom)). true. [if possible] false. [if not possible]
If I were to use sCASP, I might be able to understand why an action is not possible, e.g. john can’t walk from the kitchen to the livingroom because john is not in the kitchen right now. I might be able to get quick answers to compare action costs:
action_cost(action(walk,john,kitchen,livingroom)). 5. [returns 20 - strength(AGENT)]
And then write a valid PDDL file with actions that look like this:
write_PDDL_action(action(walk,john). [outputs text below] (:action walk :parameters (?a - agent ?from ?to - place) :precondition (and (not (dead ?a)) (loc ?a ?from) (adjacent ?from ?to flat) (not (= ?from ?to)) ) :effect (and (loc ?a ?to) (not (loc ?a ?from)) ;(increase (total-cost) 5) ) )
the agent’s name is just necessary to calculate the cost. However, if the Prolog–>PDDL converter outputs facts like
strength(john,15) then the PDDL action might contain the formula
(20 - strength(john)) or something similar. Any thoughts would be appreciated!