/** * Returns an element of sorts which is related to and no * less than every other element of sorts, if any exists. */ private Optional<Sort> greatest(Iterable<Sort> sorts) { Iterator<Sort> iter = sorts.iterator(); if (!iter.hasNext()) { return Optional.empty(); } Sort max = iter.next(); while (iter.hasNext()) { Sort next = iter.next(); if (!subsorts.greaterThanEq(max, next)) { // if min is unrelated to next, it can't be the least sort so // we also might as well switch max = next; } } for (Sort s : sorts) { if (!subsorts.greaterThanEq(max, s)) { return Optional.empty(); } } return Optional.of(max); }
/** Return the set of all known sorts which are a lower bound on * all sorts in {@code bounds}, leaving out internal sorts below "KBott" or above "K". */ private Set<Sort> lowerBounds(Collection<Sort> bounds) { Set<Sort> mins = new HashSet<>(); nextsort: for (Sort sort : iterable(sortSet)) { // for every declared sort // Sorts at or below KBott, or above K, are assumed to be // sorts from kast.k representing meta-syntax that is not a real sort. // This is done to prevent variables from being inferred as KBott or // as KList. if (subsorts.lessThanEq(sort, Sorts.KBott())) continue; if (subsorts.greaterThan(sort, Sorts.K())) continue; for (Sort bound : bounds) if (!subsorts.greaterThanEq(bound, sort)) continue nextsort; mins.add(sort); } return mins; }
stream(mainModule.definedSorts()).filter(s -> mainModule.subsorts().greaterThanEq(predicateSort, s)).distinct() .filter(sort -> mainModule.sortAttributesFor().contains(sort)).forEach(sort -> { String sortHook = mainModule.sortAttributesFor().apply(sort).<String>getOptional("hook").orElse("");
newItems.add(child); } else { Set<Sort> least = subsorts.minimal(stream(listSorts).filter(s -> subsorts.greaterThanEq(lists.get(s).get(0).childSort, childSort) && subsorts.lessThanEq(s, expectedSort)).collect(Collectors.toList())); if (least.size() != 1) { KException ex = new KException(KException.ExceptionType.ERROR, KException.KExceptionGroup.INNER_PARSER, "Overloaded term does not have a least sort. Possible sorts: " + least, tc.source().orElse(null), tc.location().orElse(null));