public static DataStructureBuiltin element(DataStructureSort sort, Term... argument) { if (sort.type().equals(KSorts.BAG) || sort.type().equals(KSorts.LIST) || sort.type().equals(KSorts.SET)) { assert argument.length == 1 : "unexpected number of collection item arguments; expected 1, found " + argument.length; if (sort.type().equals(KSorts.LIST)) { return new ListBuiltin( sort, Collections.singletonList(argument[0]), Collections.<Term>emptyList(), Collections.<Term>emptyList()); } else { return new SetBuiltin( sort, Collections.singletonList(argument[0]), Collections.<Term>emptyList()); } } else if (sort.type().equals(KSorts.MAP)) { assert argument.length == 2 : "unexpected number of map item arguments; expected 2, found " + argument.length; return new MapBuiltin( sort, Collections.singletonMap(argument[0], argument[1]), Collections.<Term>emptyList()); } else { assert false : "unknown collection type"; return null; } }
protected DataStructureBuiltin(DataStructureSort sort, Collection<Term> baseTerms) { super(sort.name()); this.dataStructureSort = sort; this.baseTerms = baseTerms; if (baseTerms.size() == 1) { Term term = baseTerms.iterator().next(); if (term instanceof Variable && term.getSort().equals(sort.name())) { viewBase = (Variable) term; } else { viewBase = null; } } else { viewBase = null; } }
public static DataStructureBuiltin empty(DataStructureSort sort) { if (sort.type().equals(KSorts.BAG) || sort.type().equals(KSorts.SET)) { return new SetBuiltin(sort, Collections.<Term>emptyList(), Collections.<Term>emptyList()); } else if (sort.type().equals(KSorts.LIST)) { return new ListBuiltin( sort, Collections.<Term>emptyList(), Collections.<Term>emptyList(), Collections.<Term>emptyList()); } else if (sort.type().equals(KSorts.MAP)) { return new MapBuiltin( sort, Collections.<Term, Term>emptyMap(), Collections.<Term>emptyList()); } else { assert false : "unknown collection type"; return null; } }
public static DataStructureBuiltin of(DataStructureSort sort, Term... argument) { /* TODO(AndreiS): enforce some type checking for collections assert argument != null; for (Term term : argument) { assert term.getSort().equals(sort.name()): "unexpected sort " + term.getSort() + " of term " + term + "at " + term.getLocation() + "; " + "expected " + sort.name(); } */ if (sort.type().equals(KSorts.BAG) || sort.type().equals(KSorts.SET)) { Collection<Term> elements = new ArrayList<Term>(); Collection<Term> terms = new ArrayList<Term>(); for (Term term : argument) { if (term instanceof CollectionBuiltin) { CollectionBuiltin collectionBuiltin = (CollectionBuiltin) term; elements.addAll(collectionBuiltin.elements()); terms.addAll(collectionBuiltin.baseTerms()); } else { terms.add(term); } } return new SetBuiltin(sort, elements, terms); } else if (sort.type().equals(KSorts.LIST)) { boolean left = true; ArrayList<Term> elementsLeft = new ArrayList<Term>(); ArrayList<Term> elementsRight = new ArrayList<Term>(); ArrayList<Term> terms = new ArrayList<Term>(); for (Term term : argument) { if (term instanceof ListBuiltin) { ListBuiltin listBuiltin = (ListBuiltin) term; if (left) { elementsLeft.addAll(listBuiltin.elementsLeft()); if (listBuiltin.baseTerms().isEmpty()) { elementsLeft.addAll(listBuiltin.elementsRight()); } else { terms.addAll(listBuiltin.baseTerms()); elementsRight.addAll(listBuiltin.elementsRight()); left = false; } } else { // if right assert listBuiltin.baseTerms().isEmpty(); elementsRight.addAll(listBuiltin.elementsLeft()); elementsRight.addAll(listBuiltin.elementsRight()); } } else { assert left; terms.add(term); left = false; } } return ListBuiltin.of(sort, elementsLeft, elementsRight, terms); } else if (sort.type().equals(KSorts.MAP)) { Map<Term, Term> elements = new HashMap<Term, Term>(); Collection<Term> terms = new ArrayList<Term>(); for (Term term : argument) { if (term instanceof MapBuiltin) { MapBuiltin mapBuiltin = (MapBuiltin) term; elements.putAll(mapBuiltin.elements()); terms.addAll(mapBuiltin.baseTerms()); } else { terms.add(term); } } return new MapBuiltin(sort, elements, terms); } else { assert false : "unknown collection type"; return null; } }