package sorts; import java.util.ArrayList; import java.util.HashSet; import parser.ASTconstantTerm; import parser.ASTsortExpression; import parser.SimpleNode; import utilities.Pair; /** * This class represents a collection of sorts having the same structure of functional symbols * For example, the sorts f(g(a)) and f(g(c)) would belong to the same group. * @author Evgenii Balai * */ public class SortGroupTree { SortGroupTreeNode root; ArrayList<ArrayList<String> > instances; String sortName; HashSet<String> usedSortNames; public SortGroupTree(ASTconstantTerm term, HashSet<String> usedSortNames) { this.root = new SortGroupTreeNode(term); this.usedSortNames = usedSortNames; // initialize array of instances instances = new ArrayList<ArrayList<String>>(); // add the first instance this.addInstance(term); } /** * Add new instances (constant term) to the group * @param term */ public void addInstance(ASTconstantTerm term) { ArrayList<String> instance = new ArrayList<String>(); addInstanceRec(term,instance); instances.add(instance); } /** * Recursion implementing addInstance * @param term current node in the tree traversal process * @param leafIndex the number of leaves of the tree we have already seen */ private void addInstanceRec(SimpleNode term, ArrayList<String>instance) { if(term.jjtGetNumChildren() == 0) { instance.add(term.image); } for(int i=0;i<term.jjtGetNumChildren();i++) { addInstanceRec((SimpleNode) term.jjtGetChild(i),instance); } } /** * * @param usedSortNames * @return */ public ArrayList<Pair<String,ASTsortExpression>> produceNewSorts(HashSet<String> usedSortNames) { ArrayList<Pair<String,ASTsortExpression>> result = new ArrayList<Pair<String,ASTsortExpression>>(); ArrayList<ArrayList<String>> convertedInstances = vhConvert(); this.sortName = root.fillNewSortDefs(result,convertedInstances,usedSortNames,new IntCounter()); return result; } private ArrayList<ArrayList<String>> vhConvert() { ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>> (); for(int i=0;i<instances.get(0).size();i++) { result.add(new ArrayList<String>()); } for(int i=0;i<instances.size();i++) { for(int j=0;j<instances.get(0).size();j++) { result.get(j).add(i, instances.get(i).get(j)); } } return result; } }