void initializeDomains(Gdl gdl) {
    if (gdl instanceof GdlRelation) {
      GdlRelation relation = (GdlRelation) gdl;
      String name = relation.getName().toString();
      if (!name.equals("base")) {
        GdlTerm term = relation.toTerm();
        GdlTerm generified = findGenericForm(term);
        Assignment instantiation = getConstantList(term);
        if (!domains.containsKey(generified)) domains.put(generified, new Domain(generified, term));
        Domain dom = domains.get(generified);
        dom.assignments.add(instantiation);
      }
    } else if (gdl instanceof GdlRule) {
      GdlRule rule = (GdlRule) gdl;
      GdlSentence head = rule.getHead();
      if (head instanceof GdlRelation) {
        GdlRelation rel = (GdlRelation) head;
        GdlTerm term = rel.toTerm();

        GdlTerm generified = findGenericForm(term);
        if (!domains.containsKey(generified)) domains.put(generified, new Domain(generified, term));
        Domain dom = domains.get(generified);

        List<GdlTerm> productionTemplate = getConstantAndVariableList(term);

        List<List<GdlLiteral>> newRHSs = deOr(rule.getBody());
        for (List<GdlLiteral> RHS : newRHSs) {
          RuleReference ruleRef = new RuleReference(GdlPool.getRule(head, RHS));
          ruleRef.productionTemplate = productionTemplate;
          for (GdlLiteral lit : RHS) {
            if (lit instanceof GdlSentence) {
              GdlTerm t = ((GdlSentence) lit).toTerm();
              Condition cond = new Condition(t);
              ruleRef.conditions.add(cond);
            }
          }
          dom.ruleRefs.add(ruleRef);
        }

      } else {
        List<List<GdlLiteral>> newRHSs = deOr(rule.getBody());
        for (List<GdlLiteral> RHS : newRHSs) {
          RuleReference ruleRef = new RuleReference(GdlPool.getRule(head, RHS));
          for (GdlLiteral lit : RHS) {
            if (lit instanceof GdlSentence) {
              GdlTerm t = ((GdlSentence) lit).toTerm();
              Condition cond = new Condition(t);
              ruleRef.conditions.add(cond);
            }
          }
          extraRefs.add(ruleRef);
        }
      }
    }
  }