package aima.core.logic.fol.domain;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @author Ravi Mohan
* @author Ciaran O'Reilly
*/
public class FOLDomain {
private Set<String> constants, functions, predicates;
private int skolemConstantIndexical = 0;
private int skolemFunctionIndexical = 0;
private int answerLiteralIndexical = 0;
private List<FOLDomainListener> listeners = new ArrayList<FOLDomainListener>();
public FOLDomain() {
this.constants = new HashSet<String>();
this.functions = new HashSet<String>();
this.predicates = new HashSet<String>();
}
public FOLDomain(FOLDomain toCopy) {
this(toCopy.getConstants(), toCopy.getFunctions(), toCopy
.getPredicates());
}
public FOLDomain(Set<String> constants, Set<String> functions,
Set<String> predicates) {
this.constants = new HashSet<String>(constants);
this.functions = new HashSet<String>(functions);
this.predicates = new HashSet<String>(predicates);
}
public Set<String> getConstants() {
return constants;
}
public Set<String> getFunctions() {
return functions;
}
public Set<String> getPredicates() {
return predicates;
}
public void addConstant(String constant) {
constants.add(constant);
}
public String addSkolemConstant() {
String sc = null;
do {
sc = "SC" + (skolemConstantIndexical++);
} while (constants.contains(sc) || functions.contains(sc)
|| predicates.contains(sc));
addConstant(sc);
notifyFOLDomainListeners(new FOLDomainSkolemConstantAddedEvent(this, sc));
return sc;
}
public void addFunction(String function) {
functions.add(function);
}
public String addSkolemFunction() {
String sf = null;
do {
sf = "SF" + (skolemFunctionIndexical++);
} while (constants.contains(sf) || functions.contains(sf)
|| predicates.contains(sf));
addFunction(sf);
notifyFOLDomainListeners(new FOLDomainSkolemFunctionAddedEvent(this, sf));
return sf;
}
public void addPredicate(String predicate) {
predicates.add(predicate);
}
public String addAnswerLiteral() {
String al = null;
do {
al = "Answer" + (answerLiteralIndexical++);
} while (constants.contains(al) || functions.contains(al)
|| predicates.contains(al));
addPredicate(al);
notifyFOLDomainListeners(new FOLDomainAnswerLiteralAddedEvent(this, al));
return al;
}
public void addFOLDomainListener(FOLDomainListener listener) {
synchronized (listeners) {
if (!listeners.contains(listener)) {
listeners.add(listener);
}
}
}
public void removeFOLDomainListener(FOLDomainListener listener) {
synchronized (listeners) {
listeners.remove(listener);
}
}
//
// PRIVATE METHODS
//
private void notifyFOLDomainListeners(FOLDomainEvent event) {
synchronized (listeners) {
for (FOLDomainListener l : listeners) {
event.notifyListener(l);
}
}
}
}