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!