Esempio n. 1
0
  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;
    }
  }
Esempio n. 2
0
 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;
   }
 }
Esempio n. 3
0
 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;
   }
 }
Esempio n. 4
0
  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;
    }
  }