Did you know ... | Search Documentation: |
Pack flux -- prolog/README |
ALPprolog --- Action Logic Programs in Propositional Logic
Website: http://alpprolog.sourceforge.net
Status: Stable
Developer: conrad.drescher@web.de
ALPprolog is a Prolog implementation of an action programming language.
It requires ECLiPSe Prolog (available at http://www.eclipse-clp.org).
It implements a fragment of the theoretical framework of Action Logic Programs as described in
http://www.computational-logic.org/content/projects/wisslogpubs/DreSchiThi-FroCoS09.pdf
Overview
The fragment can be characterized as follows:
holds(safe(Cell))
. In the offline setting reasoning by cases via
disjunctive substitutions ensures that the Action Logic Program framework
becomes logically complete.World descriptions with ALPprolog
With ALPprolog you can program strategies for autonomous agents in dynamic domains. ALPprolog programs are ordinary Prolog programs with two additional predicates:
strategy :- holds(goal)
.
strategy :- do(A)
, strategy.
In words if the goal description is satisfied at the current state then the strategy was successful. Otherwise we randomly pick some action A and keep on searching. As one can see ALP programs are read as temporally ordered sequences from left to right.
Required Files **
The overall structure of an ALPprolog domain is as follows:
(1) Create a module world.ecl --- describing the dynamic domain (2) Import this module into alpprolog.ecl (3) Create a file strategy.ecl importing world.ecl and alpprolog.ecl
For illustration purposes with this distribution comes an implementation of the Wumpus world with the respective files wumpus_world.ecl and wumpus_strategy.ecl. Below is a brief explanation of the language features and their use.
Sample Domain - Wumpus world **
Let us first recall the wumpus world: The wumpus world is a well-known challenge problem in the reasoning about action community. It consists of a grid-like world: cells may contain pits, one cell contains gold, and one the fearsome Wumpus. The agent dies if she enters a cell containing a pit or the Wumpus. But she carries one arrow so that she can shoot the Wumpus from an adjacent cell. If the agent is next to a cell contain- ing a pit (the Wumpus), she can detect that one of the surrounding cells contains a pit (the Wumpus), but doesn't know which one: She perceives a breeze if she is in a cell next to a pit, and she perceives a stench if she is in a cell next to the Wumpus. She knows the contents of the already visited cells --- in particular she can detect the gold if she is in the same cell. Getting the gold without getting killed is the agent's goal.
world.ecl: **
A world description is composed as follows:
inital_state([at(agent,1),[at(wumpus,2),wumpus(3)]])
.
This Prolog fact describes the initial state
at(agent,1)
/\ ( at(wumpus,2)
\/ at(wumpus,3)
)
We know where the agent is, but the exact location of the fearsome wumpus
is unknown. This initial state talks about "fluents": These are the mutable
properties of the dynamic domain. Formulas describing states are Prolog lists.
If a list element is a term it is a singleton clause, if it is a list it is
a disjunctive clause. A negated fluent is e.g. neg(alive(wumpus))
.
action(shoot,
[carries(agent,arrow),
at(wumpus,Cell1),
at(agent,Cell2),
connected(Cell2,Cell1)],
[neg(carries(agent,arrow)),
neg(alive(wumpus))])
.
has the following meaning: The action "shoot" is possible if the agent is currently armed, and next to a cell containing the wumpus. Finally, the effects of the action are that the agent is no longer armed, and that the wumpus gets killed.
aux([connected])
.
so that they can be distinguished from fluent properties (the default).
sensors([glitter,stench])
.
Describing sensor axioms is a little complicated. The meaning of an observation depends both upon the sensing result and the agent's current state. For example, the meaning of sensing whether an adjacent cell contains gold depends both on the observation (Yes/No) and the agent's current location. This is the sensor axiom for the wumpus agent that is trying to sense whether there is gold:
glitter(X)
,[ [X-true] -
[at(agent,Y)
] -
[at(gold,Y)
],
at(agent,Y)
]-
[neg(at(gold,Y))
]
]).
This sensor has just two possible sensor values, true and false. The meaning
of the sensing result depends on the agents current location at(agent,Y)
.
If e.g. the sensing result was true then at(gold,Y)
is adjoined to the
current state description. If the meaning of the sensor result does not
depend on the current state then the empty list may be used. In general, the
meaning may be described by any formula in prime implicate form. Variables may
be used provided that these can approriately grounded by evaluating the state
condition against the agent's current state knowledge. A sensing action
is performed simply by evaluating a non-ground sensed property.
For sensing to work in simulation you also have to provide a predicate real_world/1. This is used by alpprolog.ecl to determine the appropriate sensing results.
strategy.ecl: **
A strategy is an arbitrary Prolog program, using the special predicates holds/1 and execute/1. See wumpus_strategy.ecl for an example.
A Guide to the Distribution **
The directory 'ALPprolog' contains the files
The 'small' world contains fewer ground fluents in the agents state representation, and the 'bigger' one contains much more (allow some time for compilation).
If you want to use 'big' instead of 'small' adapt both 'wumpus_strategy.ecl' and 'alpprolog.ecl'.
The subdirectory 'FluxVersion' contains two subdirectories, 'Ground' and 'Nonground'. 'Ground' is essentially the same as 'ALPprolog', only using Flux for the reasoning instead. Again, if you want to use 'big' instead of 'small' adapt both 'wumpus_strategy.ecl' and 'flux.ecl'.
'Nonground' uses quantification over variables to keep the state representation small, and is much more efficient. Compile 'wumpus.pl' and call 'main'. You can choose a world size in 'wumpus.pl'.