Пример #1
0
 public boolean isBound(RuleVariable var, Collection<RuleVariable> boundVars) {
   if (leftExpr.equals(var) && !boundVars.contains(var)) {
     if (rightExpr instanceof RuleVariable) if (!boundVars.contains(rightExpr)) return false;
     boundVars.add(var);
     return true;
   }
   if (rightExpr.equals(var) && !boundVars.contains(var)) {
     if (leftExpr instanceof RuleVariable) if (!boundVars.contains(leftExpr)) return false;
     boundVars.add(var);
     return true;
   }
   // TODO:Testen ob ?var = External() muster vorhanden ist, ?x gebunden
   // ist und External die gesuchte Variable enth�lt, die restlichen aber
   // gebunden sind, dann gebunden.
   if (leftExpr instanceof RuleVariable
       && boundVars.contains(leftExpr)
       && rightExpr instanceof External) {
     Set<RuleVariable> extVars = rightExpr.getVariables();
     boolean found = false;
     boolean bound = true;
     for (final RuleVariable ruleVar : extVars)
       if (ruleVar.equals(var)) found = true;
       else if (!boundVars.contains(ruleVar)) bound = false;
     if (found && bound && rightExpr.isBound(var, boundVars)) {
       return true;
     }
   }
   if (rightExpr instanceof RuleVariable
       && boundVars.contains(rightExpr)
       && leftExpr instanceof External) {
     Set<RuleVariable> extVars = leftExpr.getVariables();
     boolean found = false;
     boolean bound = true;
     for (final RuleVariable ruleVar : extVars)
       if (ruleVar.equals(var)) found = true;
       else if (!boundVars.contains(ruleVar)) bound = false;
     if (found && bound && leftExpr.isBound(var, boundVars)) {
       return true;
     }
   }
   return false;
 }
Пример #2
0
 public Object evaluate(
     Bindings binding, Object result, Multimap<IExpression, IExpression> equalities) {
   // Mehrere M�glichkeiten die auftreten k�nnen
   boolean leftHasUnbound = false;
   boolean rightHasUnbound = false;
   boolean leftAssign = false;
   boolean rightAssign = false;
   Set<Variable> bindingVars = binding.getVariableSet();
   for (RuleVariable var : leftExpr.getVariables())
     if (!bindingVars.contains(var.getVariable())) {
       leftHasUnbound = true;
       // Linke ungebunden, muss allein stehen
       if (leftExpr instanceof RuleVariable) leftAssign = true;
     }
   for (RuleVariable var : rightExpr.getVariables())
     if (!bindingVars.contains(var.getVariable())) {
       rightHasUnbound = true;
       // Linke ungebunden, muss allein stehen
       if (rightExpr instanceof RuleVariable) rightAssign = true;
     }
   if (rightAssign && leftAssign)
     throw new RIFException("All Variables in Assignment " + toString() + " are unbound!");
   if (rightAssign ^ leftAssign) {
     // Einzelne ungebundene variable auf einer seite, dann einfach die
     // andere auswerten und ergebniss reinschreiben
     Literal assignValue =
         (Literal) (leftAssign ? rightExpr.evaluate(binding) : leftExpr.evaluate(binding));
     RuleVariable var = (RuleVariable) (leftAssign ? leftExpr : rightExpr);
     binding.add(var.getVariable(), assignValue);
     return BooleanLiteral.TRUE;
   } else {
     // fester wert auf jeder seite, also erst aussage mit gebundenen
     // variable auswerten und anderem als result mitgeben.
     Item left = null;
     Item right = null;
     if (rightHasUnbound) {
       left = (Item) leftExpr.evaluate(binding);
       right = (Item) rightExpr.evaluate(binding, left);
     } else if (leftHasUnbound) {
       right = (Item) rightExpr.evaluate(binding);
       left = (Item) leftExpr.evaluate(binding, right);
     } else {
       left = (Item) leftExpr.evaluate(binding);
       right = (Item) rightExpr.evaluate(binding);
     }
     return BooleanLiteral.create(left.equals(right));
   }
 }