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.simulator.flags.TimerFlag; public final class LegalPredicate extends Predicate { /** * @param expression Argument to negate. */ public LegalPredicate(Expression expression) { super(Const.aLegal, expression); } /** * @param expression Argument to negate. */ public LegalPredicate(ExpressionList expressionList) { super(Const.aLegal, expressionList); } /** * * * @param sigma * @param scope * @param flag * @return * @throws InterruptedException */ @Override protected FuzzyResolution fuzzyEvaluateBody( FuzzySubstitution sigma, GameStateScope scope, List<Expression> guard, TimerFlag flag) throws InterruptedException { ExpressionList candidates = getAppropriateMoves( scope ); if (null == candidates || candidates.isEmpty()) throw new InterruptedException(" seem to evaluate completely terminal state "); FuzzyResolution sigmas = new FuzzyResolution(); for (Expression e : candidates ){ Substitution psi = this.mgu( e, sigma ); if (null != psi){ evaluatePositively( sigma, sigmas, psi ); } } if (sigmas.isEmpty()){ evaluateToFuzzyFalse( sigma, sigmas ); } return sigmas; } /** * * @param scope * @return */ private ExpressionList getAppropriateMoves(GameStateScope scope) { ExpressionList candidates = null; Term role = this.secondOperand(); if (role instanceof Atom){ candidates = scope.getLegalMoves((Atom) role); } else { candidates = scope.getLinearLegalMoves(); } return candidates; } /** * Apply given substitution to argument of legal predicate, initialize new * legal predicate with result of application. * * @param sigma Substitution to apply. * @return New legal predicate. */ @Override public Expression apply(Substitution sigma) { return new LegalPredicate( operands.apply(sigma) ); } @Override public String toString() { return (toString == null) ? toString = "(LEGAL " + operands + ")" : toString; } }