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; }
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)); } }