for (FaspConstant t1 : town) {
      for (FaspConstant t2 : town) {
        if (distances.containsKey(new Pair<String, String>(t1.getName(), t2.getName()))) {
          GroundLiteral headd = createRegLiteral("near", t1, t2);
          GroundLiteral headc = createRegLiteral("conn", t1, t2);
          GroundRule factd = createRegularRule(headd, new TW(),
              new LattVal(distances.get(new Pair<String, String>(t1.getName(), t2.getName()))));
          GroundRule factc = createRegularRule(headc, new TW(), new LattVal(1.0));
          rules.add(factd);
          rules.add(factc);
        }
      }
    }
    // gloc rule
    for (FaspConstant a : atm) {
      for (FaspConstant t1 : town) {
        for (FaspConstant t2 : town) {
          // Different to the TPLP paper:
          if (!t1.equals(t2)) {
            GroundLiteral head = createRegLiteral("loc", a, t1, t2);
            GroundLiteral bodyl = createRegLiteral("conn", t1, t2);
            ArrayList<FaspFuzzyExpression> body = new ArrayList<FaspFuzzyExpression>();
            body.add(bodyl);
            for (FaspConstant tt1 : town) {
              for (FaspConstant tt2 : town) {
                if (!(((t1.equals(tt1)) && (t2.equals(tt2))) || ((t1.equals(tt2))
                    || (t2.equals(tt1))))
                    && (!tt1.equals(tt2))) {
                  GroundLiteral betaLit = createLiteral("loc", true, new NM(), a, tt1, tt2);
                  body.add(betaLit);
                }
              }
            }
            GroundRule locRule = new GroundRegularRule(head, body, new TW());
            rules.add(locRule);
          }
        }
      }
    }
    // gnear rule
    for (FaspConstant a : atm) {
      for (FaspConstant t : town) {
        // Why doesn't Java just support new ArrayList<FaspConstant>({a,t}) ?
        GroundLiteral head = createLiteral("locNear", false, null, a, t);
        GroundLiteral bodyElt = createLiteral("locNear2", true, new N(), a, t);
        GroundRule gnear = createRegularRule(head, new TW(), bodyElt);
        rules.add(gnear);
      }
    }
    // gnear' rule
    for (FaspConstant a : atm) {
      for (FaspConstant t1 : town) {
        GroundLiteral head = createLiteral("locNear2", false, null, a, t1);
        for (FaspConstant t2 : town) {
          GroundLiteral b1 = createRegLiteral("loc", a, t1, t2);
          GroundLiteral b2 = createNafLiteral("near", new N(), t1, t2);
          GroundLiteral b3 = createRegLiteral("locNear", a, t2);
          GroundRule gnearP = createRegularRule(head, new TW(), b1, b2, b3);
          rules.add(gnearP);
        }
      }
    }
    // nearr rule
    for (FaspConstant t1 : town) {
      for (FaspConstant t2 : town) {
        GroundLiteral head = createRegLiteral("near", t1, t2);
        for (FaspConstant t3 : town) {
          GroundLiteral b1 = createRegLiteral("conn", t1, t3);
          GroundLiteral b2 = createRegLiteral("near", t1, t3);
          GroundLiteral b3 = createRegLiteral("near", t3, t2);
          GroundRule nearr = createRegularRule(head, new TW(), b1, b2, b3);
          rules.add(nearr);
        }
      }
    }
    // locr rule
    for (FaspConstant a : atm) {
      for (FaspConstant t1 : town) {
        for (FaspConstant t2 : town) {
          // Small optimization
          if (!t1.equals(t2)) {
            GroundLiteral head = createRegLiteral("loc", a, t1, t2);
            GroundLiteral body = createRegLiteral("loc", a, t2, t1);
            GroundRule locr = createRegularRule(head, new TW(), body);
            rules.add(locr);
          }
        }
      }
    }
    // atmr rule
    for (FaspConstant a : atm) {
      for (FaspConstant t : town) {
        //GroundLiteral head = createRegLiteral("isNear", a, t);
        GroundLiteral head = createRegLiteral("atmNear", a, t);
        for (FaspConstant t1 : town) {
          for (FaspConstant t2 : town) {
            GroundLiteral b1 = createRegLiteral("loc", a, t1, t2);
            GroundLiteral b2 = createRegLiteral("locNear", a, t1);
            GroundLiteral b3 = createRegLiteral("near", t, t1);
            GroundRule atmr = createRegularRule(head, new TW(), b1, b2, b3);
            rules.add(atmr);
          }
        }
      }
    }
    // nearestAtm rule
    for (FaspConstant t : town) {
      GroundLiteral head = createRegLiteral("nearestAtm", t);
      for (FaspConstant a : atm) {
        GroundLiteral b = createRegLiteral("atmNear", a, t);
        GroundRule nearestAtm = createRegularRule(head, new TW(), b);
        rules.add(nearestAtm);
      }
    }
    // tDist rule
    GroundLiteral tDistHead = createRegLiteral("totNear");
    ArrayList<FaspFuzzyExpression> tDistBody = new ArrayList<FaspFuzzyExpression>();
    for (FaspConstant a : atm) {
      for (FaspConstant t : town) {
        tDistBody.add(createRegLiteral("atmNear", a, t));
      }
    }
    GroundRule tDistRule = new GroundRegularRule(tDistHead, tDistBody, new TM());
    rules.add(tDistRule);
    /*GroundLiteral tDistHead = createRegLiteral("totNear");
    ArrayList<FaspFuzzyExpression> tDistBody = new ArrayList<FaspFuzzyExpression>();
    for (FaspConstant t : town) {
    tDistBody.add(createRegLiteral("nearestAtm",t));
    }
    GroundRule tDistRule = new GroundRegularRule(tDistHead,tDistBody, new TM());
    rules.add(tDistRule);*/
    // constraint rule
    ArrayList<FaspFuzzyExpression> constrBody = new ArrayList<FaspFuzzyExpression>();
    constrBody.add(createNafLiteral("totNear", new N()));
    // We use 1-k because constraint (1-k) <- (1-totNear) means
    // 1-k >= 1-totNear, hence k <= totNear
    rules.add(new GroundRegularConstraint(new LattVal(1 - k), constrBody, new TW()));
    // Print the grounded program
    /*for (GroundRule r : rules) {
    System.out.println(r);
    }*/