content: package aima.core.logic.propositional.parsing;
  
  import aima.core.logic.propositional.parsing.ast.ComplexSentence;
  import aima.core.logic.propositional.parsing.ast.PropositionSymbol;
  
  /**
   * <b>Propositional Logic Visitor:</b> A <a
   * href="http://en.wikipedia.org/wiki/Visitor_pattern">Visitor Pattern/</a> for
   * traversing the abstract syntax tree structural representation of
   * propositional logic used in this library. The key difference between the
   * default Visitor pattern and the code here, is that in the former the visit()
   * methods have a void visit(ConcreteNode) signature while the visitors used
   * here have a Object visit(ConcreteNode, Object arg) signature. This simplifies
   * testing and allows some recursive code that is hard with the former .
   * 
   * @author Ravi Mohan
   * @author Ciaran O'Reilly
   * 
   * @param <A>
   *            the argument type to be passed to the visitor methods.
   * @param <R>
   *            the return type to be returned from the visitor methods.
   */
  public interface PLVisitor<A, R> {
  	/**
  	 * Visit a proposition symbol (e.g A).
  	 * 
  	 * @param sentence
  	 *            a Sentence that is a propositional symbol.
  	 * @param arg
  	 *            optional argument to be used by the visitor.
  	 * @return optional return value to be used by the visitor.
  	 */
  	R visitPropositionSymbol(PropositionSymbol sentence, A arg);
  
  	/**
  	 * Visit a unary complex sentence (e.g. ~A).
  	 * 
  	 * @param sentence
  	 *            a Sentence that is a unary complex sentence.
  	 * @param arg
  	 *            optional argument to be used by the visitor.
  	 * @return optional return value to be used by the visitor.
  	 */
  	R visitUnarySentence(ComplexSentence sentence, A arg);
  
  	/**
  	 * Visit a binary complex sentence (e.g. A & B).
  	 * 
  	 * @param sentence
  	 *            a Sentence that is a binary complex sentence.
  	 * @param arg
  	 *            optional argument to be used by the visitor.
  	 * @return optional return value to be used by the visitor.
  	 */
  	R visitBinarySentence(ComplexSentence sentence, A arg);
  }