aima.core.logic.fol.kb.data.Chain Maven / Gradle / Ivy
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();
}
}