private void narrowByRule(ConstrainedTerm constrainedTerm, Rule rule) { stopwatch.reset(); stopwatch.start(); constrainedTermResults = new ArrayList<ConstrainedTerm>(); SymbolicConstraint leftHandSideConstraint = new SymbolicConstraint(constrainedTerm.termContext()); leftHandSideConstraint.addAll(rule.requires()); for (Variable variable : rule.freshVariables()) { leftHandSideConstraint.add(variable, IntToken.fresh()); } ConstrainedTerm leftHandSide = new ConstrainedTerm( rule.leftHandSide(), rule.lookups().getSymbolicConstraint(constrainedTerm.termContext()), leftHandSideConstraint, constrainedTerm.termContext()); for (SymbolicConstraint constraint : constrainedTerm.unify(leftHandSide)) { constraint.addAll(rule.ensures()); /* rename rule variables in the constraints */ Map<Variable, Variable> freshSubstitution = constraint.rename(rule.variableSet()); Term result = rule.rightHandSide(); /* rename rule variables in the rule RHS */ result = result.substituteWithBinders(freshSubstitution, constrainedTerm.termContext()); /* apply the constraints substitution on the rule RHS */ result = result.substituteWithBinders(constraint.substitution(), constrainedTerm.termContext()); /* evaluate pending functions in the rule RHS */ result = result.evaluate(constrainedTerm.termContext()); /* eliminate anonymous variables */ constraint.eliminateAnonymousVariables(); /* compute all results */ constrainedTermResults.add( new ConstrainedTerm(result, constraint, constrainedTerm.termContext())); } stopwatch.stop(); }
// apply rule by matching private void rewriteByRule(Term term, Rule rule) { stopwatch.reset(); stopwatch.start(); termResults = new ArrayList<Term>(); TermContext context = TermContext.of(definition); ConstrainedTerm constrainedTerm = new ConstrainedTerm(term, context); SymbolicConstraint leftHandSideConstraint = new SymbolicConstraint(context); leftHandSideConstraint.addAll(rule.requires()); for (Variable variable : rule.freshVariables()) { leftHandSideConstraint.add(variable, IntToken.fresh()); } ConstrainedTerm leftHandSide = new ConstrainedTerm( rule.leftHandSide(), rule.lookups().getSymbolicConstraint(context), leftHandSideConstraint, context); for (SymbolicConstraint constraint : constrainedTerm.unify(leftHandSide)) { if (!constraint.isMatching(leftHandSide)) { continue; } constraint.orientSubstitution(leftHandSide.variableSet()); Term result = rule.rightHandSide(); /* apply the constraints substitution on the rule RHS */ result = result.substituteAndEvaluate(constraint.substitution(), context); /* compute all results */ termResults.add(result); } stopwatch.stop(); }