Add additional tests for connectives and quantifications

Additionally:
* Refactor test code (introduce TEST-PARSE-BINARY-CONNECTIVE and
  TEST-PARSE-QUANTIFICATION-1/2 functions)
* Refactor parsing code (introduce function TERM-TYPE-FOR-OPERATOR)
* Update package to reflect changes
* Fix bug in OPERATOR method for EXISTENTIAL-QUANTIFICATION-TERM
Add support for primitive actions and concurrency

* Define PRIMITIVE-ACTION-DEFINITION class and (generic) functions
  PRIMITIVE-ACTIONS, PRIMITIVE-ACTION-DEFINITION and
  MAKE-PRIMITIVE-ACTION to store and retrieve information about
  primitive actions.
* Define macro DEFINE-PRIMITIVE-ACTION.
* Extend the parser to generate primitive actions if the operator is
  defined in the PRIMITIVE-ACTIONS table of the context.
* Add test cases.
* Add the classes CONCURRENT-TERM, PRIORITIZED-CONCURRENT-TERM and
  SPAWN-TERM for concurrent terms and add the corresponding operator
  names.

Additionally:
* Add SOURCE to terms.
* Add UNIQUE-NAME to variables.
* Fix some bugs
Add support for fluents

* Define classes FLUENT-DEFINITION, RELATIONAL-FLUENT-DEFINITION and
  FUNCTIONAL-FLUENT-DEFINITION and (generic) functions FLUENTS,
  DECLARE-RELATIONAL-FLUENT and DECLARE-FUNCTIONAL-FLUENT to store and
  retrieve information about primitive actions.
* Move slot ACTION-SUCCESSOR-STATE to class FLUENT-DEFINITION and
  rename it to FLUENT-SUCCESSOR-STATE.
* Define macros DEFINE-RELATIONAL-FLUENT and DEFINE-FUNCTIONAL-FLUENT.
* Extend the parser to generate fluent terms if the operator is
  defined in the FLUENTS table of the context.
* Add test cases.

Additionally:
* Rename MAKE-PRIMITIVE-ACTION to DECLARE-PRIMITIVE-ACTION and change
  its signature.
* Rename ACTION-TYPE to ACTION-CLASS.
* Change the signature of DEFINE-PRIMITIVE-ACTION.
* Fix some bugs.
Add functions to explore the class hierarchy for terms
Initial implementation of an interpreter
Fix compilation on various Lisps

* Use Alexandria declaration NON-NEGATIVE-FIXNUM instead of
  POSITIVE-FIXNUM.
* Use Closer-Mop for class introspection on implementations that support
  it instead of the native methods.
* Add additional IGNORE declarations for unused method arguments.
Update package definitions

* Define a global variable *FOO-EXPORTS* that contains all symbols
  exported by package FOO (for each package FOO).
* Change the :EXPORT clauses of the DEFPACKAGE forms to use the global
  variables.
* Remove exports CONJOIN and DISJOIN from the syntax package and the
  SHADOWING-IMPORT-FROM-clauses for these symbols from ODYSSEUS and
  ODYSSEUS-TESTS
* Add a package ODYSSEUS-INTERPRETER that exports all symbols defined
  by interpreters.
* Define the interpreter in the ODYSSEUS-INTERPRETER package.
* Add a package ODYSSEUS-USER for interactive use.
* Define the examples in the ODYSSEUS-USER package.
* Re-export the symbols from packages ODYSSEUS-UTILITIES,
  ODYSSEUS-INTERPRETER and ODYSSEUS-SYNTAX from the ODYSSEUS package.
Add installation instructions to the Readme
Update the interpreter framework

* Add function TO-SEXPR and define it for all relevant terms.
* Define primitive action NO-OPERATION and add it to instances of
  COMPILATION-UNIT when they are created.
* Add generic functions THE-EMPTY-PROGRAM-TERM and THE-NO-OPERATION-TERM
  and define a mixin UNIQUE-TERMS-MIXIN that provides storage and cached
  methods for these functions.
* Mix UNIQUE-TERMS-MIXIN into COMPILATION-UNIT.
* Specialize DECLARE-PRIMITIVE-ACTIONS, DECLARE-RELATIONAL-FLUENT and
  DECLARE-FUNCTIONAL-FLUENT to COMPILATION-CONTEXT to enable overloads
  for INTERPRETER.
* Define classes INTERPRETER and BASIC-INTERPRETER to manage compilation
  context and runtime state as well as semantics of interpretation.
* Rename function INTERPRET to INTERPRET-1 and change its signature to
  take an interpreter as first argument.  Return the term instances
  instead of their source.
* Define accessor DEFAULT-INTERPRETER instead of accessing the global
  variable directly.
* Make INTERPRET-AND-PRINT use TO-SEXPR and add a test that controls
  whether actions are printed.  Define functions SKIP-NOOPS and
  PRINT-EVERYTHING to provide default printing behaviors.
* Update packages.
* Clean-up the code.
Add situations to the interpreter

* Define classes SITUATION, INITIAL-SITUATION and SUCCESSOR-SITUATION.
* Add a situation argument to INTERPRET-1 and return a new situation as
  third value.
* Add a situation keyword argument to INTERPRET-AND-PRINT and return the
  final situation.
* Add additional test suites and put the tests of the parser into their
  own test suite (and file).
* Restructure the code and the package structure, add some missing
  exports.
* Initialize the primitive actions of a compilation unit by calling
  the function DEFAULT-PRIMITIVE-ACTION-NAMES to obtain a list of names
  for primitive actions and calling DECLARE-PRIMITIVE-ACTION on each of
  the names in the list.
* Fix a bug in the parser.
* Add additional examples.
Check whether actions are possible before executing them

* Add dependency on Snark to the system definition.
* Define functions INITIALIZE-SNARK, PROVE-OR-REFUTE,
  IDA-PROVE-OR-REFUTE (Iterative-Deepening-Application of P-A-R), and
  PROVE-USING-SNARK to interact with Snark.
* Define function CAN-EXECUTE-P that checks whether the interpreter can
  execute a primitive action and use it in the implementation of
  INTERPRET-1 for primitive actions.
* Add an ACTION-SIGNATURE slot to class PRIMITIVE-ACTION and add an
  argument for the signature to DEFINE-PRIMITIVE-ACTION.
* Add examples that use Snark and define the system ODYSSEUS-EXAMPLES.

Additionally:
* Prepare for backtracking by introducing the class CHOICE-POINT and
  functions MAKE-CHOICE-POINT, NEXT-CHOICE-POINT, and BACKTRACK
  (currently unused and untested).
* Delegate PRIMITIVE-ACTION-DEFINITION from the interpreter to its
  context.
* Define a generic function IN-SITUATION that replaces a situation in a
  term (it's not clear whether this will be needed).

This commit introduces many hacks that will have to be removed:
* Package ODYSSEUS-UTILITIES exports the symbols needed for the examples
  so that the theory definition of Snark and the interpreter agree on
  the package of the symbols they use.  Furthermore, the theory has to
  be defined outside of the Poem program.  Resolve this by having the
  interpreter create the Snark theory.
* CAN-EXECUTE-P provides hard-coded :answer and :set-up-theory arguments
  to PROVE-USING-SNARK.  The set-up-theory function should be created by
  the interpreter (see previous item), and the variables in the answer
  should be derived by scanning TERM for free variables.
* Currently we neither regress nor progress situations but rely on Snark
  to do this.
* Variables like *PRINT-SNARK-OUTPUT*, *PRINT-SNARK-TIMEOUTS* and
  *PRINT-SNARK-REFUTATIONS* are littered throughout the code and should
  be replaced by a general configuration utility for interpreters.
* Most of the functionality is untested, except for the examples.
Auto-generate answer term for Snark

* Implement functions FREE-VARIABLES and FREE-VARIABLE-SEXPRS.
* Generate the :answer argument for PROVE-USING-SNARK from the free
  variables of the input term.
* Return the reason why an action can execute, the free variables in the
  action term and the substitution Snark has found for these variables
  from CAN-EXECUTE-P
* Define functions TRACE-ODYSSEUS and UNTRACE-ODYSSEUS to enable and
  disable tracing.  Show the additional information from CAN-EXECUTE-P
  in the trace output.
* Update the examples.

Additionally:
* Catch errors caused by INTERPRET-1 in INTERPRET-AND-PRINT and return
  an error value.
* Split the syntax.lisp file into several parts.
* Split the file package.lisp; declare the exports using DEFVAR instead
  of DEFGLOBAL since the latter is not in the CL standard.
* Create packages ODYSSEUS-CONTEXT, ODYSSEUS-TERMS, and
  ODYSSEUS-OPERATORS that export parts of ODYSSEUS-SYNTAX to simplify
  inclusion in other software.
* Fix some bugs.
Improve interpreter framework, support search and choice

* Define a condition hierarchy for runtime errors.
* Improve the definition of RESET-INTERPRETER to allow preservation of
  an interpreter's compile-time context.
* Add functions INTERPRETER-MEMENTO and (SETF INTERPRETER-MEMENTO) to
  save the state of an interpreter; add class BASIC-INTERPRETER-MEMENTO
  to save mementos for instances of BASIC-INTERPRETER.
* Store a memento of the interpreter in each choice point.
* Add functions STORED-ACTIONS, (SETF STORED-ACTIONS),
  EXECUTE-STORED-ACTIONS, and EXECUTE-PRIMITIVE-ACTIONS to encapsulate
  the functionality for executing actions.  Add a slot STORED-ACTIONS
  to class BASIC-INTERPRETER.
* Rename BASIC-INTERPRETER-STATE to TOP-LEVEL-CONTEXT since the word
  'state' is way too overloaded.
* Include the free variables of the situation in the answer computed by
  Snark to keep track of variable bindings that depend on the execution
  history.
* Implement INTERPRET-1 methods specialized on SEARCH-TERM and on
  ACTION-CHOICE-TERM.
* Replace the INTERPRET-AND-PRINT method with an INTERPRET method that
  calls the EXECUTE-STORED-ACTIONS and EXECUTE-PRIMITIVE-ACTION methods.
* Define a PRINT-OBJECT method for interpreters that shows whether the
  interpreter is executing on-line or off-line.
* Improve the tracing output of the interpreter.

Additionally:
* Add a small framework for defining and executing examples.
* Define additional examples.
* Define a method CONTAINS-VARIABLE-P to prepare for correct online
  execution of terms with variables (the interpreter should either
  signal an error or pick a value for variables occurring in terms).
Update installation instructions

* Add download links for Snark which is now an essential component.
* Update the example interaction.
* Update the list of supported Lisp implementations.  ABCL and ECL seem
  to have problems building Snark and are therefore no longer supported.
* Add a link to tbaggery's article about writing commit messages.
Use results from Snark during execution

Substitute solutions from Snark into the program and the stored actions
and, when executing offline, also into the situation.

* Extend the parser to understand Snark variable terms, since these are
  returned as Snark answers.
* Define operations SUBSTITUTE-TERM and SUBSTITUTE-TERMS that substitute
  a new term for an old one in terms or situations.
* Define condition UNBOUND-VARIABLE-DURING-ONLINE-EXECUTION that is
  raised when the interpreter is asked to execute an action containing
  a variable while it is in online mode.
* Update INTERPRET-1 for PRIMITIVE-ACTION-TERM to substitute the answer
  terms obtained from Snark into the current term and the stored
  actions, and to also update the situation when it is in offline mode.
* Trace execution of stored actions.
* Add additional examples.
Improve the DEFEXAMPLE macro

* Add a slot HIDDEN? to class ODYSSEUS-EXAMPLE.
* Define a keyword argument :hidden? to DEFEXAMPLE that prevents
  RUN-EXAMPLES and RUN-ALL-EXAMPLES from executing the test.
* Define some very long examples.
Syntactic support for data definition

Implement the term types for (a first stab at) the data definition
language and extend the parser to support them.

* Add functions DECLARATIONS and (SETF DECLARATIONS) for compilation
  contexts.
* Extend COMPILATION-UNIT with a slot DECLARATIONS and delegate
  DECLARATIONS and its setter from LOCAL-CONTEXT to its OUTER-CONTEXT.
* Define classes for declaration terms.
* Define the required methods on PARSE-ARGUMENTS-FOR-TERM to parse the
  new term classes.
* Define the operators for declarations and store the mapping from
  operators to classes in *DECLARATION-OPERATORS*.
* Add the declaration operators to *DEFAULT-KNOWN-OPERATORS*.
Support domain declarations in the interpreter

Add initial support for declarations of domain entities to the
interpreter.

* Import symbols FORALL, EXISTS, NOT and IFF from the SNARK-LISP package
  so that s-expressions generated from Odysseus are compatible with
  Snark without additional processing.
* Move condition RUNTIME-ERROR and function UNQUOTE into the UTILITIES
  package.
* Define utility functions WRAP-IN-QUOTE and DEFINE-METHOD and condition
  INVALID-CLASS.
* Replace macros DEFINE-PRIMITIVE-ACTION, DEFINE-RELATIONAL-FLUENT and
  DEFINE-FUNCTIONAL-FLUENT with functions with the same names and
  functionalities (but with evaluated arguments, obviously).
* Define methods on TO-SEXPR for declaration terms.
* Define a PROCESS-DECLARATION-FOR-PARSING function that processes
  declarations while parsing.  In particular this functions arranges for
  subsequent occurrences of the declared symbol to be treated with the
  new syntax type.
* Define methods on PARSE-ARGUMENTS-FOR-TERM for subclasses of
  DECLARATION-TERM.
* Introduce generic functions PROCESS-DECLARATION-FOR-SNARK and
  SET-UP-SNARK that turn declarations into a Snark domain definition.
* Define a method on TERM for PARSE-INTO-TERM-REPRESENTATION that allows
  already parsed terms to occur in term representations.
* Replace the :SET-UP-THEORY keyword argument to PROVE-OR-REFUTE,
  IDA-PROVE-OR-REFUTE and PROVE-USING-SNARK with a :CONTEXT keyword that
  passes a compilation context.
* Define an INTERPRET-1 method for DECLARATION-TERM instances.
* Add a slot SET-UP-FUNCTION to ODYSSEUS-EXAMPLE  that allows the common
  domain theory of several examples to be defined in a separate
  function.
* Add a function FULL-SOURCE-CODE that returns the full source code for
  an example (code generated by the set-up-function followed by the real
  example code).
* Add a :SET-UP-FUNCTION keyword argument to the DEFEXAMPLE macro.
* Define the function SET-UP-EWSC-THEORY that returns a form containing
  the domain definition for the eat/work/sleep/celebrate theory.
* Update the tests.
* Remove the file snark-setup-for-examples.lisp.
Clean-up the code

* Remove package-definition hacks for symbols DO, NO-OPERATION, EAT,
  SLEEP, WORK, CELEBRATE, IS-RESTED-P, ANNABELLE, LENZ and MATTHIAS
  since they are no longer necessary now that we can define the theory
  in the interpreter.
* Remove the commented-out Lisp declarations of the primitive actions
  for the example, since they are no longer necessary.
* Disable the APPLY* macro in term-operations.lisp that was introduced
  for debugging purposes.
Randomize action choice in offline mode

* Introduce variable *PERMUTE-OFFLINE-CHOICE*.
* Shuffle the body of the action choice if *PERMUTE-OFFLINE-CHOICE* is
  true; reverse the body (as was the default before this change) when
  it is false.