static IterableIterator<SS> gSat(S statement) {
  final new L<S> vars;
  S pat = upperCaseVarsToStars(statement, vars);
  ret mapI(func(Matches m) {
    new SS map;
    for (int i = 0; i < l(m.m); i++)
      map.put(vars.get(i), m.unq(i));
    ret map;
  }, gJMatch(pat));
}