package de.tu_dresden.inf.ggp06_2.resolver;
import java.util.List;
import de.tu_dresden.inf.ggp06_2.resolver.fuzzy.FuzzyResolution;
import de.tu_dresden.inf.ggp06_2.resolver.fuzzy.FuzzySubstitution;
import de.tu_dresden.inf.ggp06_2.resolver.scope.GameStateScope;
import de.tu_dresden.inf.ggp06_2.resolver.scope.RuleScope;
import de.tu_dresden.inf.ggp06_2.simulator.flags.TimerFlag;
public final class TruePredicate extends Predicate {
private final Atom secondOperand;
/**
* True operator is unary so it can be initialized only with one argument.
* @param expression Argument to negate.
*/
public TruePredicate(Expression expression) {
super(Const.aTrue, expression);
secondOperand = (Atom) expression.firstOperand();
}
/**
* Apply given substitution to argument of true operator, initialize new
* true operator with result of application.
*
* @param sigma Substitution to apply.
* @return New true operator.
*/
@Override
public Expression apply(Substitution sigma) {
return new TruePredicate( operands.get(0).apply(sigma) );
}
@Override
public String toString() {
return (toString == null) ? "(TRUE " + operands.get(0) + ")" : toString;
}
@Override
public Term secondOperand() {
return secondOperand;
}
@Override
protected List<Substitution> chainBody( Substitution sigma,
RuleScope scope,
TimerFlag flag )
throws InterruptedException {
return scope.chainFunction(sigma, this);
}
@Override
protected Substitution chainOneBody( Substitution sigma,
RuleScope scope,
TimerFlag flag )
throws InterruptedException {
return scope.chainOneFunction(sigma, this);
}
@Override
protected FuzzyResolution fuzzyEvaluateBody( FuzzySubstitution sigma,
GameStateScope scope,
List<Expression> guard,
TimerFlag flag )
throws InterruptedException {
Atom fluentName = secondOperand;
FuzzyResolution sigmas = new FuzzyResolution();
ExpressionList candidates = scope.getSimilarFluents( fluentName );
for ( Expression e : candidates) {
Substitution psi = mgu(e, sigma);
if (null != psi)
evaluateToFuzzyTruth( sigma, sigmas, psi );
}
if ( sigmas.isEmpty() )
evaluateToFuzzyFalse( sigma, sigmas );
return sigmas;
}
private void evaluateToFuzzyTruth(FuzzySubstitution sigma, FuzzyResolution sigmas, Substitution psi) {
FuzzySubstitution fuzzySub = new FuzzySubstitution(psi, sigma);
fuzzySub.tNorm( Expression.fuzzyOne );
sigmas.add( fuzzySub );
sigmas.setFuzzyValue( Expression.fuzzyOne );
}
}