content: package aima.core.learning.knowledge;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import aima.core.learning.framework.Example;
  import aima.core.logic.fol.Connectors;
  import aima.core.logic.fol.parsing.ast.ConnectedSentence;
  import aima.core.logic.fol.parsing.ast.Constant;
  import aima.core.logic.fol.parsing.ast.NotSentence;
  import aima.core.logic.fol.parsing.ast.Predicate;
  import aima.core.logic.fol.parsing.ast.Sentence;
  import aima.core.logic.fol.parsing.ast.Term;
  
  /**
   * @author Ciaran O'Reilly
   * 
   */
  public class FOLExample {
  	private FOLDataSetDomain folDSDomain = null;
  	private Example example = null;
  	private int egNo = 0;
  	//
  	private Constant ithExampleConstant = null;
  	private Sentence classification = null;
  	private Sentence description = null;
  
  	//
  	// PUBLIC METHODS
  	//
  	public FOLExample(FOLDataSetDomain folDSDomain, Example example, int egNo) {
  		this.folDSDomain = folDSDomain;
  		this.example = example;
  		this.egNo = egNo;
  		constructFOLEg();
  	}
  
  	public int getExampleNumber() {
  		return egNo;
  	}
  
  	public Sentence getClassification() {
  		return classification;
  	}
  
  	public Sentence getDescription() {
  		return description;
  	}
  
  	@Override
  	public String toString() {
  		return classification.toString() + " " + Connectors.AND + " "
  				+ description.toString();
  	}
  
  	//
  	// PRIVATE METHODS
  	//
  	private void constructFOLEg() {
  		ithExampleConstant = new Constant(folDSDomain.getExampleConstant(egNo));
  
  		List<Term> terms = new ArrayList<Term>();
  		terms.add(ithExampleConstant);
  		// Create the classification sentence
  		classification = new Predicate(folDSDomain.getGoalPredicateName(),
  				terms);
  		if (!example.getAttributeValueAsString(
  				folDSDomain.getDataSetTargetName()).equals(
  				folDSDomain.getTrueGoalValue())) {
  			// if not true then needs to be a Not sentence
  			classification = new NotSentence(classification);
  		}
  
  		// Create the description sentence
  		List<Sentence> descParts = new ArrayList<Sentence>();
  		for (String dname : folDSDomain.getDescriptionDataSetNames()) {
  			String foldDName = folDSDomain.getFOLName(dname);
  			terms = new ArrayList<Term>();
  			terms.add(ithExampleConstant);
  			// If multivalued becomes a two place predicate
  			// e.g: Patrons(X1, Some)
  			// otherwise: Hungry(X1) or ~ Hungry(X1)
  			// see pg 769 of AIMA
  			Sentence part = null;
  			if (folDSDomain.isMultivalued(dname)) {
  				terms.add(new Constant(folDSDomain.getFOLName(example
  						.getAttributeValueAsString(dname))));
  				part = new Predicate(foldDName, terms);
  			} else {
  				part = new Predicate(foldDName, terms);
  				// Need to determine if false
  				if (!folDSDomain.getTrueGoalValue().equals(
  						example.getAttributeValueAsString(dname))) {
  					part = new NotSentence(part);
  				}
  			}
  			descParts.add(part);
  		}
  		if (descParts.size() == 1) {
  			description = descParts.get(0);
  		} else if (descParts.size() > 1) {
  			description = new ConnectedSentence(Connectors.AND,
  					descParts.get(0), descParts.get(1));
  			for (int i = 2; i < descParts.size(); i++) {
  				description = new ConnectedSentence(Connectors.AND,
  						description, descParts.get(i));
  			}
  		}
  	}
  }
  