package janala.interpreters; import java.util.LinkedList; import java.util.List; import java.util.Map; public class SymbolicOrConstraint extends Constraint { public final List<Constraint> constraints; private SymbolicOrConstraint(List<Constraint> list) { constraints = new LinkedList<Constraint>(); constraints.addAll(list); } public SymbolicOrConstraint(Constraint c) { constraints = new LinkedList<Constraint>(); if (c != null) { constraints.add(c); } } public SymbolicOrConstraint OR(Constraint c) { if (c != null) { SymbolicOrConstraint ret = new SymbolicOrConstraint(constraints); ret.constraints.add(c); return ret; } else { return this; } } @Override public void accept(ConstraintVisitor v) { v.visitSymbolicOr(this); } @Override public Constraint not() { return new SymbolicNotConstraint(this); } @Override public Constraint substitute(Map<String, Long> assignments) { if (constraints.isEmpty()) { return SymbolicTrueConstraint.instance; } LinkedList<Constraint> tmp = new LinkedList<Constraint>(); for (Constraint c : constraints) { Constraint c2 = c.substitute(assignments); if (c2 == SymbolicTrueConstraint.instance) { return SymbolicTrueConstraint.instance; } else if (c2 != SymbolicFalseConstraint.instance) { tmp.add(c2); } } if (!tmp.isEmpty()) { return new SymbolicOrConstraint(tmp); } else { return SymbolicFalseConstraint.instance; } } @Override public String toString() { StringBuilder sb = new StringBuilder(); boolean first = true; for (Constraint c : constraints) { if (first) { first = false; } else { sb.append(" || "); } sb.append("("); sb.append(c); sb.append(")"); } return sb.toString(); } }