code: public AbstractRslNode evaluate(Map symbolTable)
  	throws RslEvaluationException {
  
  	if (symbolTable == null) symbolTable = new HashMap();
  
  	Map localSymbolTable = null;
  	Iterator iter;
  
  	RslNode finalRsl = new RslNode(getOperator());
  
  	if (_bindings != null && _bindings.size() > 0) {
  	    localSymbolTable = new HashMap(symbolTable);
  	    iter = _bindings.keySet().iterator();
  	    Bindings binds;
  	    while( iter.hasNext() ) {
  		binds = getBindings( (String)iter.next() );
  		finalRsl.put( binds.evaluate( localSymbolTable ) );
  	    }
  	} else {
  	    localSymbolTable = symbolTable;
  	}
  
  	if (_relations != null && _relations.size() > 0) {
  	    iter = _relations.keySet().iterator();
  	    NameOpValue nov;
  	    while(iter.hasNext()) {
  		nov = getParam( (String)iter.next() );
  		finalRsl.put( nov.evaluate(localSymbolTable) );
  	    }
  	}
  
  	if (_specifications != null && _specifications.size() > 0) {
  	    iter = _specifications.iterator();
  	    AbstractRslNode node;
  	    while(iter.hasNext()) {
  		node = (AbstractRslNode)iter.next();
  		finalRsl.add( node.evaluate(localSymbolTable) );
  	    }
  	}
  
  	return finalRsl;
      }
docs: Evalutes the rsl tree against the specified symbol table.
  All the variable definitions are first evaluated because
  they might update the symbol table. Then all the relations
  followed by the sub-specifications are evaluated.
  
  @param symbolTable the symbol table to evalute variables against.
  @return the evaluated rsl tree.
  @exception RslEvaluationException If an error occured during
  rsl evaluation.