+}
+
+std::string make_nombre(const std::string& n, char mod, unsigned i)
+{
+ std::ostringstream oss;
+ oss << n << "-" << mod << i;
+ return oss.str();
+}
+
+//--------------------------------------------------------------------------------------------
+//--
+void CSistemaAutonomo::heuristca_observacion(CTeoria& t)
+{
+ CTeoria* pnt = new CTeoria ; //Nueva Teoria
+ CTeoria& nt = *pnt;
+
+ // Le agrego los datos iniciales tal cual estaban antes
+ nt.datos_iniciales = t.datos_iniciales;
+
+ // Le agrego todas las condiciones del entorno como condicion final
+ nt.datos_finales = p_entorno->datos;
+
+ // Le cargo nombre y funcion (queda con k=1 y p=1)
+ nt.nombre = make_nombre(t.nombre, 'o', teorias.count());
+ nt.funcion = t.funcion;
+
+ // Agrego la teoria
+ teorias.add (nt.nombre, pnt) ;
+#ifdef DEBUG
+ std::cout << "SA: Se agrego una nueva teoria: " << nt << " basada en " << t << "\n";
+ std::cout << "SA: \tdatos_iniciales:\n" << nt.datos_iniciales << "\n";
+ std::cout << "SA: \tdatos_finales:\n" << nt.datos_finales << "\n";
+#endif // DEBUG
+
+}
+
+//--------------------------------------------------------------------------------------------
+//--
+// Si las condiciones finales del entorno son iguales a las condiciones finales de alguna teoria y
+// solo una condicion inicial es distinta => agrego una nueva teoría igual (a la q cumple los requisitos
+// anteriormente detallados) pero tomando ANY en el valor de entrada en el cual difieren.
+void CSistemaAutonomo::heuristca_generalizacion(CTeoria& t)
+{
+ unsigned i ;
+ int count = 0;
+ unsigned k = 0;
+ unsigned j = 0;
+ int posicionCambio = -1;
+ unsigned cantidadTeorias = 0;
+ std::string nombreTeoria;
+
+ cantidadTeorias = this->teorias.count();
+
+ for (i = 0; i < cantidadTeorias; i++)
+ {
+ for (k = 0; k < this->teorias[i]->datos_finales.count(); k++)
+ {
+ //me fijo si las condiciones finales de la teoria se corresponden con la del entorno.
+ if ((this->teorias[i]->datos_finales[k] != ANY) && (this->p_entorno->datos.find(t.datos_finales.keys(k)) != ANY))
+ {
+ if (this->teorias[i]->datos_finales[k] != this->p_entorno->datos.find(t.datos_finales.keys(k)))
+ {
+ count++;
+ }
+ }
+ }
+ if (count == 0)
+ { // si se corresponden (las condiciones finales son iguales) => me fijo si hay alguna condicion inicial q cambia.
+ for (j = 0; j < this->teorias[i]->datos_iniciales.count(); j++)
+ {
+ if ((this->teorias[i]->datos_iniciales[j] != ANY) && (this->p_entorno->datos.find(t.datos_iniciales.keys(j)) != ANY))
+ {
+ if (this->teorias[i]->datos_iniciales[j] != this->p_entorno->datos.find(t.datos_iniciales.keys(j)))
+ {
+ posicionCambio = j;
+ count++;
+ }
+ }
+ }
+ if (count == 1)
+ {
+ //si cambia solo una => creo una nueva teoria igual pero con ANY en la condicion q cambia.
+ CTeoria* nt = new CTeoria ; //Nueva Teoria
+ *nt = *this->teorias[i];
+ nt->datos_iniciales[posicionCambio] = ANY;
+
+ // Agrego la teoria
+ nt->nombre = make_nombre(t.nombre, 'g', teorias.count());
+ teorias.add (nt->nombre, nt) ;
+#ifdef DEBUG
+ std::cout << "SA: Se agrego una nueva teoria: " << *nt << " basada en " << *teorias[i] << "\n";
+ std::cout << "SA: \tdatos_iniciales:\n" << nt->datos_iniciales << "\n";
+ std::cout << "SA: \tdatos_finales:\n" << nt->datos_finales << "\n";
+#endif // DEBUG
+ }
+ }
+ posicionCambio = -1;
+ count = 0;
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//--
+void CSistemaAutonomo::heuristca_retraccion(CTeoria& t)
+{
+ unsigned i ;
+ unsigned modif = (unsigned)-1;