All Downloads are FREE. Search and download functionalities are using the official Maven repository.

aima.core.logic.fol.kb.data.Chain Maven / Gradle / Ivy

Go to download

AIMA-Java Core Algorithms from the book Artificial Intelligence a Modern Approach 3rd Ed.

The newest version!
package aima.core.logic.fol.kb.data;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;

import aima.core.logic.fol.inference.proof.ProofStep;
import aima.core.logic.fol.inference.proof.ProofStepChainContrapositive;
import aima.core.logic.fol.inference.proof.ProofStepPremise;

/**
 * 
 * A Chain is a sequence of literals (while a clause is a set) - order is
 * important for a chain.
 * 
 * @see Chain
 * 
 * @author Ciaran O'Reilly
 * 
 */
public class Chain {
	private static List _emptyLiteralsList = Collections
			.unmodifiableList(new ArrayList());
	//
	private List literals = new ArrayList();
	private ProofStep proofStep = null;

	public Chain() {
		// i.e. the empty chain
	}

	public Chain(List literals) {
		this.literals.addAll(literals);
	}

	public Chain(Set literals) {
		this.literals.addAll(literals);
	}

	public ProofStep getProofStep() {
		if (null == proofStep) {
			// Assume was a premise
			proofStep = new ProofStepPremise(this);
		}
		return proofStep;
	}

	public void setProofStep(ProofStep proofStep) {
		this.proofStep = proofStep;
	}

	public boolean isEmpty() {
		return literals.size() == 0;
	}

	public void addLiteral(Literal literal) {
		literals.add(literal);
	}

	public Literal getHead() {
		if (0 == literals.size()) {
			return null;
		}
		return literals.get(0);
	}

	public List getTail() {
		if (0 == literals.size()) {
			return _emptyLiteralsList;
		}
		return Collections
				.unmodifiableList(literals.subList(1, literals.size()));
	}

	public int getNumberLiterals() {
		return literals.size();
	}

	public List getLiterals() {
		return Collections.unmodifiableList(literals);
	}

	/**
	 * A contrapositive of a chain is a permutation in which a different literal
	 * is placed at the front. The contrapositives of a chain are logically
	 * equivalent to the original chain.
	 * 
	 * @return a list of contrapositives for this chain.
	 */
	public List getContrapositives() {
		List contrapositives = new ArrayList();
		List lits = new ArrayList();

		for (int i = 1; i < literals.size(); i++) {
			lits.clear();
			lits.add(literals.get(i));
			lits.addAll(literals.subList(0, i));
			lits.addAll(literals.subList(i + 1, literals.size()));
			Chain cont = new Chain(lits);
			cont.setProofStep(new ProofStepChainContrapositive(cont, this));
			contrapositives.add(cont);
		}

		return contrapositives;
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("<");

		for (int i = 0; i < literals.size(); i++) {
			if (i > 0) {
				sb.append(",");
			}
			sb.append(literals.get(i).toString());
		}

		sb.append(">");

		return sb.toString();
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy