public SymbolicConstraint matchImplies(ConstrainedTerm constrainedTerm) { SymbolicConstraint unificationConstraint = new SymbolicConstraint(constrainedTerm.termContext()); unificationConstraint.add(term, constrainedTerm.term); unificationConstraint.simplify(); if (unificationConstraint.isFalse() || !unificationConstraint.isSubstitution()) { return null; } SymbolicConstraint implicationConstraint = new SymbolicConstraint(constrainedTerm.termContext()); implicationConstraint.addAll(unificationConstraint); implicationConstraint.addAll(constrainedTerm.lookups); implicationConstraint.addAll(constrainedTerm.constraint); implicationConstraint.simplify(); unificationConstraint.addAll(constraint); unificationConstraint.simplify(); if (!unificationConstraint.implies(implicationConstraint)) { return null; } unificationConstraint.addAll(implicationConstraint); return unificationConstraint; }
public Collection<SymbolicConstraint> unify(ConstrainedTerm constrainedTerm) { if (!term.kind.equals(constrainedTerm.term.kind)) { return Collections.emptyList(); } SymbolicConstraint unificationConstraint = new SymbolicConstraint(constrainedTerm.termContext()); unificationConstraint.add(term, constrainedTerm.term()); unificationConstraint.simplify(); if (unificationConstraint.isFalse()) { return Collections.emptyList(); } Collection<SymbolicConstraint> constraints = new ArrayList<SymbolicConstraint>(); for (SymbolicConstraint solution : unificationConstraint.getMultiConstraints()) { if (SymbolicConstraint.TruthValue.FALSE == solution.addAll(constrainedTerm.lookups)) continue; if (SymbolicConstraint.TruthValue.FALSE == solution.addAll(constrainedTerm.constraint)) continue; if (SymbolicConstraint.TruthValue.FALSE == solution.addAll(constraint)) continue; solution.simplify(); if (solution.isFalse()) { continue; } if (solution.checkUnsat()) { continue; } constraints.add(solution); } return constraints; }