package jayhorn.solver; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.Stack; public class ProverTupleExpr implements ProverExpr { /** * Eliminate tuples by expanding them. */ public static ProverExpr[] flatten(ProverExpr[] exprs) { ArrayList<ProverExpr> res = new ArrayList<ProverExpr>(); Stack<ProverExpr> todo = new Stack<ProverExpr>(); for (int i = exprs.length - 1; i >= 0; --i) todo.push(exprs[i]); while (!todo.isEmpty()) { ProverExpr next = todo.pop(); if (next instanceof ProverTupleExpr) { ProverTupleExpr tnext = (ProverTupleExpr)next; for (int i = tnext.getArity() - 1; i >= 0; --i) todo.push(tnext.getSubExpr(i)); } else { res.add(next); } } return res.toArray(new ProverExpr[0]); } private final ProverExpr[] subExprs; private ProverTupleType type = null; public ProverTupleExpr(ProverExpr[] subExprs) { this.subExprs = subExprs.clone(); } public int getArity() { return subExprs.length; } public ProverExpr getSubExpr(int ind) { return subExprs[ind]; } public ProverTupleType getType() { if (type == null) { final ProverType[] subTypes = new ProverType[subExprs.length]; for (int i = 0; i < subExprs.length; ++i) subTypes[i] = subExprs[i].getType(); type = new ProverTupleType(subTypes); } return type; } public BigInteger getIntLiteralValue() { throw new UnsupportedOperationException(); } public boolean getBooleanLiteralValue() { throw new UnsupportedOperationException(); } @Override public String toString() { StringBuffer res = new StringBuffer(); res.append("["); String sep = ""; for (int i = 0; i < getArity(); ++i) { res.append(getSubExpr(i)); res.append(sep); sep = ", "; } res.append("]"); return res.toString(); } @Override public int hashCode() { return 12345 * Arrays.hashCode(subExprs); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ProverTupleExpr other = (ProverTupleExpr) obj; return Arrays.equals(this.subExprs, other.subExprs); } }