<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>golog++ : An Integrative System Design</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Victor Mataré</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Stefan Schiffer</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Copyright c by the paper's authors. Copying permitted for private and academic purposes. In: G. Steinbauer, A. Ferrein (eds.): Proceedings of the 11th International Workshop on Cognitive Robotics</institution>
          ,
          <addr-line>Tempe, AZ, USA, 27-Oct-2018, published at</addr-line>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Mobile Autonomous Systems and Cognitive Robotics FH Aachen University of Applied Sciences 52066 Aachen</institution>
          ,
          <country country="DE">Germany</country>
        </aff>
      </contrib-group>
      <fpage>29</fpage>
      <lpage>35</lpage>
      <abstract>
        <p>Golog is a language family with great untapped potential. We argue that it could become a practical and widely usable high-level control language, if only it had an implementation that is usable in a production environment. In this paper, we do not specify another Golog interpreter, but an extensible C++ framework that defines a coherent grammar, developer tool support, internal/external consistency checking with clean error handling, and a simple, portable platform interface. The framework specifically does not implement language semantics. For this purpose we can simply hook into any of the many existing implementations that do very well in implementing language semantics, but fall short in regards to interfacing, portability, usability and practicality in general.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Introduction</title>
      <p>
        As of 2018, we can safely say that the Golog [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]
language family is still far from realizing its potential
as a practical high-level robot control language.
Theoretically, the idea of freely interleaving planning with
traditional imperative programming should be at the
core of how complex robot behavior is implemented
today, but for practical reasons, most high-level
control is still either finite state machines or specialized
imperative code.
      </p>
      <p>The reasons for this are manifold. In an academic
context, the criticism is often leveled at Golog’s
runtime complexity and supposed obsoleteness due to
advances in planning. The response then usually has
to justify it as a worthwhile endeavour since there is
no reason (yet) to just drop the middle ground
between planning and programming. Golog’s
verifiability, generality, extensibility and transparency (e.g.
w.r.t. accountability) are also often mentioned as
redeeming features.</p>
      <p>In our view however, the reasons why Golog is not
really gaining the practical impact it deserves, are
beyond the scope of most Golog-related research. From
a robot manufacturer’s point of view, Golog is
simply not a feasible option due to numerous usability and
engineering issues.</p>
    </sec>
    <sec id="sec-2">
      <title>The Status quo and related work</title>
      <p>There is a wealth of different implementations, and
although diversity can be a good thing, the Golog
family is missing technical coherence beyond the
theory. Each implementation sports unique and valuable
features, strengths and weaknesses. Documentation
(aside from theoretical papers) on any of those is,
however, sparse or nonexistent. To even figure out which
one might fit a project’s requirements, a programmer
needs to be educated in formal logic to sift through
the pertinent academic literature. Porting features
between implementations can be tedious and error-prone
since there are no explicit extension points and no
internal consistency checks. In fact, most
implementations do not even have any external consistency
checking: Calling an action whose precondition is
unsatisfied, for instance, yields the same result as calling an
undefined action. While the former is a perfectly valid
programming technique, the latter constitutes a
malformed program which could easily be rejected with
an explicit error message pinpointing the exact cause
of the error. In general, the complete absence of such
error handling in most Golog implementations makes
debugging a larger codebase impossible within a
reasonable time budget.</p>
      <p>
        All of the Prolog-based implementations also tend
to blur the line between the language and its
implementation. This issue has been noted before, e.g.
by [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. Here, we want to emphasize that the Prolog
implementation-level is not just sometimes abused for
dirty hacks. On the contrary, it is even deliberately
exposed as a quasi-legitimate meta-language to encode
domain restrictions or to enumerate program elements.
While this can certainly be a powerful tool to the
expert programmer, it can also make any code
unreadable if used irresponsibly. To the language learner, this
metalanguage proves a conundrum, precisely because
it is also the implementation language (i.e. it is
effectively undefined!) and can be used to manipulate
anything, including the language semantics.
      </p>
      <p>
        The last major issue that cannot go unmentioned is
interfacing with the real world. Usually, it boils down
to some Prolog clause like
execute ( Action , History ) : - impl ( Action ).
where impl(Action) is some Prolog code that takes
care of triggering the real action, e.g. in the
behavioral layer of some robotics framework. One notable
exception to this otherwise minimalistic approach is
IndiGolog [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], which comes with a more elaborate
interfacing called the Environment Manager. Its use
case is however for one IndiGolog agent to control N
disparate execution environments via TCP/IP. Today,
this is obsoleted by robotics frameworks that provide
a coherent, component-based view on a robot [
        <xref ref-type="bibr" rid="ref14 ref15">15, 14</xref>
        ].
Such frameworks typically offer network-transparent
component APIs [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ], so that Indigolog’s 1 : N over
TCP capability just adds unnecessary complexity, on
top of the cruft of embedding Prolog on the remote
end to basically just unmarshal a TCP packet into an
action call.
      </p>
      <p>
        In general, we can see that the interfacing logic
of most Golog implementations doesn’t go any
further than the execution system specified by [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. For
N robot platforms and M Golog implementations,
N M platform interfaces need to be written since
none of the interfacing code is portable between either
robotics frameworks or Golog implementations.
      </p>
      <p>All of these problems combined keep Golog from
gaining a critical mass of supporters that could sustain
a community that is interested in a good
implementation.</p>
      <p>
        Outside of the Golog community, we see more
diverse approaches to high-level interfacing. The
Semantic Robot Description Language (SRDL) [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ]
implements a framework that describes a robot platform
with its components, and how they can be used to
realize certain actions. As such, it serves a different
purpose, namely mapping an abstract action concept
to a realization strategy on a particular robot
platform. To the framework we envision here, actions are
opaque units, so a system like SRDL could be used as
an action execution backend.
      </p>
      <p>
        PRS/OpenPRS [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] and the ecosystem around them
are worth noting because they also serve the purpose
of a high-level control language, but found much wider
use than any Golog dialect. However *PRS does not
set itself apart through better theoretical foundations
or through greater expressivity. The issue where *PRS
clearly has the lead on any Golog dialect is
usability, developer support, integration, i.e. tool support in
general.
      </p>
      <p>The same applies to the C-Language Integrated
Programming System [18, CLIPS, cf.]. From a
theoretical view, the language should be less expressive
and less practical for high-level control application
than Golog. But nonetheless, it is used much more
widely1. While some of CLIPS’ lead on Golog could
be explained by the more general, rule-based language
paradigm, its clear advantages are still a coherent
language specification and well-designed, stable C/C++
bindings.</p>
      <p>
        It is not like Golog’s potential had not been widely
noticed. It played a prominent part in the Semantic
Web hype (cf. e.g. [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] with thousands of citations),
and it has been used for high-level control of soccer
playing robots [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] as well as for domestic service robots
[
        <xref ref-type="bibr" rid="ref17">17</xref>
        ]. However unlike OWL [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ], it never made the leap
out of the academic laboratories. Again, observe how
OWL is supported by a rich set of interoperable tools
that help with visualization, error checking and
debugging, while Golog is not.
      </p>
      <p>
        How to fix it
We can summarize the issues outlined above as a
general lack of tool support and usability which makes
Golog infeasible as a practical high-level control
language. So what features should an implementation
have to make it useful in actual robotics scenarios?
Important groundwork on this question has been done
by [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. Here, we want to expand on that while
shifting the focus towards a more condensed and flexible
architecture.
      </p>
      <p>
        First of all, we have to differentiate two major user
roles: The language user (e.g. an application
developer), and the language developer (e.g. a maintainer
or an extension developer). The non-functional
requirements that follow are relevant to these roles in
varying degrees. The requirements Q1 through Q4
follow directly from general guidelines of usability, as
described e.g. by [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. They apply mainly to the role
of the language user. Q5 to Q8 on the other hand
are most relevant to the language developer, and they
1See also 418 questions tagged “clips” on stackoverflow
(stackoverflow.com/questions/tagged/clips) vs. 2 questions
tagged “golog”
(stackoverflow.com/questions/tagged/golog).
correspond directly to the fundamentals of software
engineering.
      </p>
      <sec id="sec-2-1">
        <title>Non-functional requirements</title>
        <p>Q1 Familiarity Ensure that commonly known
language constructs do what the programmer
intuitively expects.</p>
        <p>Q2 Readability Be syntactically “easy on the eye”,
i.e. let the visual structure reflect the syntactic
structure (to help with skimming code).</p>
        <p>Q3 Learnability Actively support the user in
developing an understanding of the language’s syntax
and semantics. Make errors traceable to their
cause, give a clear and specific hint at what is
wrong.</p>
        <p>Q4 Visibility Support implementation of visual
editing frontends, i.e. code browsing, semantic code
highlighting and interactive debugging.</p>
        <p>Q5 Extensibility Define a clear path to introducing
new language features and robot interfaces while
ensuring internal consistency as well as possible.
Q6 Minimalism Don’t bloat. Don’t reinvent the
wheel. Implement what is missing, re-use good
code. Use minimal indirection, especially at
runtime.</p>
      </sec>
      <sec id="sec-2-2">
        <title>Q7 Separation of concerns Eliminate internal de</title>
        <p>pendencies where possible. Concentrate external
dependencies in few, well-specified interfaces.
Q8 Maintainability Keep external interfaces
compatible. Be OpenSource. Be contributor friendly
through good nomenclature, readable code and
concise, instructive documentation.</p>
        <p>
          The YAGI interpreter [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ] went a long way towards
Q1, Q2 and Q3 by defining a specialized language
syntax and implementing it in a proper parser. Q5 was
considered in regard to robot interfaces, but in regard
to the language itself, the focus was on specifying and
implementing the full language semantics, effectively
spawning yet another golog dialect (hence the name).
This of course conflicts with Q6. Thought was also
put into Q7 and Q8, mainly by employing a clean
coding style and using appropriate design patterns.
        </p>
        <p>
          We have to embrace the fact that the majority of
Golog-related research deals with semantic variants
and extensions. Another significant push in
expressive power can be expected from the convergence of
machine learning with knowledge-based systems. So
what we need at this time is not another Golog
implementation, but a language design and interfacing
framework that puts the main emphasis on
extensibility and practicality. With that, the resulting
functional requirements are significantly slimmed down in
comparison to [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]:
        </p>
      </sec>
      <sec id="sec-2-3">
        <title>Functional requirements</title>
        <p>F1 Parse Golog programs written in a specifically
designed syntax.</p>
        <p>F2 Represent the parsed program in a concise,
typesafe object model. Reflect the type safety in all
extension points and in the parser.</p>
        <p>F3 Run the program represented by the object
model, re-using as much code from the existing
implementations as possible.</p>
        <p>F4 Execute actions found by running the program
on any robot or simulation environment.</p>
        <p>F5 Map sensors to exogenous actions/events as
specified by the program.</p>
        <p>F6 Monitor action execution to support failure
handling and self-maintenance.</p>
        <p>So here, we deliberately do not specify language
semantics since that is exactly what we want to keep
extensible. What do need is a coherent interfacing
framework that takes care of everything other than language
semantics, namely the functional requirements F1 to
F6, in a manner that satisfies the non-functional
requirements Q1 through Q8. In general, all of the
nonfunctional requirements should be applied to all of the
functional requirements to varying degrees. Q7
Separation of concerns and Q8 Maintainability apply
to the system as a whole and are thus equally
important to all of the functional requirements.</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>The golog++ interfacing framework</title>
      <p>From the functional requirements, we can derive three
global system concerns: Representation of the Golog
program (including parsing), static and runtime
semantics, and acting/sensing e.g. on a physical robot
platform. They are represented in Figure 1 as dashed
areas. Since we want to be extensible both in the
platform interface and in the language semantics, these
main concerns are linked together through interfaces
that make a compromise between generality and
strictness.</p>
      <p>Other than in YAGI, for instance, the parser does
not instantiate an auto-generated syntax tree that
contains unnecessary syntactic detail, but a concise,
handdesigned class model (the metamodel component in
Figure 1). The parser is written in templated C++,
acting/sensing
«Interface»
PlatformBackend</p>
      <p>«use»
«component»</p>
      <p>ROS
so the metamodel is usable and enforced in the
grammar definition as well. An instance of the metamodel
represents the basic action theory and the procedural
code that together form a Golog domain/program.</p>
      <p>Restrictions in the metamodel apply particularly to
the extensible type model, syntactic constraints that
follow from expression types, referential integrity and
extension consistency. It conforms to the following
(tentative and incomplete) specification:
Representation concern (language metamodel)
The golog++ metamodel encompasses two sets of
classes: The static program representation, and the
runtime state. Elements of the static program
representation are classes that can form a BAT (like
Fluent, Action, EffectAxiom), procedural code (like
Function, Pick, Search, Conditional, etc.), and formula
constituents like Conjunction, Negation, Quantification
and so on. Of the runtime state representation, only
the Transition interface is shown in Figure 1, since it
links together the three main system concerns.
Others, such as the History, might not even need explicit
representation in all implementations.</p>
      <p>Declarations and definitions of
functions/procedures, actions and fluents are Globals (cf. Figure 3,
only actions and fluents shown), which means that by
themselves they are toplevel entities and cannot be
constituents of another expression. All other program
$fluent loc ( $x ) {
initially :</p>
      <p>( b) = table , ( a ) = b
}
elements are either void-valued Statement s (i.e.
instructions in a procedural code block that may fail
to execute) or expressions that are syntactically
exchangeable with constant values of the same type. The
type system is designed to extensible, and the types
BooleanExpression, NumericExpression and
SymbolicExpression are always defined.</p>
      <p>References can refer to any Variable or Global, and
they inherit from a type alias exposed by their target
class that determines what type of expression a
reference to that class will be. So while Variables and
Globals themselves are not constituent expressions,
References to them are.2</p>
      <p>Certain expressions by definition have a different
type than their constituents. For example poss( ) and
do( ) are both boolean expressions for a (void-valued)
action or procedure . The ternary expression 1 ? 2 :
3 has the type (T ( 3) = T ( 2)), if T ( 1) = Boolean.</p>
      <p>For the sake of rigidity and clarity, there is no
implicit type conversion, e.g. comparisons can only be
made between identical types and the result is always
a boolean value. Every complex formula has the type
2cf. Figure 3. Note that the UML standard has no
syntax for describing this pattern, so we emulate it by
representing TargetT::ExprT as a separate interface that can be either
BooleanExpression or SymbolicExpression.
of all its parts. Since all type-dependent code
(including the parser) is templated, the restrictions specified
above are enforced by the C++ compiler, even within
the grammar definition. Implementing a new
expression type in the metamodel automatically instantiates
all needed templates where possible. Where manual
template specialization is required, it is enforced by
the C++ compiler.</p>
      <p>Scopes are also represented explicitly in the static
metamodel. Each Scope holds a reference to its parent
scope, and it can resolve any symbol that is contained
in itself or in one of its parents.</p>
      <p>The parser reads a program in golog++ syntax (like
the example in Figure 2) and instantiates these
metamodel classes to form a graph that represents the
program as an interconnected C++ object structure. The
code example in Figure 2 would (among others)
produce an instance of the Action class called “stack”,
which accepts two symbol-valued arguments. As
precondition, an Action can accept any
BooleanExpression, which in this case would be an instance of the
Conjunction class, which is again made up of
Comparisons and a Quantification. Via the nesting of
constituents, the program’s object representation thus
forms a syntax tree. References like the calls to the
goal() function and to the stack($x, $y) action in
the main program can interconnect the objects across
the syntactic tree’s branches, thus forming a (possibly
cyclical) graph that represents the program’s
referential (call) structure. Each expression in a program is
represented by a unique object, and none of these
objects are copyable since their exact place within the
syntactic tree is part of their identity.</p>
      <p>Semantics concern
Every language element in the metamodel owns a
specific implementation of the Semantics interface that
is attached after a program’s object representation is
fully constructed. The core interfaces (i.e. all shown
in Figure 1 and the entire metamodel ) do not make
any assumptions about how the Semantics interface is
realized. To give a program its semantics (i.e. to make
it executable), the ExecutionContext recurses twice
along the syntax tree of all Global s and of the main
procedure. On the first recursion, every program
element is visited by a factory (leveraging runtime
polymorphism) that assigs a unique instance of a specific
Semantics implementation to it. On the second
recursion run, the ExecutionContext delegates to a virtual
method in its concrete implementation that must use
each element’s Semantics to prepare it for execution
(e.g. by compiling, initializing runtime state, etc).</p>
      <p>So for the fluent declaration loc($x) in Fig. 2, the
ReadylogSemantics (cf. Fig. 1) would produce the
«Interface»</p>
      <p>Global
«Interface»</p>
      <p>Expression
«Interface»
BooleanExpression</p>
      <p>«Interface»</p>
      <p>SymbolicExpression
«substitute»
«Interface»</p>
      <p>ExprT</p>
      <p>«substitute»
e«ixmprpeosrst»ion_t</p>
      <p>Fluent ExprT: Interface</p>
      <p>
        Action
+ precond: BooleanExpression [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]
+ effect: EffectAxiom [*]
1+ target + referenc*e
«bind»
&lt;ExprT -&gt; EffExprT&gt;
+ action
1
      </p>
      <p>*
+ effect</p>
      <p>
        Reference
+ target: TargetT [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]
      </p>
      <p>TargetT: Class
«bind»
&lt;TargetT -&gt; Fluent&gt;</p>
      <p>
        EffectAxiom EffExprT: Interface
+ fluent: Reference [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]
+ value: EffExprT [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]
+ condition: BooleanExpression [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]
Here, the argument variable X and the domain symbols
a, b and table are each constituents of their own, so
the fluent’s semantics delegates to their semantics for
producing the respective Prolog terms.
      </p>
      <p>
        After compilation, all Semantics implementations
must be in a state that allows the ExecutionContext
to test the main program for the next Transition and
for the final state. These methods are also specified by
the ExecutionContext and realized by its
implementation. The EclipseExecutionContext shown in Figure 1
for example embeds an eclipse-clp interpreter, loads
ReadyLog [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] and uses its trans/4 and final/2
predicates to implement runtime. A Transition created by
an ExecutionContext implementation is a
parameterized Action. When a legal Transition is found, it is
passed to the PlatformBackend for execution.
      </p>
      <p>The ExecutionContext also provides access to
ExogEvent objects that are created from sensor data as
well as from state changes in platform components
or in action execution. An ExecutionContext
implementation must consume these events and apply them
to the runtime state implementation of the current
golog++ program (usually by incorporating them into
the history).
The PlatformBackend accepts a Transition object,
and its implementor must use that to trigger an action
on some target platform. A PlatformBackend
implementation must also select and retrieve the sensor data
and other runtime state that is needed to instantiate
the ExogEvent objects as specified by the golog++
program. A more precise specification of this interface is
subject to currently ongoing work.</p>
      <sec id="sec-3-1">
        <title>Discussion and rationale</title>
        <p>This specification and its current implementation
already satisfy large portions of the functional and
nonfunctional requirements. Q1 Familiarity is mostly
a given since the procedural semantics of Golog are
already aligned with traditional imperative
programming. Employing a familiar C-like syntax then makes
the imperative Golog code immediately recognizable
to all programmers that know e.g. C/C++, Java or
JavaScript. A C-like syntax has been chosen over the
Pascal-like variant employed in YAGI since it is more
widely used, and we expect better visual ergonomics
by using punctuation (i.e. curly braces) as block
delimiters. Q2 Readability is further helped by using a
C++ class-like notation for Golog action definitions
(again inspired by YAGI), with “ precondition:” and
“effect:” as section markers within the action’s
definition block. However we have dispensed with YAGI’s
way of notating a fluent as a 0-arity functional symbol
that denotes a set of n-tuples. Instead, we returned
to the classical SitCalc-like notation with n-ary
functional or relational fluents, which should be more
recognizable to developers with e.g. a PDDL background.</p>
        <p>The goal of Q3 Learnability is of course closely
related to Q1 Familiarity, Q2 Readability and Q4
Visibility. A typical Golog developer may likely be
proficient in other languages, but given its currently
limited pervasion, we have to assume that he/she is
unfamiliar with the Situation Calculus or any other
Golog dialect. The most important tools to
support Q3 are type safety and interactive debugging (i.e.
single-stepping a live program with viewable runtime
state).</p>
        <p>Support for interactive debugging is limited in the
current ExecutionContext implementation since the
interpretation of all procedural code is encapsulated
within the toplevel trans/4 call to the ReadyLog
interpreter. To achieve full support for interactively
single-stepping procedural code, an ExecutionContext
implementation would have to handle each
procedural statement individually. An alternative would be to
change the implementations of all language elements
to not assert/1 or compile/1 plain Prolog predicates
representing the Golog program, but to register as</p>
        <p>C++ external predicates that implement appropriate
debugging hooks.</p>
        <p>Type safety is important to support Q3
Learnability since knowing the type of an
expression allows for a much more descriptive code
model. In particular, references can be resolved
statically, which allows for implementation of proper
code browsing (Q4 Visibility). Using the type of
an expression to restrict the grammar allows us to
catch many more cases of accidental misuse of symbol
references and other expressions.</p>
        <p>Q5 Extensibility, Q6 Minimalism, Q7
Separation of concerns and Q8 Maintainability are again
a set of non-functional requirements that tend to go
hand in hand. Together, they form the technical
foundation for continued proliferation of any piece of
software. In golog++, we achieve Minimalism by
dealing purely with the three main concerns of
representation, semantics and acting/sensing. It is important
to note that only the representation concern (parsing
into an instance of the metamodel) has a stand-alone
implementation, i.e. it is the only one that does not
depend on some external implementation of abstract
interfaces to run. The metamodel’s static and
runtime state representation forms the (singular!)
interface through which the semantics and acting/sensing
concerns interact. Consequentially, Q7 Separation
of concerns in golog++ means that anything
concerned with semantics or acting/sensing can ever only
depend on the metamodel, while the metamodel can
ever only depend on the abstract acting/sensing and
semantics interfaces.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Conclusion and outlook</title>
      <p>
        The golog++ language grammar will be a more
dedicated subject in future work when the syntactic
extension points are developed. The mid-term vision is
to support namespacing and language profiles similar
to OWL [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ].
      </p>
      <p>
        One use case of the golog++ framework is the
ConTrAkt project, where the Golog language will be
extended to support platform self-monitoring and
autonomous, platform-aware failure recovery. To that
end, a language specification for platform constraint
modeling is in development. Its goal is to allow
domain-independent encoding of platform details so
that domain modellers don’t have to worry about
platform quirks [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]. It will make use of extension points in
the acting/sensing concern (i.e. the abstract platform
interface) which are yet to be specified. It will also
require syntactic extensions and possibly an external
constraint solver to be embedded via an
ExecutionContext implementation.
      </p>
      <p>The design goals of the framework presented here
are flexibility, extensibility, usability and ease of
deployment. Its most important feature is to decouple
Golog reasoning, program representation and
platform interfacing. Consequentially, to serve N
platforms with M different language semantics, we
simply need N platform interfaces and M semantics,
instead of N M leaky abstractions like before.
Decoupling also allows us to use the right tool for the job:
Modern, templated C++ for metamodeling,
interfacing and outer control flow, and Prolog (or other
AIaffine languages) for the implementation of language
semantics and reasoning.</p>
      <p>The complete source code of the golog++
framework is freely available at https://github.com/
MASKOR/gologpp.git.</p>
    </sec>
    <sec id="sec-5">
      <title>Acknowledgments</title>
      <p>This work was supported by the German National
Science Foundation (DFG) under grant number FE
1077/4-1.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>G.</given-names>
            <surname>De Giacomo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Lespérance</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H. J.</given-names>
            <surname>Levesque</surname>
          </string-name>
          , and
          <string-name>
            <given-names>S.</given-names>
            <surname>Sardina</surname>
          </string-name>
          .
          <article-title>Indigolog: A high-level programming language for embedded reasoning agents</article-title>
          .
          <source>In Multi-Agent Programming:</source>
          , pages
          <fpage>31</fpage>
          -
          <lpage>72</lpage>
          . Springer,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>A.</given-names>
            <surname>Dix</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Finlay</surname>
          </string-name>
          ,
          <string-name>
            <given-names>G. D.</given-names>
            <surname>Abowd</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Beale</surname>
          </string-name>
          .
          <article-title>Design rules</article-title>
          . In Human-Computer Interaction, chapter
          <volume>7</volume>
          , pages
          <fpage>258</fpage>
          -
          <lpage>288</lpage>
          . Pearson Education Limited,
          <source>3rd edition</source>
          ,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>A.</given-names>
            <surname>Ferrein</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Fritz</surname>
          </string-name>
          , and
          <string-name>
            <given-names>G.</given-names>
            <surname>Lakemeyer</surname>
          </string-name>
          .
          <article-title>Using golog for deliberation and team coordination in robotic soccer</article-title>
          .
          <source>KI</source>
          ,
          <volume>19</volume>
          (
          <issue>1</issue>
          ):
          <fpage>24</fpage>
          ,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>A.</given-names>
            <surname>Ferrein</surname>
          </string-name>
          and
          <string-name>
            <given-names>G.</given-names>
            <surname>Lakemeyer</surname>
          </string-name>
          .
          <article-title>Logic-based robot control in highly dynamic domains</article-title>
          .
          <source>Robotics and Autonomous Systems</source>
          ,
          <volume>56</volume>
          (
          <issue>11</issue>
          ):
          <fpage>980</fpage>
          -
          <lpage>991</lpage>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>A.</given-names>
            <surname>Ferrein</surname>
          </string-name>
          , G. Steinbauer, and
          <string-name>
            <given-names>S.</given-names>
            <surname>Vassos</surname>
          </string-name>
          .
          <article-title>Actionbased imperative programming with YAGI</article-title>
          .
          <source>In Proceedings of the 8th International Conference on Cognitive Robotics. AAAI Press</source>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>D.</given-names>
            <surname>Hähnel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Burgard</surname>
          </string-name>
          , and
          <string-name>
            <given-names>G.</given-names>
            <surname>Lakemeyer. GOLEX</surname>
          </string-name>
          <article-title>- bridging the gap between logic (GOLOG) and a real robot</article-title>
          .
          <source>In O. Herzog and A</source>
          . Günter, editors,
          <source>KI-98: Advances in Artificial Intelligence</source>
          , pages
          <fpage>165</fpage>
          -
          <lpage>176</lpage>
          , Berlin, Heidelberg,
          <year>1998</year>
          . Springer Berlin Heidelberg.
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>P.</given-names>
            <surname>Hitzler</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Krötzsch</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Parsia</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P. F.</given-names>
            <surname>PatelSchneider</surname>
          </string-name>
          , and
          <string-name>
            <surname>S. Rudolph.</surname>
          </string-name>
          <article-title>OWL 2 web ontology language primer</article-title>
          .
          <source>W3C recommendation</source>
          ,
          <volume>27</volume>
          (
          <issue>1</issue>
          ):
          <fpage>123</fpage>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>T.</given-names>
            <surname>Hofmann</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Mataré</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Schiffer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Ferrein</surname>
          </string-name>
          , and
          <string-name>
            <surname>G. Lakemeyer.</surname>
          </string-name>
          <article-title>Constraint-based online transformation of abstract plans into executable robot actions</article-title>
          .
          <source>In AAAI Spring Symposium 2018 on Integrating Representation, Reasoning</source>
          , Learning, and
          <article-title>Execution for Goal Directed Autonomy</article-title>
          , Stanford, CA, USA,
          <year>2018</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>F. F.</given-names>
            <surname>Ingrand</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Chatila</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Alami</surname>
          </string-name>
          , and
          <string-name>
            <given-names>F.</given-names>
            <surname>Robert</surname>
          </string-name>
          .
          <article-title>PRS: A high level supervision and control language for autonomous mobile robots</article-title>
          .
          <source>In IEEE International Conference on Robotics and Automation</source>
          , volume
          <volume>1</volume>
          , pages
          <fpage>43</fpage>
          -
          <lpage>49</lpage>
          ,
          <year>1996</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>L.</given-names>
            <surname>Kunze</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Roehm</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M.</given-names>
            <surname>Beetz</surname>
          </string-name>
          .
          <article-title>Towards semantic robot description languages</article-title>
          .
          <source>In IEEE International Conference on Robotics and Automation</source>
          , pages
          <fpage>5589</fpage>
          -
          <lpage>5595</lpage>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>H. J.</given-names>
            <surname>Levesque</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Reiter</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Lespérance</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Lin</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R. B.</given-names>
            <surname>Scherl</surname>
          </string-name>
          .
          <article-title>GOLOG: A Logic Programming Language for Dynamic Domains</article-title>
          .
          <source>Journal of Logic Programming</source>
          ,
          <volume>31</volume>
          (
          <issue>1-3</issue>
          ):
          <fpage>59</fpage>
          -
          <lpage>84</lpage>
          , April-June
          <year>1997</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>S. A.</given-names>
            <surname>McIlraith</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T. C.</given-names>
            <surname>Son</surname>
          </string-name>
          , and
          <string-name>
            <given-names>H.</given-names>
            <surname>Zeng</surname>
          </string-name>
          .
          <article-title>Semantic web services</article-title>
          .
          <source>IEEE Intelligent Systems</source>
          ,
          <volume>16</volume>
          (
          <issue>2</issue>
          ):
          <fpage>46</fpage>
          -
          <lpage>53</lpage>
          ,
          <year>Mar 2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>B.</given-names>
            <surname>Motik</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B. C.</given-names>
            <surname>Grau</surname>
          </string-name>
          ,
          <string-name>
            <given-names>I.</given-names>
            <surname>Horrocks</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            <surname>Wu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Fokoue</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Lutz</surname>
          </string-name>
          , et al.
          <article-title>OWL 2 web ontology language profiles</article-title>
          .
          <source>W3C recommendation</source>
          ,
          <volume>27</volume>
          :
          <fpage>61</fpage>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>T.</given-names>
            <surname>Niemueller</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Ferrein</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Beck</surname>
          </string-name>
          , and
          <string-name>
            <given-names>G.</given-names>
            <surname>Lakemeyer</surname>
          </string-name>
          .
          <article-title>Design principles of the component-based robot software framework fawkes</article-title>
          . In International Conference on Simulation, Modeling, and Programming for Autonomous Robots, pages
          <fpage>300</fpage>
          -
          <lpage>311</lpage>
          . Springer,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>M.</given-names>
            <surname>Quigley</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Conley</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Gerkey</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Faust</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Foote</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Leibs</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Wheeler</surname>
          </string-name>
          ,
          <article-title>and</article-title>
          <string-name>
            <given-names>A. Y.</given-names>
            <surname>Ng</surname>
          </string-name>
          .
          <article-title>ROS: an open-source robot operating system</article-title>
          .
          <source>In ICRA workshop on open source software</source>
          , volume
          <volume>3</volume>
          , page 5.
          <string-name>
            <surname>Kobe</surname>
          </string-name>
          , Japan,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>M.</given-names>
            <surname>Reichardt</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Föhst</surname>
          </string-name>
          , and
          <string-name>
            <given-names>K.</given-names>
            <surname>Berns</surname>
          </string-name>
          .
          <article-title>An overview on framework design for autonomous robots</article-title>
          . it-Information Technology,
          <volume>57</volume>
          (
          <issue>2</issue>
          ):
          <fpage>75</fpage>
          -
          <lpage>84</lpage>
          ,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>S.</given-names>
            <surname>Schiffer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Ferrein</surname>
          </string-name>
          , and
          <string-name>
            <given-names>G.</given-names>
            <surname>Lakemeyer. Caesar - An Intelligent Domestic Service</surname>
          </string-name>
          <article-title>Robot</article-title>
          .
          <source>Journal of Intelligent Service Robotics</source>
          ,
          <volume>23</volume>
          (Special Issue on Artificial Intelligence in Robotics: Sensing, Representation and Action):
          <fpage>259</fpage>
          -
          <lpage>273</lpage>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>R. M.</given-names>
            <surname>Wygant. CLIPS -</surname>
          </string-name>
          <article-title>a powerful development and delivery expert system tool</article-title>
          . Computers &amp; industrial engineering,
          <volume>17</volume>
          (
          <issue>1-4</issue>
          ):
          <fpage>546</fpage>
          -
          <lpage>549</lpage>
          ,
          <year>1989</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>