These files contain the code for the planner SNLP.  SNLP is a domain
independent systematic nonlinear planner that is both complete and sound.

The design of this planner was influenced by the paper "Systematic
Nonlinear Planning" by D. McAllester and D.  Rosenblitt (to appear in
AAAI-91).  This planner was created for comparing linear and nonlinear
planning in the paper "Evaluating Nonlinear Planning" 
by S. Soderland and D. Weld (University of Washington CSE TR 91-02-03). 

The best way to explain this planner is through an example.
Planning domains are defined using a STRIPS like notation.  An example
domain for the blocks world would be defined by the following routine.

  (defun blocks-world-domain ()
    ;; purge old domain prior to defining a new domain
    (snlp:reset-domain)

    ;; Define step for putting a block on the table.
    (snlp:defstep :action '(newtower ?x)
      :precond  '((on ?X ?Z) (clear ?X))
      :add '((on ?X Table) (clear ?Z))
      :dele'((on ?X ?Z))
      :equals '((not (?X ?Z)) (not (?X Table)) (not (?Z Table))))

    ;; Define step for placing one block on another.
    (snlp:defstep :action '(puton ?X ?Y)
      :precond '((on ?X ?Z) (clear ?X) (clear ?Y))
      :add   '((on ?X ?Y) (clear ?Z))
      :dele  '((on ?X ?Z) (clear ?Y))
      :equals '((not (?X ?Y)) (not (?X ?Z)) (not (?Y ?Z))
                (not (?X Table)) (not (?Y Table)))))

The only difference between a SNLP defstep and a STRIPS action 
revolves around the :equals entry.  This entry defines extra 
constraints on the variables involving equalities and inequalities.  

Once a domain is defined a problem can be defined by two lists,
representing a set of conjunctive initial conditions and goal conditions
respectively.  For example, 

  (defun sussman-anomally ()
    (snlp:plan '((on C A) (on A Table) (on B Table) (clear C) (clear B))
               '((on A B) (on B C))))

Calling these two functions one after the other gives the following
output.

  Initial  : ((ON C A) (ON A TABLE) (ON B TABLE) (CLEAR C) (CLEAR B))

  Step 1   : (NEWTOWER C)     from ?SNLP::Z3       Created 3 
  Step 2   : (PUTON B C)      from ?SNLP::Z1       Created 1 
  Step 3   : (PUTON A B)      from ?SNLP::Z2       Created 2 

  Goal     : ((ON A B) (ON B C))
  Complete! 


  SNLPLAN (Init = 5  ; Goals = 2 ) => Win  (3 steps)     CPU 934      
       Nodes (V = 13  ; Q = 15  ; C = 41  )             Branch 2.1538463 
       Working Unifies: 255                             Bindings added: 108 

Notice that SNLP returns two values, a plan and a statistics object.  Both
of these structures have customized print methods that cause the output
shown above.

To avoid an infinite loop in cases when there is no solution, it is
necessary to set the variable snlp::*snlp-limit* to the maximum number
of incomplete plans that the planner can generate at one time.  This
variable's value can be increased for harder planning problems.
