package models.terms;
import exceptions.IllegalTypeException;
import models.algebra.Symbol;
import models.algebra.Type;
public abstract class EvaluatableTerm extends RDLTerm{
public EvaluatableTerm(Symbol symbol, int order) {
super(symbol, order);
}
public abstract boolean isLinearRightNormalized();
public LinearRightNormalizedType getLinearRightNormalizedType() {
if (isLinearRightNormalized()) {
return LinearRightNormalizedType.LINEAR_RIGHT_NORMALIZED;
}
return LinearRightNormalizedType.NOT_LINEAR_RIGHT_NORMALIZED;
}
public abstract EvaluatableTerm linearRightNormalize();
public abstract void selfLinearRightNormalize();
public static ResourceVariable of(String name, Type type, int order) {
return new ResourceVariable(name, type, order);
}
public static DependencyTerm of(EvaluatableTerm term, ResourceVariable variable, EvaluatableTerm valueTerm) {
return new DependencyTerm(term, variable, valueTerm);
}
public static EvaluatableTerm of(EvaluatableTerm term, ResourceVariable variable, EvaluatableTerm valueTerm, int order) {
if(variable.getOrder() == valueTerm.getOrder() && variable.getOrder() == order) {
return new DependencyTerm(term, variable, valueTerm);
} else if(variable.getOrder() -1 == order) {
return new DependencyTerm(term, variable, valueTerm);
} else {
return new SetEvaluatableTerm(new DependencyTerm(term, variable, valueTerm), order);
}
}
public static DependencyTerm of(Dependency dependency, EvaluatableTerm argumentTerm) {
RDLTerm term = dependency.getDependingTerm();
if(! (term instanceof EvaluatableTerm)) {
throw new IllegalTypeException();
}
return new DependencyTerm((EvaluatableTerm) term, dependency.getDependedVariable(), argumentTerm);
}
public static EvaluatableTerm of(Dependency dependency, EvaluatableTerm argumentTerm, int order) {
RDLTerm term = dependency.getDependingTerm();
if(! (term instanceof EvaluatableTerm)) {
throw new IllegalTypeException();
}
ResourceVariable variable = dependency.getDependedVariable();
if(variable.getOrder() == argumentTerm.getOrder() && variable.getOrder() == order) {
return new DependencyTerm((EvaluatableTerm) term, variable, argumentTerm);
} else if(variable.getOrder() - 1 == order) {
return new DependencyTerm((EvaluatableTerm) term, variable, argumentTerm);
} else {
return new SetEvaluatableTerm(new DependencyTerm((EvaluatableTerm) term, variable, argumentTerm), order);
}
}
public static SetEvaluatableTerm of(EvaluatableTerm term, int order) {
return new SetEvaluatableTerm(term, order);
}
}