const Varset* combine(const Chain<Varset>*& vsc, const Varset& vs) const {
const Varset* combine(const Chain<Varset>*& vsc, const Varset& vs, const TypeTable& types) const {
  const Varset* combine(const Chain<Varset>*& vsc, const Varset& vs) const {    if (constant() != Object(NULL_TERM) && vs.constant() != Object(NULL_TERM)	&& constant() != vs.constant()) {      return NULL;    }    Object comb_const =      (constant() != Object(NULL_TERM)) ? constant() : vs.constant();    const Chain<StepVariable>* comb_cd = cd_set();    for (const Chain<StepVariable>* vc = vs.cd_set();	 vc != NULL; vc = vc->tail) {      const StepVariable& step_var = vc->head;      if (excludes(step_var.first, step_var.second)) {	Chain<StepVariable>::register_use(comb_cd);	Chain<StepVariable>::unregister_use(comb_cd);	return NULL;      } else {	comb_cd = new Chain<StepVariable>(step_var, comb_cd);      }    }    const Chain<StepVariable>* comb_ncd = ncd_set();    for (const Chain<StepVariable>* vc = vs.ncd_set();	 vc != NULL; vc = vc->tail) {      const StepVariable& step_var = vc->head;      if (includes(step_var.first, step_var.second)) {	Chain<StepVariable>::register_use(comb_cd);	Chain<StepVariable>::unregister_use(comb_cd);	Chain<StepVariable>::register_use(comb_ncd);	Chain<StepVariable>::unregister_use(comb_ncd);	return NULL;      } else if (!excludes(step_var.first, step_var.second)) {	comb_ncd = new Chain<StepVariable>(step_var, comb_ncd);      }    }    vsc = new Chain<Varset>(Varset(comb_const, comb_cd, comb_ncd), vsc);    return &vsc->head;  }